home *** CD-ROM | disk | FTP | other *** search
/ PC World 2000 February / PCWorld_2000-02_cd.bin / Software / TemaCD / tcvpa / data1.cab / MyFileGroup / INCLUDE / Cltn.hpp < prev    next >
C/C++ Source or Header  |  1999-06-03  |  37KB  |  1,257 lines

  1. #ifndef _INC_CLTN_HPP
  2. #define _INC_CLTN_HPP
  3. template <class K, class V> class TC_TPtrMap;
  4. template <class K, class V> class TC_TPtrMapIter;
  5.  
  6. // **********************************************************************
  7. class TC_COREEX_EXPORT TC_CPtrMap 
  8. {
  9.  
  10. // **********************************************************************
  11. public: 
  12. struct Pair 
  13. {
  14. public:  void * m_Key ;
  15. public:  void * m_Val ;
  16. public:   Pair ( void * key, void * val) 
  17. {
  18. m_Key = key;
  19. m_Val = val;
  20. } // end of func
  21. // **********************************************************************
  22.  
  23.  
  24. }; // end of class Pair
  25.  
  26. // **********************************************************************
  27. typedef TC_TArrayPTR <Pair> SrtCltn;
  28. protected:  SrtCltn m_Cltn ;
  29. protected:  TCCmpFunc m_CmpFunc ;
  30. protected:  int m_CurPos ;
  31. protected:  void * GetKey (int idx)  ;
  32. protected:  void * GetVal (int idx)  ;
  33. protected:  void * DoSearch (void * searchKey, int &pos)  ;
  34. public:   TC_CPtrMap (TCCmpFunc cmp_func)  ;
  35. public:  void SetCmpFunc (TCCmpFunc cmp_func) 
  36. {
  37. m_CmpFunc = cmp_func;
  38. } // end of func
  39. // **********************************************************************
  40.  
  41. public:  TCCmpFunc GetCmpFunc () 
  42. {
  43. return m_CmpFunc;
  44. } // end of func
  45. // **********************************************************************
  46.  
  47. public:  int InsertAssoc (void * key, void * val)  ;
  48. public:  BOOL DeleteAssoc (void * key)  ;
  49. protected: virtual void DestroyValue (void * val)  ;
  50. public:  BOOL RemoveAssoc (void * key)  ;
  51. public:  BOOL RemoveByIdx (int idx)  ;
  52. public:  int GetCurPos ()  ;
  53. public:  BOOL InsertInCurPos (void* key, void * val)  ;
  54. public:  void DeleteAll ()  ;
  55. public:  void RemoveAll ()  ;
  56. public:  void * Search (void * searchKey, TCCmpFunc cmp_func=0)  ;
  57. public:  long Count ()  ;
  58. public:  void * ValByIdx (int idx)  ;
  59. public:  void * KeyByIdx (int idx)  ;
  60.  
  61. }; // end of class TC_CPtrMap
  62.  
  63. // **********************************************************************
  64.  
  65. // **********************************************************************
  66. class TC_COREEX_EXPORT TC_CPtrMapIter 
  67. {
  68. protected:  TC_CPtrMap & m_Map ;
  69. protected:  int m_Idx ;
  70. public:   TC_CPtrMapIter (const TC_CPtrMap & map)  ;
  71. public:  void Reset ()  ;
  72. public:  void BeginFrom (void * key)  ;
  73. public:  void * Next ()  ;
  74. public:  BOOL More ()  ;
  75.  
  76. }; // end of class TC_CPtrMapIter
  77.  
  78. // **********************************************************************
  79.  
  80. // **********************************************************************
  81.  template <class K, class V>
  82. class TC_TPtrMap 
  83. {
  84. friend TC_TPtrMapIter<K,V>; 
  85. public:
  86. typedef int (*MapCmpFunc)(const K*, const K*);
  87.  
  88. // **********************************************************************
  89. public: 
  90. class Map 
  91.     : public TC_CPtrMap
  92. {
  93. public:   Map (::TCCmpFunc cmp_func) 
  94. : TC_CPtrMap (cmp_func)
  95. {
  96.  
  97. } // end of func
  98. // **********************************************************************
  99.  
  100. protected: virtual void DestroyValue (void * val) 
  101. {
  102. delete (V*)val;
  103. } // end of func
  104. // **********************************************************************
  105.  
  106.  
  107. }; // end of class Map
  108.  
  109. // **********************************************************************
  110. private:  Map m_Map ;
  111. public:   TC_TPtrMap (MapCmpFunc cmp_func) 
  112. : m_Map((::TCCmpFunc)cmp_func)
  113. {
  114. } // end of func
  115. // **********************************************************************
  116.  
  117. public:  MapCmpFunc GetCmpFunc () 
  118. {
  119. return (MapCmpFunc)m_Map.GetCmpFunc();
  120. } // end of func
  121. // **********************************************************************
  122.  
  123. public:  int InsertAssoc (K * key, V * val) 
  124. {
  125. return m_Map.InsertAssoc(key,val);
  126. } // end of func
  127. // **********************************************************************
  128.  
  129. public:  BOOL DeleteAssoc (K * key) 
  130. {
  131. return m_Map.DeleteAssoc(key);
  132.  
  133.  
  134. } // end of func
  135. // **********************************************************************
  136.  
  137. public:  BOOL RemoveAssoc (K * key) 
  138. {
  139. return m_Map.RemoveAssoc(key);
  140. } // end of func
  141. // **********************************************************************
  142.  
  143. public:  BOOL InsertInCurPos (K* key, V * val) 
  144. {
  145. return m_Map.InsertInCurPos(key,val);
  146. } // end of func
  147. // **********************************************************************
  148.  
  149. public:  BOOL RemoveByIdx (int idx) 
  150. {
  151. return m_Map.RemoveByIdx(idx);
  152. } // end of func
  153. // **********************************************************************
  154.  
  155. public:  V * Search (K * searchKey, MapCmpFunc cmp_func=0) 
  156. {
  157. return (V*) m_Map.Search(searchKey, (::TCCmpFunc)cmp_func);
  158. } // end of func
  159. // **********************************************************************
  160.  
  161. public:  V * operator [] (K * key) 
  162. {
  163. return Search(key);
  164. } // end of func
  165. // **********************************************************************
  166.  
  167. public:  V * ValByIdx (int idx) 
  168. {
  169. return (V*) m_Map.ValByIdx(idx);
  170. } // end of func
  171. // **********************************************************************
  172.  
  173. public:  K * KeyByIdx (int idx) 
  174. {
  175. return (K*) m_Map.KeyByIdx(idx);
  176. } // end of func
  177. // **********************************************************************
  178.  
  179. public:  long Count () 
  180. {
  181. return m_Map.Count();
  182. } // end of func
  183. // **********************************************************************
  184.  
  185. public:  void DeleteAll () 
  186. {
  187. m_Map.DeleteAll();
  188. } // end of func
  189. // **********************************************************************
  190.  
  191. public:  void RemoveAll () 
  192. {
  193. m_Map.RemoveAll();
  194. } // end of func
  195. // **********************************************************************
  196.  
  197. public:  int GetCurPos () 
  198. {
  199. return m_Map.GetCurPos();
  200. } // end of func
  201. // **********************************************************************
  202.  
  203.  
  204. }; // end of class TC_TPtrMap
  205.  
  206. // **********************************************************************
  207.  
  208. // **********************************************************************
  209.  template <class K, class V>
  210. class TC_TPtrMapIter 
  211.     : public TC_TIterator<V>
  212. {
  213. protected:  TC_CPtrMapIter m_Iter ;
  214. public:   TC_TPtrMapIter (const TC_TPtrMap<K,V> & map) 
  215. : m_Iter(map.m_Map)
  216. {
  217. } // end of func
  218. // **********************************************************************
  219.  
  220. public:  void BeginFrom (K * key) 
  221. {
  222. m_Iter.BeginFrom(key);
  223. } // end of func
  224. // **********************************************************************
  225.  
  226. public:  void Reset () 
  227. {
  228. m_Iter.Reset(); 
  229. } // end of func
  230. // **********************************************************************
  231.  
  232. public:  BOOL More () 
  233. {
  234. return m_Iter.More(); 
  235. } // end of func
  236. // **********************************************************************
  237.  
  238. public:  V * Next () 
  239. {
  240. return (V*) m_Iter.Next();
  241.  
  242.  
  243.  
  244. } // end of func
  245. // **********************************************************************
  246.  
  247.  
  248. }; // end of class TC_TPtrMapIter
  249.  
  250. // **********************************************************************
  251.  
  252. // **********************************************************************
  253. class TC_COREEX_EXPORT TC_CSNode 
  254. {
  255. friend class TC_CSList;
  256.  
  257. protected:  TC_CSNode * m_Next ;
  258. protected:  void * m_Item ;
  259. public:   TC_CSNode (void * item) 
  260. {
  261. m_Item = item;
  262. m_Next = 0;
  263. } // end of func
  264. // **********************************************************************
  265.  
  266. public:  TC_CSNode * Next () 
  267. {
  268. return m_Next;
  269. } // end of func
  270. // **********************************************************************
  271.  
  272. public:  void SetItem (void * item) 
  273. {
  274. m_Item = item;
  275. } // end of func
  276. // **********************************************************************
  277.  
  278. public:  void * GetItem ()  ;
  279.  
  280. }; // end of class TC_CSNode
  281.  
  282. // **********************************************************************
  283.  
  284. // **********************************************************************
  285. class TC_COREEX_EXPORT TC_CKeyNode 
  286.     : public TC_CSNode
  287. {
  288. private:  HANDLE m_Key ;
  289. public:   TC_CKeyNode (void * item) 
  290. : TC_CSNode (item)
  291. {
  292. m_Key = 0;
  293. } // end of func
  294. // **********************************************************************
  295.  
  296. public:  TC_CKeyNode * Next () 
  297. {
  298. return (TC_CKeyNode*)m_Next;
  299. } // end of func
  300. // **********************************************************************
  301.  
  302. public:  void SetKey (HANDLE key) 
  303. {
  304. m_Key = key;
  305. } // end of func
  306. // **********************************************************************
  307.  
  308. public:  HANDLE GetKey () 
  309. {
  310. return m_Key;
  311. } // end of func
  312. // **********************************************************************
  313.  
  314.  
  315. }; // end of class TC_CKeyNode
  316.  
  317. // **********************************************************************
  318.  
  319. // **********************************************************************
  320. class TC_COREEX_EXPORT TC_CNameNode 
  321.     : public TC_CKeyNode
  322. {
  323. protected:  TC_CString m_Name ;
  324. public:   TC_CNameNode (void * item) 
  325. : TC_CKeyNode(item)
  326. {
  327.  
  328. } // end of func
  329. // **********************************************************************
  330.  
  331. public:  TC_CNameNode * Next () 
  332. {
  333. return (TC_CNameNode*)m_Next;
  334. } // end of func
  335. // **********************************************************************
  336.  
  337. public:  void SetName (const char * name)  ;
  338. public:  const char * GetName ()  ;
  339.  
  340. }; // end of class TC_CNameNode
  341.  
  342. // **********************************************************************
  343.  
  344. // **********************************************************************
  345. class TC_COREEX_EXPORT TC_CSList 
  346. {
  347. public:
  348.     typedef void* (*ITR_FUNC)(void*, void*);
  349.  
  350.  
  351.  
  352. protected:  TC_CSNode * m_Root ;
  353. protected:  TC_CSNode * m_Tail ;
  354. protected:  int m_Count ;
  355. public:   TC_CSList () 
  356. {
  357. Reset();
  358. } // end of func
  359. // **********************************************************************
  360.  
  361. public: virtual  ~TC_CSList ()  ;
  362. public:  TC_CSNode * Root () 
  363. {
  364. return m_Root;
  365. } // end of func
  366. // **********************************************************************
  367.  
  368. public:  int Count ()  ;
  369. public:  void Add (TC_CSNode & node)  ;
  370. public:  void Add (void * item) 
  371. {
  372. Add (*new TC_CSNode(item));
  373. } // end of func
  374. // **********************************************************************
  375.  
  376. public:  void Append (TC_CSNode & node)  ;
  377. public:  void Append (void * item) 
  378. {
  379. Append (*new TC_CSNode(item));
  380. } // end of func
  381. // **********************************************************************
  382.  
  383. public:  BOOL Remove (TC_CSNode & node)  ;
  384. public:  TC_CSNode * Remove (void * item)  ;
  385. public:  void * Iterate (ITR_FUNC itr_func, void * arg)  ;
  386. public:  void Reset () 
  387. {
  388. m_Tail = 0;
  389. m_Root = 0;
  390. m_Count = 0;
  391. } // end of func
  392. // **********************************************************************
  393.  
  394.  
  395. }; // end of class TC_CSList
  396.  
  397. // **********************************************************************
  398.  
  399. // **********************************************************************
  400. class TC_COREEX_EXPORT TC_CSListIter 
  401. {
  402. protected:  TC_CSList * m_List ;
  403. protected:  TC_CSNode * m_Curr ;
  404. public:   TC_CSListIter (TC_CSList * list)  ;
  405. public:  void Reset ()  ;
  406. public:  TC_CSNode * Current ()  ;
  407. public:  TC_CSNode * Next ()  ;
  408.  
  409. }; // end of class TC_CSListIter
  410.  
  411. // **********************************************************************
  412.  
  413. // **********************************************************************
  414. class TC_COREEX_EXPORT TC_CSListValIter 
  415.     : public TC_CSListIter
  416. {
  417. public:   TC_CSListValIter (TC_CSList * list)  ;
  418. public:  void * CurrentVal ()  ;
  419. public:  void * NextVal ()  ;
  420.  
  421. }; // end of class TC_CSListValIter
  422.  
  423. // **********************************************************************
  424.  
  425. // **********************************************************************
  426. class TC_COREEX_EXPORT TC_CKeyList 
  427.     : public TC_CSList
  428. {
  429. private:
  430.     void    Add(TC_CSNode& node);
  431.     void    Append(TC_CSNode& node);
  432.     BOOL    Remove(TC_CSNode& node);
  433. public:   TC_CKeyList () 
  434. : TC_CSList()
  435. {
  436. } // end of func
  437. // **********************************************************************
  438.  
  439. public:  TC_CKeyNode * Root () 
  440. {
  441. return (TC_CKeyNode*)m_Root;
  442. } // end of func
  443. // **********************************************************************
  444.  
  445. public:  void Add (TC_CKeyNode & node) 
  446. {
  447. TC_CSList::Add(node);
  448. } // end of func
  449. // **********************************************************************
  450.  
  451. public:  void Add (void * item) 
  452. {
  453. TC_CSList::Add (*new TC_CKeyNode(item));
  454. } // end of func
  455. // **********************************************************************
  456.  
  457. public:  void Append (TC_CKeyNode & node) 
  458. {
  459. TC_CSList::Append(node);
  460. } // end of func
  461. // **********************************************************************
  462.  
  463. public:  void Append (void * item) 
  464. {
  465. TC_CSList::Append (*new TC_CKeyNode(item));
  466. } // end of func
  467. // **********************************************************************
  468.  
  469. public:  BOOL Remove (TC_CKeyNode & node) 
  470. {
  471. return TC_CSList::Remove(node);
  472. } // end of func
  473. // **********************************************************************
  474.  
  475. public:  TC_CKeyNode * Remove (void * item) 
  476. {
  477. return (TC_CKeyNode*)TC_CSList::Remove(item);
  478. } // end of func
  479. // **********************************************************************
  480.  
  481. public:  void * Find (HANDLE key)  ;
  482.  
  483. }; // end of class TC_CKeyList
  484.  
  485. // **********************************************************************
  486.  
  487. // **********************************************************************
  488. class TC_COREEX_EXPORT TC_CNameList 
  489.     : public TC_CKeyList
  490. {
  491. public:   TC_CNameList () 
  492. : TC_CKeyList()
  493. {
  494. } // end of func
  495. // **********************************************************************
  496.  
  497. public:  TC_CNameNode * Root () 
  498. {
  499. return (TC_CNameNode*)m_Root;
  500. } // end of func
  501. // **********************************************************************
  502.  
  503. public:  void Add (TC_CNameNode & node) 
  504. {
  505. TC_CKeyList::Add(node);
  506. } // end of func
  507. // **********************************************************************
  508.  
  509. public:  void Add (void * item) 
  510. {
  511. TC_CKeyList::Add (*new TC_CNameNode(item));
  512. } // end of func
  513. // **********************************************************************
  514.  
  515. public:  void Append (TC_CNameNode & node) 
  516. {
  517. TC_CKeyList::Append(node);
  518. } // end of func
  519. // **********************************************************************
  520.  
  521. public:  void Append (void * item) 
  522. {
  523. TC_CKeyList::Append (*new TC_CNameNode(item));
  524. } // end of func
  525. // **********************************************************************
  526.  
  527. public:  BOOL Remove (TC_CNameNode & node) 
  528. {
  529. return TC_CKeyList::Remove(node);
  530. } // end of func
  531. // **********************************************************************
  532.  
  533. public:  TC_CNameNode * Remove (void * item) 
  534. {
  535. return (TC_CNameNode*)TC_CKeyList::Remove(item);
  536. } // end of func
  537. // **********************************************************************
  538.  
  539. public:  void * Find (HANDLE key) 
  540. {
  541. return TC_CKeyList::Find(key);
  542. } // end of func
  543. // **********************************************************************
  544.  
  545. public:  void * Find (const char * name)  ;
  546.  
  547. }; // end of class TC_CNameList
  548.  
  549. // **********************************************************************
  550.  
  551. // **********************************************************************
  552. class TC_COREEX_EXPORT TC_CLockList 
  553.     : public TC_CNameList
  554. {
  555. private:  TC_CRWAccess * m_Lock ;
  556. public:   TC_CLockList ()  ;
  557. public:   ~TC_CLockList ()  ;
  558. public:  void Add (TC_CNameNode & node)  ;
  559. public:  void Add (void * item) 
  560. {
  561. Add (*new TC_CNameNode(item));
  562. } // end of func
  563. // **********************************************************************
  564.  
  565. public:  void Append (TC_CNameNode & node)  ;
  566. public:  void Append (void * item) 
  567. {
  568. Append (*new TC_CNameNode(item));
  569. } // end of func
  570. // **********************************************************************
  571.  
  572. public:  BOOL Remove (TC_CNameNode & node)  ;
  573. public:  TC_CNameNode * Remove (void * item) 
  574. {
  575. return Remove(item);
  576. } // end of func
  577. // **********************************************************************
  578.  
  579. public:  void * Iterate (ITR_FUNC itr_func, void * arg)  ;
  580. public:  void * Find (HANDLE key)  ;
  581. public:  void * Find (const char * name)  ;
  582. public:  TC_CRWAccess * GetLock ()  ;
  583.  
  584. }; // end of class TC_CLockList
  585.  
  586. // **********************************************************************
  587.  
  588. // **********************************************************************
  589.  template <class Item>
  590. class TC_TSNode 
  591.     : public TC_CSNode
  592. {
  593. public:   TC_TSNode (Item * item) 
  594. : TC_CSNode(item)
  595. {
  596. } // end of func
  597. // **********************************************************************
  598.  
  599. public:  TC_TSNode<Item> * Next () 
  600. {
  601. return (TC_TSNode<Item>*)m_Next;
  602. } // end of func
  603. // **********************************************************************
  604.  
  605. public:  void SetItem (Item * item) 
  606. {
  607. m_Item = item;
  608. } // end of func
  609. // **********************************************************************
  610.  
  611. public:  Item * GetItem () 
  612. {
  613. return (Item*)m_Item;
  614. } // end of func
  615. // **********************************************************************
  616.  
  617.  
  618. }; // end of class TC_TSNode
  619.  
  620. // **********************************************************************
  621.  
  622. // **********************************************************************
  623.  template <class Item>
  624. class TC_TKeyNode 
  625.     : public TC_CKeyNode
  626. {
  627. public:   TC_TKeyNode (Item * item) 
  628. : TC_CKeyNode(item)
  629. {
  630. } // end of func
  631. // **********************************************************************
  632.  
  633. public:  TC_TKeyNode<Item> * Next () 
  634. {
  635. return (TC_TKeyNode<Item>*)m_Next;
  636. } // end of func
  637. // **********************************************************************
  638.  
  639. public:  void SetItem (Item * item) 
  640. {
  641. m_Item = item;
  642. } // end of func
  643. // **********************************************************************
  644.  
  645. public:  Item * GetItem () 
  646. {
  647. return (Item*)m_Item;
  648. } // end of func
  649. // **********************************************************************
  650.  
  651.  
  652. }; // end of class TC_TKeyNode
  653.  
  654. // **********************************************************************
  655.  
  656. // **********************************************************************
  657.  template <class Item>
  658. class TC_TNameNode 
  659.     : public TC_CNameNode
  660. {
  661. public:   TC_TNameNode (Item * item) 
  662. : TC_CNameNode(item)
  663. {
  664. } // end of func
  665. // **********************************************************************
  666.  
  667. public:  TC_TNameNode<Item> * Next () 
  668. {
  669. return (TC_TNameNode<Item>*)m_Next;
  670. } // end of func
  671. // **********************************************************************
  672.  
  673. public:  void SetItem (Item * item) 
  674. {
  675. m_Item = item;
  676. } // end of func
  677. // **********************************************************************
  678.  
  679. public:  Item * GetItem () 
  680. {
  681. return (Item*)m_Item;
  682. } // end of func
  683. // **********************************************************************
  684.  
  685.  
  686. }; // end of class TC_TNameNode
  687.  
  688. // **********************************************************************
  689.  
  690. // **********************************************************************
  691.  template <class Item>
  692. class TC_TSList 
  693.     : public TC_CSList
  694. {
  695. typedef Item* (*ITR_FUNC)(Item*, void*);
  696. public:   TC_TSList () 
  697. : TC_CSList()
  698. {
  699. } // end of func
  700. // **********************************************************************
  701.  
  702. public:  TC_TSNode<Item>* Root () 
  703. {
  704. return (TC_TSNode<Item>*)m_Root;
  705. } // end of func
  706. // **********************************************************************
  707.  
  708. public:  void Add (TC_TSNode<Item>& node) 
  709. {
  710. TC_CSList::Add(node);
  711. } // end of func
  712. // **********************************************************************
  713.  
  714. public:  void Add (Item* item) 
  715. {
  716. TC_CSList::Add(*new TC_TSNode<Item>(item));
  717. } // end of func
  718. // **********************************************************************
  719.  
  720. public:  void Append (TC_TSNode<Item>& node) 
  721. {
  722. TC_CSList::Append(node);
  723. } // end of func
  724. // **********************************************************************
  725.  
  726. public:  void Append (Item* item) 
  727. {
  728. TC_CSList::Append(*new TC_TSNode<Item>(item));
  729. } // end of func
  730. // **********************************************************************
  731.  
  732. public:  BOOL Remove (TC_TSNode<Item>& node) 
  733. {
  734. return TC_CSList::Remove(node);
  735. } // end of func
  736. // **********************************************************************
  737.  
  738. public:  TC_TSNode<Item>* Remove (Item * item) 
  739. {
  740. return (TC_TSNode<Item>*) TC_CSList::Remove(item);
  741. } // end of func
  742. // **********************************************************************
  743.  
  744. public:  Item * Iterate (ITR_FUNC itr_func, void* arg) 
  745. {
  746. return (Item*)TC_CSList::Iterate((TC_CSList::ITR_FUNC)itr_func, arg);
  747. } // end of func
  748. // **********************************************************************
  749.  
  750.  
  751. }; // end of class TC_TSList
  752.  
  753. // **********************************************************************
  754.  
  755. // **********************************************************************
  756.  template <class Item>
  757. class TC_TKeyList 
  758.     : public TC_CKeyList
  759. {
  760. typedef Item* (*ITR_FUNC)(Item*, void*);
  761. public:   TC_TKeyList () 
  762. : TC_CKeyList()
  763. {
  764. } // end of func
  765. // **********************************************************************
  766.  
  767. public:  TC_TKeyNode<Item>* Root () 
  768. {
  769. return (TC_TKeyNode<Item>*)m_Root;
  770. } // end of func
  771. // **********************************************************************
  772.  
  773. public:  void Add (TC_TKeyNode<Item>& node) 
  774. {
  775. TC_CKeyList::Add(node);
  776. } // end of func
  777. // **********************************************************************
  778.  
  779. public:  void Add (Item* item) 
  780. {
  781. TC_CKeyList::Add(*new TC_TKeyNode<Item>(item));
  782. } // end of func
  783. // **********************************************************************
  784.  
  785. public:  void Append (TC_TKeyNode<Item>& node) 
  786. {
  787. TC_CKeyList::Append(node);
  788. } // end of func
  789. // **********************************************************************
  790.  
  791. public:  void Append (Item* item) 
  792. {
  793. TC_CKeyList::Append(*new TC_TKeyNode<Item>(item));
  794. } // end of func
  795. // **********************************************************************
  796.  
  797. public:  BOOL Remove (TC_TKeyNode<Item>& node) 
  798. {
  799. return TC_CKeyList::Remove(node);
  800. } // end of func
  801. // **********************************************************************
  802.  
  803. public:  TC_TKeyNode<Item>* Remove (Item * item) 
  804. {
  805. return (TC_TKeyNode<Item>*) TC_CKeyList::Remove(item);
  806. } // end of func
  807. // **********************************************************************
  808.  
  809. public:  Item * Iterate (ITR_FUNC itr_func, void* arg) 
  810. {
  811. return (Item*)TC_CKeyList::Iterate((TC_CKeyList::ITR_FUNC)itr_func, arg);
  812. } // end of func
  813. // **********************************************************************
  814.  
  815. public:  Item * Find (HANDLE key) 
  816. {
  817. return (Item*)TC_CKeyList::Find(key);
  818. } // end of func
  819. // **********************************************************************
  820.  
  821.  
  822. }; // end of class TC_TKeyList
  823.  
  824. // **********************************************************************
  825.  
  826. // **********************************************************************
  827.  template <class Item>
  828. class TC_TNameList 
  829.     : public TC_CNameList
  830. {
  831. typedef Item* (*ITR_FUNC)(Item*, void*);
  832. public:   TC_TNameList () 
  833. : TC_CNameList()
  834. {
  835. } // end of func
  836. // **********************************************************************
  837.  
  838. public:  TC_TNameNode<Item>* Root () 
  839. {
  840. return (TC_TNameNode<Item>*)m_Root;
  841. } // end of func
  842. // **********************************************************************
  843.  
  844. public:  void Add (TC_TNameNode<Item>& node) 
  845. {
  846. TC_CNameList::Add(node);
  847. } // end of func
  848. // **********************************************************************
  849.  
  850. public:  void Add (Item* item) 
  851. {
  852. TC_CNameList::Add(*new TC_TNameNode<Item>(item));
  853. } // end of func
  854. // **********************************************************************
  855.  
  856. public:  void Append (TC_TNameNode<Item>& node) 
  857. {
  858. TC_CNameList::Append(node);
  859. } // end of func
  860. // **********************************************************************
  861.  
  862. public:  void Append (Item* item) 
  863. {
  864. TC_CNameList::Append(*new TC_TNameNode<Item>(item));
  865. } // end of func
  866. // **********************************************************************
  867.  
  868. public:  BOOL Remove (TC_TNameNode<Item>& node) 
  869. {
  870. return TC_CNameList::Remove(node);
  871. } // end of func
  872. // **********************************************************************
  873.  
  874. public:  TC_TNameNode<Item>* Remove (Item * item) 
  875. {
  876. return (TC_TNameNode<Item>*) TC_CNameList::Remove(item);
  877. } // end of func
  878. // **********************************************************************
  879.  
  880. public:  Item * Iterate (ITR_FUNC itr_func, void* arg) 
  881. {
  882. return (Item*)TC_CNameList::Iterate((TC_CNameList::ITR_FUNC)itr_func, arg);
  883. } // end of func
  884. // **********************************************************************
  885.  
  886. public:  Item * Find (HANDLE key) 
  887. {
  888. return (Item*)TC_CNameList::Find(key);
  889. } // end of func
  890. // **********************************************************************
  891.  
  892. public:  Item * Find (const char * name) 
  893. {
  894. return (Item*)TC_CNameList::Find(name);
  895. } // end of func
  896. // **********************************************************************
  897.  
  898.  
  899. }; // end of class TC_TNameList
  900.  
  901. // **********************************************************************
  902.  
  903. // **********************************************************************
  904.  template <class Item>
  905. class TC_TLockList 
  906.     : public TC_CLockList
  907. {
  908. typedef Item* (*ITR_FUNC)(Item*, void*);
  909. public:   TC_TLockList () 
  910. : TC_CLockList()
  911. {
  912. } // end of func
  913. // **********************************************************************
  914.  
  915. public:  TC_TNameNode<Item>* Root () 
  916. {
  917. return (TC_TNameNode<Item>*)m_Root;
  918. } // end of func
  919. // **********************************************************************
  920.  
  921. public:  void Add (TC_TNameNode<Item>& node) 
  922. {
  923. TC_CLockList::Add(node);
  924. } // end of func
  925. // **********************************************************************
  926.  
  927. public:  void Add (Item* item) 
  928. {
  929. TC_CLockList::Add(*new TC_TNameNode<Item>(item));
  930. } // end of func
  931. // **********************************************************************
  932.  
  933. public:  void Append (TC_TNameNode<Item>& node) 
  934. {
  935. TC_CLockList::Append(node);
  936. } // end of func
  937. // **********************************************************************
  938.  
  939. public:  void Append (Item* item) 
  940. {
  941. TC_CLockList::Append(*new TC_TNameNode<Item>(item));
  942. } // end of func
  943. // **********************************************************************
  944.  
  945. public:  BOOL Remove (TC_TNameNode<Item>& node) 
  946. {
  947. return TC_CLockList::Remove(node);
  948. } // end of func
  949. // **********************************************************************
  950.  
  951. public:  TC_TNameNode<Item>* Remove (Item * item) 
  952. {
  953. return (TC_TNameNode<Item>*) TC_CLockList::Remove(item);
  954. } // end of func
  955. // **********************************************************************
  956.  
  957. public:  Item * Iterate (ITR_FUNC itr_func, void* arg) 
  958. {
  959. return (Item*)TC_CLockList::Iterate((TC_CLockList::ITR_FUNC)itr_func, arg);
  960. } // end of func
  961. // **********************************************************************
  962.  
  963. public:  Item * Find (HANDLE key) 
  964. {
  965. return (Item*)TC_CLockList::Find(key);
  966. } // end of func
  967. // **********************************************************************
  968.  
  969. public:  Item * Find (const char * name) 
  970. {
  971. return (Item*)TC_CLockList::Find(name);
  972. } // end of func
  973. // **********************************************************************
  974.  
  975.  
  976. }; // end of class TC_TLockList
  977.  
  978. // **********************************************************************
  979. template<class Item> void tcTClear (TC_TSList<Item>& list)  ;
  980. template<class Item> void tcTClear (TC_TKeyList<Item>& list)  ;
  981. template<class Item> void tcTClear (TC_TNameList<Item>& list)  ;
  982. typedef long TCHTreeNode;
  983. class TC_CBTree;
  984. class TC_CBTreeNodeSpace;
  985. class TC_CBTreeNodeHeap;
  986. class TC_CBTreeIter;
  987. class TC_CBTreeNode;
  988. class TC_CComparator;
  989.  
  990. template <class ItemType> class TBTreeIterator;
  991. #define TC_BTREE_CMP_FUNC    TC_CBTree::BTreeCmpFunc
  992.  
  993. // **********************************************************************
  994. class TC_COREEX_EXPORT TC_CBTree 
  995. {
  996. protected: 
  997. enum DelAction {
  998.  DelAct_None,
  999.  DelAct_RotateLeft,
  1000.  DelAct_RotateRight,
  1001.  DelAct_Merge,
  1002. };
  1003. public:
  1004.     typedef int (*BTreeCmpFunc)(const void*, const void*);
  1005. private:  BOOL m_OwnNodeSpace ;
  1006. protected:  BTreeCmpFunc m_Cmp ;
  1007. protected:  TC_CBTreeNodeSpace* m_NodeSpace ;
  1008. protected:  short m_Order ;
  1009. protected:  TC_CRWAccess * m_Lock ;
  1010. public:   TC_CBTree (BTreeCmpFunc cmp, short order = 2, TC_CBTreeNodeSpace* space = 0)  ;
  1011. public: virtual  ~TC_CBTree ()  ;
  1012. protected:  TC_CBTreeNode* _Adjust (TC_CBTreeNode* node, short index, TC_CBTreeNode* c0, TC_CBTreeNode* c1, DelAction& action)  ;
  1013. protected:  TC_CBTreeNode* _DescendInto (TC_CBTreeNode* node, short subtreeIndex, DelAction& action)  ;
  1014. protected:  BOOL _InsertNonFull (TC_CBTreeNode* node, void* item)  ;
  1015. protected:  void _SplitChild (TC_CBTreeNode* x, short i, TC_CBTreeNode* y)  ;
  1016. public: virtual void* Find (void* item, void ** last_item = 0) const ;
  1017. public: virtual void* ItemWithRank (long rank) const ;
  1018. public: virtual long RankOf (void* item)  ;
  1019. public: virtual long Size () const ;
  1020. public: virtual BOOL Add (void* item)  ;
  1021. public: virtual void* Remove (void* key)  ;
  1022. public: virtual BOOL Delete (void* item)  ;
  1023. public: virtual void* ExtractMin ()  ;
  1024. public:  TC_CBTreeNodeSpace* NodeSpace () const
  1025. {
  1026. return m_NodeSpace;
  1027. } // end of func
  1028. // **********************************************************************
  1029.  
  1030. public:  BTreeCmpFunc CmpFunc () 
  1031. {
  1032. return m_Cmp;
  1033. } // end of func
  1034. // **********************************************************************
  1035.  
  1036. public:  void SetCmpFunc (BTreeCmpFunc cmp)  ;
  1037. public:  short Order () 
  1038. {
  1039. return m_Order;
  1040. } // end of func
  1041. // **********************************************************************
  1042.  
  1043. public:  void* Smallest () 
  1044. {
  1045. return ItemWithRank (0);
  1046. } // end of func
  1047. // **********************************************************************
  1048.  
  1049. public:  void* Largest () 
  1050. {
  1051. return ItemWithRank (Size()-1);
  1052. } // end of func
  1053. // **********************************************************************
  1054.  
  1055. public:  void UseLocking (TCRWPrivilege privilege = W_Privilege)  ;
  1056. public:  BOOL Lock (TCRWRequest request = R_Request, long timeout = -1L)  ;
  1057. public:  void Unlock ()  ;
  1058.  
  1059. }; // end of class TC_CBTree
  1060.  
  1061. // **********************************************************************
  1062.  
  1063. // **********************************************************************
  1064. class TC_COREEX_EXPORT TC_CBTreeNode 
  1065. {
  1066. friend TC_CBTree;
  1067. friend TC_CBTreeIter;
  1068. friend TC_CBTreeNodeSpace;
  1069. protected:  TCHTreeNode m_Handle ;
  1070. protected:  long m_SubtreeSize ;
  1071. protected:  BOOL m_IsLeaf ;
  1072. protected:  short m_KeyCount ;
  1073. protected:  void** m_Items ;
  1074. protected:  TCHTreeNode* m_Subtree ;
  1075. protected:  TC_CBTreeNodeSpace* m_NodeSpace ;
  1076. protected:   TC_CBTreeNode (TC_CBTreeNodeSpace* space)  ;
  1077. protected: virtual  ~TC_CBTreeNode ()  ;
  1078. protected: virtual void MoveSubNode (const TC_CBTreeNode& x, short pos, short our_pos, short nkeys)  ;
  1079. public: virtual BOOL Search (void* itm, short& index)  ;
  1080. public: virtual void ShiftRightAt (short pos, short amount = 1)  ;
  1081. public: virtual void ShiftLeftAt (short pos, short amount = 1)  ;
  1082. public:  long Size () 
  1083. {
  1084. return m_KeyCount;
  1085. } // end of func
  1086. // **********************************************************************
  1087.  
  1088. public:  void* Item (short i) 
  1089. {
  1090. TC_COREEX_ASSERT ( i < m_KeyCount );
  1091. return m_Items[i];
  1092. } // end of func
  1093. // **********************************************************************
  1094.  
  1095. public:  TCHTreeNode Subtree (short i)  ;
  1096. public:  long SubtreeSize () 
  1097. {
  1098. return m_SubtreeSize;
  1099. } // end of func
  1100. // **********************************************************************
  1101.  
  1102. public:  TCHTreeNode Handle () 
  1103. {
  1104. return m_Handle;
  1105. } // end of func
  1106. // **********************************************************************
  1107.  
  1108. public:  TC_CBTreeNodeSpace* NodeSpace () 
  1109. {
  1110. return m_NodeSpace;
  1111. } // end of func
  1112. // **********************************************************************
  1113.  
  1114. public:  short Order ()  ;
  1115. public:  TC_BTREE_CMP_FUNC CmpFunc ()  ;
  1116. public:  BOOL IsLeaf () 
  1117. {
  1118. return m_IsLeaf;
  1119. } // end of func
  1120. // **********************************************************************
  1121.  
  1122. public:  short KeyCount () 
  1123. {
  1124. return m_KeyCount;
  1125. } // end of func
  1126. // **********************************************************************
  1127.  
  1128.  
  1129. }; // end of class TC_CBTreeNode
  1130.  
  1131. // **********************************************************************
  1132.  
  1133. // **********************************************************************
  1134. class TC_COREEX_EXPORT TC_CBTreeNodeSpace 
  1135. {
  1136. friend class TC_CBTree;
  1137. protected:  TC_CBTree * m_BTree ;
  1138. public:   TC_CBTreeNodeSpace (TC_CBTree * tree)  ;
  1139. protected:   TC_CBTreeNodeSpace ()  ;
  1140. protected: virtual void _Init (TC_CBTree * tree)  ;
  1141. public: virtual  ~TC_CBTreeNodeSpace ()  ;
  1142. protected: virtual void _Destroy (TC_CBTreeNode* node)  ;
  1143. protected: virtual TC_CBTreeNode* _BuildNode ()  ;
  1144. protected: virtual void _SetHandle (TC_CBTreeNode& node, TCHTreeNode h)  ;
  1145. public: virtual TCHTreeNode RootHandle ()  =0 ;
  1146. public: virtual void NewRoot (TCHTreeNode h)  =0 ;
  1147. public: virtual TCHTreeNode CreateNode ()  =0 ;
  1148. public: virtual void DestroyNode (TC_CBTreeNode*)  =0 ;
  1149. public: virtual TC_CBTreeNode* BorrowNode (TCHTreeNode h)  =0 ;
  1150. public: virtual void ReturnNode (TC_CBTreeNode* n)  =0 ;
  1151. public: virtual void NodeModified (TC_CBTreeNode* n)  =0 ;
  1152. public:  TC_CBTreeNode* BorrowRoot () 
  1153. {
  1154. return BorrowNode (RootHandle());
  1155. } // end of func
  1156. // **********************************************************************
  1157.  
  1158. public:  void WriteBack (TC_CBTreeNode* node) 
  1159. {
  1160. NodeModified (node); 
  1161. ReturnNode (node);
  1162. } // end of func
  1163. // **********************************************************************
  1164.  
  1165. public:  TC_CBTreeNode* MakeNode () 
  1166. {
  1167. return BorrowNode (CreateNode());
  1168. } // end of func
  1169. // **********************************************************************
  1170.  
  1171. public: virtual void DestroyItem (void *item)  ;
  1172. public:  short Order ()  ;
  1173. public:  TC_BTREE_CMP_FUNC CmpFunc ()  ;
  1174.  
  1175. }; // end of class TC_CBTreeNodeSpace
  1176.  
  1177. // **********************************************************************
  1178.  
  1179. // **********************************************************************
  1180. class TC_COREEX_EXPORT TC_CBTreeNodeHeap 
  1181.     : public TC_CBTreeNodeSpace
  1182. {
  1183. protected:  TCHTreeNode m_Root ;
  1184. public:   TC_CBTreeNodeHeap (TC_CBTree * tree)  ;
  1185. public:   TC_CBTreeNodeHeap ()  ;
  1186. public:   ~TC_CBTreeNodeHeap ()  ;
  1187. protected: virtual void _Init (TC_CBTree * tree)  ;
  1188. protected:  void _DestroySubtree (TCHTreeNode h)  ;
  1189. public: virtual TCHTreeNode CreateNode ()  ;
  1190. public: virtual TC_CBTreeNode* BorrowNode (TCHTreeNode h)  ;
  1191. public: virtual void ReturnNode (TC_CBTreeNode* /* h */)  ;
  1192. public: virtual void DestroyNode (TC_CBTreeNode* node)  ;
  1193. public: virtual TCHTreeNode RootHandle ()  ;
  1194. public: virtual void NewRoot (TCHTreeNode h)  ;
  1195. public: virtual void NodeModified (TC_CBTreeNode*)  ;
  1196.  
  1197. }; // end of class TC_CBTreeNodeHeap
  1198.  
  1199. // **********************************************************************
  1200.  
  1201. // **********************************************************************
  1202. class TC_COREEX_EXPORT TC_CBTreeIter 
  1203. {
  1204. protected:  const TC_CBTree& m_Tree ;
  1205. protected:  long m_Index ;
  1206. protected:  short m_Length ;
  1207. protected:  void* m_Path ;
  1208. public:   TC_CBTreeIter (const TC_CBTree& tree)  ;
  1209. public:   TC_CBTreeIter (const TC_CBTreeIter& itr)  ;
  1210. public: virtual  ~TC_CBTreeIter ()  ;
  1211. public:  void BeginFrom (void* item)  ;
  1212. public:  void Reset ()  ;
  1213. public:  void* Next ()  ;
  1214. public:  BOOL More ()  ;
  1215. public:  long CurrentRank () 
  1216. {
  1217. return m_Index;
  1218. } // end of func
  1219. // **********************************************************************
  1220.  
  1221.  
  1222. }; // end of class TC_CBTreeIter
  1223.  
  1224. // **********************************************************************
  1225. // **********************************************************************
  1226. template<class Item> void tcTClear  (TC_TSList<Item>& list) 
  1227. {
  1228. for ( TC_TSNode<Item>* curr = list.Root(); curr; )    {
  1229.        TC_TSNode<Item>* node= curr->Next();
  1230.     delete curr->GetItem();
  1231.     curr = node;
  1232. }
  1233. list.Reset();
  1234. }
  1235. // **********************************************************************
  1236. template<class Item> void tcTClear  (TC_TKeyList<Item>& list) 
  1237. {
  1238. for ( TC_TKeyNode<Item>* curr = list.Root(); curr; )    {
  1239.        TC_TKeyNode<Item>* node= curr->Next();
  1240.     delete curr->GetItem();
  1241.     curr = node;
  1242. }
  1243. list.Reset();
  1244. }
  1245. // **********************************************************************
  1246. template<class Item> void tcTClear  (TC_TNameList<Item>& list) 
  1247. {
  1248. for ( TC_TNameNode<Item>* curr = list.Root(); curr; )    {
  1249.        TC_TNameNode<Item>* node= curr->Next();
  1250.     delete curr->GetItem();
  1251.     curr = node;
  1252. }
  1253. list.Reset();
  1254. }
  1255.  
  1256. #endif // _INC_CLTN_HPP
  1257.