1 /*---------------------------------------------------------------------------*
2   Project:  NintendoWare
3   File:     ut_LinkList.h
4 
5   Copyright (C)2009-2010 Nintendo Co., Ltd./HAL Laboratory, Inc.  All rights reserved.
6 
7   These coded instructions, statements, and computer programs contain
8   proprietary information of Nintendo of America Inc. and/or Nintendo
9   Company Ltd., and are protected by Federal copyright law.  They may
10   not be disclosed to third parties or copied or duplicated in any form,
11   in whole or in part, without the prior written consent of Nintendo.
12 
13   $Revision:$
14  *---------------------------------------------------------------------------*/
15 
16 #ifndef NW_UT_LINKLIST_H_
17 #define NW_UT_LINKLIST_H_
18 
19 #include <nw/types.h>
20 #include <nw/assert.h>
21 #include <nw/ut/ut_Inlines.h>
22 #include <nw/ut/ut_Iterator.h>
23 #include <nw/ut/ut_Preprocessor.h>
24 
25 namespace nw {
26 namespace ut {
27 
28 class LinkListNode;
29 
30 namespace internal {
31 
32 class LinkListImpl;
33 
34 } // namespace internal
35 
36 //--------------------------------------------------------------------------
37 //! @brief    双方向リンクリストノードです。
38 //---------------------------------------------------------------------------
39 class LinkListNode
40 {
41 private:
42     NW_DISALLOW_COPY_AND_ASSIGN(LinkListNode);
43 
44 public:
45 
46     typedef LinkListNode Self;  //!< @details :private
47 
48     //--------------------------------------------------------------------------
49     //! @brief        コンストラクタです。
50     //---------------------------------------------------------------------------
LinkListNode()51     /* ctor */ explicit LinkListNode() : m_pNext(NULL), m_pPrev(NULL) {}
52 
53     //--------------------------------------------------------------------------
54     //! @brief        次のノードを取得します。
55     //!
56     //! @return       次のノードのポインタを返します。
57     //---------------------------------------------------------------------------
GetNext()58     Self* GetNext() const { return m_pNext; }
59 
60     //--------------------------------------------------------------------------
61     //! @brief        1つ前のノードを取得します。
62     //!
63     //! @return       1つ前のノードのポインタを返します。
64     //---------------------------------------------------------------------------
GetPrev()65     Self* GetPrev() const { return m_pPrev; }
66 
67     //--------------------------------------------------------------------------
68     //! @brief        比較演算子のオーバーロードです。
69     //!
70     //! @param[in]    &r1     1つ目の比較値です。
71     //! @param[in]    &r2     2つ目の比較値です。
72     //!
73     //! @return       等しい場合には true、そうでない場合には false を返します。
74     //---------------------------------------------------------------------------
75     friend bool operator==(const Self &r1,const Self &r2) { return &r1 == &r2; }
76 
77     //--------------------------------------------------------------------------
78     //! @brief        否定の比較演算子のオーバーロードです。
79     //!
80     //! @param[in]    r1     1つ目の比較値です。
81     //! @param[in]    r2     2つ目の比較値です。
82     //!
83     //! @return       等しい場合には false、そうでない場合には true を返します。
84     //---------------------------------------------------------------------------
85     friend bool operator!=(const Self &r1,const Self &r2) { return !(r1 == r2); }
86 
87 private:
88     Self* m_pNext;
89     Self* m_pPrev;
90 
91     friend class internal::LinkListImpl;  // m_pNext, m_pPrevを使用するため。
92 };
93 
94 namespace internal {
95 
96     //--------------------------------------------------------------------------
97     //! @brief        双方向リンクリスト実装クラス
98     //---------------------------------------------------------------------------
99     class LinkListImpl
100     {
101     private:
102         NW_DISALLOW_COPY_AND_ASSIGN(LinkListImpl);
103 
104     public:
105 
106         typedef LinkListImpl        Self;
107         typedef u32                 size_type;
108         typedef PtrDiff             difference_type;
109 
110         // リンクリストノードクラス。
111         typedef LinkListNode        Node;
112         typedef Node                value_type;
113         typedef value_type*         pointer;
114         typedef const value_type*   const_pointer;
115         typedef value_type&         reference;
116         typedef const value_type&   const_reference;
117         typedef std::bidirectional_iterator_tag iterator_category;
118 
119         //===========================================================================
120         // イテレータ
121         //===========================================================================
122         class iterator;
123         class const_iterator;
124 
125         class iterator : public internal::iterator<iterator_category, value_type>
126         {
127         public:
128 
129             typedef iterator TIt;
130             typedef internal::iterator<iterator_category, value_type> TBaseIt;
131 
iterator()132             /* ctor */ explicit iterator() : m_pPointer(NULL) {}
133 
134             reference operator*()   const { NW_NULL_ASSERT(m_pPointer); return *m_pPointer; }
135             pointer   operator->()  const { return m_pPointer; }
136 
137             TIt &operator++()   { m_pPointer = m_pPointer->GetNext(); return *this; }
138             TIt operator++(int) { const TIt it(*this); (void)++*this; return it;  }
139             TIt &operator--()   { m_pPointer = m_pPointer->GetPrev(); return *this; }
140             TIt operator--(int) { const TIt it(*this); (void)--*this; return it;  }
141 
142             friend bool operator==(TIt it1, TIt it2) { return it1.m_pPointer == it2.m_pPointer; }
143             friend bool operator!=(TIt it1, TIt it2) { return !(it1 == it2); }
144 
145         private:
146 
iterator(pointer p)147             explicit iterator(pointer p) : m_pPointer(p) {}
148 
149             pointer m_pPointer;
150 
151             friend class LinkListImpl;    // コンストラクタを使用するため。
152             friend class const_iterator;  // m_pPointerを使用するため。
153         };
154 
155         //! @details :private
156         typedef iterator Iterator_alias_;  // const_iterator内部で使用。
157 
158         class const_iterator
159             : public internal::iterator<iterator_category, value_type>
160         {
161         public:
162 
163             typedef const_iterator TIt;
164             typedef internal::iterator<iterator_category, value_type> TBaseIt;
165             typedef const_pointer pointer;
166             typedef const_reference reference;
167 
const_iterator()168             explicit const_iterator() : m_pPointer(NULL) {}
const_iterator(Iterator_alias_ it)169             const_iterator(Iterator_alias_ it) : m_pPointer(it.m_pPointer) {}
170 
171             reference operator*()  const { NW_NULL_ASSERT(m_pPointer); return *m_pPointer;}
172             pointer   operator->() const { return m_pPointer;}
173 
174             TIt &operator++()   { m_pPointer = m_pPointer->GetNext(); return *this; }
175             TIt operator++(int) { const TIt it(*this); (void)++*this; return it; }
176             TIt &operator--()   { m_pPointer = m_pPointer->GetPrev(); return *this; }
177             TIt operator--(int) { const TIt it(*this); (void)--*this; return it; }
178 
179             friend bool operator==(TIt it1, TIt it2) {return it1.m_pPointer == it2.m_pPointer; }
180             friend bool operator!=(TIt it1, TIt it2) {return !(it1 == it2);}
181 
182         private:
183 
const_iterator(pointer p)184             explicit const_iterator(pointer p) : m_pPointer(p) {}
185 
186             pointer m_pPointer;
187 
188             friend class LinkListImpl;  // コンストラクタを使用するため。
189         };
190 
191         typedef internal::reverse_iterator<iterator>       reverse_iterator;
192         typedef internal::reverse_iterator<const_iterator> const_reverse_iterator;
193 
194         //----------------------------------------
195         //! @name コンストラクタ/デストラクタ。
196         //@{
197 
LinkListImpl()198         /* ctor */ explicit LinkListImpl() { Initialize_(); }
~LinkListImpl()199         /* dtor */ ~LinkListImpl() { clear(); }
200 
201         //@}
202 
203         //----------------------------------------
204         //! @name 状態の問い合わせ、イテレータの取得
205         //@{
206 
size()207         size_type       size() const { return m_Size; }
empty()208         bool            empty() const { return m_Size == 0; }
209 
begin()210         iterator         begin()       { return iterator(m_BaseNode.GetNext()); }
begin()211         const_iterator   begin() const { return const_iterator(m_BaseNode.GetNext()); }
end()212         iterator         end()         { return iterator(&m_BaseNode); }
end()213         const_iterator   end()   const { return const_iterator(const_cast<Node*>(&m_BaseNode)); }
214 
rbegin()215         reverse_iterator       rbegin()       { return reverse_iterator(end()); }
rbegin()216         const_reverse_iterator rbegin() const { return const_reverse_iterator(end()); }
rend()217         reverse_iterator       rend()         { return reverse_iterator(begin()); }
rend()218         const_reverse_iterator rend()   const { return const_reverse_iterator(begin()); }
219 
front()220         reference front()
221         {
222             NW_ASSERT(!empty());
223             return *begin();
224         }
front()225         const_reference front() const
226         {
227             NW_ASSERT(!empty());
228             return *begin();
229         }
back()230         reference back()
231         {
232             NW_ASSERT(!empty());
233             return *--end();
234         }
back()235         const_reference back() const
236         {
237             NW_ASSERT(!empty());
238             return *--end();
239         }
240 
241         //@}
242 
243         //----------------------------------------
244         //! @name 要素の挿入/削除。
245         //@{
246 
push_front(pointer p)247         void push_front(pointer p) { (void)insert( begin(), p ); }
push_back(pointer p)248         void push_back(pointer p)  { (void)insert( end(), p ); }
pop_front()249         void pop_front()           { (void)erase( begin() ); }
pop_back()250         void pop_back()            { (void)erase( --end() ); }
251 
252         iterator insert(iterator it,pointer p);
253 
254         iterator erase(pointer p);
255         iterator erase(iterator it);
256         iterator erase(iterator itFirst,iterator itLast);
257 
clear()258         void clear() { (void)this->erase(begin(), end()); }
259 
260         //@}
261 
262         //----------------------------------------
263         //! @name 要素の順序の変更
264         //@{
265 
266         void reverse();
267 
268         //@}
269 
270         //----------------------------------------
271         //! @name 要素とノードとの変換
272         //@{
273 
GetIteratorFromPointer(pointer p)274         static iterator GetIteratorFromPointer(pointer p)
275         {
276             NW_NULL_ASSERT(p);
277             return iterator(p);
278         }
279 
GetIteratorFromPointer(const_pointer p)280         static const_iterator GetIteratorFromPointer(const_pointer p)
281         {
282             NW_NULL_ASSERT(p);
283             return const_iterator(p);
284         }
285 
286     protected:
GetBaseNode()287         Node* GetBaseNode() { return &m_BaseNode; }
GetBaseNode()288         const Node* GetBaseNode() const { return &m_BaseNode; }
289 
290     private:
291 
Initialize_()292         void Initialize_()
293         {
294             m_Size=0;
295             m_BaseNode.m_pNext = &m_BaseNode;
296             m_BaseNode.m_pPrev = &m_BaseNode;
297         }
298 
299 
300         size_type   m_Size;      // 現在の要素数。
301         Node        m_BaseNode;  // ノードリンクリストの[先端 - 1]兼[終端]。
302     };
303 
304 } // namespace internal
305 
306 
307 //--------------------------------------------------------------------------
308 //! @brief        リンクリストクラスです。
309 //!
310 //! @tparam T        リストの要素となるクラスの型です。
311 //! @tparam TNOffset 要素 T の型の中での LinkListNode へのオフセットです。
312 //---------------------------------------------------------------------------
313 template < typename T, PtrDiff TNOffset >
314 class LinkList : private internal::LinkListImpl
315 {
316 private:
317 
318     typedef internal::LinkListImpl Base;
319 
320 public:
321 
322     typedef LinkList  Self;    //!< @details :private
323     using Base::Node;
324 
325     using Base::size_type;
326     using Base::difference_type;
327 
328     typedef T                  value_type;      //!< @details :private
329     typedef value_type*        pointer;         //!< @details :private
330     typedef const value_type*  const_pointer;   //!< @details :private
331     typedef value_type&        reference;       //!< @details :private
332     typedef const value_type&  const_reference; //!< @details :private
333     typedef std::bidirectional_iterator_tag iterator_category; //!< @details :private
334 
335 private:
336 
337     typedef Base::iterator      TIt_base_;
338     typedef Base::const_iterator TItC_base_;
339 
340 public:
341 
342     //===========================================================================
343     // イテレータ
344     //===========================================================================
345 
346     class iterator;
347     class const_iterator;
348 
349     //--------------------------------------------------------------------------
350     //! @brief   リンクリストのイテレータです。
351     //---------------------------------------------------------------------------
352     class iterator : public internal::iterator<iterator_category, value_type>
353     {
354     public:
355 
356         typedef iterator TIt;                                               //!< @details :private
357         typedef internal::iterator<iterator_category, value_type> TBaseIt;  //!< @details :private
358 
359         //--------------------------------------------------------------------------
360         //! @brief        コンストラクタです。
361         //---------------------------------------------------------------------------
iterator()362         /* ctro */ explicit iterator() {}
363 
364         //----------------------------------------
365         //! @name 演算子オーバーロード
366         //@{
367 
368         //--------------------------------------------------------------------------
369         //! @brief        イテレータの指している要素の値を取得するポインタ演算子です。
370         //!
371         //! @return       要素の参照を返します。
372         //---------------------------------------------------------------------------
373         reference operator*()  const { pointer p = operator->(); NW_NULL_ASSERT(p); return *p;}
374 
375         //--------------------------------------------------------------------------
376         //! @brief        イテレータの指している要素のアドレスを取得するアロー演算子です。
377         //!
378         //! @return       要素のポインタを返します。
379         //---------------------------------------------------------------------------
380         pointer   operator->() const { return GetPointerFromNode(it_.operator->());}
381 
382         //--------------------------------------------------------------------------
383         //! @brief        イテレータの前置のインクリメント演算子です。
384         //!
385         //! @return       インクリメントされたイテレータを返します。
386         //---------------------------------------------------------------------------
387         TIt &operator++()   { (void)++it_; return *this; }
388 
389         //--------------------------------------------------------------------------
390         //! @brief        イテレータの後置のインクリメント演算子です。
391         //!
392         //! @return       インクリメント前のイテレータを返します。
393         //---------------------------------------------------------------------------
394         TIt operator++(int) { const TIt it(*this); (void)++*this; return it; }
395 
396         //--------------------------------------------------------------------------
397         //! @brief        イテレータの前置のデクリメント演算子です。
398         //!
399         //! @return       デクリメントされたイテレータを返します。
400         //---------------------------------------------------------------------------
401         TIt &operator--()   { (void)--it_; return *this; }
402 
403         //--------------------------------------------------------------------------
404         //! @brief        イテレータの後置のデクリメント演算子です。
405         //!
406         //! @return       デクリメント前のイテレータを返します。
407         //---------------------------------------------------------------------------
408         TIt operator--(int) { const TIt it(*this); (void)--*this; return it; }
409 
410         //--------------------------------------------------------------------------
411         //! @brief        比較演算子です。
412         //!
413         //! @param[in]    it1     比較対象の1つ目のイテレータです。
414         //! @param[in]    it2     比較対象の2つ目のイテレータです。
415         //!
416         //! @return       等しい場合には true, そうでない場合には false を返します。
417         //---------------------------------------------------------------------------
418         friend bool operator == (TIt it1, TIt it2) { return it1.it_== it2.it_; }
419 
420         //--------------------------------------------------------------------------
421         //! @brief        否定の比較演算子です。
422         //!
423         //! @param[in]    it1_     比較対象の1つ目のイテレータです。
424         //! @param[in]    it2_     比較対象の2つ目のイテレータです。
425         //!
426         //! @return       等しい場合には false, そうでない場合には true を返します。
427         //---------------------------------------------------------------------------
428         friend bool operator != (TIt it1_, TIt it2_) { return !(it1_ == it2_); }  // it1, it2 にすると何故かコンパイラに警告される。
429 
430         //@}
431 
432     private:
433 
iterator(TIt_base_ it)434         /* ctor */ explicit iterator(TIt_base_ it) : it_(it) {}
435         TIt_base_ it_;
436 
437     #ifdef NW_PLATFORM_CTR
438         friend class LinkList;
439     #else
440         friend class Self;  // コンストラクタを使用するため。
441     #endif
442         friend class const_iterator;  // it_を使用するため。
443     };
444 
445     typedef iterator Iterator_alias_;  // const_iterator内部で使用。
446 
447     //--------------------------------------------------------------------------
448     //! @brief   リンクリストのコンストイテレータです。
449     //---------------------------------------------------------------------------
450     class const_iterator
451         : public internal::iterator<iterator_category, value_type>
452     {
453     public:
454 
455         typedef const_iterator TIt;                                         //!< @details :private
456         typedef internal::iterator<iterator_category, value_type> TBaseIt;  //!< @details :private
457         typedef const_pointer pointer;                                      //!< @details :private
458         typedef const_reference reference;                                  //!< @details :private
459 
460         //--------------------------------------------------------------------------
461         //! @brief        コンストラクタです。
462         //---------------------------------------------------------------------------
const_iterator()463         /* ctor */ explicit const_iterator() {}
464 
465         //--------------------------------------------------------------------------
466         //! @brief        コピーコンストラクタです。
467         //---------------------------------------------------------------------------
const_iterator(Iterator_alias_ it)468         /* ctor */ const_iterator(Iterator_alias_ it) : it_(it.it_) {}
469 
470         //----------------------------------------
471         //! @name 演算子オーバーロード
472         //@{
473 
474         //--------------------------------------------------------------------------
475         //! @brief        イテレータの指している要素の値を取得するポインタ演算子です。
476         //!
477         //! @return       要素の参照を返します。
478         //---------------------------------------------------------------------------
479         reference operator*()  const { pointer p = operator->(); NW_NULL_ASSERT(p); return *p; }
480 
481         //--------------------------------------------------------------------------
482         //! @brief        イテレータの指している要素のアドレスを取得するアロー演算子です。
483         //!
484         //! @return       要素のポインタを返します。
485         //---------------------------------------------------------------------------
486         pointer   operator->() const { return GetPointerFromNode(it_.operator->());}
487 
488         //--------------------------------------------------------------------------
489         //! @brief        イテレータの前置のインクリメント演算子です。
490         //!
491         //! @return       インクリメントされたイテレータを返します。
492         //---------------------------------------------------------------------------
493         TIt &operator++()   { (void)++it_; return *this; }
494 
495         //--------------------------------------------------------------------------
496         //! @brief        イテレータの後置のインクリメント演算子です。
497         //!
498         //! @return       インクリメント前のイテレータを返します。
499         //---------------------------------------------------------------------------
500         TIt operator++(int) { const TIt it(*this); (void)++*this; return it; }
501 
502         //--------------------------------------------------------------------------
503         //! @brief        イテレータの前置のデクリメント演算子です。
504         //!
505         //! @return       デクリメントされたイテレータを返します。
506         //---------------------------------------------------------------------------
507         TIt &operator--()   { (void)--it_; return *this;}
508 
509         //--------------------------------------------------------------------------
510         //! @brief        イテレータの後置のデクリメント演算子です。
511         //!
512         //! @return       デクリメント前のイテレータを返します。
513         //---------------------------------------------------------------------------
514         TIt operator--(int) { const TIt it(*this); (void)--*this; return it; }
515 
516         //--------------------------------------------------------------------------
517         //! @brief        比較演算子です。
518         //!
519         //! @param[in]    it1     比較対象の1つ目のイテレータです。
520         //! @param[in]    it2     比較対象の2つ目のイテレータです。
521         //!
522         //! @return       等しい場合には true, そうでない場合には false を返します。
523         //---------------------------------------------------------------------------
524         friend bool operator == (TIt it1, TIt it2) { return it1.it_== it2.it_; }
525 
526         //--------------------------------------------------------------------------
527         //! @brief        否定の比較演算子です。
528         //!
529         //! @param[in]    it1_     比較対象の1つ目のイテレータです。
530         //! @param[in]    it2_     比較対象の2つ目のイテレータです。
531         //!
532         //! @return       等しい場合には false, そうでない場合には true を返します。
533         //---------------------------------------------------------------------------
534         friend bool operator != (TIt it1_, TIt it2_) { return !(it1_ == it2_); }
535 
536         //@}
537 
538     protected:
539 
const_iterator(TItC_base_ it)540         /* ctor */ explicit const_iterator(TItC_base_ it) : it_(it) {}
541 
542         TItC_base_ it_;
543 
544 
545     #if defined(NW_PLATFORM_CTR)
546         friend class LinkList;  // コンストラクタを使用するため。
547     #else
548         friend class Self;  // コンストラクタを使用するため。
549     #endif
550     };
551 
552     typedef internal::reverse_iterator<iterator> reverse_iterator;              //!< @details :private
553     typedef internal::reverse_iterator<const_iterator> const_reverse_iterator;  //!< @details :private
554 
555     //----------------------------------------
556     //! @name コンストラクタ/デストラクタ。
557     //@{
558 
559     //--------------------------------------------------------------------------
560     //! @brief   コンストラクタです。
561     //---------------------------------------------------------------------------
LinkList()562     /* ctor */ explicit LinkList() {}
563 
564     //@}
565 
566     //----------------------------------------
567     //! @name 状態の問い合わせ、イテレータの取得
568     //@{
569 
570     //--------------------------------------------------------------------------
571     //! @fn          u32  LinkList::size()
572     //!
573     //! @brief        リストのサイズを取得します。
574     //!
575     //! @return       リストのサイズを返します。
576     //---------------------------------------------------------------------------
577     using Base::size;
578 
579     //--------------------------------------------------------------------------
580     //! @fn           bool LinkList::empty()
581     //!
582     //! @brief        リストが空であるかどうかを取得します。
583     //!
584     //! @return       リストが空の場合には true, 要素が存在する場合には false を返します。
585     //---------------------------------------------------------------------------
586     using Base::empty;
587 
588     //--------------------------------------------------------------------------
589     //! @brief        先頭の要素へのイテレータを取得します。
590     //!
591     //! @return       先頭の要素へのイテレータを返します。
592     //---------------------------------------------------------------------------
begin()593     iterator        begin()       { return iterator(Base::begin()); }
begin()594     const_iterator  begin() const { return const_iterator(const_cast<Self*>(this)->begin()); }
595 
596     //--------------------------------------------------------------------------
597     //! @brief        イテレータの終端を取得します。
598     //!
599     //! @return       イテレータの終端を返します。
600     //---------------------------------------------------------------------------
end()601     iterator        end()         { return iterator(Base::end()); }
end()602     const_iterator  end()   const { return const_iterator(const_cast<Self*>(this)->end()); }
603 
604     //--------------------------------------------------------------------------
605     //! @brief        末尾の要素へのリバースイテレータを取得します。
606     //!
607     //! @return       末尾の要素へのリバースイテレータを返します。
608     //---------------------------------------------------------------------------
rbegin()609     reverse_iterator        rbegin()       { return reverse_iterator(end()); }
rbegin()610     const_reverse_iterator  rbegin() const { return const_reverse_iterator(end()); }
611 
612     //--------------------------------------------------------------------------
613     //! @brief        リバースイテレータの終端を取得します。
614     //!
615     //! @return       リバースイテレータの終端を返します。
616     //---------------------------------------------------------------------------
rend()617     reverse_iterator        rend()         { return reverse_iterator(begin()); }
rend()618     const_reverse_iterator  rend()   const { return const_reverse_iterator(begin()); }
619 
620     //--------------------------------------------------------------------------
621     //! @brief        先頭の要素の参照を取得します。
622     //!
623     //! @return       先頭の要素の参照を返します。
624     //---------------------------------------------------------------------------
front()625     reference       front()       { NW_ASSERT(!empty()); return *begin(); }
front()626     const_reference front() const { NW_ASSERT(!empty()); return *begin(); }
627 
628     //--------------------------------------------------------------------------
629     //! @brief        末尾の要素の参照を取得します。
630     //!
631     //! @return       末尾の要素の参照を返します。
632     //---------------------------------------------------------------------------
back()633     reference       back()        { NW_ASSERT(!empty()); return *--end(); }
back()634     const_reference back() const  { NW_ASSERT(!empty()); return *--end(); }
635 
636     //@}
637 
638     //----------------------------------------
639     //! @name 挿入/削除
640     //@{
641 
642     //--------------------------------------------------------------------------
643     //! @brief        リストに要素を挿入します。
644     //!
645     //! @param[in]    it      要素を挿入位置のイテレータです。 it の直前に要素が挿入されます。
646     //! @param[in]    p       挿入する要素のポインタです。
647     //!
648     //! @return       追加された要素のイテレータを返します。
649     //---------------------------------------------------------------------------
insert(iterator it,pointer p)650     iterator insert(iterator it, pointer p) { return iterator(Base::insert(it.it_,GetNodeFromPointer(p)));}
651 
652     //--------------------------------------------------------------------------
653     //! @brief        リストにの先頭に要素を追加します。
654     //!
655     //! @param[in]    p       挿入する要素のポインタです。
656     //---------------------------------------------------------------------------
push_front(pointer p)657     void     push_front(pointer p)          { (void)insert(begin(),p);}
658 
659     //--------------------------------------------------------------------------
660     //! @brief        リストにの末尾に要素を追加します。
661     //!
662     //! @param[in]    p       挿入する要素のポインタです。
663     //---------------------------------------------------------------------------
push_back(pointer p)664     void     push_back(pointer p)           { (void)insert(end(),p);}
665 
666     using Base::pop_front;
667     using Base::pop_back;
668 
669     //--------------------------------------------------------------------------
670     //! @brief        指定されたメンバを削除します。
671     //!
672     //! @param[in]    it      削除する要素のイテレータです。
673     //!
674     //! @return       削除した要素の次のノードへのイテレータを返します。
675     //---------------------------------------------------------------------------
erase(iterator it)676     iterator erase(iterator it)                      { return iterator(Base::erase(it.it_)); }
677 
678     //--------------------------------------------------------------------------
679     //! @brief        指定されたメンバを削除します。
680     //!
681     //!
682     //!               終了位置に指定された要素は削除されません。
683     //!
684     //! @param[in]    itFirst 削除開始位置を示すイテレータです。
685     //! @param[in]    itLast  削除終了位置を示すイテレータです。
686     //!
687     //! @return       削除した要素の次のノードへのイテレータを返します。
688     //---------------------------------------------------------------------------
erase(iterator itFirst,iterator itLast)689     iterator erase(iterator itFirst,iterator itLast) { return iterator(Base::erase(itFirst.it_, itLast.it_)); }
690 
691     //--------------------------------------------------------------------------
692     //! @brief        指定されたメンバを削除します。
693     //!
694     //! @param[in]    p       削除する要素のポインタです。
695     //!
696     //! @return       削除した要素の次のノードへのイテレータを返します。
697     //---------------------------------------------------------------------------
erase(pointer p)698     iterator erase(pointer p)                        { return iterator(Base::erase(GetNodeFromPointer(p))); }
699 
700     //--------------------------------------------------------------------------
701     //! @brief        一つ前の要素を取得します。
702     //!
703     //! @param[in]    p       基点となる要素のポインタです。
704     //!
705     //! @return       一つ前の要素を返します。 存在しない場合は NULL を返します。
706     //---------------------------------------------------------------------------
GetPrev(pointer p)707     pointer GetPrev(pointer p)
708     {
709         Node* baseNode = GetBaseNode();
710         Node* node = ( p == NULL )? baseNode : GetNodeFromPointer( p );
711         node = node->GetPrev();
712         return ( node == baseNode )? NULL : GetPointerFromNode( node );
713     }
714 
GetPrev(const_pointer p)715     const_pointer GetPrev(const_pointer p) const
716     {
717         const Node* baseNode = GetBaseNode();
718         const Node* node = ( p == NULL )? baseNode : GetNodeFromPointer( p );
719         node = node->GetPrev();
720         return ( node == baseNode )? NULL : GetPointerFromNode( node );
721     }
722 
723     //--------------------------------------------------------------------------
724     //! @brief        一つ後の要素を取得します。
725     //!
726     //! @param[in]    p       基点となる要素のポインタです。
727     //!
728     //! @return       一つ後の要素を返します。 存在しない場合は NULL を返します。
729     //---------------------------------------------------------------------------
GetNext(pointer p)730     pointer GetNext(pointer p)
731     {
732         Node* baseNode = GetBaseNode();
733         Node* node = ( p == NULL )? baseNode : GetNodeFromPointer( p );
734         node = node->GetNext();
735         return ( node == baseNode )? NULL : GetPointerFromNode( node );
736     }
737 
GetNext(const_pointer p)738     const_pointer GetNext(const_pointer p) const
739     {
740         const Node* baseNode = GetBaseNode();
741         const Node* node = ( p == NULL )? baseNode : GetNodeFromPointer( p );
742         node = node->GetNext();
743         return ( node == baseNode )? NULL : GetPointerFromNode( node );
744     }
745 
746     //--------------------------------------------------------------------------
747     //! @fn           void nw::ut::LinkList::clear()
748     //!
749     //! @brief        リストを空にします。
750     //---------------------------------------------------------------------------
751     using Base::clear;
752 
753     //@}
754 
755     //----------------------------------------
756     //! @name 順序の変更
757     //@{
758 
759     //--------------------------------------------------------------------------
760     //! @fn           void LinkList::reverse()
761     //!
762     //! @brief        リストの並びを反転します。
763     //---------------------------------------------------------------------------
764     using Base::reverse;
765 
766     //@}
767 
768     //----------------------------------------
769     //! @name 要素とノードとの変換
770     //@{
771 
772     //--------------------------------------------------------------------------
773     //! @brief        ノードのポインタからイテレータを取得します。
774     //!
775     //! @param[in]    p   ノードのポインタです。
776     //!
777     //! @return       イテレータです。
778     //---------------------------------------------------------------------------
GetIteratorFromPointer(Node * p)779     static iterator GetIteratorFromPointer(Node *p)
780     {
781         NW_NULL_ASSERT(p);
782         return iterator(Base::GetIteratorFromPointer(p));
783     }
GetIteratorFromPointer(const Node * p)784     static const_iterator GetIteratorFromPointer(const Node *p)
785     {
786         NW_NULL_ASSERT(p);
787         return const_iterator(Base::GetIteratorFromPointer(p));
788     }
789 
790     //--------------------------------------------------------------------------
791     //! @brief        要素のポインタからイテレータを取得します。
792     //!
793     //! @param[in]    p   要素のポインタです。
794     //!
795     //! @return       イテレータです。
796     //---------------------------------------------------------------------------
GetIteratorFromPointer(pointer p)797     static iterator GetIteratorFromPointer(pointer p)
798     {
799         NW_NULL_ASSERT(p);
800         return GetIteratorFromPointer(GetNodeFromPointer(p));
801     }
GetIteratorFromPointer(const_pointer p)802     static const_iterator GetIteratorFromPointer(const_pointer p)
803     {
804         NW_NULL_ASSERT(p);
805         return GetIteratorFromPointer(GetNodeFromPointer(p));
806     }
807 
808     //--------------------------------------------------------------------------
809     //! @brief        要素のポインタからノードのポインタを取得します。
810     //!
811     //! @param[in]    p   要素のポインタです。
812     //!
813     //! @return       ノードのポインタです。
814     //---------------------------------------------------------------------------
GetNodeFromPointer(pointer p)815     static Node* GetNodeFromPointer(pointer p)
816     {
817         NW_NULL_ASSERT(p);
818         return reinterpret_cast<Node*>(reinterpret_cast<IntPtr>(p) + TNOffset);
819     }
GetNodeFromPointer(const_pointer p)820     static const Node* GetNodeFromPointer(const_pointer p)
821     {
822         NW_NULL_ASSERT(p);
823         return reinterpret_cast<const Node*>(reinterpret_cast<IntPtr>(p) + TNOffset);
824     }
825 
826     //--------------------------------------------------------------------------
827     //! @brief        ノードのポインタから要素のポインタを取得します。
828     //!
829     //! @param[in]    p   ノードのポインタです。
830     //!
831     //! @return       要素のポインタです。
832     //---------------------------------------------------------------------------
GetPointerFromNode(Node * p)833     static pointer GetPointerFromNode(Node* p)
834     {
835         NW_NULL_ASSERT(p);
836         return reinterpret_cast<pointer>(reinterpret_cast<IntPtr>(p) - TNOffset);
837     }
GetPointerFromNode(const Node * p)838     static const_pointer GetPointerFromNode(const Node* p)
839     {
840         NW_NULL_ASSERT(p);
841         return reinterpret_cast<const_pointer>( reinterpret_cast<IntPtr>(p) - TNOffset);
842     }
843 
844     //@}
845 
846     //------------------------------------
847     // NW4R 互換用のalias
848     //------------------------------------
849     typedef iterator                Iterator;               //!< @details :private
850     typedef const_iterator          ConstIterator;          //!< @details :private
851     typedef reverse_iterator        ReverseIterator;        //!< @details :private
852     typedef const_reverse_iterator  ConstReverseIterator;   //!< @details :private
853 
GetSize()854     size_type GetSize() const { return this->size(); }      //!< @details :private
IsEmpty()855     bool      IsEmpty() const { return this->empty(); }     //!< @details :private
856 
GetBeginIter()857     iterator        GetBeginIter()       { return this->begin(); }      //!< @details :private
GetBeginIter()858     const_iterator  GetBeginIter() const { return this->begin();   }    //!< @details :private
GetEndIter()859     iterator        GetEndIter()         { return this->end();   }      //!< @details :private
GetEndIter()860     const_iterator  GetEndIter()   const { return this->end(); }        //!< @details :private
861 
GetBeginReverseIter()862     reverse_iterator        GetBeginReverseIter()       { return this->rbegin(); }  //!< @details :private
GetBeginReverseIter()863     const_reverse_iterator  GetBeginReverseIter() const { return this->rbegin(); }  //!< @details :private
GetEndReverseIter()864     reverse_iterator        GetEndReverseIter()         { return this->rend(); }    //!< @details :private
GetEndReverseIter()865     const_reverse_iterator  GetEndReverseIter()   const { return this->rend(); }    //!< @details :private
866 
GetFront()867     reference       GetFront()       { return this->front(); }  //!< @details :private
GetFront()868     const_reference GetFront() const { return this->front(); }  //!< @details :private
GetBack()869     reference       GetBack()        { return this->back(); }   //!< @details :private
GetBack()870     const_reference GetBack()  const { return this->back(); }   //!< @details :private
871 
Insert(iterator it,pointer p)872     iterator Insert(iterator it, pointer p) { return this->insert(it, p); } //!< @details :private
PushFront(pointer p)873     void     PushFront(pointer p)           { this->push_front(p); }        //!< @details :private
PushBack(pointer p)874     void     PushBack(pointer p)            { this->push_back(p); }         //!< @details :private
875 
PopFront()876     void    PopFront() { this->pop_front(); }   //!< @details :private
PopBack()877     void    PopBack()  { this->pop_back();  }   //!< @details :private
878 
Erase(iterator it)879     iterator Erase(iterator it)                      { return this->erase(it); }                //!< @details :private
Erase(iterator itFirst,iterator itLast)880     iterator Erase(iterator itFirst,iterator itLast) { return this->erase(itFirst, itLast); }   //!< @details :private
Erase(pointer p)881     iterator Erase(pointer p)                        { return this->erase(p); }                 //!< @details :private
882 
Clear()883     void     Clear() { this->clear(); }         //!< @details :private
Reverse()884     void     Reverse() { this->reverse(); }     //!< @details :private
885 };
886 
887 
888 }  // namespace ut
889 }  // namespace nw
890 
891 #endif  /* NW_UT_LINKLIST_H_ */
892