Source code of Windows XP (NT5)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

960 lines
25 KiB

  1. #pragma once
  2. #ifndef _STLTREE_H_
  3. #define _STLTREE_H_
  4. //#include <cstddef>
  5. //#include <iterator>
  6. //#include <memory>
  7. //#include <xutility>
  8. #include <stddef.h>
  9. #include <stliter.h>
  10. #include <stlmem.h>
  11. #include <stlxutil.h>
  12. #ifdef _MSC_VER
  13. #pragma pack(push,8)
  14. #endif /* _MSC_VER */
  15. _STD_BEGIN
  16. // TEMPLATE CLASS _Tree
  17. template<class _K, class _Ty, class _Kfn, class _Pr, class _A>
  18. class _Tree
  19. {
  20. protected:
  21. typedef _POINTER_X(void, _A) _Genptr;
  22. enum _Redbl
  23. {
  24. _Red, _Black
  25. };
  26. struct _Node;
  27. friend struct _Node;
  28. struct _Node
  29. {
  30. _Genptr _Left, _Parent, _Right;
  31. _Ty _Value;
  32. _Redbl _Color;
  33. };
  34. typedef _POINTER_X(_Node, _A) _Nodeptr;
  35. typedef _REFERENCE_X(_Nodeptr, _A) _Nodepref;
  36. typedef _REFERENCE_X(const _K, _A) _Keyref;
  37. typedef _REFERENCE_X(_Redbl, _A) _Rbref;
  38. typedef _REFERENCE_X(_Ty, _A) _Vref;
  39. static _Rbref _Color(_Nodeptr _P)
  40. {
  41. return ((_Rbref)(*_P)._Color);
  42. }
  43. static _Keyref _Key(_Nodeptr _P)
  44. {
  45. return (_Kfn()(_Value(_P)));
  46. }
  47. static _Nodepref _Left(_Nodeptr _P)
  48. {
  49. return ((_Nodepref)(*_P)._Left);
  50. }
  51. static _Nodepref _Parent(_Nodeptr _P)
  52. {
  53. return ((_Nodepref)(*_P)._Parent);
  54. }
  55. static _Nodepref _Right(_Nodeptr _P)
  56. {
  57. return ((_Nodepref)(*_P)._Right);
  58. }
  59. static _Vref _Value(_Nodeptr _P)
  60. {
  61. return ((_Vref)(*_P)._Value);
  62. }
  63. public:
  64. typedef _Tree<_K, _Ty, _Kfn, _Pr, _A> _Myt;
  65. typedef _K key_type;
  66. typedef _Ty value_type;
  67. typedef _A::size_type size_type;
  68. typedef _A::difference_type difference_type;
  69. typedef _POINTER_X(_Ty, _A) _Tptr;
  70. typedef _POINTER_X(const _Ty, _A) _Ctptr;
  71. typedef _REFERENCE_X(_Ty, _A) reference;
  72. typedef _REFERENCE_X(const _Ty, _A) const_reference;
  73. // CLASS iterator
  74. class iterator;
  75. friend class iterator;
  76. class iterator : public _Bidit<_Ty, difference_type>
  77. {
  78. public:
  79. iterator()
  80. {
  81. }
  82. iterator(_Nodeptr _P) : _Ptr(_P)
  83. {
  84. }
  85. reference operator*() const
  86. {
  87. return (_Value(_Ptr));
  88. }
  89. _Tptr operator->() const
  90. {
  91. return (&**this);
  92. }
  93. iterator& operator++()
  94. {
  95. _Inc();
  96. return (*this);
  97. }
  98. iterator operator++(int)
  99. {
  100. iterator _Tmp = *this;
  101. ++*this;
  102. return (_Tmp);
  103. }
  104. iterator& operator--()
  105. {
  106. _Dec();
  107. return (*this);
  108. }
  109. iterator operator--(int)
  110. {
  111. iterator _Tmp = *this;
  112. --*this;
  113. return (_Tmp);
  114. }
  115. bool operator==(const iterator& _X) const
  116. {
  117. return (_Ptr == _X._Ptr);
  118. }
  119. bool operator!=(const iterator& _X) const
  120. {
  121. return (!(*this == _X));
  122. }
  123. void _Dec()
  124. {
  125. //_Lockit _Lk;
  126. if (_Color(_Ptr) == _Red
  127. && _Parent(_Parent(_Ptr)) == _Ptr)
  128. _Ptr = _Right(_Ptr);
  129. else if (_Left(_Ptr) != _Nil)
  130. _Ptr = _Max(_Left(_Ptr));
  131. else
  132. {
  133. _Nodeptr _P;
  134. while (_Ptr == _Left(_P = _Parent(_Ptr)))
  135. _Ptr = _P;
  136. _Ptr = _P;
  137. }
  138. }
  139. void _Inc()
  140. {
  141. //_Lockit _Lk;
  142. if (_Right(_Ptr) != _Nil)
  143. _Ptr = _Min(_Right(_Ptr));
  144. else
  145. {
  146. _Nodeptr _P;
  147. while (_Ptr == _Right(_P = _Parent(_Ptr)))
  148. _Ptr = _P;
  149. if (_Right(_Ptr) != _P)
  150. _Ptr = _P;
  151. }
  152. }
  153. _Nodeptr _Mynode() const
  154. {
  155. return (_Ptr);
  156. }
  157. protected:
  158. _Nodeptr _Ptr;
  159. };
  160. // CLASS const_iterator
  161. class const_iterator;
  162. friend class const_iterator;
  163. class const_iterator : public iterator
  164. {
  165. public:
  166. const_iterator()
  167. {
  168. }
  169. const_iterator(_Nodeptr _P)
  170. : iterator(_P)
  171. {
  172. }
  173. const_iterator(const iterator& _X)
  174. : iterator(_X)
  175. {
  176. }
  177. const_reference operator*() const
  178. {
  179. return (_Value(_Ptr));
  180. }
  181. _Ctptr operator->() const
  182. {
  183. return (&**this);
  184. }
  185. const_iterator& operator++()
  186. {
  187. _Inc();
  188. return (*this);
  189. }
  190. const_iterator operator++(int)
  191. {
  192. iterator _Tmp = *this;
  193. ++*this;
  194. return (_Tmp);
  195. }
  196. const_iterator& operator--()
  197. {
  198. _Dec();
  199. return (*this);
  200. }
  201. const_iterator operator--(int)
  202. {
  203. iterator _Tmp = *this;
  204. --*this;
  205. return (_Tmp);
  206. }
  207. bool operator==(const const_iterator& _X) const
  208. {
  209. return (_Ptr == _X._Ptr);
  210. }
  211. bool operator!=(const const_iterator& _X) const
  212. {
  213. return (!(*this == _X));
  214. }
  215. };
  216. typedef reverse_bidirectional_iterator<iterator,
  217. value_type, reference, _Tptr, difference_type>
  218. reverse_iterator;
  219. typedef reverse_bidirectional_iterator<const_iterator,
  220. value_type, const_reference, _Ctptr, difference_type>
  221. const_reverse_iterator;
  222. typedef pair<iterator, bool> _Pairib;
  223. typedef pair<iterator, iterator> _Pairii;
  224. typedef pair<const_iterator, const_iterator> _Paircc;
  225. explicit _Tree(const _Pr& _Parg, bool _Marg = true,
  226. const _A& _Al = _A())
  227. : allocator(_Al),
  228. key_compare(_Parg), _Multi(_Marg)
  229. {
  230. _Init();
  231. }
  232. _Tree(const _Ty *_F, const _Ty *_L,
  233. const _Pr& _Parg, bool _Marg = true,
  234. const _A& _Al = _A())
  235. : allocator(_Al),
  236. key_compare(_Parg), _Multi(_Marg)
  237. {
  238. _Init();
  239. insert(_F, _L);
  240. }
  241. _Tree(const _Myt& _X)
  242. : allocator(_X.allocator),
  243. key_compare(_X.key_compare), _Multi(_X._Multi)
  244. {
  245. _Init();
  246. _Copy(_X);
  247. }
  248. ~_Tree()
  249. {
  250. erase(begin(), end());
  251. _Freenode(_Head);
  252. _Head = 0, _Size = 0;
  253. {
  254. //_Lockit _Lk;
  255. if (--_Nilrefs == 0)
  256. {
  257. _Freenode(_Nil);
  258. _Nil = 0;
  259. }
  260. }
  261. }
  262. _Myt& operator=(const _Myt& _X)
  263. {
  264. if (this != &_X)
  265. {
  266. erase(begin(), end());
  267. key_compare = _X.key_compare;
  268. _Copy(_X);
  269. }
  270. return (*this);
  271. }
  272. iterator begin()
  273. {
  274. return (iterator(_Lmost()));
  275. }
  276. const_iterator begin() const
  277. {
  278. return (const_iterator(_Lmost()));
  279. }
  280. iterator end()
  281. {
  282. return (iterator(_Head));
  283. }
  284. const_iterator end() const
  285. {
  286. return (const_iterator(_Head));
  287. }
  288. reverse_iterator rbegin()
  289. {
  290. return (reverse_iterator(end()));
  291. }
  292. const_reverse_iterator rbegin() const
  293. {
  294. return (const_reverse_iterator(end()));
  295. }
  296. reverse_iterator rend()
  297. {
  298. return (reverse_iterator(begin()));
  299. }
  300. const_reverse_iterator rend() const
  301. {
  302. return (const_reverse_iterator(begin()));
  303. }
  304. size_type size() const
  305. {
  306. return (_Size);
  307. }
  308. size_type max_size() const
  309. {
  310. return (allocator.max_size());
  311. }
  312. bool empty() const
  313. {
  314. return (size() == 0);
  315. }
  316. _A get_allocator() const
  317. {
  318. return (allocator);
  319. }
  320. _Pr key_comp() const
  321. {
  322. return (key_compare);
  323. }
  324. _Pairib insert(const value_type& _V)
  325. {
  326. _Nodeptr _X = _Root();
  327. _Nodeptr _Y = _Head;
  328. bool _Ans = true;
  329. {
  330. //_Lockit Lk;
  331. while (_X != _Nil)
  332. {
  333. _Y = _X;
  334. _Ans = key_compare(_Kfn()(_V), _Key(_X));
  335. _X = _Ans ? _Left(_X) : _Right(_X);
  336. }
  337. }
  338. if (_Multi)
  339. return (_Pairib(_Insert(_X, _Y, _V), true));
  340. iterator _P = iterator(_Y);
  341. if (!_Ans)
  342. ;
  343. else if (_P == begin())
  344. return (_Pairib(_Insert(_X, _Y, _V), true));
  345. else
  346. --_P;
  347. if (key_compare(_Key(_P._Mynode()), _Kfn()(_V)))
  348. return (_Pairib(_Insert(_X, _Y, _V), true));
  349. return (_Pairib(_P, false));
  350. }
  351. iterator insert(iterator _P, const value_type& _V)
  352. {
  353. if (size() == 0)
  354. ;
  355. else if (_P == begin())
  356. {
  357. if (key_compare(_Kfn()(_V), _Key(_P._Mynode())))
  358. return (_Insert(_Head, _P._Mynode(), _V));
  359. }
  360. else if (_P == end())
  361. {
  362. //_Lockit Lk;
  363. if (key_compare(_Key(_Rmost()), _Kfn()(_V)))
  364. return (_Insert(_Nil, _Rmost(), _V));
  365. }
  366. else
  367. {
  368. iterator _Pb = _P;
  369. if (key_compare(_Key((--_Pb)._Mynode()), _Kfn()(_V))
  370. && key_compare(_Kfn()(_V), _Key(_P._Mynode())))
  371. {
  372. //_Lockit _Lk;
  373. if (_Right(_Pb._Mynode()) == _Nil)
  374. return (_Insert(_Nil, _Pb._Mynode(), _V));
  375. else
  376. return (_Insert(_Head, _P._Mynode(), _V));
  377. }
  378. }
  379. return (insert(_V).first);
  380. }
  381. void insert(iterator _F, iterator _L)
  382. {
  383. for (; _F != _L; ++_F)
  384. insert(*_F);
  385. }
  386. void insert(const value_type *_F, const value_type *_L)
  387. {
  388. for (; _F != _L; ++_F)
  389. insert(*_F);
  390. }
  391. iterator erase(iterator _P)
  392. {
  393. _Nodeptr _X;
  394. _Nodeptr _Y = (_P++)._Mynode();
  395. _Nodeptr _Z = _Y;
  396. //_Lockit _Lk;
  397. if (_Left(_Y) == _Nil)
  398. _X = _Right(_Y);
  399. else if (_Right(_Y) == _Nil)
  400. _X = _Left(_Y);
  401. else
  402. _Y = _Min(_Right(_Y)), _X = _Right(_Y);
  403. if (_Y != _Z)
  404. {
  405. _Parent(_Left(_Z)) = _Y;
  406. _Left(_Y) = _Left(_Z);
  407. if (_Y == _Right(_Z))
  408. _Parent(_X) = _Y;
  409. else
  410. {
  411. _Parent(_X) = _Parent(_Y);
  412. _Left(_Parent(_Y)) = _X;
  413. _Right(_Y) = _Right(_Z);
  414. _Parent(_Right(_Z)) = _Y;
  415. }
  416. if (_Root() == _Z)
  417. _Root() = _Y;
  418. else if (_Left(_Parent(_Z)) == _Z)
  419. _Left(_Parent(_Z)) = _Y;
  420. else
  421. _Right(_Parent(_Z)) = _Y;
  422. _Parent(_Y) = _Parent(_Z);
  423. std::swap(_Color(_Y), _Color(_Z));
  424. _Y = _Z;
  425. }
  426. else
  427. {
  428. _Parent(_X) = _Parent(_Y);
  429. if (_Root() == _Z)
  430. _Root() = _X;
  431. else if (_Left(_Parent(_Z)) == _Z)
  432. _Left(_Parent(_Z)) = _X;
  433. else
  434. _Right(_Parent(_Z)) = _X;
  435. if (_Lmost() != _Z)
  436. ;
  437. else if (_Right(_Z) == _Nil)
  438. _Lmost() = _Parent(_Z);
  439. else
  440. _Lmost() = _Min(_X);
  441. if (_Rmost() != _Z)
  442. ;
  443. else if (_Left(_Z) == _Nil)
  444. _Rmost() = _Parent(_Z);
  445. else
  446. _Rmost() = _Max(_X);
  447. }
  448. if (_Color(_Y) == _Black)
  449. {
  450. while (_X != _Root() && _Color(_X) == _Black)
  451. if (_X == _Left(_Parent(_X)))
  452. {
  453. _Nodeptr _W = _Right(_Parent(_X));
  454. if (_Color(_W) == _Red)
  455. {
  456. _Color(_W) = _Black;
  457. _Color(_Parent(_X)) = _Red;
  458. _Lrotate(_Parent(_X));
  459. _W = _Right(_Parent(_X));
  460. }
  461. if (_Color(_Left(_W)) == _Black
  462. && _Color(_Right(_W)) == _Black)
  463. {
  464. _Color(_W) = _Red;
  465. _X = _Parent(_X);
  466. }
  467. else
  468. {
  469. if (_Color(_Right(_W)) == _Black)
  470. {
  471. _Color(_Left(_W)) = _Black;
  472. _Color(_W) = _Red;
  473. _Rrotate(_W);
  474. _W = _Right(_Parent(_X));
  475. }
  476. _Color(_W) = _Color(_Parent(_X));
  477. _Color(_Parent(_X)) = _Black;
  478. _Color(_Right(_W)) = _Black;
  479. _Lrotate(_Parent(_X));
  480. break;
  481. }
  482. }
  483. else
  484. {
  485. _Nodeptr _W = _Left(_Parent(_X));
  486. if (_Color(_W) == _Red)
  487. {
  488. _Color(_W) = _Black;
  489. _Color(_Parent(_X)) = _Red;
  490. _Rrotate(_Parent(_X));
  491. _W = _Left(_Parent(_X));
  492. }
  493. if (_Color(_Right(_W)) == _Black
  494. && _Color(_Left(_W)) == _Black)
  495. {
  496. _Color(_W) = _Red;
  497. _X = _Parent(_X);
  498. }
  499. else
  500. {
  501. if (_Color(_Left(_W)) == _Black)
  502. {
  503. _Color(_Right(_W)) = _Black;
  504. _Color(_W) = _Red;
  505. _Lrotate(_W);
  506. _W = _Left(_Parent(_X));
  507. }
  508. _Color(_W) = _Color(_Parent(_X));
  509. _Color(_Parent(_X)) = _Black;
  510. _Color(_Left(_W)) = _Black;
  511. _Rrotate(_Parent(_X));
  512. break;
  513. }
  514. }
  515. _Color(_X) = _Black;
  516. }
  517. _Destval(&_Value(_Y));
  518. _Freenode(_Y);
  519. --_Size;
  520. return (_P);
  521. }
  522. iterator erase(iterator _F, iterator _L)
  523. {
  524. if (size() == 0 || _F != begin() || _L != end())
  525. {
  526. while (_F != _L)
  527. erase(_F++);
  528. return (_F);
  529. }
  530. else
  531. {
  532. //_Lockit Lk;
  533. _Erase(_Root());
  534. _Root() = _Nil, _Size = 0;
  535. _Lmost() = _Head, _Rmost() = _Head;
  536. return (begin());
  537. }
  538. }
  539. size_type erase(const _K& _X)
  540. {
  541. _Pairii _P = equal_range(_X);
  542. size_type _N = 0;
  543. _Distance(_P.first, _P.second, _N);
  544. erase(_P.first, _P.second);
  545. return (_N);
  546. }
  547. void erase(const _K *_F, const _K *_L)
  548. {
  549. for (; _F != _L; ++_F)
  550. erase(*_F);
  551. }
  552. void clear()
  553. {
  554. erase(begin(), end());
  555. }
  556. iterator find(const _K& _Kv)
  557. {
  558. iterator _P = lower_bound(_Kv);
  559. return (_P == end()
  560. || key_compare(_Kv, _Key(_P._Mynode()))
  561. ? end() : _P);
  562. }
  563. const_iterator find(const _K& _Kv) const
  564. {
  565. const_iterator _P = lower_bound(_Kv);
  566. return (_P == end()
  567. || key_compare(_Kv, _Key(_P._Mynode()))
  568. ? end() : _P);
  569. }
  570. size_type count(const _K& _Kv) const
  571. {
  572. _Paircc _Ans = equal_range(_Kv);
  573. size_type _N = 0;
  574. _Distance(_Ans.first, _Ans.second, _N);
  575. return (_N);
  576. }
  577. iterator lower_bound(const _K& _Kv)
  578. {
  579. return (iterator(_Lbound(_Kv)));
  580. }
  581. const_iterator lower_bound(const _K& _Kv) const
  582. {
  583. return (const_iterator(_Lbound(_Kv)));
  584. }
  585. iterator upper_bound(const _K& _Kv)
  586. {
  587. return (iterator(_Ubound(_Kv)));
  588. }
  589. const_iterator upper_bound(const _K& _Kv) const
  590. {
  591. return (iterator(_Ubound(_Kv)));
  592. }
  593. _Pairii equal_range(const _K& _Kv)
  594. {
  595. return (_Pairii(lower_bound(_Kv), upper_bound(_Kv)));
  596. }
  597. _Paircc equal_range(const _K& _Kv) const
  598. {
  599. return (_Paircc(lower_bound(_Kv), upper_bound(_Kv)));
  600. }
  601. void swap(_Myt& _X)
  602. {
  603. std::swap(key_compare, _X.key_compare);
  604. if (allocator == _X.allocator)
  605. {
  606. std::swap(_Head, _X._Head);
  607. std::swap(_Multi, _X._Multi);
  608. std::swap(_Size, _X._Size);
  609. }
  610. else
  611. {
  612. _Myt _Ts = *this; *this = _X, _X = _Ts;
  613. }
  614. }
  615. friend void swap(_Myt& _X, _Myt& _Y)
  616. {
  617. _X.swap(_Y);
  618. }
  619. protected:
  620. static _Nodeptr _Nil;
  621. static size_t _Nilrefs;
  622. void _Copy(const _Myt& _X)
  623. {
  624. //_Lockit _Lk;
  625. _Root() = _Copy(_X._Root(), _Head);
  626. _Size = _X.size();
  627. if (_Root() != _Nil)
  628. {
  629. _Lmost() = _Min(_Root());
  630. _Rmost() = _Max(_Root());
  631. }
  632. else
  633. _Lmost() = _Head, _Rmost() = _Head;
  634. }
  635. _Nodeptr _Copy(_Nodeptr _X, _Nodeptr _P)
  636. {
  637. //_Lockit _Lk;
  638. _Nodeptr _R = _X;
  639. for (; _X != _Nil; _X = _Left(_X))
  640. {
  641. _Nodeptr _Y = _Buynode(_P, _Color(_X));
  642. if (_R == _X)
  643. _R = _Y;
  644. _Right(_Y) = _Copy(_Right(_X), _Y);
  645. _Consval(&_Value(_Y), _Value(_X));
  646. _Left(_P) = _Y;
  647. _P = _Y;
  648. }
  649. _Left(_P) = _Nil;
  650. return (_R);
  651. }
  652. void _Erase(_Nodeptr _X)
  653. {
  654. //_Lockit _Lk;
  655. for (_Nodeptr _Y = _X; _Y != _Nil; _X = _Y)
  656. {
  657. _Erase(_Right(_Y));
  658. _Y = _Left(_Y);
  659. _Destval(&_Value(_X));
  660. _Freenode(_X);
  661. }
  662. }
  663. void _Init()
  664. {
  665. //_Lockit _Lk;
  666. if (_Nil == 0)
  667. {
  668. _Nil = _Buynode(0, _Black);
  669. _Left(_Nil) = 0, _Right(_Nil) = 0;
  670. }
  671. ++_Nilrefs;
  672. _Head = _Buynode(_Nil, _Red), _Size = 0;
  673. _Lmost() = _Head, _Rmost() = _Head;
  674. }
  675. iterator _Insert(_Nodeptr _X, _Nodeptr _Y, const _Ty& _V)
  676. {
  677. //_Lockit _Lk;
  678. _Nodeptr _Z = _Buynode(_Y, _Red);
  679. _Left(_Z) = _Nil, _Right(_Z) = _Nil;
  680. _Consval(&_Value(_Z), _V);
  681. ++_Size;
  682. if (_Y == _Head || _X != _Nil
  683. || key_compare(_Kfn()(_V), _Key(_Y)))
  684. {
  685. _Left(_Y) = _Z;
  686. if (_Y == _Head)
  687. {
  688. _Root() = _Z;
  689. _Rmost() = _Z;
  690. }
  691. else if (_Y == _Lmost())
  692. _Lmost() = _Z;
  693. }
  694. else
  695. {
  696. _Right(_Y) = _Z;
  697. if (_Y == _Rmost())
  698. _Rmost() = _Z;
  699. }
  700. for (_X = _Z; _X != _Root()
  701. && _Color(_Parent(_X)) == _Red; )
  702. if (_Parent(_X) == _Left(_Parent(_Parent(_X))))
  703. {
  704. _Y = _Right(_Parent(_Parent(_X)));
  705. if (_Color(_Y) == _Red)
  706. {
  707. _Color(_Parent(_X)) = _Black;
  708. _Color(_Y) = _Black;
  709. _Color(_Parent(_Parent(_X))) = _Red;
  710. _X = _Parent(_Parent(_X));
  711. }
  712. else
  713. {
  714. if (_X == _Right(_Parent(_X)))
  715. {
  716. _X = _Parent(_X);
  717. _Lrotate(_X);
  718. }
  719. _Color(_Parent(_X)) = _Black;
  720. _Color(_Parent(_Parent(_X))) = _Red;
  721. _Rrotate(_Parent(_Parent(_X)));
  722. }
  723. }
  724. else
  725. {
  726. _Y = _Left(_Parent(_Parent(_X)));
  727. if (_Color(_Y) == _Red)
  728. {
  729. _Color(_Parent(_X)) = _Black;
  730. _Color(_Y) = _Black;
  731. _Color(_Parent(_Parent(_X))) = _Red;
  732. _X = _Parent(_Parent(_X));
  733. }
  734. else
  735. {
  736. if (_X == _Left(_Parent(_X)))
  737. {
  738. _X = _Parent(_X);
  739. _Rrotate(_X);
  740. }
  741. _Color(_Parent(_X)) = _Black;
  742. _Color(_Parent(_Parent(_X))) = _Red;
  743. _Lrotate(_Parent(_Parent(_X)));
  744. }
  745. }
  746. _Color(_Root()) = _Black;
  747. return (iterator(_Z));
  748. }
  749. _Nodeptr _Lbound(const _K& _Kv) const
  750. {
  751. //_Lockit _Lk;
  752. _Nodeptr _X = _Root();
  753. _Nodeptr _Y = _Head;
  754. while (_X != _Nil)
  755. if (key_compare(_Key(_X), _Kv))
  756. _X = _Right(_X);
  757. else
  758. _Y = _X, _X = _Left(_X);
  759. return (_Y);
  760. }
  761. _Nodeptr& _Lmost()
  762. {
  763. return (_Left(_Head));
  764. }
  765. _Nodeptr& _Lmost() const
  766. {
  767. return (_Left(_Head));
  768. }
  769. void _Lrotate(_Nodeptr _X)
  770. {
  771. //_Lockit _Lk;
  772. _Nodeptr _Y = _Right(_X);
  773. _Right(_X) = _Left(_Y);
  774. if (_Left(_Y) != _Nil)
  775. _Parent(_Left(_Y)) = _X;
  776. _Parent(_Y) = _Parent(_X);
  777. if (_X == _Root())
  778. _Root() = _Y;
  779. else if (_X == _Left(_Parent(_X)))
  780. _Left(_Parent(_X)) = _Y;
  781. else
  782. _Right(_Parent(_X)) = _Y;
  783. _Left(_Y) = _X;
  784. _Parent(_X) = _Y;
  785. }
  786. static _Nodeptr _Max(_Nodeptr _P)
  787. {
  788. //_Lockit _Lk;
  789. while (_Right(_P) != _Nil)
  790. _P = _Right(_P);
  791. return (_P);
  792. }
  793. static _Nodeptr _Min(_Nodeptr _P)
  794. {
  795. //_Lockit _Lk;
  796. while (_Left(_P) != _Nil)
  797. _P = _Left(_P);
  798. return (_P);
  799. }
  800. _Nodeptr& _Rmost()
  801. {
  802. return (_Right(_Head));
  803. }
  804. _Nodeptr& _Rmost() const
  805. {
  806. return (_Right(_Head));
  807. }
  808. _Nodeptr& _Root()
  809. {
  810. return (_Parent(_Head));
  811. }
  812. _Nodeptr& _Root() const
  813. {
  814. return (_Parent(_Head));
  815. }
  816. void _Rrotate(_Nodeptr _X)
  817. {
  818. //_Lockit _Lk;
  819. _Nodeptr _Y = _Left(_X);
  820. _Left(_X) = _Right(_Y);
  821. if (_Right(_Y) != _Nil)
  822. _Parent(_Right(_Y)) = _X;
  823. _Parent(_Y) = _Parent(_X);
  824. if (_X == _Root())
  825. _Root() = _Y;
  826. else if (_X == _Right(_Parent(_X)))
  827. _Right(_Parent(_X)) = _Y;
  828. else
  829. _Left(_Parent(_X)) = _Y;
  830. _Right(_Y) = _X;
  831. _Parent(_X) = _Y;
  832. }
  833. _Nodeptr _Ubound(const _K& _Kv) const
  834. {
  835. //_Lockit _Lk;
  836. _Nodeptr _X = _Root();
  837. _Nodeptr _Y = _Head;
  838. while (_X != _Nil)
  839. if (key_compare(_Kv, _Key(_X)))
  840. _Y = _X, _X = _Left(_X);
  841. else
  842. _X = _Right(_X);
  843. return (_Y);
  844. }
  845. _Nodeptr _Buynode(_Nodeptr _Parg, _Redbl _Carg)
  846. {
  847. _Nodeptr _S = (_Nodeptr)allocator._Charalloc(
  848. 1 * sizeof (_Node));
  849. _Parent(_S) = _Parg;
  850. _Color(_S) = _Carg;
  851. return (_S);
  852. }
  853. void _Consval(_Tptr _P, const _Ty& _V)
  854. {
  855. _Construct(&*_P, _V);
  856. }
  857. void _Destval(_Tptr _P)
  858. {
  859. _Destroy(&*_P);
  860. }
  861. void _Freenode(_Nodeptr _S)
  862. {
  863. allocator.deallocate(_S, 1);
  864. }
  865. _A allocator;
  866. _Pr key_compare;
  867. _Nodeptr _Head;
  868. bool _Multi;
  869. size_type _Size;
  870. };
  871. template<class _K, class _Ty, class _Kfn, class _Pr, class _A>
  872. _Tree<_K, _Ty, _Kfn, _Pr, _A>::_Nodeptr
  873. _Tree<_K, _Ty, _Kfn, _Pr, _A>::_Nil = 0;
  874. template<class _K, class _Ty, class _Kfn, class _Pr, class _A>
  875. size_t _Tree<_K, _Ty, _Kfn, _Pr, _A>::_Nilrefs = 0;
  876. // tree TEMPLATE OPERATORS
  877. template<class _K, class _Ty, class _Kfn,
  878. class _Pr, class _A> inline
  879. bool operator==(const _Tree<_K, _Ty, _Kfn, _Pr, _A>& _X,
  880. const _Tree<_K, _Ty, _Kfn, _Pr, _A>& _Y)
  881. {
  882. return (_X.size() == _Y.size()
  883. && equal(_X.begin(), _X.end(), _Y.begin()));
  884. }
  885. template<class _K, class _Ty, class _Kfn,
  886. class _Pr, class _A> inline
  887. bool operator!=(const _Tree<_K, _Ty, _Kfn, _Pr, _A>& _X,
  888. const _Tree<_K, _Ty, _Kfn, _Pr, _A>& _Y)
  889. {
  890. return (!(_X == _Y));
  891. }
  892. template<class _K, class _Ty, class _Kfn,
  893. class _Pr, class _A> inline
  894. bool operator<(const _Tree<_K, _Ty, _Kfn, _Pr, _A>& _X,
  895. const _Tree<_K, _Ty, _Kfn, _Pr, _A>& _Y)
  896. {
  897. return (lexicographical_compare(_X.begin(), _X.end(),
  898. _Y.begin(), _Y.end()));
  899. }
  900. template<class _K, class _Ty, class _Kfn,
  901. class _Pr, class _A> inline
  902. bool operator>(const _Tree<_K, _Ty, _Kfn, _Pr, _A>& _X,
  903. const _Tree<_K, _Ty, _Kfn, _Pr, _A>& _Y)
  904. {
  905. return (_Y < _X);
  906. }
  907. template<class _K, class _Ty, class _Kfn,
  908. class _Pr, class _A> inline
  909. bool operator<=(const _Tree<_K, _Ty, _Kfn, _Pr, _A>& _X,
  910. const _Tree<_K, _Ty, _Kfn, _Pr, _A>& _Y)
  911. {
  912. return (!(_Y < _X));
  913. }
  914. template<class _K, class _Ty, class _Kfn,
  915. class _Pr, class _A> inline
  916. bool operator>=(const _Tree<_K, _Ty, _Kfn, _Pr, _A>& _X,
  917. const _Tree<_K, _Ty, _Kfn, _Pr, _A>& _Y)
  918. {
  919. return (!(_X < _Y));
  920. }
  921. _STD_END
  922. #ifdef _MSC_VER
  923. #pragma pack(pop)
  924. #endif /* _MSC_VER */
  925. #endif /* _STLTREE_H_ */
  926. /*
  927. * Copyright (c) 1995 by P.J. Plauger. ALL RIGHTS RESERVED.
  928. * Consult your license regarding permissions and restrictions.
  929. */
  930. /*
  931. * This file is derived from software bearing the following
  932. * restrictions:
  933. *
  934. * Copyright (c) 1994
  935. * Hewlett-Packard Company
  936. *
  937. * Permission to use, copy, modify, distribute and sell this
  938. * software and its documentation for any purpose is hereby
  939. * granted without fee, provided that the above copyright notice
  940. * appear in all copies and that both that copyright notice and
  941. * this permission notice appear in supporting documentation.
  942. * Hewlett-Packard Company makes no representations about the
  943. * suitability of this software for any purpose. It is provided
  944. * "as is" without express or implied warranty.
  945. */