示例#1
0
        public static IEnumerable <TVal> Stream <TInd, TVal>(
            Func <IEnumerableFeed <TInd, TVal> > feedFactory,
            TInd fromInd = default(TInd), TInd untilInd = default(TInd), bool inReverse = false,
            IEnumerable <Buffer <TVal> > bufferProvider      = null, long maxItemCount = long.MaxValue,
            Action <IEnumerableFeed <TInd, TVal> > onDispose = null)
            where TInd : IComparable <TInd>
        {
            if (feedFactory == null)
            {
                throw new ArgumentNullException("feedFactory");
            }

            IEnumerableFeed <TInd, TVal> feed = feedFactory();

            try
            {
                foreach (var segm in feed.StreamSegments(fromInd, untilInd, inReverse, bufferProvider, maxItemCount))
                {
                    for (int i = segm.Offset; i < segm.Offset + segm.Count; i++)
                    {
                        yield return(segm.Array[i]);
                    }
                }
            }
            finally
            {
                if (onDispose != null)
                {
                    onDispose(feed);
                }
            }
        }
示例#2
0
 public static IEnumerable <TVal> Stream <TInd, TVal>(
     this IEnumerableFeed <TInd, TVal> feed,
     TInd fromInd = default(TInd), TInd untilInd = default(TInd), bool inReverse = false,
     IEnumerable <Buffer <TVal> > bufferProvider = null, long maxItemCount = long.MaxValue)
     where TInd : IComparable <TInd>
 {
     return(feed.StreamSegments(fromInd, untilInd, inReverse, bufferProvider, maxItemCount).Stream());
 }
示例#3
0
        public static IEnumerable <ArraySegment <TVal> > StreamSegments <TInd, TVal>(
            this IEnumerableFeed <TInd, TVal> feed,
            TInd fromInd = default(TInd), TInd untilInd = default(TInd), bool inReverse = false,
            IEnumerable <Buffer <TVal> > bufferProvider = null, long maxItemCount = long.MaxValue)
            where TInd : IComparable <TInd>
        {
            if (feed == null)
            {
                throw new ArgumentNullException("feed");
            }

            return(Utils.IsDefault(untilInd)
                       ? feed.StreamSegments(fromInd, inReverse, bufferProvider, maxItemCount)
                       : StreamSegmentsUntil(feed, fromInd, untilInd, inReverse, bufferProvider, maxItemCount));
        }
示例#4
0
        private static IEnumerable <ArraySegment <TVal> > StreamSegmentsUntil <TInd, TVal>(
            IEnumerableFeed <TInd, TVal> feed,
            TInd fromInd, TInd untilInd, bool inReverse,
            IEnumerable <Buffer <TVal> > bufferProvider, long maxItemCount)
            where TInd : IComparable <TInd>
        {
            Func <TVal, TInd> tsa = feed.IndexAccessor;

            foreach (var segm in feed.StreamSegments(fromInd, inReverse, bufferProvider, maxItemCount))
            {
                if (segm.Count == 0)
                {
                    continue;
                }

                int comp = tsa(segm.Array[segm.Offset + segm.Count - 1]).CompareTo(untilInd);
                if (inReverse ? comp >= 0 : comp < 0)
                {
                    yield return(segm);

                    continue;
                }

                var pos = (int)
                          Utils.BinarySearch(
                    untilInd, segm.Offset, segm.Count, false, inReverse, i => tsa(segm.Array[i]));

                if (pos < 0)
                {
                    pos = ~pos;
                }
                else if (inReverse)
                {
                    pos++;
                }

                if (pos > segm.Offset)
                {
                    yield return(new ArraySegment <TVal>(segm.Array, segm.Offset, pos - segm.Offset));
                }

                yield break;
            }
        }
示例#5
0
        public FeedConverter(
            IEnumerableFeed <TInd, TOld> feed,
            Func <TOld, TNew> converter,
            Func <TNew, TInd> indexAccessor,
            Func <TOld, bool> predicate = null)
        {
            if (feed == null)
            {
                throw new ArgumentNullException("feed");
            }
            if (converter == null)
            {
                throw new ArgumentNullException("converter");
            }
            if (indexAccessor == null)
            {
                throw new ArgumentNullException("indexAccessor");
            }

            _feed          = feed;
            _indexAccessor = indexAccessor;
            _converter     = converter;
            _predicate     = predicate;
        }