hxlist.h
上传用户:dangjiwu
上传日期:2013-07-19
资源大小:42019k
文件大小:20k
源码类别:

Symbian

开发平台:

Visual C++

  1. /* ***** BEGIN LICENSE BLOCK *****
  2.  * Source last modified: $Id: hxlist.h,v 1.1.1.1.50.3 2004/07/09 01:45:51 hubbe Exp $
  3.  * 
  4.  * Portions Copyright (c) 1995-2004 RealNetworks, Inc. All Rights Reserved.
  5.  * 
  6.  * The contents of this file, and the files included with this file,
  7.  * are subject to the current version of the RealNetworks Public
  8.  * Source License (the "RPSL") available at
  9.  * http://www.helixcommunity.org/content/rpsl unless you have licensed
  10.  * the file under the current version of the RealNetworks Community
  11.  * Source License (the "RCSL") available at
  12.  * http://www.helixcommunity.org/content/rcsl, in which case the RCSL
  13.  * will apply. You may also obtain the license terms directly from
  14.  * RealNetworks.  You may not use this file except in compliance with
  15.  * the RPSL or, if you have a valid RCSL with RealNetworks applicable
  16.  * to this file, the RCSL.  Please see the applicable RPSL or RCSL for
  17.  * the rights, obligations and limitations governing use of the
  18.  * contents of the file.
  19.  * 
  20.  * Alternatively, the contents of this file may be used under the
  21.  * terms of the GNU General Public License Version 2 or later (the
  22.  * "GPL") in which case the provisions of the GPL are applicable
  23.  * instead of those above. If you wish to allow use of your version of
  24.  * this file only under the terms of the GPL, and not to allow others
  25.  * to use your version of this file under the terms of either the RPSL
  26.  * or RCSL, indicate your decision by deleting the provisions above
  27.  * and replace them with the notice and other provisions required by
  28.  * the GPL. If you do not delete the provisions above, a recipient may
  29.  * use your version of this file under the terms of any one of the
  30.  * RPSL, the RCSL or the GPL.
  31.  * 
  32.  * This file is part of the Helix DNA Technology. RealNetworks is the
  33.  * developer of the Original Code and owns the copyrights in the
  34.  * portions it created.
  35.  * 
  36.  * This file, and the files included with this file, is distributed
  37.  * and made available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY
  38.  * KIND, EITHER EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS
  39.  * ALL SUCH WARRANTIES, INCLUDING WITHOUT LIMITATION, ANY WARRANTIES
  40.  * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, QUIET
  41.  * ENJOYMENT OR NON-INFRINGEMENT.
  42.  * 
  43.  * Technology Compatibility Kit Test Suite(s) Location:
  44.  *    http://www.helixcommunity.org/content/tck
  45.  * 
  46.  * Contributor(s):
  47.  * 
  48.  * ***** END LICENSE BLOCK ***** */
  49. #include "hxslist.h"
  50. #if defined(DEFINE_LIST) || defined(DEFINE_KEYED_LIST)
  51. class LIST_NAME
  52. {
  53. public:
  54. #ifdef DEFINE_KEYED_LIST
  55.     typedef VALUE_TYPE::first_type key_type;
  56.     typedef KEY_BEHAVIOUR key_behaviour;
  57.     typedef VALUE_TYPE::second_type referent_type;
  58. #endif //DEFINE_KEYED_LIST
  59.     typedef VALUE_TYPE value_type;
  60.     class _Iterator
  61.     {
  62.     public:
  63. _Iterator();
  64. _Iterator
  65. (
  66.     const CHXSimpleList* pSimpleListWrapped,
  67.     LISTPOSITION ListPosition
  68. );
  69. _Iterator(const _Iterator& rliocOther);
  70. ~_Iterator();
  71. _Iterator& operator=
  72. (
  73.     const _Iterator& rliocOther
  74. );
  75. VALUE_TYPE& operator*();
  76. _Iterator& operator=(const VALUE_TYPE& rclsNewValue);
  77. _Iterator& operator++();
  78. const _Iterator operator++(int);
  79. _Iterator& operator--();
  80. const _Iterator operator--(int);
  81.     private:
  82. CHXSimpleList* m_pSimpleListWrapped;
  83. LISTPOSITION m_ListPosition;
  84. friend class LIST_NAME;
  85. friend BOOL operator==
  86. (
  87.     const _Iterator& rliocLeft,
  88.     const _Iterator& rliocRight
  89. );
  90. friend BOOL operator!=
  91. (
  92.     const _Iterator& rliocLeft,
  93.     const _Iterator& rliocRight
  94. );
  95.     };
  96. private:
  97.     friend class _Iterator;
  98. public:
  99.     typedef _Iterator iterator;
  100.     typedef const _Iterator const_iterator;
  101.     LIST_NAME();
  102.     LIST_NAME(const LIST_NAME& rlocOther);
  103.     ~LIST_NAME();
  104.     LIST_NAME& operator=(const LIST_NAME& rlocOther);
  105.     _Iterator begin();
  106.     const _Iterator begin() const;
  107.     _Iterator end();
  108.     const _Iterator end() const;
  109.     size_t size() const;
  110.     _Iterator insert(_Iterator itBefore, const value_type&);
  111.     void insert
  112.     (
  113. _Iterator itBefore,
  114. const _Iterator itFirst,
  115. const _Iterator itLast
  116.     );
  117.     _Iterator remove(_Iterator itThis);
  118.     _Iterator remove(_Iterator itFirst, _Iterator itLast);
  119.     void empty();
  120. #ifdef DEFINE_KEYED_LIST
  121.     _Iterator insert(const value_type&);
  122.     _Iterator remove(const key_type&);
  123.     _Iterator find(const key_type&);
  124. #ifndef _UNIX
  125.     const _Iterator find(const key_type&) const;
  126. #endif
  127.     _Iterator find(const _Iterator, const key_type&);
  128. #ifndef _UNIX
  129.     const _Iterator find(const _Iterator, const key_type&) const;
  130. #endif
  131. #endif //DEFINE_KEYED_LIST
  132. protected:
  133.     CHXSimpleList m_SimpleListWrapped;
  134.     void _copy(const LIST_NAME& rlocOther);
  135. };
  136. #ifdef DEFINE_KEYED_LIST
  137. #undef DEFINE_KEYED_LIST
  138. #undef KEY_BEHAVIOUR
  139. #else //DEFINE_LIST
  140. #undef DEFINE_LIST
  141. #endif //DEFINE_KEYED_LIST
  142. #undef VALUE_TYPE
  143. #undef LIST_NAME
  144. #endif //DEFINE_LIST || DEFINE_KEYED_LIST
  145. #if defined(DEFINE_LIST_GLOBALS) || defined(DEFINE_KEYED_LIST_GLOBALS)
  146. #ifndef LIST_SCOPE
  147. #define LIST_FULL_SPEC LIST_NAME
  148. #else
  149. #define LIST_FULL_SPEC LIST_SCOPE::LIST_NAME
  150. #endif //!LIST_SCOPE
  151. BOOL operator==
  152. (
  153.     const LIST_FULL_SPEC::_Iterator& rliocLeft,
  154.     const LIST_FULL_SPEC::_Iterator& rliocRight
  155. );
  156. BOOL operator!=
  157. (
  158.     const LIST_FULL_SPEC::_Iterator& rliocLeft,
  159.     const LIST_FULL_SPEC::_Iterator& rliocRight
  160. );
  161. #undef LIST_NAME
  162. #undef DEFINE_LIST_GLOBALS
  163. #undef DEFINE_KEYED_LIST_GLOBALS
  164. #undef LIST_SCOPE
  165. #undef LIST_FULL_SPEC
  166. #endif //DEFINE_LIST_GLOBALS || DEFINE_KEYED_LIST_GLOBALS
  167. #if defined(IMPLEMENT_LIST) || defined(IMPLEMENT_KEYED_LIST)
  168. #ifndef LIST_SCOPE
  169. #define LIST_FULL_SPEC LIST_NAME
  170. #else
  171. #define LIST_FULL_SPEC LIST_SCOPE::LIST_NAME
  172. #endif //!LIST_SCOPE
  173.     LIST_FULL_SPEC::LIST_NAME()
  174.     {
  175.     }
  176.     LIST_FULL_SPEC::LIST_NAME(const LIST_NAME& rlocOther)
  177.     {
  178. _copy(rlocOther);
  179.     }
  180.     LIST_FULL_SPEC::~LIST_NAME()
  181.     {
  182. empty();
  183.     }
  184.     LIST_NAME&
  185.     LIST_FULL_SPEC::operator=(const LIST_NAME& rlocOther)
  186.     {
  187. empty();
  188. _copy(rlocOther);
  189. return *this;
  190.     }
  191.     void
  192.     LIST_FULL_SPEC::_copy(const LIST_NAME& rlocOther)
  193.     {
  194.      iterator itOther;
  195. for
  196. (
  197.     itOther = rlocOther.begin();
  198.     itOther != rlocOther.end();
  199.     ++itOther
  200. )
  201. {
  202.     insert(end(), *itOther);
  203. }
  204.     }
  205.     LIST_FULL_SPEC::iterator
  206.     LIST_FULL_SPEC::begin()
  207.     {
  208. return iterator(&m_SimpleListWrapped, m_SimpleListWrapped.GetHeadPosition());
  209.     }
  210.     const LIST_FULL_SPEC::iterator
  211.     LIST_FULL_SPEC::begin() const
  212.     {
  213. return iterator(&m_SimpleListWrapped, m_SimpleListWrapped.GetHeadPosition());
  214.     }
  215.     LIST_FULL_SPEC::iterator
  216.     LIST_FULL_SPEC::end()
  217.     {
  218. return iterator(&m_SimpleListWrapped, NULL);
  219.     }
  220.     const LIST_FULL_SPEC::iterator
  221.     LIST_FULL_SPEC::end() const
  222.     {
  223. return iterator(&m_SimpleListWrapped, NULL);
  224.     }
  225.     size_t 
  226.     LIST_FULL_SPEC::size() const
  227.     {
  228. return m_SimpleListWrapped.GetCount();
  229.     }
  230.     LIST_FULL_SPEC::iterator
  231.     LIST_FULL_SPEC::insert(LIST_FULL_SPEC::iterator itBefore, const LIST_FULL_SPEC::value_type& rclsNew)
  232.     {
  233. if ((&m_SimpleListWrapped) != itBefore.m_pSimpleListWrapped)
  234. {
  235.     return begin();
  236. }
  237. value_type* pNew = new value_type;
  238. LISTPOSITION ListPositionNew;
  239. LISTPOSITION ListPosition;
  240. HX_ASSERT(pNew);
  241. *pNew = rclsNew;
  242. if (!itBefore.m_ListPosition)
  243. {
  244.     ListPositionNew = m_SimpleListWrapped.AddTail((void*)pNew);
  245. }
  246. else
  247. {
  248.     ListPosition = itBefore.m_ListPosition;
  249.     ListPositionNew = m_SimpleListWrapped.InsertBefore(ListPosition, (void*)pNew);
  250. }
  251. return iterator(&m_SimpleListWrapped, ListPositionNew);
  252.     }
  253.     void
  254.     LIST_FULL_SPEC::insert
  255.     (
  256. LIST_FULL_SPEC::iterator itBefore,
  257. const LIST_FULL_SPEC::iterator itFirst,
  258. const LIST_FULL_SPEC::iterator itLast
  259.     )
  260.     {
  261. iterator itOther;
  262. LISTPOSITION ListPosition;
  263. if ((&m_SimpleListWrapped) != itBefore.m_pSimpleListWrapped)
  264. {
  265.     return;
  266. }
  267. for (itOther = itFirst; itOther != itLast && itOther != end(); ++itOther)
  268. {
  269.     value_type* pNew = new value_type;
  270.     HX_ASSERT(pNew);
  271.     *pNew = *((value_type*)itOther.m_pSimpleListWrapped->GetAt(itOther.m_ListPosition));
  272.     if (!itBefore.m_ListPosition)
  273.     {
  274. m_SimpleListWrapped.AddTail((void*)pNew);
  275.     }
  276.     else
  277.     {
  278. ListPosition = itBefore.m_ListPosition;
  279. m_SimpleListWrapped.InsertBefore(ListPosition, (void*)pNew);
  280.     }
  281. }
  282.     }
  283.     LIST_FULL_SPEC::iterator
  284.     LIST_FULL_SPEC::remove(LIST_FULL_SPEC::iterator itThis)
  285.     {
  286. if (!itThis.m_ListPosition || (&m_SimpleListWrapped) != itThis.m_pSimpleListWrapped)
  287. {
  288.     return end();
  289. }
  290. LISTPOSITION ListPositionOld;
  291. ListPositionOld = itThis.m_ListPosition;
  292. ++itThis;
  293. delete ((value_type*)m_SimpleListWrapped.GetAt(ListPositionOld));
  294. m_SimpleListWrapped.RemoveAt(ListPositionOld);
  295. return itThis;
  296.     }
  297.     LIST_FULL_SPEC::iterator
  298.     LIST_FULL_SPEC::remove(LIST_FULL_SPEC::iterator itFirst, LIST_FULL_SPEC::iterator itLast)
  299.     {
  300. if (!itFirst.m_ListPosition || (&m_SimpleListWrapped) != itFirst.m_pSimpleListWrapped)
  301. {
  302.     return end();
  303. }
  304. iterator itOther;
  305. LISTPOSITION ListPositionOld;
  306. for (itOther = itFirst; itOther != itLast && itOther != end();)
  307. {
  308.     ListPositionOld = itOther.m_ListPosition;
  309.     ++itOther;
  310.     delete ((value_type*)m_SimpleListWrapped.GetAt(ListPositionOld));
  311.     m_SimpleListWrapped.RemoveAt(ListPositionOld);
  312. }
  313. return itOther;
  314.     }
  315.     void
  316.     LIST_FULL_SPEC::empty()
  317.     {
  318. remove(begin(), end());
  319.     }
  320. #ifdef IMPLEMENT_KEYED_LIST
  321.     LIST_FULL_SPEC::iterator
  322.     LIST_FULL_SPEC::insert(const LIST_FULL_SPEC::value_type& rclsNew)
  323.     {
  324. return insert(begin(), rclsNew);
  325.     }
  326.     LIST_FULL_SPEC::iterator
  327.     LIST_FULL_SPEC::remove(const LIST_FULL_SPEC::key_type& key)
  328.     {
  329. iterator itNext = begin();
  330. while ((itNext = remove(find(itNext, key))) != end()) {};
  331. return itNext;
  332.     }
  333.     LIST_FULL_SPEC::iterator 
  334.     LIST_FULL_SPEC::find(const LIST_FULL_SPEC::key_type& key)
  335.     {
  336. return find(begin(), key);
  337.     }
  338. #ifndef _UNIX
  339.     LIST_FULL_SPEC::const_iterator 
  340.     LIST_FULL_SPEC::find(const LIST_FULL_SPEC::key_type& key) const
  341.     {
  342. return find(begin(), key);
  343.     }
  344. #endif
  345.     LIST_FULL_SPEC::iterator 
  346.     LIST_FULL_SPEC::find(const LIST_FULL_SPEC::iterator itBegin, const LIST_FULL_SPEC::key_type& key)
  347.     {
  348. iterator itCurrent;
  349. for (itCurrent = itBegin; itCurrent != end(); ++itCurrent)
  350. {
  351.     if (!key_behaviour::compare((*itCurrent).first, key))
  352.     {
  353. break;
  354.     }
  355. }
  356. return itCurrent;
  357.     }
  358. #ifndef _UNIX
  359.     LIST_FULL_SPEC::const_iterator 
  360.     LIST_FULL_SPEC::find(const LIST_FULL_SPEC::iterator itBegin, const LIST_FULL_SPEC::key_type& key) const
  361.     {
  362. iterator itCurrent;
  363. for (itCurrent = itBegin; itCurrent != end(); ++itCurrent)
  364. {
  365.     if (!key_behaviour::compare((*itCurrent).first, key))
  366.     {
  367. break;
  368.     }
  369. }
  370. return itCurrent;
  371.     }
  372. #endif
  373. #endif //IMPLEMENT_KEYED_LIST
  374.     LIST_FULL_SPEC::_Iterator::_Iterator()
  375. : m_pSimpleListWrapped(NULL)
  376. , m_ListPosition(NULL)
  377.     {
  378.     }
  379.     LIST_FULL_SPEC::_Iterator::_Iterator
  380.     (
  381. const CHXSimpleList* pSimpleListWrapped,
  382. LISTPOSITION ListPosition
  383.     )
  384. : m_pSimpleListWrapped((CHXSimpleList*)pSimpleListWrapped)
  385. , m_ListPosition(ListPosition)
  386.     {
  387.     }
  388.     LIST_FULL_SPEC::_Iterator::_Iterator
  389.     (
  390. const LIST_FULL_SPEC::_Iterator& rliocOther
  391.     )
  392. : m_pSimpleListWrapped(rliocOther.m_pSimpleListWrapped)
  393. , m_ListPosition(rliocOther.m_ListPosition)
  394.     {
  395.     }
  396.     LIST_FULL_SPEC::_Iterator::~_Iterator()
  397.     {
  398.     }
  399.     LIST_FULL_SPEC::_Iterator&
  400.     LIST_FULL_SPEC::_Iterator::operator=
  401.     (
  402. const LIST_FULL_SPEC::_Iterator& rliocOther
  403.     )
  404.     {
  405. m_pSimpleListWrapped = (rliocOther.m_pSimpleListWrapped);
  406. m_ListPosition = (rliocOther.m_ListPosition);
  407. return *this;
  408.     }
  409.     LIST_FULL_SPEC::value_type&
  410.     LIST_FULL_SPEC::_Iterator::operator*()
  411.     {
  412. HX_ASSERT(m_pSimpleListWrapped && m_ListPosition);
  413. return *((LIST_FULL_SPEC::value_type*)m_pSimpleListWrapped->GetAt(m_ListPosition));
  414.     }
  415.     LIST_FULL_SPEC::_Iterator&
  416.     LIST_FULL_SPEC::_Iterator::operator=(const LIST_FULL_SPEC::value_type& rclsNewValue)
  417.     {
  418. if(m_pSimpleListWrapped && m_ListPosition)
  419. {
  420.     *((LIST_FULL_SPEC::value_type*)m_pSimpleListWrapped->GetAt(m_ListPosition)) = rclsNewValue;
  421. }
  422. return *this;
  423.     }
  424.     LIST_FULL_SPEC::_Iterator&
  425.     LIST_FULL_SPEC::_Iterator::operator++()
  426.     {
  427. if(m_pSimpleListWrapped && m_ListPosition)
  428. {
  429.     m_pSimpleListWrapped->GetNext(m_ListPosition);
  430. }
  431. return *this;
  432.     }
  433.     const LIST_FULL_SPEC::_Iterator
  434.     LIST_FULL_SPEC::_Iterator::operator++(int)
  435.     {
  436. _Iterator liocRet(*this);
  437. ++(*this);
  438. return liocRet;
  439.     }
  440.     LIST_FULL_SPEC::_Iterator&
  441.     LIST_FULL_SPEC::_Iterator::operator--()
  442.     {
  443. if(m_pSimpleListWrapped)
  444. {
  445.     if (!m_ListPosition)
  446.     {
  447. m_ListPosition = m_pSimpleListWrapped->GetTailPosition();
  448.     }
  449.     else
  450.     {
  451. m_pSimpleListWrapped->GetPrev(m_ListPosition);
  452. if (!m_ListPosition)
  453. {
  454.     m_ListPosition = m_pSimpleListWrapped->GetHeadPosition();
  455. }
  456.     }
  457. }
  458. return *this;
  459.     }
  460.     const LIST_FULL_SPEC::_Iterator
  461.     LIST_FULL_SPEC::_Iterator::operator--(int)
  462.     {
  463. LIST_FULL_SPEC::_Iterator liocRet(*this);
  464. --(*this);
  465. return liocRet;
  466.     }
  467.     BOOL operator==
  468.     (
  469. const LIST_FULL_SPEC::_Iterator& rliocLeft,
  470. const LIST_FULL_SPEC::_Iterator& rliocRight
  471.     )
  472.     {
  473. return (rliocLeft.m_pSimpleListWrapped == rliocRight.m_pSimpleListWrapped && rliocLeft.m_ListPosition == rliocRight.m_ListPosition);
  474.     }
  475.     BOOL operator!=
  476.     (
  477. const LIST_FULL_SPEC::_Iterator& rliocLeft,
  478. const LIST_FULL_SPEC::_Iterator& rliocRight
  479.     )
  480.     {
  481. return (rliocLeft.m_pSimpleListWrapped != rliocRight.m_pSimpleListWrapped || rliocLeft.m_ListPosition != rliocRight.m_ListPosition);
  482.     }
  483. #undef IMPLEMENT_KEYED_LIST
  484. #undef IMPLEMENT_LIST
  485. #undef LIST_NAME
  486. #undef LIST_SCOPE
  487. #undef LIST_FULL_SPEC
  488. #endif //IMPLEMENT_LIST
  489. #ifdef DEFINE_UNIQUELY_KEYED_LIST
  490. //#define KEYED_LIST
  491. //#define LOOKUP_MAP
  492. //#define LIST_NAME
  493. class LIST_NAME : public KEYED_LIST
  494. {
  495. public:
  496.     typedef KEYED_LIST::key_type key_type;
  497.     typedef KEYED_LIST::key_behaviour key_behaviour;
  498.     typedef KEYED_LIST::referent_type referent_type;
  499.     typedef KEYED_LIST::value_type value_type;
  500.     typedef KEYED_LIST::iterator iterator;
  501.     typedef KEYED_LIST::const_iterator const_iterator;
  502.     typedef KEYED_LIST base_list;
  503.     typedef LOOKUP_MAP lookup_map;
  504. public:
  505.     LIST_NAME();
  506.     LIST_NAME(const LIST_NAME& rlocOther);
  507.     ~LIST_NAME();
  508.     LIST_NAME& operator=(const LIST_NAME& rlocOther);
  509.     iterator insert(iterator itBefore, const value_type&);
  510.     void insert
  511.     (
  512. iterator itBefore,
  513. const iterator itFirst,
  514. const iterator itLast
  515.     );
  516.     iterator insert(const value_type&);
  517.     iterator remove(iterator itThis);
  518.     iterator remove(iterator itFirst, iterator itLast);
  519.     iterator remove(const key_type&);
  520.     void empty();
  521.     KEYED_LIST::_Iterator find(const key_type&);
  522. #ifndef _UNIX
  523.     const KEYED_LIST::_Iterator find(const key_type&) const;
  524. #endif
  525. private:
  526.     KEYED_LIST::_Iterator find(const KEYED_LIST::_Iterator, const key_type&);
  527. #ifndef _UNIX
  528.     const KEYED_LIST::_Iterator find(const KEYED_LIST::_Iterator, const key_type&) const;
  529. #endif
  530. private:
  531.     LOOKUP_MAP m_LookupMap;
  532.     void _copy(const LIST_NAME& rlocOther);
  533. };
  534. #undef KEYED_LIST
  535. #undef LIST_NAME
  536. #undef LOOKUP_MAP
  537. #undef DEFINE_UNIQUELY_KEYED_LIST
  538. #endif //DEFINE_UNIQUELY_KEYED_LIST
  539. #ifdef DEFINE_UNIQUELY_KEYED_LIST_GLOBALS
  540. #ifndef LIST_SCOPE
  541. #define LIST_FULL_SPEC LIST_NAME
  542. #else
  543. #define LIST_FULL_SPEC LIST_SCOPE::LIST_NAME
  544. #endif //!LIST_SCOPE
  545. #undef LIST_NAME
  546. #undef DEFINE_UNIQUELY_KEYED_LIST_GLOBALS
  547. #undef LIST_SCOPE
  548. #undef LIST_FULL_SPEC
  549. #endif //DEFINE_UNIQUELY_KEYED_LIST_GLOBALS
  550. #ifdef IMPLEMENT_UNIQUELY_KEYED_LIST
  551. #ifndef LIST_SCOPE
  552. #define LIST_FULL_SPEC LIST_NAME
  553. #else
  554. #define LIST_FULL_SPEC LIST_SCOPE::LIST_NAME
  555. #endif //!LIST_SCOPE
  556.     LIST_FULL_SPEC::LIST_NAME()
  557.     {
  558.     }
  559.     LIST_FULL_SPEC::LIST_NAME(const LIST_FULL_SPEC& rlocOther)
  560.     {
  561. _copy(rlocOther);
  562.     }
  563.     LIST_FULL_SPEC::~LIST_NAME()
  564.     {
  565. empty();
  566.     }
  567.     LIST_FULL_SPEC&
  568.     LIST_FULL_SPEC::operator=(const LIST_FULL_SPEC& rlocOther)
  569.     {
  570. empty();
  571. _copy(rlocOther);
  572. return *this;
  573.     }
  574.     void
  575.     LIST_FULL_SPEC::_copy(const LIST_FULL_SPEC& rlocOther)
  576.     {
  577.      iterator itOther;
  578. for
  579. (
  580.     itOther = rlocOther.begin();
  581.     itOther != rlocOther.end();
  582.     ++itOther
  583. )
  584. {
  585.     insert(end(), *itOther);
  586. }
  587.     }
  588.     LIST_FULL_SPEC::iterator
  589.     LIST_FULL_SPEC::insert(LIST_FULL_SPEC::iterator itBefore, const LIST_FULL_SPEC::value_type& rvalue)
  590.     {
  591. lookup_map::iterator itValue;
  592. iterator itNew;
  593. itValue = m_LookupMap.find(rvalue.first);
  594. if (itValue == m_LookupMap.end())
  595. {
  596.     //New insert
  597.     // insert into ordered list
  598.     itNew = base_list::insert(itBefore, rvalue);
  599.     // insert into map
  600.     m_LookupMap.insert(lookup_map::value_type(rvalue.first, itNew));
  601. }
  602. else
  603. {
  604.     // dup insert, replace previous with this.
  605.     // remove existing from ordered list
  606.     base_list::remove((*itValue).second);
  607.     // insert new into ordered list
  608.     itNew = base_list::insert(itBefore, rvalue);
  609.     // replace old iterator in the map
  610.     itValue = lookup_map::value_type(rvalue.first, itNew);
  611. }
  612. return itNew;
  613.     }
  614.     void
  615.     LIST_FULL_SPEC::insert
  616.     (
  617. LIST_FULL_SPEC::iterator itBefore,
  618. const LIST_FULL_SPEC::iterator itFirst,
  619. const LIST_FULL_SPEC::iterator itLast
  620.     )
  621.     {
  622. iterator itOther;
  623. for (itOther = itFirst; itOther != itLast && itOther != end(); ++itOther)
  624. {
  625.     insert(itBefore, *itOther);
  626. }
  627.     }
  628.     LIST_FULL_SPEC::iterator
  629.     LIST_FULL_SPEC::insert(const LIST_FULL_SPEC::value_type& rclsNew)
  630.     {
  631. return insert(begin(), rclsNew);
  632.     }
  633.     LIST_FULL_SPEC::iterator
  634.     LIST_FULL_SPEC::remove(LIST_FULL_SPEC::iterator itThis)
  635.     {
  636. // remove from map
  637. m_LookupMap.remove((*itThis).first);
  638. // remove from ordered list
  639. return base_list::remove(itThis);
  640.     }
  641.     LIST_FULL_SPEC::iterator
  642.     LIST_FULL_SPEC::remove(LIST_FULL_SPEC::iterator itFirst, LIST_FULL_SPEC::iterator itLast)
  643.     {
  644. iterator itOther;
  645. for (itOther = itFirst; itOther != itLast && itOther != end();)
  646. {
  647.     itOther = remove(itOther);
  648. }
  649. return itOther;
  650.     }
  651.     LIST_FULL_SPEC::iterator
  652.     LIST_FULL_SPEC::remove(const LIST_FULL_SPEC::key_type& key)
  653.     {
  654. iterator itNext;
  655. lookup_map::iterator itValue;
  656. itValue = m_LookupMap.find(key);
  657. if (itValue != m_LookupMap.end())
  658. {
  659.     // Save iterator
  660.     itNext = (*itValue).second;
  661.     // remove from map
  662.     m_LookupMap.remove((*itValue).first);
  663.     // remove from ordered list
  664.     itNext = remove(itNext);
  665. }
  666. else
  667. {
  668.     itNext = end();
  669. }
  670. return itNext;
  671.     }
  672.     void
  673.     LIST_FULL_SPEC::empty()
  674.     {
  675. remove(begin(), end());
  676.     }
  677.     LIST_FULL_SPEC::iterator 
  678.     LIST_FULL_SPEC::find(const LIST_FULL_SPEC::key_type& key)
  679.     {
  680. iterator itFound;
  681. lookup_map::iterator itValue;
  682. itValue = m_LookupMap.find(key);
  683. if (itValue != m_LookupMap.end())
  684. {
  685.     itFound = (*itValue).second;
  686. }
  687. else
  688. {
  689.     itFound = end();
  690. }
  691. return itFound;
  692.     }
  693. #ifndef _UNIX
  694.     LIST_FULL_SPEC::const_iterator 
  695.     LIST_FULL_SPEC::find(const LIST_FULL_SPEC::key_type& key) const
  696.     {
  697. iterator itFound;
  698. lookup_map::iterator itValue;
  699. itValue = m_LookupMap.find(key);
  700. if (itValue != m_LookupMap.end())
  701. {
  702.     itFound = (*itValue).second;
  703. }
  704. else
  705. {
  706.     itFound = end();
  707. }
  708. return itFound;
  709.     }
  710. #endif
  711.     LIST_FULL_SPEC::iterator 
  712.     LIST_FULL_SPEC::find(const LIST_FULL_SPEC::iterator , const LIST_FULL_SPEC::key_type& )
  713.     {
  714. return end();
  715.     }
  716. #ifndef _UNIX
  717.     LIST_FULL_SPEC::const_iterator 
  718.     LIST_FULL_SPEC::find(const LIST_FULL_SPEC::iterator , const LIST_FULL_SPEC::key_type& ) const
  719.     {
  720. return end();
  721.     }
  722. #endif
  723. #undef LIST_NAME
  724. #undef IMPLEMENT_UNIQUELY_KEYED_LIST
  725. #undef LIST_SCOPE
  726. #undef LIST_FULL_SPEC
  727. #endif //IMPLEMENT_UNIQUELY_KEYED_LIST