예제 #1
0
        public static RubyArray /*!*/ ValuesAt(ConversionStorage <int> /*!*/ fixnumCast, RubyStruct /*!*/ self, params object[] /*!*/ values)
        {
            RubyArray result = new RubyArray();

            object[] data = self.Values;

            for (int i = 0; i < values.Length; ++i)
            {
                Range range = values[i] as Range;
                if (range != null)
                {
                    int begin = Protocols.CastToFixnum(fixnumCast, range.Begin);
                    int end   = Protocols.CastToFixnum(fixnumCast, range.End);

                    if (range.ExcludeEnd)
                    {
                        end -= 1;
                    }

                    begin = NormalizeIndex(data.Length, begin);
                    end   = NormalizeIndex(data.Length, end);
                    Debug.Assert(end - begin <= data.Length); // because we normalized the indicies

                    if (end - begin > 0)
                    {
                        result.AddCapacity(end - begin);
                        for (int j = begin; j <= end; j++)
                        {
                            result.Add(data[j]);
                        }
                    }
                }
                else
                {
                    int index = NormalizeIndex(data.Length, Protocols.CastToFixnum(fixnumCast, values[i]));
                    result.Add(data[index]);
                }
            }

            return(result);
        }