Example #1
0
            public AdvancedEnumerator(ODBSet <TKey> owner, AdvancedEnumeratorParam <TKey> param)
            {
                _owner      = owner;
                _keyValueTr = _owner._keyValueTr;
                _ascending  = param.Order == EnumerationOrder.Ascending;
                _prevModificationCounter = _owner._modificationCounter;
                _prevProtectionCounter   = _keyValueTr.CursorMovedCounter;
                _keyValueTr.FindFirstKey(_owner._prefix);
                var  prefixIndex = _keyValueTr.GetKeyIndex();
                long startIndex;
                long endIndex;

                if (param.EndProposition == KeyProposition.Ignored)
                {
                    _keyValueTr.FindLastKey(_owner._prefix);
                    endIndex = _keyValueTr.GetKeyIndex() - prefixIndex - 1;
                }
                else
                {
                    var keyBytes = _owner.KeyToByteArray(param.End);
                    switch (_keyValueTr.Find(keyBytes, (uint)_owner._prefix.Length))
                    {
                    case FindResult.Exact:
                        endIndex = _keyValueTr.GetKeyIndex() - prefixIndex;
                        if (param.EndProposition == KeyProposition.Excluded)
                        {
                            endIndex--;
                        }

                        break;

                    case FindResult.Previous:
                        endIndex = _keyValueTr.GetKeyIndex() - prefixIndex;
                        break;

                    case FindResult.Next:
                        endIndex = _keyValueTr.GetKeyIndex() - prefixIndex - 1;
                        break;

                    case FindResult.NotFound:
                        endIndex = -1;
                        break;

                    default:
                        throw new ArgumentOutOfRangeException();
                    }
                }

                if (param.StartProposition == KeyProposition.Ignored)
                {
                    startIndex = 0;
                }
                else
                {
                    var keyBytes = _owner.KeyToByteArray(param.Start);
                    switch (_keyValueTr.Find(keyBytes, (uint)_owner._prefix.Length))
                    {
                    case FindResult.Exact:
                        startIndex = _keyValueTr.GetKeyIndex() - prefixIndex;
                        if (param.StartProposition == KeyProposition.Excluded)
                        {
                            startIndex++;
                        }

                        break;

                    case FindResult.Previous:
                        startIndex = _keyValueTr.GetKeyIndex() - prefixIndex + 1;
                        break;

                    case FindResult.Next:
                        startIndex = _keyValueTr.GetKeyIndex() - prefixIndex;
                        break;

                    case FindResult.NotFound:
                        startIndex = 0;
                        break;

                    default:
                        throw new ArgumentOutOfRangeException();
                    }
                }

                _count     = (uint)Math.Max(0, endIndex - startIndex + 1);
                _startPos  = (uint)(_ascending ? startIndex : endIndex);
                _pos       = 0;
                _seekState = SeekState.Undefined;
            }
Example #2
0
 public IEnumerable <TKey> GetAdvancedEnumerator(AdvancedEnumeratorParam <TKey> param)
 {
     return(new AdvancedEnumerator(this, param));
 }
Example #3
0
        public long RemoveRange(AdvancedEnumeratorParam <TKey> param)
        {
            _modificationCounter++;

            _keyValueTr.FindFirstKey(_prefix);
            var  prefixIndex = _keyValueTr.GetKeyIndex();
            long startIndex;
            long endIndex;

            if (param.EndProposition == KeyProposition.Ignored)
            {
                _keyValueTr.FindLastKey(_prefix);
                endIndex = _keyValueTr.GetKeyIndex() - prefixIndex - 1;
            }
            else
            {
                var keyBytes = KeyToByteArray(param.End);
                switch (_keyValueTr.Find(keyBytes, (uint)_prefix.Length))
                {
                case FindResult.Exact:
                    endIndex = _keyValueTr.GetKeyIndex() - prefixIndex;
                    if (param.EndProposition == KeyProposition.Excluded)
                    {
                        endIndex--;
                    }

                    break;

                case FindResult.Previous:
                    endIndex = _keyValueTr.GetKeyIndex() - prefixIndex;
                    break;

                case FindResult.Next:
                    endIndex = _keyValueTr.GetKeyIndex() - prefixIndex - 1;
                    break;

                case FindResult.NotFound:
                    endIndex = -1;
                    break;

                default:
                    throw new ArgumentOutOfRangeException();
                }
            }

            if (param.StartProposition == KeyProposition.Ignored)
            {
                startIndex = 0;
            }
            else
            {
                var keyBytes = KeyToByteArray(param.Start);
                switch (_keyValueTr.Find(keyBytes, (uint)_prefix.Length))
                {
                case FindResult.Exact:
                    startIndex = _keyValueTr.GetKeyIndex() - prefixIndex;
                    if (param.StartProposition == KeyProposition.Excluded)
                    {
                        startIndex++;
                    }

                    break;

                case FindResult.Previous:
                    startIndex = _keyValueTr.GetKeyIndex() - prefixIndex + 1;
                    break;

                case FindResult.Next:
                    startIndex = _keyValueTr.GetKeyIndex() - prefixIndex;
                    break;

                case FindResult.NotFound:
                    startIndex = 0;
                    break;

                default:
                    throw new ArgumentOutOfRangeException();
                }
            }

            _keyValueTr.EraseRange(prefixIndex + startIndex, prefixIndex + endIndex);
            _count = -1;
            return(Math.Max(0, endIndex - startIndex + 1));
        }
Example #4
0
 public IOrderedDictionaryEnumerator <TKey, TValue> GetAdvancedEnumerator(AdvancedEnumeratorParam <TKey> param)
 {
     return(new AdvancedEnumerator <TKey, TValue>(this, param));
 }
Example #5
0
 public IEnumerable <T> GetAdvancedEnumerator(AdvancedEnumeratorParam <T> param)
 {
     throw new System.NotSupportedException();
 }
Example #6
0
 public long RemoveRange(AdvancedEnumeratorParam <T> param)
 {
     throw new System.NotSupportedException();
 }
Example #7
0
            public AdvancedEnumerator(ODBDictionary <TKey, TValue> owner, AdvancedEnumeratorParam <TKey> param)
            {
                _owner = owner;
                _keyValueTrProtector = _owner._keyValueTrProtector;
                _keyValueTr          = _owner._keyValueTr;
                _ascending           = param.Order == EnumerationOrder.Ascending;
                _keyValueTrProtector.Start();
                _prevModificationCounter = _owner._modificationCounter;
                _prevProtectionCounter   = _keyValueTrProtector.ProtectionCounter;
                _keyValueTr.SetKeyPrefix(_owner._prefix);
                long startIndex;
                long endIndex;

                if (param.EndProposition == KeyProposition.Ignored)
                {
                    endIndex = _keyValueTr.GetKeyValueCount() - 1;
                }
                else
                {
                    var keyBytes = _owner.KeyToByteArray(param.End);
                    switch (_keyValueTr.Find(ByteBuffer.NewSync(keyBytes)))
                    {
                    case FindResult.Exact:
                        endIndex = _keyValueTr.GetKeyIndex();
                        if (param.EndProposition == KeyProposition.Excluded)
                        {
                            endIndex--;
                        }
                        break;

                    case FindResult.Previous:
                        endIndex = _keyValueTr.GetKeyIndex();
                        break;

                    case FindResult.Next:
                        endIndex = _keyValueTr.GetKeyIndex() - 1;
                        break;

                    case FindResult.NotFound:
                        endIndex = -1;
                        break;

                    default:
                        throw new ArgumentOutOfRangeException();
                    }
                }
                if (param.StartProposition == KeyProposition.Ignored)
                {
                    startIndex = 0;
                }
                else
                {
                    var keyBytes = _owner.KeyToByteArray(param.Start);
                    switch (_keyValueTr.Find(ByteBuffer.NewSync(keyBytes)))
                    {
                    case FindResult.Exact:
                        startIndex = _keyValueTr.GetKeyIndex();
                        if (param.StartProposition == KeyProposition.Excluded)
                        {
                            startIndex++;
                        }
                        break;

                    case FindResult.Previous:
                        startIndex = _keyValueTr.GetKeyIndex() + 1;
                        break;

                    case FindResult.Next:
                        startIndex = _keyValueTr.GetKeyIndex();
                        break;

                    case FindResult.NotFound:
                        startIndex = 0;
                        break;

                    default:
                        throw new ArgumentOutOfRangeException();
                    }
                }
                _count      = (uint)Math.Max(0, endIndex - startIndex + 1);
                _startPos   = (uint)(_ascending ? startIndex : endIndex);
                _pos        = 0;
                _seekNeeded = true;
            }