45class LinkListImpl :
private NonCopyable {
54 friend class LinkListImpl;
55 friend class ConstIterator;
58 Iterator() : mNode(NULL) {}
61 Iterator& operator++() {
62 mNode = mNode->GetNext();
66 Iterator& operator--() {
67 mNode = mNode->GetPrev();
77 return lhs.mNode == rhs.mNode;
88 friend class LinkListImpl;
91 explicit ConstIterator(
Iterator it) : mNode(it.mNode) {}
93 ConstIterator& operator++() {
94 mNode = mNode->GetNext();
98 ConstIterator& operator--() {
99 mNode = mNode->GetPrev();
109 return lhs.mNode == rhs.mNode;
126 Iterator GetBeginIter() {
127 return Iterator(mNode.GetNext());
129 Iterator GetEndIter() {
130 return Iterator(&mNode);
133 Iterator Insert(Iterator it, LinkListNode* pNode);
135 Iterator Erase(Iterator it);
136 Iterator Erase(LinkListNode* pNode);
137 Iterator Erase(Iterator begin, Iterator end);
140 ulong GetSize()
const {
143 bool IsEmpty()
const {
148 Erase(GetBeginIter());
151 Erase(--GetEndIter());
159 mNode.mNext = &mNode;
160 mNode.mPrev = &mNode;
173template <
typename TIter>
class ReverseIterator {
175 explicit ReverseIterator(TIter it) : mCurrent(it) {}
177 TIter GetBase()
const {
181 ReverseIterator& operator++() {
186 const typename TIter::TElem* operator->()
const {
187 return &this->operator*();
190 typename TIter::TElem& operator*()
const {
195 friend bool operator==(
const ReverseIterator& rLhs,
196 const ReverseIterator& rRhs) {
197 return rLhs.mCurrent == rRhs.mCurrent;
200 friend bool operator!=(
const ReverseIterator& rLhs,
201 const ReverseIterator& rRhs) {
202 return !(rLhs.mCurrent == rRhs.mCurrent);
225 friend class LinkList;
226 friend class ConstIterator;
233 Iterator() : mIterator(NULL) {}
234 explicit Iterator(LinkListImpl::Iterator it) : mIterator(it) {}
236 Iterator& operator++() {
241 Iterator& operator--() {
246 Iterator operator++(
int) {
247 Iterator ret = *
this;
252 T* operator->()
const {
253 return GetPointerFromNode(mIterator.operator->());
256 T& operator*()
const {
257 return *this->operator->();
260 friend bool operator==(Iterator lhs, Iterator rhs) {
261 return lhs.mIterator == rhs.mIterator;
264 friend bool operator!=(Iterator lhs, Iterator rhs) {
265 return !(lhs == rhs);
269 LinkListImpl::Iterator mIterator;
275 class ConstIterator {
276 friend class LinkList;
283 explicit ConstIterator(LinkListImpl::Iterator it) : mIterator(it) {}
284 explicit ConstIterator(
Iterator it) : mIterator(it.mIterator) {}
286 ConstIterator& operator++() {
291 ConstIterator& operator--() {
296 ConstIterator operator++(
int) {
297 ConstIterator ret = *
this;
302 const T* operator->()
const {
303 return GetPointerFromNode(mIterator.operator->());
306 const T& operator*()
const {
307 return *this->operator->();
310 friend bool operator==(ConstIterator lhs, ConstIterator rhs) {
311 return lhs.mIterator == rhs.mIterator;
314 friend bool operator!=(ConstIterator lhs, ConstIterator rhs) {
315 return !(lhs == rhs);
319 LinkListImpl::ConstIterator mIterator;
330 Iterator GetBeginIter() {
331 return Iterator(LinkListImpl::GetBeginIter());
333 ConstIterator GetBeginIter()
const {
334 return ConstIterator(
const_cast<LinkList*
>(
this)->GetBeginIter());
336 RevIterator GetBeginReverseIter() {
337 return RevIterator(GetBeginIter());
339 ConstRevIterator GetBeginReverseIter()
const {
340 return ConstRevIterator(GetBeginIter());
344 return Iterator(LinkListImpl::GetEndIter());
347 return ConstIterator(
const_cast<LinkList*
>(
this)->GetEndIter());
349 RevIterator GetEndReverseIter() {
350 return RevIterator(GetEndIter());
352 ConstRevIterator GetEndReverseIter()
const {
353 return ConstRevIterator(GetEndIter());
358 LinkListImpl::Insert(it.mIterator, GetNodeFromPointer(pElem)));
362 return Iterator(LinkListImpl::Erase(GetNodeFromPointer(pElem)));
365 return Iterator(LinkListImpl::Erase(it.mIterator));
368 void PushBack(T* pElem) {
369 Insert(GetEndIter(), pElem);
373 return *GetBeginIter();
375 const T& GetFront()
const {
376 return *GetBeginIter();
380 return *--GetEndIter();
382 const T& GetBack()
const {
383 return *--GetEndIter();
386 static Iterator GetIteratorFromPointer(T* pElem) {
387 return GetIteratorFromPointer(GetNodeFromPointer(pElem));
390 static Iterator GetIteratorFromPointer(LinkListNode* pNode) {
391 return Iterator(LinkListImpl::GetIteratorFromPointer(pNode));
394 static LinkListNode* GetNodeFromPointer(T* pElem) {
395 return reinterpret_cast<LinkListNode*
>(
reinterpret_cast<char*
>(pElem) +
399 static T* GetPointerFromNode(LinkListNode* pNode) {
400 return reinterpret_cast<T*
>(
reinterpret_cast<char*
>(pNode) - Ofs);
403 static const T* GetPointerFromNode(
const LinkListNode* pNode) {
404 return reinterpret_cast<const T*
>(
reinterpret_cast<const char*
>(pNode) -