protected override void AddRangeInternal(T[] items, int startIndex, int count)
        {
            var rangeTail = new StackedBagNodeSlim <T> {
                Value = items[0]
            };
            var rangeHead = rangeTail;

            for (var i = 1; i < count - 1; i++)
            {
                rangeHead = new StackedBagNodeSlim <T> {
                    Value = items[i], Next = rangeHead
                }
            }
            ;
            if (count > 1)
            {
                rangeHead = new StackedBagNodeSlim <T> {
                    Next = rangeHead
                }
            }
            ;
            Add(items[count - 1], rangeHead, rangeTail);
            if (KeepCount)
            {
                Interlocked.Add(ref _count, count);
            }
        }
        protected override void Add(T value, StackedBagNodeSlim <T> rangeHead, StackedBagNodeSlim <T> rangeTail)
        {
            rangeHead.Value = value;
            SpinWait?spinner = null;
            StackedBagNodeSlim <T> localHead = null;

            do
            {
                if (localHead != null)
                {
                    Spinner.Spin(ref spinner);
                }
                rangeTail.Next = localHead = Head;
            } while (Interlocked.CompareExchange(ref Head, rangeHead, localHead) != localHead);
        }