btreeg.go 31 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391
  1. // Copyright 2020 Joshua J Baker. All rights reserved.
  2. // Use of this source code is governed by an MIT-style
  3. // license that can be found in the LICENSE file.
  4. package btree
  5. import "sync"
  6. type BTreeG[T any] struct {
  7. isoid uint64
  8. mu *sync.RWMutex
  9. root *node[T]
  10. count int
  11. locks bool
  12. copyItems bool
  13. isoCopyItems bool
  14. less func(a, b T) bool
  15. empty T
  16. max int
  17. min int
  18. }
  19. type node[T any] struct {
  20. isoid uint64
  21. count int
  22. items []T
  23. children *[]*node[T]
  24. }
  25. // PathHint is a utility type used with the *Hint() functions. Hints provide
  26. // faster operations for clustered keys.
  27. type PathHint struct {
  28. used [8]bool
  29. path [8]uint8
  30. }
  31. // Options for passing to New when creating a new BTree.
  32. type Options struct {
  33. // Degree is used to define how many items and children each internal node
  34. // can contain before it must branch. For example, a degree of 2 will
  35. // create a 2-3-4 tree, where each node may contains 1-3 items and
  36. // 2-4 children. See https://en.wikipedia.org/wiki/2–3–4_tree.
  37. // Default is 32
  38. Degree int
  39. // NoLocks will disable locking. Otherwide a sync.RWMutex is used to
  40. // ensure all operations are safe across multiple goroutines.
  41. NoLocks bool
  42. }
  43. // New returns a new BTree
  44. func NewBTreeG[T any](less func(a, b T) bool) *BTreeG[T] {
  45. return NewBTreeGOptions(less, Options{})
  46. }
  47. func NewBTreeGOptions[T any](less func(a, b T) bool, opts Options) *BTreeG[T] {
  48. tr := new(BTreeG[T])
  49. tr.isoid = newIsoID()
  50. tr.mu = new(sync.RWMutex)
  51. tr.locks = !opts.NoLocks
  52. tr.less = less
  53. tr.init(opts.Degree)
  54. return tr
  55. }
  56. func (tr *BTreeG[T]) init(degree int) {
  57. if tr.min != 0 {
  58. return
  59. }
  60. tr.min, tr.max = degreeToMinMax(degree)
  61. _, tr.copyItems = ((interface{})(tr.empty)).(copier[T])
  62. if !tr.copyItems {
  63. _, tr.isoCopyItems = ((interface{})(tr.empty)).(isoCopier[T])
  64. }
  65. }
  66. // Less is a convenience function that performs a comparison of two items
  67. // using the same "less" function provided to New.
  68. func (tr *BTreeG[T]) Less(a, b T) bool {
  69. return tr.less(a, b)
  70. }
  71. func (tr *BTreeG[T]) newNode(leaf bool) *node[T] {
  72. n := &node[T]{isoid: tr.isoid}
  73. if !leaf {
  74. n.children = new([]*node[T])
  75. }
  76. return n
  77. }
  78. // leaf returns true if the node is a leaf.
  79. func (n *node[T]) leaf() bool {
  80. return n.children == nil
  81. }
  82. func (tr *BTreeG[T]) bsearch(n *node[T], key T) (index int, found bool) {
  83. low, high := 0, len(n.items)
  84. for low < high {
  85. h := (low + high) / 2
  86. if !tr.less(key, n.items[h]) {
  87. low = h + 1
  88. } else {
  89. high = h
  90. }
  91. }
  92. if low > 0 && !tr.less(n.items[low-1], key) {
  93. return low - 1, true
  94. }
  95. return low, false
  96. }
  97. func (tr *BTreeG[T]) find(n *node[T], key T, hint *PathHint, depth int,
  98. ) (index int, found bool) {
  99. if hint == nil {
  100. return tr.bsearch(n, key)
  101. }
  102. return tr.hintsearch(n, key, hint, depth)
  103. }
  104. func (tr *BTreeG[T]) hintsearch(n *node[T], key T, hint *PathHint, depth int,
  105. ) (index int, found bool) {
  106. // Best case finds the exact match, updates the hint and returns.
  107. // Worst case, updates the low and high bounds to binary search between.
  108. low := 0
  109. high := len(n.items) - 1
  110. if depth < 8 && hint.used[depth] {
  111. index = int(hint.path[depth])
  112. if index >= len(n.items) {
  113. // tail item
  114. if tr.Less(n.items[len(n.items)-1], key) {
  115. index = len(n.items)
  116. goto path_match
  117. }
  118. index = len(n.items) - 1
  119. }
  120. if tr.Less(key, n.items[index]) {
  121. if index == 0 || tr.Less(n.items[index-1], key) {
  122. goto path_match
  123. }
  124. high = index - 1
  125. } else if tr.Less(n.items[index], key) {
  126. low = index + 1
  127. } else {
  128. found = true
  129. goto path_match
  130. }
  131. }
  132. // Do a binary search between low and high
  133. // keep on going until low > high, where the guarantee on low is that
  134. // key >= items[low - 1]
  135. for low <= high {
  136. mid := low + ((high+1)-low)/2
  137. // if key >= n.items[mid], low = mid + 1
  138. // which implies that key >= everything below low
  139. if !tr.Less(key, n.items[mid]) {
  140. low = mid + 1
  141. } else {
  142. high = mid - 1
  143. }
  144. }
  145. // if low > 0, n.items[low - 1] >= key,
  146. // we have from before that key >= n.items[low - 1]
  147. // therefore key = n.items[low - 1],
  148. // and we have found the entry for key.
  149. // Otherwise we must keep searching for the key in index `low`.
  150. if low > 0 && !tr.Less(n.items[low-1], key) {
  151. index = low - 1
  152. found = true
  153. } else {
  154. index = low
  155. found = false
  156. }
  157. path_match:
  158. if depth < 8 {
  159. hint.used[depth] = true
  160. var pathIndex uint8
  161. if n.leaf() && found {
  162. pathIndex = uint8(index + 1)
  163. } else {
  164. pathIndex = uint8(index)
  165. }
  166. if pathIndex != hint.path[depth] {
  167. hint.path[depth] = pathIndex
  168. for i := depth + 1; i < 8; i++ {
  169. hint.used[i] = false
  170. }
  171. }
  172. }
  173. return index, found
  174. }
  175. // SetHint sets or replace a value for a key using a path hint
  176. func (tr *BTreeG[T]) SetHint(item T, hint *PathHint) (prev T, replaced bool) {
  177. if tr.locks {
  178. tr.mu.Lock()
  179. prev, replaced = tr.setHint(item, hint)
  180. tr.mu.Unlock()
  181. } else {
  182. prev, replaced = tr.setHint(item, hint)
  183. }
  184. return prev, replaced
  185. }
  186. func (tr *BTreeG[T]) setHint(item T, hint *PathHint) (prev T, replaced bool) {
  187. if tr.root == nil {
  188. tr.init(0)
  189. tr.root = tr.newNode(true)
  190. tr.root.items = append([]T{}, item)
  191. tr.root.count = 1
  192. tr.count = 1
  193. return tr.empty, false
  194. }
  195. prev, replaced, split := tr.nodeSet(&tr.root, item, hint, 0)
  196. if split {
  197. left := tr.isoLoad(&tr.root, true)
  198. right, median := tr.nodeSplit(left)
  199. tr.root = tr.newNode(false)
  200. *tr.root.children = make([]*node[T], 0, tr.max+1)
  201. *tr.root.children = append([]*node[T]{}, left, right)
  202. tr.root.items = append([]T{}, median)
  203. tr.root.updateCount()
  204. return tr.setHint(item, hint)
  205. }
  206. if replaced {
  207. return prev, true
  208. }
  209. tr.count++
  210. return tr.empty, false
  211. }
  212. // Set or replace a value for a key
  213. func (tr *BTreeG[T]) Set(item T) (T, bool) {
  214. return tr.SetHint(item, nil)
  215. }
  216. func (tr *BTreeG[T]) nodeSplit(n *node[T]) (right *node[T], median T) {
  217. i := tr.max / 2
  218. median = n.items[i]
  219. // right node
  220. right = tr.newNode(n.leaf())
  221. right.items = n.items[i+1:]
  222. if !n.leaf() {
  223. *right.children = (*n.children)[i+1:]
  224. }
  225. right.updateCount()
  226. // left node
  227. n.items[i] = tr.empty
  228. n.items = n.items[:i:i]
  229. if !n.leaf() {
  230. *n.children = (*n.children)[: i+1 : i+1]
  231. }
  232. n.updateCount()
  233. return right, median
  234. }
  235. func (n *node[T]) updateCount() {
  236. n.count = len(n.items)
  237. if !n.leaf() {
  238. for i := 0; i < len(*n.children); i++ {
  239. n.count += (*n.children)[i].count
  240. }
  241. }
  242. }
  243. // Copy the node for safe isolation.
  244. func (tr *BTreeG[T]) copy(n *node[T]) *node[T] {
  245. n2 := new(node[T])
  246. n2.isoid = tr.isoid
  247. n2.count = n.count
  248. n2.items = make([]T, len(n.items), cap(n.items))
  249. copy(n2.items, n.items)
  250. if tr.copyItems {
  251. for i := 0; i < len(n2.items); i++ {
  252. n2.items[i] = ((interface{})(n2.items[i])).(copier[T]).Copy()
  253. }
  254. } else if tr.isoCopyItems {
  255. for i := 0; i < len(n2.items); i++ {
  256. n2.items[i] = ((interface{})(n2.items[i])).(isoCopier[T]).IsoCopy()
  257. }
  258. }
  259. if !n.leaf() {
  260. n2.children = new([]*node[T])
  261. *n2.children = make([]*node[T], len(*n.children), tr.max+1)
  262. copy(*n2.children, *n.children)
  263. }
  264. return n2
  265. }
  266. // isoLoad loads the provided node and, if needed, performs a copy-on-write.
  267. func (tr *BTreeG[T]) isoLoad(cn **node[T], mut bool) *node[T] {
  268. if mut && (*cn).isoid != tr.isoid {
  269. *cn = tr.copy(*cn)
  270. }
  271. return *cn
  272. }
  273. func (tr *BTreeG[T]) nodeSet(cn **node[T], item T,
  274. hint *PathHint, depth int,
  275. ) (prev T, replaced bool, split bool) {
  276. if (*cn).isoid != tr.isoid {
  277. *cn = tr.copy(*cn)
  278. }
  279. n := *cn
  280. var i int
  281. var found bool
  282. if hint == nil {
  283. i, found = tr.bsearch(n, item)
  284. } else {
  285. i, found = tr.hintsearch(n, item, hint, depth)
  286. }
  287. if found {
  288. prev = n.items[i]
  289. n.items[i] = item
  290. return prev, true, false
  291. }
  292. if n.leaf() {
  293. if len(n.items) == tr.max {
  294. return tr.empty, false, true
  295. }
  296. n.items = append(n.items, tr.empty)
  297. copy(n.items[i+1:], n.items[i:])
  298. n.items[i] = item
  299. n.count++
  300. return tr.empty, false, false
  301. }
  302. prev, replaced, split = tr.nodeSet(&(*n.children)[i], item, hint, depth+1)
  303. if split {
  304. if len(n.items) == tr.max {
  305. return tr.empty, false, true
  306. }
  307. right, median := tr.nodeSplit((*n.children)[i])
  308. *n.children = append(*n.children, nil)
  309. copy((*n.children)[i+1:], (*n.children)[i:])
  310. (*n.children)[i+1] = right
  311. n.items = append(n.items, tr.empty)
  312. copy(n.items[i+1:], n.items[i:])
  313. n.items[i] = median
  314. return tr.nodeSet(&n, item, hint, depth)
  315. }
  316. if !replaced {
  317. n.count++
  318. }
  319. return prev, replaced, false
  320. }
  321. func (tr *BTreeG[T]) Scan(iter func(item T) bool) {
  322. tr.scan(iter, false)
  323. }
  324. func (tr *BTreeG[T]) ScanMut(iter func(item T) bool) {
  325. tr.scan(iter, true)
  326. }
  327. func (tr *BTreeG[T]) scan(iter func(item T) bool, mut bool) {
  328. if tr.lock(mut) {
  329. defer tr.unlock(mut)
  330. }
  331. if tr.root == nil {
  332. return
  333. }
  334. tr.nodeScan(&tr.root, iter, mut)
  335. }
  336. func (tr *BTreeG[T]) nodeScan(cn **node[T], iter func(item T) bool, mut bool,
  337. ) bool {
  338. n := tr.isoLoad(cn, mut)
  339. if n.leaf() {
  340. for i := 0; i < len(n.items); i++ {
  341. if !iter(n.items[i]) {
  342. return false
  343. }
  344. }
  345. return true
  346. }
  347. for i := 0; i < len(n.items); i++ {
  348. if !tr.nodeScan(&(*n.children)[i], iter, mut) {
  349. return false
  350. }
  351. if !iter(n.items[i]) {
  352. return false
  353. }
  354. }
  355. return tr.nodeScan(&(*n.children)[len(*n.children)-1], iter, mut)
  356. }
  357. // Get a value for key
  358. func (tr *BTreeG[T]) Get(key T) (T, bool) {
  359. return tr.getHint(key, nil, false)
  360. }
  361. func (tr *BTreeG[T]) GetMut(key T) (T, bool) {
  362. return tr.getHint(key, nil, true)
  363. }
  364. // GetHint gets a value for key using a path hint
  365. func (tr *BTreeG[T]) GetHint(key T, hint *PathHint) (value T, ok bool) {
  366. return tr.getHint(key, hint, false)
  367. }
  368. func (tr *BTreeG[T]) GetHintMut(key T, hint *PathHint) (value T, ok bool) {
  369. return tr.getHint(key, hint, true)
  370. }
  371. // GetHint gets a value for key using a path hint
  372. func (tr *BTreeG[T]) getHint(key T, hint *PathHint, mut bool) (T, bool) {
  373. if tr.lock(mut) {
  374. defer tr.unlock(mut)
  375. }
  376. if tr.root == nil {
  377. return tr.empty, false
  378. }
  379. n := tr.isoLoad(&tr.root, mut)
  380. depth := 0
  381. for {
  382. i, found := tr.find(n, key, hint, depth)
  383. if found {
  384. return n.items[i], true
  385. }
  386. if n.children == nil {
  387. return tr.empty, false
  388. }
  389. n = tr.isoLoad(&(*n.children)[i], mut)
  390. depth++
  391. }
  392. }
  393. // Len returns the number of items in the tree
  394. func (tr *BTreeG[T]) Len() int {
  395. return tr.count
  396. }
  397. // Delete a value for a key and returns the deleted value.
  398. // Returns false if there was no value by that key found.
  399. func (tr *BTreeG[T]) Delete(key T) (T, bool) {
  400. return tr.DeleteHint(key, nil)
  401. }
  402. // DeleteHint deletes a value for a key using a path hint and returns the
  403. // deleted value.
  404. // Returns false if there was no value by that key found.
  405. func (tr *BTreeG[T]) DeleteHint(key T, hint *PathHint) (T, bool) {
  406. if tr.lock(true) {
  407. defer tr.unlock(true)
  408. }
  409. return tr.deleteHint(key, hint)
  410. }
  411. func (tr *BTreeG[T]) deleteHint(key T, hint *PathHint) (T, bool) {
  412. if tr.root == nil {
  413. return tr.empty, false
  414. }
  415. prev, deleted := tr.delete(&tr.root, false, key, hint, 0)
  416. if !deleted {
  417. return tr.empty, false
  418. }
  419. if len(tr.root.items) == 0 && !tr.root.leaf() {
  420. tr.root = (*tr.root.children)[0]
  421. }
  422. tr.count--
  423. if tr.count == 0 {
  424. tr.root = nil
  425. }
  426. return prev, true
  427. }
  428. func (tr *BTreeG[T]) delete(cn **node[T], max bool, key T,
  429. hint *PathHint, depth int,
  430. ) (T, bool) {
  431. n := tr.isoLoad(cn, true)
  432. var i int
  433. var found bool
  434. if max {
  435. i, found = len(n.items)-1, true
  436. } else {
  437. i, found = tr.find(n, key, hint, depth)
  438. }
  439. if n.leaf() {
  440. if found {
  441. // found the items at the leaf, remove it and return.
  442. prev := n.items[i]
  443. copy(n.items[i:], n.items[i+1:])
  444. n.items[len(n.items)-1] = tr.empty
  445. n.items = n.items[:len(n.items)-1]
  446. n.count--
  447. return prev, true
  448. }
  449. return tr.empty, false
  450. }
  451. var prev T
  452. var deleted bool
  453. if found {
  454. if max {
  455. i++
  456. prev, deleted = tr.delete(&(*n.children)[i], true, tr.empty, nil, 0)
  457. } else {
  458. prev = n.items[i]
  459. maxItem, _ := tr.delete(&(*n.children)[i], true, tr.empty, nil, 0)
  460. deleted = true
  461. n.items[i] = maxItem
  462. }
  463. } else {
  464. prev, deleted = tr.delete(&(*n.children)[i], max, key, hint, depth+1)
  465. }
  466. if !deleted {
  467. return tr.empty, false
  468. }
  469. n.count--
  470. if len((*n.children)[i].items) < tr.min {
  471. tr.nodeRebalance(n, i)
  472. }
  473. return prev, true
  474. }
  475. // nodeRebalance rebalances the child nodes following a delete operation.
  476. // Provide the index of the child node with the number of items that fell
  477. // below minItems.
  478. func (tr *BTreeG[T]) nodeRebalance(n *node[T], i int) {
  479. if i == len(n.items) {
  480. i--
  481. }
  482. // ensure copy-on-write
  483. left := tr.isoLoad(&(*n.children)[i], true)
  484. right := tr.isoLoad(&(*n.children)[i+1], true)
  485. if len(left.items)+len(right.items) < tr.max {
  486. // Merges the left and right children nodes together as a single node
  487. // that includes (left,item,right), and places the contents into the
  488. // existing left node. Delete the right node altogether and move the
  489. // following items and child nodes to the left by one slot.
  490. // merge (left,item,right)
  491. left.items = append(left.items, n.items[i])
  492. left.items = append(left.items, right.items...)
  493. if !left.leaf() {
  494. *left.children = append(*left.children, *right.children...)
  495. }
  496. left.count += right.count + 1
  497. // move the items over one slot
  498. copy(n.items[i:], n.items[i+1:])
  499. n.items[len(n.items)-1] = tr.empty
  500. n.items = n.items[:len(n.items)-1]
  501. // move the children over one slot
  502. copy((*n.children)[i+1:], (*n.children)[i+2:])
  503. (*n.children)[len(*n.children)-1] = nil
  504. (*n.children) = (*n.children)[:len(*n.children)-1]
  505. } else if len(left.items) > len(right.items) {
  506. // move left -> right over one slot
  507. // Move the item of the parent node at index into the right-node first
  508. // slot, and move the left-node last item into the previously moved
  509. // parent item slot.
  510. right.items = append(right.items, tr.empty)
  511. copy(right.items[1:], right.items)
  512. right.items[0] = n.items[i]
  513. right.count++
  514. n.items[i] = left.items[len(left.items)-1]
  515. left.items[len(left.items)-1] = tr.empty
  516. left.items = left.items[:len(left.items)-1]
  517. left.count--
  518. if !left.leaf() {
  519. // move the left-node last child into the right-node first slot
  520. *right.children = append(*right.children, nil)
  521. copy((*right.children)[1:], *right.children)
  522. (*right.children)[0] = (*left.children)[len(*left.children)-1]
  523. (*left.children)[len(*left.children)-1] = nil
  524. (*left.children) = (*left.children)[:len(*left.children)-1]
  525. left.count -= (*right.children)[0].count
  526. right.count += (*right.children)[0].count
  527. }
  528. } else {
  529. // move left <- right over one slot
  530. // Same as above but the other direction
  531. left.items = append(left.items, n.items[i])
  532. left.count++
  533. n.items[i] = right.items[0]
  534. copy(right.items, right.items[1:])
  535. right.items[len(right.items)-1] = tr.empty
  536. right.items = right.items[:len(right.items)-1]
  537. right.count--
  538. if !left.leaf() {
  539. *left.children = append(*left.children, (*right.children)[0])
  540. copy(*right.children, (*right.children)[1:])
  541. (*right.children)[len(*right.children)-1] = nil
  542. *right.children = (*right.children)[:len(*right.children)-1]
  543. left.count += (*left.children)[len(*left.children)-1].count
  544. right.count -= (*left.children)[len(*left.children)-1].count
  545. }
  546. }
  547. }
  548. // Ascend the tree within the range [pivot, last]
  549. // Pass nil for pivot to scan all item in ascending order
  550. // Return false to stop iterating
  551. func (tr *BTreeG[T]) Ascend(pivot T, iter func(item T) bool) {
  552. tr.ascend(pivot, iter, false)
  553. }
  554. func (tr *BTreeG[T]) AscendMut(pivot T, iter func(item T) bool) {
  555. tr.ascend(pivot, iter, true)
  556. }
  557. func (tr *BTreeG[T]) ascend(pivot T, iter func(item T) bool, mut bool) {
  558. if tr.lock(mut) {
  559. defer tr.unlock(mut)
  560. }
  561. if tr.root == nil {
  562. return
  563. }
  564. tr.nodeAscend(&tr.root, pivot, nil, 0, iter, mut)
  565. }
  566. // The return value of this function determines whether we should keep iterating
  567. // upon this functions return.
  568. func (tr *BTreeG[T]) nodeAscend(cn **node[T], pivot T, hint *PathHint,
  569. depth int, iter func(item T) bool, mut bool,
  570. ) bool {
  571. n := tr.isoLoad(cn, mut)
  572. i, found := tr.find(n, pivot, hint, depth)
  573. if !found {
  574. if !n.leaf() {
  575. if !tr.nodeAscend(&(*n.children)[i], pivot, hint, depth+1, iter,
  576. mut) {
  577. return false
  578. }
  579. }
  580. }
  581. // We are either in the case that
  582. // - node is found, we should iterate through it starting at `i`,
  583. // the index it was located at.
  584. // - node is not found, and TODO: fill in.
  585. for ; i < len(n.items); i++ {
  586. if !iter(n.items[i]) {
  587. return false
  588. }
  589. if !n.leaf() {
  590. if !tr.nodeScan(&(*n.children)[i+1], iter, mut) {
  591. return false
  592. }
  593. }
  594. }
  595. return true
  596. }
  597. func (tr *BTreeG[T]) Reverse(iter func(item T) bool) {
  598. tr.reverse(iter, false)
  599. }
  600. func (tr *BTreeG[T]) ReverseMut(iter func(item T) bool) {
  601. tr.reverse(iter, true)
  602. }
  603. func (tr *BTreeG[T]) reverse(iter func(item T) bool, mut bool) {
  604. if tr.lock(mut) {
  605. defer tr.unlock(mut)
  606. }
  607. if tr.root == nil {
  608. return
  609. }
  610. tr.nodeReverse(&tr.root, iter, mut)
  611. }
  612. func (tr *BTreeG[T]) nodeReverse(cn **node[T], iter func(item T) bool, mut bool,
  613. ) bool {
  614. n := tr.isoLoad(cn, mut)
  615. if n.leaf() {
  616. for i := len(n.items) - 1; i >= 0; i-- {
  617. if !iter(n.items[i]) {
  618. return false
  619. }
  620. }
  621. return true
  622. }
  623. if !tr.nodeReverse(&(*n.children)[len(*n.children)-1], iter, mut) {
  624. return false
  625. }
  626. for i := len(n.items) - 1; i >= 0; i-- {
  627. if !iter(n.items[i]) {
  628. return false
  629. }
  630. if !tr.nodeReverse(&(*n.children)[i], iter, mut) {
  631. return false
  632. }
  633. }
  634. return true
  635. }
  636. // Descend the tree within the range [pivot, first]
  637. // Pass nil for pivot to scan all item in descending order
  638. // Return false to stop iterating
  639. func (tr *BTreeG[T]) Descend(pivot T, iter func(item T) bool) {
  640. tr.descend(pivot, iter, false)
  641. }
  642. func (tr *BTreeG[T]) DescendMut(pivot T, iter func(item T) bool) {
  643. tr.descend(pivot, iter, true)
  644. }
  645. func (tr *BTreeG[T]) descend(pivot T, iter func(item T) bool, mut bool) {
  646. if tr.lock(mut) {
  647. defer tr.unlock(mut)
  648. }
  649. if tr.root == nil {
  650. return
  651. }
  652. tr.nodeDescend(&tr.root, pivot, nil, 0, iter, mut)
  653. }
  654. func (tr *BTreeG[T]) nodeDescend(cn **node[T], pivot T, hint *PathHint,
  655. depth int, iter func(item T) bool, mut bool,
  656. ) bool {
  657. n := tr.isoLoad(cn, mut)
  658. i, found := tr.find(n, pivot, hint, depth)
  659. if !found {
  660. if !n.leaf() {
  661. if !tr.nodeDescend(&(*n.children)[i], pivot, hint, depth+1, iter,
  662. mut) {
  663. return false
  664. }
  665. }
  666. i--
  667. }
  668. for ; i >= 0; i-- {
  669. if !iter(n.items[i]) {
  670. return false
  671. }
  672. if !n.leaf() {
  673. if !tr.nodeReverse(&(*n.children)[i], iter, mut) {
  674. return false
  675. }
  676. }
  677. }
  678. return true
  679. }
  680. // Load is for bulk loading pre-sorted items
  681. func (tr *BTreeG[T]) Load(item T) (T, bool) {
  682. if tr.lock(true) {
  683. defer tr.unlock(true)
  684. }
  685. if tr.root == nil {
  686. return tr.setHint(item, nil)
  687. }
  688. n := tr.isoLoad(&tr.root, true)
  689. for {
  690. n.count++ // optimistically update counts
  691. if n.leaf() {
  692. if len(n.items) < tr.max {
  693. if tr.Less(n.items[len(n.items)-1], item) {
  694. n.items = append(n.items, item)
  695. tr.count++
  696. return tr.empty, false
  697. }
  698. }
  699. break
  700. }
  701. n = tr.isoLoad(&(*n.children)[len(*n.children)-1], true)
  702. }
  703. // revert the counts
  704. n = tr.root
  705. for {
  706. n.count--
  707. if n.leaf() {
  708. break
  709. }
  710. n = (*n.children)[len(*n.children)-1]
  711. }
  712. return tr.setHint(item, nil)
  713. }
  714. // Min returns the minimum item in tree.
  715. // Returns nil if the treex has no items.
  716. func (tr *BTreeG[T]) Min() (T, bool) {
  717. return tr.minMut(false)
  718. }
  719. func (tr *BTreeG[T]) MinMut() (T, bool) {
  720. return tr.minMut(true)
  721. }
  722. func (tr *BTreeG[T]) minMut(mut bool) (T, bool) {
  723. if tr.lock(mut) {
  724. defer tr.unlock(mut)
  725. }
  726. if tr.root == nil {
  727. return tr.empty, false
  728. }
  729. n := tr.isoLoad(&tr.root, mut)
  730. for {
  731. if n.leaf() {
  732. return n.items[0], true
  733. }
  734. n = tr.isoLoad(&(*n.children)[0], mut)
  735. }
  736. }
  737. // Max returns the maximum item in tree.
  738. // Returns nil if the tree has no items.
  739. func (tr *BTreeG[T]) Max() (T, bool) {
  740. return tr.maxMut(false)
  741. }
  742. func (tr *BTreeG[T]) MaxMut() (T, bool) {
  743. return tr.maxMut(true)
  744. }
  745. func (tr *BTreeG[T]) maxMut(mut bool) (T, bool) {
  746. if tr.lock(mut) {
  747. defer tr.unlock(mut)
  748. }
  749. if tr.root == nil {
  750. return tr.empty, false
  751. }
  752. n := tr.isoLoad(&tr.root, mut)
  753. for {
  754. if n.leaf() {
  755. return n.items[len(n.items)-1], true
  756. }
  757. n = tr.isoLoad(&(*n.children)[len(*n.children)-1], mut)
  758. }
  759. }
  760. // PopMin removes the minimum item in tree and returns it.
  761. // Returns nil if the tree has no items.
  762. func (tr *BTreeG[T]) PopMin() (T, bool) {
  763. if tr.lock(true) {
  764. defer tr.unlock(true)
  765. }
  766. if tr.root == nil {
  767. return tr.empty, false
  768. }
  769. n := tr.isoLoad(&tr.root, true)
  770. var item T
  771. for {
  772. n.count-- // optimistically update counts
  773. if n.leaf() {
  774. item = n.items[0]
  775. if len(n.items) == tr.min {
  776. break
  777. }
  778. copy(n.items[:], n.items[1:])
  779. n.items[len(n.items)-1] = tr.empty
  780. n.items = n.items[:len(n.items)-1]
  781. tr.count--
  782. if tr.count == 0 {
  783. tr.root = nil
  784. }
  785. return item, true
  786. }
  787. n = tr.isoLoad(&(*n.children)[0], true)
  788. }
  789. // revert the counts
  790. n = tr.root
  791. for {
  792. n.count++
  793. if n.leaf() {
  794. break
  795. }
  796. n = (*n.children)[0]
  797. }
  798. return tr.deleteHint(item, nil)
  799. }
  800. // PopMax removes the maximum item in tree and returns it.
  801. // Returns nil if the tree has no items.
  802. func (tr *BTreeG[T]) PopMax() (T, bool) {
  803. if tr.lock(true) {
  804. defer tr.unlock(true)
  805. }
  806. if tr.root == nil {
  807. return tr.empty, false
  808. }
  809. n := tr.isoLoad(&tr.root, true)
  810. var item T
  811. for {
  812. n.count-- // optimistically update counts
  813. if n.leaf() {
  814. item = n.items[len(n.items)-1]
  815. if len(n.items) == tr.min {
  816. break
  817. }
  818. n.items[len(n.items)-1] = tr.empty
  819. n.items = n.items[:len(n.items)-1]
  820. tr.count--
  821. if tr.count == 0 {
  822. tr.root = nil
  823. }
  824. return item, true
  825. }
  826. n = tr.isoLoad(&(*n.children)[len(*n.children)-1], true)
  827. }
  828. // revert the counts
  829. n = tr.root
  830. for {
  831. n.count++
  832. if n.leaf() {
  833. break
  834. }
  835. n = (*n.children)[len(*n.children)-1]
  836. }
  837. return tr.deleteHint(item, nil)
  838. }
  839. // GetAt returns the value at index.
  840. // Return nil if the tree is empty or the index is out of bounds.
  841. func (tr *BTreeG[T]) GetAt(index int) (T, bool) {
  842. return tr.getAt(index, false)
  843. }
  844. func (tr *BTreeG[T]) GetAtMut(index int) (T, bool) {
  845. return tr.getAt(index, true)
  846. }
  847. func (tr *BTreeG[T]) getAt(index int, mut bool) (T, bool) {
  848. if tr.lock(mut) {
  849. defer tr.unlock(mut)
  850. }
  851. if tr.root == nil || index < 0 || index >= tr.count {
  852. return tr.empty, false
  853. }
  854. n := tr.isoLoad(&tr.root, mut)
  855. for {
  856. if n.leaf() {
  857. return n.items[index], true
  858. }
  859. i := 0
  860. for ; i < len(n.items); i++ {
  861. if index < (*n.children)[i].count {
  862. break
  863. } else if index == (*n.children)[i].count {
  864. return n.items[i], true
  865. }
  866. index -= (*n.children)[i].count + 1
  867. }
  868. n = tr.isoLoad(&(*n.children)[i], mut)
  869. }
  870. }
  871. // DeleteAt deletes the item at index.
  872. // Return nil if the tree is empty or the index is out of bounds.
  873. func (tr *BTreeG[T]) DeleteAt(index int) (T, bool) {
  874. if tr.lock(true) {
  875. defer tr.unlock(true)
  876. }
  877. if tr.root == nil || index < 0 || index >= tr.count {
  878. return tr.empty, false
  879. }
  880. var pathbuf [8]uint8 // track the path
  881. path := pathbuf[:0]
  882. var item T
  883. n := tr.isoLoad(&tr.root, true)
  884. outer:
  885. for {
  886. n.count-- // optimistically update counts
  887. if n.leaf() {
  888. // the index is the item position
  889. item = n.items[index]
  890. if len(n.items) == tr.min {
  891. path = append(path, uint8(index))
  892. break outer
  893. }
  894. copy(n.items[index:], n.items[index+1:])
  895. n.items[len(n.items)-1] = tr.empty
  896. n.items = n.items[:len(n.items)-1]
  897. tr.count--
  898. if tr.count == 0 {
  899. tr.root = nil
  900. }
  901. return item, true
  902. }
  903. i := 0
  904. for ; i < len(n.items); i++ {
  905. if index < (*n.children)[i].count {
  906. break
  907. } else if index == (*n.children)[i].count {
  908. item = n.items[i]
  909. path = append(path, uint8(i))
  910. break outer
  911. }
  912. index -= (*n.children)[i].count + 1
  913. }
  914. path = append(path, uint8(i))
  915. n = tr.isoLoad(&(*n.children)[i], true)
  916. }
  917. // revert the counts
  918. var hint PathHint
  919. n = tr.root
  920. for i := 0; i < len(path); i++ {
  921. if i < len(hint.path) {
  922. hint.path[i] = uint8(path[i])
  923. hint.used[i] = true
  924. }
  925. n.count++
  926. if !n.leaf() {
  927. n = (*n.children)[uint8(path[i])]
  928. }
  929. }
  930. return tr.deleteHint(item, &hint)
  931. }
  932. // Height returns the height of the tree.
  933. // Returns zero if tree has no items.
  934. func (tr *BTreeG[T]) Height() int {
  935. if tr.lock(false) {
  936. defer tr.unlock(false)
  937. }
  938. var height int
  939. if tr.root != nil {
  940. n := tr.root
  941. for {
  942. height++
  943. if n.leaf() {
  944. break
  945. }
  946. n = (*n.children)[0]
  947. }
  948. }
  949. return height
  950. }
  951. // Walk iterates over all items in tree, in order.
  952. // The items param will contain one or more items.
  953. func (tr *BTreeG[T]) Walk(iter func(item []T) bool) {
  954. tr.walk(iter, false)
  955. }
  956. func (tr *BTreeG[T]) WalkMut(iter func(item []T) bool) {
  957. tr.walk(iter, true)
  958. }
  959. func (tr *BTreeG[T]) walk(iter func(item []T) bool, mut bool) {
  960. if tr.lock(mut) {
  961. defer tr.unlock(mut)
  962. }
  963. if tr.root == nil {
  964. return
  965. }
  966. tr.nodeWalk(&tr.root, iter, mut)
  967. }
  968. func (tr *BTreeG[T]) nodeWalk(cn **node[T], iter func(item []T) bool, mut bool,
  969. ) bool {
  970. n := tr.isoLoad(cn, mut)
  971. if n.leaf() {
  972. if !iter(n.items) {
  973. return false
  974. }
  975. } else {
  976. for i := 0; i < len(n.items); i++ {
  977. if !tr.nodeWalk(&(*n.children)[i], iter, mut) {
  978. return false
  979. }
  980. if !iter(n.items[i : i+1]) {
  981. return false
  982. }
  983. }
  984. if !tr.nodeWalk(&(*n.children)[len(n.items)], iter, mut) {
  985. return false
  986. }
  987. }
  988. return true
  989. }
  990. // Copy the tree. This is a copy-on-write operation and is very fast because
  991. // it only performs a shadowed copy.
  992. func (tr *BTreeG[T]) Copy() *BTreeG[T] {
  993. return tr.IsoCopy()
  994. }
  995. func (tr *BTreeG[T]) IsoCopy() *BTreeG[T] {
  996. if tr.lock(true) {
  997. defer tr.unlock(true)
  998. }
  999. tr.isoid = newIsoID()
  1000. tr2 := new(BTreeG[T])
  1001. *tr2 = *tr
  1002. tr2.mu = new(sync.RWMutex)
  1003. tr2.isoid = newIsoID()
  1004. return tr2
  1005. }
  1006. func (tr *BTreeG[T]) lock(write bool) bool {
  1007. if tr.locks {
  1008. if write {
  1009. tr.mu.Lock()
  1010. } else {
  1011. tr.mu.RLock()
  1012. }
  1013. }
  1014. return tr.locks
  1015. }
  1016. func (tr *BTreeG[T]) unlock(write bool) {
  1017. if write {
  1018. tr.mu.Unlock()
  1019. } else {
  1020. tr.mu.RUnlock()
  1021. }
  1022. }
  1023. // Iter represents an iterator
  1024. type IterG[T any] struct {
  1025. tr *BTreeG[T]
  1026. mut bool
  1027. locked bool
  1028. seeked bool
  1029. atstart bool
  1030. atend bool
  1031. stack []iterStackItemG[T]
  1032. item T
  1033. }
  1034. type iterStackItemG[T any] struct {
  1035. n *node[T]
  1036. i int
  1037. }
  1038. // Iter returns a read-only iterator.
  1039. // The Release method must be called finished with iterator.
  1040. func (tr *BTreeG[T]) Iter() IterG[T] {
  1041. return tr.iter(false)
  1042. }
  1043. func (tr *BTreeG[T]) IterMut() IterG[T] {
  1044. return tr.iter(true)
  1045. }
  1046. func (tr *BTreeG[T]) iter(mut bool) IterG[T] {
  1047. var iter IterG[T]
  1048. iter.tr = tr
  1049. iter.mut = mut
  1050. iter.locked = tr.lock(iter.mut)
  1051. return iter
  1052. }
  1053. // Seek to item greater-or-equal-to key.
  1054. // Returns false if there was no item found.
  1055. func (iter *IterG[T]) Seek(key T) bool {
  1056. if iter.tr == nil {
  1057. return false
  1058. }
  1059. iter.seeked = true
  1060. iter.stack = iter.stack[:0]
  1061. if iter.tr.root == nil {
  1062. return false
  1063. }
  1064. n := iter.tr.isoLoad(&iter.tr.root, iter.mut)
  1065. for {
  1066. i, found := iter.tr.find(n, key, nil, 0)
  1067. iter.stack = append(iter.stack, iterStackItemG[T]{n, i})
  1068. if found {
  1069. iter.item = n.items[i]
  1070. return true
  1071. }
  1072. if n.leaf() {
  1073. iter.stack[len(iter.stack)-1].i--
  1074. return iter.Next()
  1075. }
  1076. n = iter.tr.isoLoad(&(*n.children)[i], iter.mut)
  1077. }
  1078. }
  1079. // First moves iterator to first item in tree.
  1080. // Returns false if the tree is empty.
  1081. func (iter *IterG[T]) First() bool {
  1082. if iter.tr == nil {
  1083. return false
  1084. }
  1085. iter.atend = false
  1086. iter.atstart = false
  1087. iter.seeked = true
  1088. iter.stack = iter.stack[:0]
  1089. if iter.tr.root == nil {
  1090. return false
  1091. }
  1092. n := iter.tr.isoLoad(&iter.tr.root, iter.mut)
  1093. for {
  1094. iter.stack = append(iter.stack, iterStackItemG[T]{n, 0})
  1095. if n.leaf() {
  1096. break
  1097. }
  1098. n = iter.tr.isoLoad(&(*n.children)[0], iter.mut)
  1099. }
  1100. s := &iter.stack[len(iter.stack)-1]
  1101. iter.item = s.n.items[s.i]
  1102. return true
  1103. }
  1104. // Last moves iterator to last item in tree.
  1105. // Returns false if the tree is empty.
  1106. func (iter *IterG[T]) Last() bool {
  1107. if iter.tr == nil {
  1108. return false
  1109. }
  1110. iter.seeked = true
  1111. iter.stack = iter.stack[:0]
  1112. if iter.tr.root == nil {
  1113. return false
  1114. }
  1115. n := iter.tr.isoLoad(&iter.tr.root, iter.mut)
  1116. for {
  1117. iter.stack = append(iter.stack, iterStackItemG[T]{n, len(n.items)})
  1118. if n.leaf() {
  1119. iter.stack[len(iter.stack)-1].i--
  1120. break
  1121. }
  1122. n = iter.tr.isoLoad(&(*n.children)[len(n.items)], iter.mut)
  1123. }
  1124. s := &iter.stack[len(iter.stack)-1]
  1125. iter.item = s.n.items[s.i]
  1126. return true
  1127. }
  1128. // Release the iterator.
  1129. func (iter *IterG[T]) Release() {
  1130. if iter.tr == nil {
  1131. return
  1132. }
  1133. if iter.locked {
  1134. iter.tr.unlock(iter.mut)
  1135. iter.locked = false
  1136. }
  1137. iter.stack = nil
  1138. iter.tr = nil
  1139. }
  1140. // Next moves iterator to the next item in iterator.
  1141. // Returns false if the tree is empty or the iterator is at the end of
  1142. // the tree.
  1143. func (iter *IterG[T]) Next() bool {
  1144. if iter.tr == nil {
  1145. return false
  1146. }
  1147. if !iter.seeked {
  1148. return iter.First()
  1149. }
  1150. if len(iter.stack) == 0 {
  1151. if iter.atstart {
  1152. return iter.First() && iter.Next()
  1153. }
  1154. return false
  1155. }
  1156. s := &iter.stack[len(iter.stack)-1]
  1157. s.i++
  1158. if s.n.leaf() {
  1159. if s.i == len(s.n.items) {
  1160. for {
  1161. iter.stack = iter.stack[:len(iter.stack)-1]
  1162. if len(iter.stack) == 0 {
  1163. iter.atend = true
  1164. return false
  1165. }
  1166. s = &iter.stack[len(iter.stack)-1]
  1167. if s.i < len(s.n.items) {
  1168. break
  1169. }
  1170. }
  1171. }
  1172. } else {
  1173. n := iter.tr.isoLoad(&(*s.n.children)[s.i], iter.mut)
  1174. for {
  1175. iter.stack = append(iter.stack, iterStackItemG[T]{n, 0})
  1176. if n.leaf() {
  1177. break
  1178. }
  1179. n = iter.tr.isoLoad(&(*n.children)[0], iter.mut)
  1180. }
  1181. }
  1182. s = &iter.stack[len(iter.stack)-1]
  1183. iter.item = s.n.items[s.i]
  1184. return true
  1185. }
  1186. // Prev moves iterator to the previous item in iterator.
  1187. // Returns false if the tree is empty or the iterator is at the beginning of
  1188. // the tree.
  1189. func (iter *IterG[T]) Prev() bool {
  1190. if iter.tr == nil {
  1191. return false
  1192. }
  1193. if !iter.seeked {
  1194. return false
  1195. }
  1196. if len(iter.stack) == 0 {
  1197. if iter.atend {
  1198. return iter.Last() && iter.Prev()
  1199. }
  1200. return false
  1201. }
  1202. s := &iter.stack[len(iter.stack)-1]
  1203. if s.n.leaf() {
  1204. s.i--
  1205. if s.i == -1 {
  1206. for {
  1207. iter.stack = iter.stack[:len(iter.stack)-1]
  1208. if len(iter.stack) == 0 {
  1209. iter.atstart = true
  1210. return false
  1211. }
  1212. s = &iter.stack[len(iter.stack)-1]
  1213. s.i--
  1214. if s.i > -1 {
  1215. break
  1216. }
  1217. }
  1218. }
  1219. } else {
  1220. n := iter.tr.isoLoad(&(*s.n.children)[s.i], iter.mut)
  1221. for {
  1222. iter.stack = append(iter.stack, iterStackItemG[T]{n, len(n.items)})
  1223. if n.leaf() {
  1224. iter.stack[len(iter.stack)-1].i--
  1225. break
  1226. }
  1227. n = iter.tr.isoLoad(&(*n.children)[len(n.items)], iter.mut)
  1228. }
  1229. }
  1230. s = &iter.stack[len(iter.stack)-1]
  1231. iter.item = s.n.items[s.i]
  1232. return true
  1233. }
  1234. // Item returns the current iterator item.
  1235. func (iter *IterG[T]) Item() T {
  1236. return iter.item
  1237. }
  1238. // Items returns all the items in order.
  1239. func (tr *BTreeG[T]) Items() []T {
  1240. return tr.items(false)
  1241. }
  1242. func (tr *BTreeG[T]) ItemsMut() []T {
  1243. return tr.items(true)
  1244. }
  1245. func (tr *BTreeG[T]) items(mut bool) []T {
  1246. if tr.lock(mut) {
  1247. defer tr.unlock(mut)
  1248. }
  1249. items := make([]T, 0, tr.Len())
  1250. if tr.root != nil {
  1251. items = tr.nodeItems(&tr.root, items, mut)
  1252. }
  1253. return items
  1254. }
  1255. func (tr *BTreeG[T]) nodeItems(cn **node[T], items []T, mut bool) []T {
  1256. n := tr.isoLoad(cn, mut)
  1257. if n.leaf() {
  1258. return append(items, n.items...)
  1259. }
  1260. for i := 0; i < len(n.items); i++ {
  1261. items = tr.nodeItems(&(*n.children)[i], items, mut)
  1262. items = append(items, n.items[i])
  1263. }
  1264. return tr.nodeItems(&(*n.children)[len(*n.children)-1], items, mut)
  1265. }
  1266. // Clear will delete all items.
  1267. func (tr *BTreeG[T]) Clear() {
  1268. if tr.lock(true) {
  1269. defer tr.unlock(true)
  1270. }
  1271. tr.root = nil
  1272. tr.count = 0
  1273. }
  1274. // Generic BTree
  1275. //
  1276. // Deprecated: use BTreeG
  1277. type Generic[T any] struct {
  1278. *BTreeG[T]
  1279. }
  1280. // NewGeneric returns a generic BTree
  1281. //
  1282. // Deprecated: use NewBTreeG
  1283. func NewGeneric[T any](less func(a, b T) bool) *Generic[T] {
  1284. return &Generic[T]{NewBTreeGOptions(less, Options{})}
  1285. }
  1286. // NewGenericOptions returns a generic BTree
  1287. //
  1288. // Deprecated: use NewBTreeGOptions
  1289. func NewGenericOptions[T any](less func(a, b T) bool, opts Options,
  1290. ) *Generic[T] {
  1291. return &Generic[T]{NewBTreeGOptions(less, opts)}
  1292. }
  1293. func (tr *Generic[T]) Copy() *Generic[T] {
  1294. return &Generic[T]{tr.BTreeG.Copy()}
  1295. }