Exemplo n.º 1
0
 public bool TryConsumeConcurrent(EnumerableToken <T> tokens, out T item)
 {
     lock (_lock)
     {
         return(TryConsume(tokens, out item));
     }
 }
Exemplo n.º 2
0
            public EnumerableToken <T> Register()
            {
                EnumerableToken <T> tokens = new EnumerableToken <T>(this);

                ConsumedIndex[tokens] = 0;
                return(tokens);
            }
Exemplo n.º 3
0
        private static IEnumerable <T> ConcurrentSubEnumerable <T>(EnumerableToken <T> tokens)
        {
            T item;

            while (tokens.TryConsumeConcurrent(out item))
            {
                yield return(item);
            }
        }
Exemplo n.º 4
0
        public void Crawl()
        {
            EnumerableToken token = new EnumerableToken(_parentToken, _type, _value);

            _objectCrawler.AcceptVisitors(token);
            if (token.IgnoreCrawl)
            {
                return;
            }
            foreach (var item in (IEnumerable)_value)
            {
                if (item == null)
                {
                    continue;
                }
                _objectCrawler.Crawl(item.GetType(), token, item);
            }
        }
Exemplo n.º 5
0
            public bool TryConsume(EnumerableToken <T> tokens, out T item)
            {
                item = default(T);
                if (ConsumedIndex.ContainsKey(tokens))
                {
                    int offset = ConsumedIndex[tokens];
                    if (ConsumedIndex.Count > 1 &&
                        offset == 0 &&
                        ConsumedIndex.Values.Count(o => o == 0) == 1) // This is the only one at index 0
                    {
                        foreach (EnumerableToken <T> key in ConsumedIndex.Keys.ToList())
                        {
                            if (!ReferenceEquals(key, tokens))
                            {
                                ConsumedIndex[key]--; // Decrement the others8
                            }
                        }
                        item = _cache[0];
                        _cache.RemoveAt(0);
                        return(true);
                    }

                    offset++;
                    ConsumedIndex[tokens] = offset;

                    if (offset > _cache.Count)
                    {
                        if (!_iter.MoveNext())
                        {
                            ConsumedIndex[tokens]--;  // We can't move any further. Turn back!
                            return(false);
                        }
                        _cache.Add(_iter.Current);
                    }

                    item = _cache[offset - 1];
                    return(true);
                }

                return(false);
            }
Exemplo n.º 6
0
 public void VisitEnumerable(EnumerableToken enumerable)
 {
     Enumerable = enumerable;
 }
 public virtual void VisitEnumerable(EnumerableToken enumerableToken)
 {
 }