📄 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 + -