Ejemplo n.º 1
0
        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>());
                }
            }
        }
Ejemplo n.º 2
0
        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;
            }
        }
Ejemplo n.º 3
0
        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));
                }
            }
        }
Ejemplo n.º 4
0
        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));
                }
            }
        }