list_vs.h 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751
  1. ////////////////////////////////////////////////////////////////////////////////////////
  2. // RAVEN STANDARD TEMPLATE LIBRARY
  3. // (c) 2002 Activision
  4. //
  5. //
  6. // List
  7. // ----
  8. // The list class supports ordered insertion and deletion in O(1) constant time.
  9. // It simulates a linked list of pointers by allocating free spots in a pool and
  10. // maintaining "links" as indicies to the pool array objects.
  11. //
  12. //
  13. //
  14. // NOTES:
  15. //
  16. //
  17. //
  18. ////////////////////////////////////////////////////////////////////////////////////////
  19. #if !defined(RATL_LIST_VS_INC)
  20. #define RATL_LIST_VS_INC
  21. ////////////////////////////////////////////////////////////////////////////////////////
  22. // Includes
  23. ////////////////////////////////////////////////////////////////////////////////////////
  24. #if defined(RA_DEBUG_LINKING)
  25. #pragma message("...including list_vs.h")
  26. #endif
  27. #if !defined(RATL_COMMON_INC)
  28. #include "ratl_common.h"
  29. #endif
  30. #if !defined(RATL_POOL_VS_INC)
  31. #include "pool_vs.h"
  32. #endif
  33. namespace ratl
  34. {
  35. // this is private to the list, but you have no access to it, soooo..
  36. class list_node
  37. {
  38. public:
  39. int mNext;
  40. int mPrev;
  41. };
  42. ////////////////////////////////////////////////////////////////////////////////////////
  43. // The List Class
  44. ////////////////////////////////////////////////////////////////////////////////////////
  45. template <class T>
  46. class list_base : public ratl_base
  47. {
  48. public:
  49. typedef typename T TStorageTraits;
  50. typedef typename T::TValue TTValue;
  51. ////////////////////////////////////////////////////////////////////////////////////
  52. // Capacity Enum
  53. ////////////////////////////////////////////////////////////////////////////////////
  54. enum
  55. {
  56. CAPACITY = T::CAPACITY
  57. };
  58. private:
  59. ////////////////////////////////////////////////////////////////////////////////////
  60. // Data
  61. ////////////////////////////////////////////////////////////////////////////////////
  62. pool_base<TStorageTraits> mPool; // The Allocation Data Pool
  63. int mFront; // The Beginning Of The List
  64. int mBack; // The End Of The List
  65. enum
  66. {
  67. NULL_NODE = -1
  68. };
  69. public:
  70. ////////////////////////////////////////////////////////////////////////////////////
  71. // Constructor
  72. ////////////////////////////////////////////////////////////////////////////////////
  73. list_base() : mFront(NULL_NODE), mBack(NULL_NODE)
  74. {
  75. }
  76. ////////////////////////////////////////////////////////////////////////////////////
  77. // How Many Objects Are In This List
  78. ////////////////////////////////////////////////////////////////////////////////////
  79. int size() const
  80. {
  81. return (mPool.size());
  82. }
  83. ////////////////////////////////////////////////////////////////////////////////////
  84. // Are There Any Objects In This List?
  85. ////////////////////////////////////////////////////////////////////////////////////
  86. bool empty() const
  87. {
  88. assert(mFront!=NULL_NODE || size()==0);
  89. return (mFront==NULL_NODE);
  90. }
  91. ////////////////////////////////////////////////////////////////////////////////////
  92. // Is This List Filled?
  93. ////////////////////////////////////////////////////////////////////////////////////
  94. bool full() const
  95. {
  96. return (mPool.full());
  97. }
  98. ////////////////////////////////////////////////////////////////////////////////////
  99. // Clear All Elements
  100. ////////////////////////////////////////////////////////////////////////////////////
  101. void clear()
  102. {
  103. mFront = NULL_NODE;
  104. mBack = NULL_NODE;
  105. mPool.clear();
  106. }
  107. ////////////////////////////////////////////////////////////////////////////////////
  108. // Get The First Object In The List
  109. ////////////////////////////////////////////////////////////////////////////////////
  110. TTValue & front()
  111. {
  112. assert(mFront!=NULL_NODE); // this is empty
  113. return mPool[mFront];
  114. }
  115. ////////////////////////////////////////////////////////////////////////////////////
  116. // Get The Last Object In The List
  117. ////////////////////////////////////////////////////////////////////////////////////
  118. TTValue & back()
  119. {
  120. assert(mBack!=NULL_NODE);
  121. return mPool[mBack];
  122. }
  123. ////////////////////////////////////////////////////////////////////////////////////
  124. // Get The First Object In The List
  125. ////////////////////////////////////////////////////////////////////////////////////
  126. const TTValue & front() const
  127. {
  128. assert(mFront!=NULL_NODE); // this is empty
  129. return mPool[mFront];
  130. }
  131. ////////////////////////////////////////////////////////////////////////////////////
  132. // Get The Last Object In The List
  133. ////////////////////////////////////////////////////////////////////////////////////
  134. const TTValue & back() const
  135. {
  136. assert(mBack!=NULL_NODE);
  137. return mPool[mBack];
  138. }
  139. public:
  140. ////////////////////////////////////////////////////////////////////////////////////
  141. // Iterator
  142. ////////////////////////////////////////////////////////////////////////////////////
  143. class const_iterator;
  144. class iterator
  145. {
  146. friend class list_base<T>;
  147. friend class const_iterator;
  148. int mLoc;
  149. list_base<T>* mOwner;
  150. public:
  151. // Constructors
  152. //--------------
  153. iterator() : mOwner(0), mLoc(0)
  154. {}
  155. iterator(list_base* p, int t) : mOwner(p), mLoc(t)
  156. {}
  157. iterator(const iterator &t) : mOwner(t.mOwner), mLoc(t.mLoc)
  158. {}
  159. // Assignment Operator
  160. //---------------------
  161. void operator= (const iterator &t)
  162. {
  163. mOwner = t.mOwner;
  164. mLoc = t.mLoc;
  165. }
  166. // Equality Operators
  167. //--------------------
  168. bool operator!=(const iterator &t) const
  169. {
  170. return (mLoc!=t.mLoc || mOwner!=t.mOwner);
  171. }
  172. bool operator==(const iterator &t) const
  173. {
  174. return (mLoc==t.mLoc && mOwner==t.mOwner);
  175. }
  176. // DeReference Operator
  177. //----------------------
  178. TTValue& operator* () const
  179. {
  180. assert(mLoc>=0 && mLoc<T::CAPACITY);
  181. return (mOwner->mPool[mLoc]);
  182. }
  183. // DeReference Operator
  184. //----------------------
  185. TTValue& value() const
  186. {
  187. assert(mLoc>=0 && mLoc<T::CAPACITY);
  188. return (mOwner->mPool[mLoc]);
  189. }
  190. // DeReference Operator
  191. //----------------------
  192. TTValue* operator-> () const
  193. {
  194. assert(mLoc>=0 && mLoc<T::CAPACITY);
  195. return (&mOwner->mPool[mLoc]);
  196. }
  197. // prefix Inc Operator
  198. //--------------
  199. iterator operator++(int)
  200. {
  201. assert(mLoc>=0 && mLoc<T::CAPACITY);
  202. iterator old(*this);
  203. mLoc = T::node(mOwner->mPool[mLoc]).mNext;
  204. return old;
  205. }
  206. // postfix Inc Operator
  207. //--------------
  208. iterator operator++()
  209. {
  210. assert(mLoc>=0 && mLoc<T::CAPACITY);
  211. mLoc = T::node(mOwner->mPool[mLoc]).mNext;
  212. return *this;
  213. }
  214. // prefix Inc Operator
  215. //--------------
  216. iterator operator--(int)
  217. {
  218. assert(mLoc>=0 && mLoc<T::CAPACITY);
  219. iterator old(*this);
  220. mLoc = T::node(mOwner->mPool[mLoc]).mPrev;
  221. return old;
  222. }
  223. //--------------
  224. // postfix Dec Operator
  225. //--------------
  226. iterator operator--()
  227. {
  228. assert(mLoc>=0 && mLoc<T::CAPACITY);
  229. mLoc = T::node(mOwner->mPool[mLoc]).mPrev;
  230. return *this;
  231. }
  232. };
  233. ////////////////////////////////////////////////////////////////////////////////////
  234. // Constant Iterator
  235. ////////////////////////////////////////////////////////////////////////////////////
  236. class const_iterator
  237. {
  238. friend class list_base<T>;
  239. int mLoc;
  240. const list_base<T>* mOwner;
  241. public:
  242. // Constructors
  243. //--------------
  244. const_iterator() : mOwner(0), mLoc(0)
  245. {}
  246. const_iterator(const list_base* p, int t) : mOwner(p), mLoc(t)
  247. {}
  248. const_iterator(const const_iterator &t) : mOwner(t.mOwner), mLoc(t.mLoc)
  249. {}
  250. const_iterator(const iterator &t) : mOwner(t.mOwner), mLoc(t.mLoc)
  251. {}
  252. // Assignment Operator
  253. //---------------------
  254. void operator= (const const_iterator &t)
  255. {
  256. mOwner = t.mOwner;
  257. mLoc = t.mLoc;
  258. }
  259. // Assignment Operator
  260. //---------------------
  261. void operator= (const iterator &t)
  262. {
  263. mOwner = t.mOwner;
  264. mLoc = t.mLoc;
  265. }
  266. // Equality Operators
  267. //--------------------
  268. bool operator!=(const iterator &t) const
  269. {
  270. return (mLoc!=t.mLoc || mOwner!=t.mOwner);
  271. }
  272. bool operator==(const iterator &t) const
  273. {
  274. return (mLoc==t.mLoc && mOwner==t.mOwner);
  275. }
  276. // Equality Operators
  277. //--------------------
  278. bool operator!=(const const_iterator &t) const
  279. {
  280. return (mLoc!=t.mLoc || mOwner!=t.mOwner);
  281. }
  282. bool operator==(const const_iterator &t) const
  283. {
  284. return (mLoc==t.mLoc && mOwner==t.mOwner);
  285. }
  286. // DeReference Operator
  287. //----------------------
  288. const TTValue& operator* () const
  289. {
  290. assert(mLoc>=0 && mLoc<T::CAPACITY);
  291. return (mOwner->mPool[mLoc]);
  292. }
  293. // DeReference Operator
  294. //----------------------
  295. const TTValue* operator-> () const
  296. {
  297. assert(mLoc>=0 && mLoc<T::CAPACITY);
  298. return (&mOwner->mPool[mLoc]);
  299. }
  300. // DeReference Operator
  301. //----------------------
  302. const TTValue& value() const
  303. {
  304. assert(mLoc>=0 && mLoc<T::CAPACITY);
  305. return (mOwner->mPool[mLoc]);
  306. }
  307. // prefix Inc Operator
  308. //--------------
  309. const_iterator operator++(int)
  310. {
  311. assert(mLoc>=0 && mLoc<T::CAPACITY);
  312. const_iterator old(*this);
  313. mLoc = T::node(mOwner->mPool[mLoc]).mNext;
  314. return old;
  315. }
  316. // postfix Inc Operator
  317. //--------------
  318. const_iterator operator++()
  319. {
  320. assert(mLoc>=0 && mLoc<T::CAPACITY);
  321. mLoc = T::node(mOwner->mPool[mLoc]).mNext;
  322. return *this;
  323. }
  324. // prefix Inc Operator
  325. //--------------
  326. const_iterator operator--(int)
  327. {
  328. assert(mLoc>=0 && mLoc<T::CAPACITY);
  329. const_iterator old(*this);
  330. mLoc = T::node(mOwner->mPool[mLoc]).mPrev;
  331. return old;
  332. }
  333. //--------------
  334. // postfix Dec Operator
  335. //--------------
  336. const_iterator operator--()
  337. {
  338. assert(mLoc>=0 && mLoc<T::CAPACITY);
  339. mLoc = T::node(mOwner->mPool[mLoc]).mPrev;
  340. return *this;
  341. }
  342. };
  343. friend class iterator;
  344. friend class const_iterator;
  345. ////////////////////////////////////////////////////////////////////////////////////
  346. // Iterator Begin (Starts At Address mFront)
  347. ////////////////////////////////////////////////////////////////////////////////////
  348. iterator begin()
  349. {
  350. return iterator(this, mFront);
  351. }
  352. ////////////////////////////////////////////////////////////////////////////////////
  353. // Iterator Begin (Starts At Address mFront)
  354. ////////////////////////////////////////////////////////////////////////////////////
  355. const_iterator begin() const
  356. {
  357. return const_iterator(this, mFront);
  358. }
  359. ////////////////////////////////////////////////////////////////////////////////////
  360. // Reverse Iterator Begin (Starts At Address mBack)
  361. ////////////////////////////////////////////////////////////////////////////////////
  362. iterator rbegin()
  363. {
  364. return iterator(this, mBack);
  365. }
  366. ////////////////////////////////////////////////////////////////////////////////////
  367. // Reverse Iterator Begin (Starts At Address mBack)
  368. ////////////////////////////////////////////////////////////////////////////////////
  369. const_iterator rbegin() const
  370. {
  371. return const_iterator(this, mBack);
  372. }
  373. ////////////////////////////////////////////////////////////////////////////////////
  374. // Iterator End (Set To Address NULL_NODE) Should Work For Forward & Backward Iteration
  375. ////////////////////////////////////////////////////////////////////////////////////
  376. iterator end()
  377. {
  378. return iterator(this, NULL_NODE);
  379. }
  380. ////////////////////////////////////////////////////////////////////////////////////
  381. // Iterator End (Set To Address NULL_NODE) Should Work For Forward & Backward Iteration
  382. ////////////////////////////////////////////////////////////////////////////////////
  383. const_iterator end() const
  384. {
  385. return const_iterator(this, NULL_NODE);
  386. }
  387. ////////////////////////////////////////////////////////////////////////////////////
  388. // Iterator Insert (BEFORE POINTED ELEMENT)
  389. ////////////////////////////////////////////////////////////////////////////////////
  390. T& insert(const iterator& it)
  391. {
  392. int nNew= mPool.alloc();
  393. insert_low(it,nNew);
  394. return mPool[mNew];
  395. }
  396. ////////////////////////////////////////////////////////////////////////////////////
  397. // Iterator Insert Value(BEFORE POINTED ELEMENT)
  398. ////////////////////////////////////////////////////////////////////////////////////
  399. void insert(const iterator& it, const TTValue& val)
  400. {
  401. int nNew= mPool.alloc(val);
  402. insert_low(it,nNew);
  403. }
  404. ////////////////////////////////////////////////////////////////////////////////////
  405. // Iterator Insert Raw(BEFORE POINTED ELEMENT)
  406. ////////////////////////////////////////////////////////////////////////////////////
  407. TRatlNew* insert_raw(const iterator& it)
  408. {
  409. TRatlNew *ret = mPool.alloc_raw();
  410. insert_low(it,mPool.pointer_to_index(ret));
  411. return ret;
  412. }
  413. ////////////////////////////////////////////////////////////////////////////////////
  414. // Iterator Insert (AFTER POINTED ELEMENT) (ALSO - NOT CONSTANT, WILL CHANGE it)
  415. ////////////////////////////////////////////////////////////////////////////////////
  416. T& insert_after(iterator& it)
  417. {
  418. int nNew= mPool.alloc();
  419. insert_low_after(it,nNew);
  420. it = iterator(this, nNew);
  421. return mPool[mNew];
  422. }
  423. ////////////////////////////////////////////////////////////////////////////////////
  424. // Iterator Insert Value(AFTER POINTED ELEMENT) (ALSO - NOT CONSTANT, WILL CHANGE it)
  425. ////////////////////////////////////////////////////////////////////////////////////
  426. void insert_after(iterator& it, const TTValue& val)
  427. {
  428. int nNew= mPool.alloc(val);
  429. insert_low_after(it,nNew);
  430. it = iterator(this, nNew);
  431. }
  432. ////////////////////////////////////////////////////////////////////////////////////
  433. // Iterator Insert Raw(AFTER POINTED ELEMENT) (ALSO - NOT CONSTANT, WILL CHANGE it)
  434. ////////////////////////////////////////////////////////////////////////////////////
  435. TRatlNew* insert_raw_after(iterator& it)
  436. {
  437. TRatlNew *ret = mPool.alloc_raw();
  438. insert_low_after(it,mPool.pointer_to_index(ret));
  439. it = iterator(this, mPool.pointer_to_index(ret));
  440. return ret;
  441. }
  442. ////////////////////////////////////////////////////////////////////////////////////
  443. // Front Insert (BEFORE POINTED ELEMENT)
  444. ////////////////////////////////////////////////////////////////////////////////////
  445. T& push_front()
  446. {
  447. int nNew= mPool.alloc();
  448. insert_low(begin(),nNew);
  449. return mPool[mNew];
  450. }
  451. ////////////////////////////////////////////////////////////////////////////////////
  452. // Front Insert Value(BEFORE POINTED ELEMENT)
  453. ////////////////////////////////////////////////////////////////////////////////////
  454. void push_front(const TTValue& val)
  455. {
  456. int nNew= mPool.alloc(val);
  457. insert_low(begin(),nNew);
  458. }
  459. ////////////////////////////////////////////////////////////////////////////////////
  460. // Front Insert Raw(BEFORE POINTED ELEMENT)
  461. ////////////////////////////////////////////////////////////////////////////////////
  462. TRatlNew * push_front_raw()
  463. {
  464. TRatlNew *ret = mPool.alloc_raw();
  465. insert_low(begin(),mPool.pointer_to_index(ret));
  466. return ret;
  467. }
  468. ////////////////////////////////////////////////////////////////////////////////////
  469. // Front Insert (BEFORE POINTED ELEMENT)
  470. ////////////////////////////////////////////////////////////////////////////////////
  471. T& push_back()
  472. {
  473. int nNew= mPool.alloc();
  474. insert_low(end(),nNew);
  475. return mPool[mNew];
  476. }
  477. ////////////////////////////////////////////////////////////////////////////////////
  478. // Front Insert Value(BEFORE POINTED ELEMENT)
  479. ////////////////////////////////////////////////////////////////////////////////////
  480. void push_back(const TTValue& val)
  481. {
  482. int nNew= mPool.alloc(val);
  483. insert_low(end(),nNew);
  484. }
  485. ////////////////////////////////////////////////////////////////////////////////////
  486. // Front Insert Raw(BEFORE POINTED ELEMENT)
  487. ////////////////////////////////////////////////////////////////////////////////////
  488. TRatlNew * push_back_raw()
  489. {
  490. TRatlNew *ret = mPool.alloc_raw();
  491. insert_low(end(),mPool.pointer_to_index(ret));
  492. return ret;
  493. }
  494. ////////////////////////////////////////////////////////////////////////////////////
  495. // Iterator Erase
  496. ////////////////////////////////////////////////////////////////////////////////////
  497. void erase(iterator& it)
  498. {
  499. assert(it.mOwner==this); // Iterators must be mixed up, this is from a different list.
  500. assert(it.mLoc!=NULL_NODE);
  501. int At = it.mLoc;
  502. int Prev = T::node(mPool[At]).mPrev;
  503. int Next = T::node(mPool[At]).mNext;
  504. // LINK: (Prev)<-(At)--(Next)
  505. //--------------------------------------------
  506. if (Next!=NULL_NODE)
  507. {
  508. T::node(mPool[Next]).mPrev = Prev;
  509. }
  510. // LINK: (Prev)--(At)->(Next)
  511. //--------------------------------------------
  512. if (Prev!=NULL_NODE)
  513. {
  514. T::node(mPool[Prev]).mNext = Next;
  515. }
  516. // UPDATE: Front & Back
  517. //----------------------
  518. if (At==mBack)
  519. {
  520. mBack = Prev;
  521. }
  522. if (At==mFront)
  523. {
  524. mFront = Next;
  525. }
  526. // ERASE At
  527. //--------------------------------------------
  528. mPool.free(At);
  529. it.mLoc = Prev;
  530. }
  531. template<class CAST_TO>
  532. CAST_TO *verify_alloc(CAST_TO *p) const
  533. {
  534. return mPool.verify_alloc(p);
  535. }
  536. private:
  537. ////////////////////////////////////////////////////////////////////////////////////
  538. // Iterator Insert, returns pool index
  539. ////////////////////////////////////////////////////////////////////////////////////
  540. void insert_low(const iterator& it,int nNew)
  541. {
  542. assert(it.mOwner==this); // Iterators must be mixed up, this is from a different list.
  543. int Next = it.mLoc;
  544. int Prev = NULL_NODE;
  545. if (Next!=NULL_NODE)
  546. {
  547. Prev = T::node(mPool[Next]).mPrev;
  548. }
  549. else
  550. {
  551. Prev = mBack;
  552. }
  553. assert(nNew!=Next && nNew!=Prev);
  554. // LINK: (Prev)<-(New)->(Next)
  555. //--------------------------------------------
  556. T::node(mPool[nNew]).mPrev = Prev;
  557. T::node(mPool[nNew]).mNext = Next;
  558. // LINK: (New)<-(Next)
  559. //--------------------------------------------
  560. if (Next!=NULL_NODE)
  561. {
  562. T::node(mPool[Next]).mPrev = nNew;
  563. assert(T::node(mPool[Next]).mPrev!=T::node(mPool[Next]).mNext);
  564. }
  565. else
  566. {
  567. mBack = nNew;
  568. }
  569. // LINK: (Prev)->(New)
  570. //--------------------------------------------
  571. if (Prev!=NULL_NODE)
  572. {
  573. T::node(mPool[Prev]).mNext = nNew;
  574. assert(T::node(mPool[Prev]).mPrev!=T::node(mPool[Prev]).mNext);
  575. }
  576. else
  577. {
  578. mFront = nNew;
  579. }
  580. }
  581. ////////////////////////////////////////////////////////////////////////////////////
  582. // Iterator Insert, returns pool index (AFTER POINTED ELEMENT)
  583. ////////////////////////////////////////////////////////////////////////////////////
  584. void insert_low_after(const iterator& it,int nNew)
  585. {
  586. assert(it.mOwner==this); // Iterators must be mixed up, this is from a different list.
  587. int Next = NULL_NODE;//it.mLoc;
  588. int Prev = it.mLoc;//NULL_NODE;
  589. if (Prev!=NULL_NODE)
  590. {
  591. Next = T::node(mPool[Prev]).mNext;
  592. }
  593. else
  594. {
  595. Prev = mFront;
  596. }
  597. assert(nNew!=Next && nNew!=Prev);
  598. // LINK: (Prev)<-(New)->(Next)
  599. //--------------------------------------------
  600. T::node(mPool[nNew]).mPrev = Prev;
  601. T::node(mPool[nNew]).mNext = Next;
  602. // LINK: (New)<-(Next)
  603. //--------------------------------------------
  604. if (Next!=NULL_NODE)
  605. {
  606. T::node(mPool[Next]).mPrev = nNew;
  607. assert(T::node(mPool[Next]).mPrev!=T::node(mPool[Next]).mNext);
  608. }
  609. else
  610. {
  611. mBack = nNew;
  612. }
  613. // LINK: (Prev)->(New)
  614. //--------------------------------------------
  615. if (Prev!=NULL_NODE)
  616. {
  617. T::node(mPool[Prev]).mNext = nNew;
  618. assert(T::node(mPool[Prev]).mPrev!=T::node(mPool[Prev]).mNext);
  619. }
  620. else
  621. {
  622. mFront = nNew;
  623. }
  624. }
  625. };
  626. template<class T, int ARG_CAPACITY>
  627. class list_vs : public list_base<storage::value_semantics_node<T,ARG_CAPACITY,list_node> >
  628. {
  629. public:
  630. typedef typename storage::value_semantics_node<T,ARG_CAPACITY,list_node> TStorageTraits;
  631. typedef typename TStorageTraits::TValue TTValue;
  632. enum
  633. {
  634. CAPACITY = ARG_CAPACITY
  635. };
  636. list_vs() {}
  637. };
  638. template<class T, int ARG_CAPACITY>
  639. class list_os : public list_base<storage::object_semantics_node<T,ARG_CAPACITY,list_node> >
  640. {
  641. public:
  642. typedef typename storage::object_semantics_node<T,ARG_CAPACITY,list_node> TStorageTraits;
  643. typedef typename TStorageTraits::TValue TTValue;
  644. enum
  645. {
  646. CAPACITY = ARG_CAPACITY
  647. };
  648. list_os() {}
  649. };
  650. template<class T, int ARG_CAPACITY, int ARG_MAX_CLASS_SIZE>
  651. class list_is : public list_base<storage::virtual_semantics_node<T,ARG_CAPACITY,ARG_MAX_CLASS_SIZE,list_node> >
  652. {
  653. public:
  654. typedef typename storage::virtual_semantics_node<T,ARG_CAPACITY,ARG_MAX_CLASS_SIZE,list_node> TStorageTraits;
  655. typedef typename TStorageTraits::TValue TTValue;
  656. enum
  657. {
  658. CAPACITY = ARG_CAPACITY,
  659. MAX_CLASS_SIZE = ARG_MAX_CLASS_SIZE
  660. };
  661. list_is() {}
  662. };
  663. }
  664. #endif