📄 testtypedef.cxx
字号:
#include <cassert>#include <iostream>using namespace std;namespace resip{template <class P>class IntrusiveListElement{ public: IntrusiveListElement() : mNext(0), mPrev(0) {} virtual ~IntrusiveListElement() { remove(); } // make this element an empty list static P makeList(P elem) { assert(!elem->IntrusiveListElement::mNext); elem->IntrusiveListElement::mPrev = elem; elem->IntrusiveListElement::mNext = elem; return elem; } bool empty() const { assert(mPrev); assert(mNext); return mNext == static_cast<P>(const_cast<IntrusiveListElement<P>*>(this)); } // .dlb. add reverse_iterator? class iterator { public: explicit iterator(const P start) : mPos(start) {} iterator& operator=(const iterator& rhs) { mPos = rhs.mPos; return *this; } iterator& operator++() { mPos = mPos->IntrusiveListElement::mNext; return *this; } bool operator==(const iterator& rhs) { return mPos == rhs.mPos; } bool operator!=(const iterator& rhs) { return mPos != rhs.mPos; } P operator*() { return mPos; } private: P mPos; }; iterator begin() { assert(mPrev); assert(mNext); return iterator(mNext); } iterator end() { assert(mPrev); assert(mNext); return iterator(static_cast<P>(this)); } friend class iterator; // pushing an element onto the same list twice is undefined void push_front(P elem) { assert(mPrev); assert(mNext); elem->IntrusiveListElement::mNext = mNext; elem->IntrusiveListElement::mPrev = static_cast<P>(this); elem->IntrusiveListElement::mNext->IntrusiveListElement::mPrev = elem; elem->IntrusiveListElement::mPrev->IntrusiveListElement::mNext = elem; } // putting an element onto the same list twice is undefined void push_back(P elem) { assert(mPrev); assert(mNext); elem->IntrusiveListElement::mPrev = mPrev; elem->IntrusiveListElement::mNext = static_cast<P>(this); elem->IntrusiveListElement::mPrev->IntrusiveListElement::mNext = elem; elem->IntrusiveListElement::mNext->IntrusiveListElement::mPrev = elem; } void remove() { if (mNext) { // prev -> this -> next // <- <- // // prev -> next // <- mNext->IntrusiveListElement::mPrev = mPrev; mPrev->IntrusiveListElement::mNext = mNext; } mNext = 0; mPrev = 0; } protected: mutable P mNext; mutable P mPrev;};template <class P>class IntrusiveListElement1{ public: IntrusiveListElement1() : mNext(0), mPrev(0) {} virtual ~IntrusiveListElement1() { remove(); } // make this element an empty list static P makeList(P elem) { assert(!elem->IntrusiveListElement1::mNext); elem->IntrusiveListElement1::mPrev = elem; elem->IntrusiveListElement1::mNext = elem; return elem; } bool empty() const { assert(mPrev); assert(mNext); return mNext == static_cast<P>(const_cast<IntrusiveListElement1<P>*>(this)); } // .dlb. add reverse_iterator? class iterator { public: explicit iterator(const P start) : mPos(start) {} iterator& operator=(const iterator& rhs) { mPos = rhs.mPos; return *this; } iterator& operator++() { mPos = mPos->IntrusiveListElement1::mNext; return *this; } bool operator==(const iterator& rhs) { return mPos == rhs.mPos; } bool operator!=(const iterator& rhs) { return mPos != rhs.mPos; } P operator*() { return mPos; } private: P mPos; }; iterator begin() { assert(mPrev); assert(mNext); return iterator(mNext); } iterator end() { assert(mPrev); assert(mNext); return iterator(static_cast<P>(this)); } friend class iterator; // pushing an element onto the same list twice is undefined void push_front(P elem) { assert(mPrev); assert(mNext); elem->IntrusiveListElement1::mNext = mNext; elem->IntrusiveListElement1::mPrev = static_cast<P>(this); elem->IntrusiveListElement1::mNext->IntrusiveListElement1::mPrev = elem; elem->IntrusiveListElement1::mPrev->IntrusiveListElement1::mNext = elem; } // putting an element onto the same list twice is undefined void push_back(P elem) { assert(mPrev); assert(mNext); elem->IntrusiveListElement1::mPrev = mPrev; elem->IntrusiveListElement1::mNext = static_cast<P>(this); elem->IntrusiveListElement1::mPrev->IntrusiveListElement1::mNext = elem; elem->IntrusiveListElement1::mNext->IntrusiveListElement1::mPrev = elem; } void remove() { if (mNext) { // prev -> this -> next // <- <- // // prev -> next // <- mNext->IntrusiveListElement1::mPrev = mPrev; mPrev->IntrusiveListElement1::mNext = mNext; } mNext = 0; mPrev = 0; } protected: mutable P mNext; mutable P mPrev;};template <class P>class IntrusiveListElement2{ public: IntrusiveListElement2() : mNext(0), mPrev(0) {} virtual ~IntrusiveListElement2() { remove(); } // make this element an empty list static P makeList(P elem) { assert(!elem->IntrusiveListElement2::mNext); elem->IntrusiveListElement2::mPrev = elem; elem->IntrusiveListElement2::mNext = elem; return elem; } bool empty() const { assert(mPrev); assert(mNext); return mNext == static_cast<P>(const_cast<IntrusiveListElement2<P>*>(this)); } // .dlb. add reverse_iterator? class iterator { public: explicit iterator(const P start) : mPos(start) {} iterator& operator=(const iterator& rhs) { mPos = rhs.mPos; return *this; } iterator& operator++() { mPos = mPos->IntrusiveListElement2::mNext; return *this; } bool operator==(const iterator& rhs) { return mPos == rhs.mPos; } bool operator!=(const iterator& rhs) { return mPos != rhs.mPos; } P operator*() { return mPos; } private: P mPos; }; iterator begin() { assert(mPrev); assert(mNext); return iterator(mNext); } iterator end()
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -