public bool TryConsumeConcurrent(EnumerableToken <T> tokens, out T item) { lock (_lock) { return(TryConsume(tokens, out item)); } }
public EnumerableToken <T> Register() { EnumerableToken <T> tokens = new EnumerableToken <T>(this); ConsumedIndex[tokens] = 0; return(tokens); }
private static IEnumerable <T> ConcurrentSubEnumerable <T>(EnumerableToken <T> tokens) { T item; while (tokens.TryConsumeConcurrent(out item)) { yield return(item); } }
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); } }
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); }
public void VisitEnumerable(EnumerableToken enumerable) { Enumerable = enumerable; }
public virtual void VisitEnumerable(EnumerableToken enumerableToken) { }