public override FVList <T> Where(int localCount, Predicate <T> keep, WListProtected <T> forWList) { // Optimization Debug.Assert(localCount > 0); if (keep(_1)) { if (localCount == 2) { if (keep(_2)) { _immCount = 2; // Mark immutable if it isn't already return(MakeResult(this, 2, forWList)); } } if (_immCount == MutableFlag) { _immCount = 1; // Ensure first item is immutable } return(MakeResult(this, 1, forWList)); } else { if (localCount == 2 && keep(_2)) { return(MakeResult(_2, forWList)); } else { return(new FVList <T>()); } } }
protected WListProtected(WListProtected <T> original, bool takeOwnership) : this(original.Block, original.LocalCount, takeOwnership&& original.IsOwner) { if (IsOwner) { original.IsOwner = false; } byte userByte = original.UserByte; if (userByte != 0) { UserByte = userByte; } }
public override FVList <T> SmartSelect(int _localCount, Func <T, T> map, WListProtected <T> forWList) { // Optimization T item, item2; Debug.Assert(_localCount > 0); if (EqualityComparer.Equals(item = map(_1), _1)) { if (_localCount == 2) { if (EqualityComparer.Equals(item2 = map(_2), _2)) { _immCount = 2; // Mark immutable if it isn't already return(MakeResult(this, 2, forWList)); } else { return(MakeResult(item, item2, forWList)); } } else { if (_immCount == MutableFlag) { _immCount = 1; // Ensure first item is immutable } return(MakeResult(this, 1, forWList)); } } else { if (_localCount == 2) { return(MakeResult(item, map(_2), forWList)); } else { return(MakeResult(item, forWList)); } } }
public override FVList <T> WhereSelect(int _localCount, Func <T, Maybe <T> > map, WListProtected <T> forWList) { // Optimization Maybe <T> item, item2; Debug.Assert(_localCount > 0); if (IsSame(_1, item = map(_1))) { if (_localCount == 2) { if (IsSame(_2, item2 = map(_2))) { _immCount = 2; // Mark immutable if it isn't already return(MakeResult(this, 2, forWList)); } else { return(MakeResult(item.Value, item2.Value, forWList)); } } else { if (_immCount == MutableFlag) { _immCount = 1; // Ensure first item is immutable } return(MakeResult(this, 1, forWList)); } } else if (!item.HasValue) { if (_localCount == 1 || !(item2 = map(_2)).HasValue) { Debug.Assert(forWList == null || forWList.Count == 0); return(FVList <T> .Empty); } else { return(MakeResult(item2.Value, forWList)); } } else { if (_localCount == 1 || !(item2 = map(_2)).HasValue) { return(MakeResult(item.Value, forWList)); } else { return(MakeResult(item.Value, item2.Value, forWList)); } } }