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