github.com/BlockABC/godash@v0.0.0-20191112120524-f4aa3a32c566/database/internal/treap/treapiter.go (about) 1 // Copyright (c) 2015-2016 The btcsuite developers 2 // Copyright (c) 2016 The Dash developers 3 // Use of this source code is governed by an ISC 4 // license that can be found in the LICENSE file. 5 6 package treap 7 8 import "bytes" 9 10 // Iterator represents an iterator for forwards and backwards iteration over 11 // the contents of a treap (mutable or immutable). 12 type Iterator struct { 13 t *Mutable // Mutable treap iterator is associated with or nil 14 root *treapNode // Root node of treap iterator is associated with 15 node *treapNode // The node the iterator is positioned at 16 parents parentStack // The stack of parents needed to iterate 17 isNew bool // Whether the iterator has been positioned 18 seekKey []byte // Used to handle dynamic updates for mutable treap 19 startKey []byte // Used to limit the iterator to a range 20 limitKey []byte // Used to limit the iterator to a range 21 } 22 23 // limitIterator clears the current iterator node if it is outside of the range 24 // specified when the iterator was created. It returns whether the iterator is 25 // valid. 26 func (iter *Iterator) limitIterator() bool { 27 if iter.node == nil { 28 return false 29 } 30 31 node := iter.node 32 if iter.startKey != nil && bytes.Compare(node.key, iter.startKey) < 0 { 33 iter.node = nil 34 return false 35 } 36 37 if iter.limitKey != nil && bytes.Compare(node.key, iter.limitKey) >= 0 { 38 iter.node = nil 39 return false 40 } 41 42 return true 43 } 44 45 // seek moves the iterator based on the provided key and flags. 46 // 47 // When the exact match flag is set, the iterator will either be moved to first 48 // key in the treap that exactly matches the provided key, or the one 49 // before/after it depending on the greater flag. 50 // 51 // When the exact match flag is NOT set, the iterator will be moved to the first 52 // key in the treap before/after the provided key depending on the greater flag. 53 // 54 // In all cases, the limits specified when the iterator was created are 55 // respected. 56 func (iter *Iterator) seek(key []byte, exactMatch bool, greater bool) bool { 57 iter.node = nil 58 iter.parents = parentStack{} 59 var selectedNodeDepth int 60 for node := iter.root; node != nil; { 61 iter.parents.Push(node) 62 63 // Traverse left or right depending on the result of the 64 // comparison. Also, set the iterator to the node depending on 65 // the flags so the iterator is positioned properly when an 66 // exact match isn't found. 67 compareResult := bytes.Compare(key, node.key) 68 if compareResult < 0 { 69 if greater { 70 iter.node = node 71 selectedNodeDepth = iter.parents.Len() - 1 72 } 73 node = node.left 74 continue 75 } 76 if compareResult > 0 { 77 if !greater { 78 iter.node = node 79 selectedNodeDepth = iter.parents.Len() - 1 80 } 81 node = node.right 82 continue 83 } 84 85 // The key is an exact match. Set the iterator and return now 86 // when the exact match flag is set. 87 if exactMatch { 88 iter.node = node 89 iter.parents.Pop() 90 return iter.limitIterator() 91 } 92 93 // The key is an exact match, but the exact match is not set, so 94 // choose which direction to go based on whether the larger or 95 // smaller key was requested. 96 if greater { 97 node = node.right 98 } else { 99 node = node.left 100 } 101 } 102 103 // There was either no exact match or there was an exact match but the 104 // exact match flag was not set. In any case, the parent stack might 105 // need to be adjusted to only include the parents up to the selected 106 // node. Also, ensure the selected node's key does not exceed the 107 // allowed range of the iterator. 108 for i := iter.parents.Len(); i > selectedNodeDepth; i-- { 109 iter.parents.Pop() 110 } 111 return iter.limitIterator() 112 } 113 114 // First moves the iterator to the first key/value pair. When there is only a 115 // single key/value pair both First and Last will point to the same pair. 116 // Returns false if there are no key/value pairs. 117 func (iter *Iterator) First() bool { 118 // Seek the start key if the iterator was created with one. This will 119 // result in either an exact match, the first greater key, or an 120 // exhausted iterator if no such key exists. 121 iter.isNew = false 122 if iter.startKey != nil { 123 return iter.seek(iter.startKey, true, true) 124 } 125 126 // The smallest key is in the left-most node. 127 iter.parents = parentStack{} 128 for node := iter.root; node != nil; node = node.left { 129 if node.left == nil { 130 iter.node = node 131 return true 132 } 133 iter.parents.Push(node) 134 } 135 return false 136 } 137 138 // Last moves the iterator to the last key/value pair. When there is only a 139 // single key/value pair both First and Last will point to the same pair. 140 // Returns false if there are no key/value pairs. 141 func (iter *Iterator) Last() bool { 142 // Seek the limit key if the iterator was created with one. This will 143 // result in the first key smaller than the limit key, or an exhausted 144 // iterator if no such key exists. 145 iter.isNew = false 146 if iter.limitKey != nil { 147 return iter.seek(iter.limitKey, false, false) 148 } 149 150 // The highest key is in the right-most node. 151 iter.parents = parentStack{} 152 for node := iter.root; node != nil; node = node.right { 153 if node.right == nil { 154 iter.node = node 155 return true 156 } 157 iter.parents.Push(node) 158 } 159 return false 160 } 161 162 // Next moves the iterator to the next key/value pair and returns false when the 163 // iterator is exhausted. When invoked on a newly created iterator it will 164 // position the iterator at the first item. 165 func (iter *Iterator) Next() bool { 166 if iter.isNew { 167 return iter.First() 168 } 169 170 if iter.node == nil { 171 return false 172 } 173 174 // Reseek the previous key without allowing for an exact match if a 175 // force seek was requested. This results in the key greater than the 176 // previous one or an exhausted iterator if there is no such key. 177 if seekKey := iter.seekKey; seekKey != nil { 178 iter.seekKey = nil 179 return iter.seek(seekKey, false, true) 180 } 181 182 // When there is no right node walk the parents until the parent's right 183 // node is not equal to the previous child. This will be the next node. 184 if iter.node.right == nil { 185 parent := iter.parents.Pop() 186 for parent != nil && parent.right == iter.node { 187 iter.node = parent 188 parent = iter.parents.Pop() 189 } 190 iter.node = parent 191 return iter.limitIterator() 192 } 193 194 // There is a right node, so the next node is the left-most node down 195 // the right sub-tree. 196 iter.parents.Push(iter.node) 197 iter.node = iter.node.right 198 for node := iter.node.left; node != nil; node = node.left { 199 iter.parents.Push(iter.node) 200 iter.node = node 201 } 202 return iter.limitIterator() 203 } 204 205 // Prev moves the iterator to the previous key/value pair and returns false when 206 // the iterator is exhausted. When invoked on a newly created iterator it will 207 // position the iterator at the last item. 208 func (iter *Iterator) Prev() bool { 209 if iter.isNew { 210 return iter.Last() 211 } 212 213 if iter.node == nil { 214 return false 215 } 216 217 // Reseek the previous key without allowing for an exact match if a 218 // force seek was requested. This results in the key smaller than the 219 // previous one or an exhausted iterator if there is no such key. 220 if seekKey := iter.seekKey; seekKey != nil { 221 iter.seekKey = nil 222 return iter.seek(seekKey, false, false) 223 } 224 225 // When there is no left node walk the parents until the parent's left 226 // node is not equal to the previous child. This will be the previous 227 // node. 228 for iter.node.left == nil { 229 parent := iter.parents.Pop() 230 for parent != nil && parent.left == iter.node { 231 iter.node = parent 232 parent = iter.parents.Pop() 233 } 234 iter.node = parent 235 return iter.limitIterator() 236 } 237 238 // There is a left node, so the previous node is the right-most node 239 // down the left sub-tree. 240 iter.parents.Push(iter.node) 241 iter.node = iter.node.left 242 for node := iter.node.right; node != nil; node = node.right { 243 iter.parents.Push(iter.node) 244 iter.node = node 245 } 246 return iter.limitIterator() 247 } 248 249 // Seek moves the iterator to the first key/value pair with a key that is 250 // greater than or equal to the given key and returns true if successful. 251 func (iter *Iterator) Seek(key []byte) bool { 252 iter.isNew = false 253 return iter.seek(key, true, true) 254 } 255 256 // Key returns the key of the current key/value pair or nil when the iterator 257 // is exhausted. The caller should not modify the contents of the returned 258 // slice. 259 func (iter *Iterator) Key() []byte { 260 if iter.node == nil { 261 return nil 262 } 263 return iter.node.key 264 } 265 266 // Value returns the value of the current key/value pair or nil when the 267 // iterator is exhausted. The caller should not modify the contents of the 268 // returned slice. 269 func (iter *Iterator) Value() []byte { 270 if iter.node == nil { 271 return nil 272 } 273 return iter.node.value 274 } 275 276 // Valid indicates whether the iterator is positioned at a valid key/value pair. 277 // It will be considered invalid when the iterator is newly created or exhausted. 278 func (iter *Iterator) Valid() bool { 279 return iter.node != nil 280 } 281 282 // ForceReseek notifies the iterator that the underlying mutable treap has been 283 // updated, so the next call to Prev or Next needs to reseek in order to allow 284 // the iterator to continue working properly. 285 // 286 // NOTE: Calling this function when the iterator is associated with an immutable 287 // treap has no effect as you would expect. 288 func (iter *Iterator) ForceReseek() { 289 // Nothing to do when the iterator is associated with an immutable 290 // treap. 291 if iter.t == nil { 292 return 293 } 294 295 // Update the iterator root to the mutable treap root in case it 296 // changed. 297 iter.root = iter.t.root 298 299 // Set the seek key to the current node. This will force the Next/Prev 300 // functions to reseek, and thus properly reconstruct the iterator, on 301 // their next call. 302 if iter.node == nil { 303 iter.seekKey = nil 304 return 305 } 306 iter.seekKey = iter.node.key 307 } 308 309 // Iterator returns a new iterator for the mutable treap. The newly returned 310 // iterator is not pointing to a valid item until a call to one of the methods 311 // to position it is made. 312 // 313 // The start key and limit key parameters cause the iterator to be limited to 314 // a range of keys. The start key is inclusive and the limit key is exclusive. 315 // Either or both can be nil if the functionality is not desired. 316 // 317 // WARNING: The ForceSeek method must be called on the returned iterator if 318 // the treap is mutated. Failure to do so will cause the iterator to return 319 // unexpected keys and/or values. 320 // 321 // For example: 322 // iter := t.Iterator(nil, nil) 323 // for iter.Next() { 324 // if someCondition { 325 // t.Delete(iter.Key()) 326 // iter.ForceReseek() 327 // } 328 // } 329 func (t *Mutable) Iterator(startKey, limitKey []byte) *Iterator { 330 iter := &Iterator{ 331 t: t, 332 root: t.root, 333 isNew: true, 334 startKey: startKey, 335 limitKey: limitKey, 336 } 337 return iter 338 } 339 340 // Iterator returns a new iterator for the immutable treap. The newly returned 341 // iterator is not pointing to a valid item until a call to one of the methods 342 // to position it is made. 343 // 344 // The start key and limit key parameters cause the iterator to be limited to 345 // a range of keys. The start key is inclusive and the limit key is exclusive. 346 // Either or both can be nil if the functionality is not desired. 347 func (t *Immutable) Iterator(startKey, limitKey []byte) *Iterator { 348 iter := &Iterator{ 349 root: t.root, 350 isNew: true, 351 startKey: startKey, 352 limitKey: limitKey, 353 } 354 return iter 355 }