17 SRefCnt() : count(0) { }
26 T* operator-> ()
const {
return pObj; }
27 bool operator== (
const T* pobj)
const {
return pobj == pObj; }
28 bool operator!= (
const T* pobj)
const {
return pobj != pObj; }
30 bool operator== (
const SPtr<T>& spobj)
const {
return spobj.pObj == pObj; }
31 bool operator!= (
const SPtr<T>& spobj)
const {
return spobj.pObj != pObj; }
33 SPtr(T* pobj = 0) : pObj(pobj)
35 if (pObj) { pObj->count++; }
37 SPtr(
const SPtr& ptr) : pObj(ptr.pObj)
39 if (pObj) { pObj->count++; }
42 SPtr& operator= (
const SPtr& ptr)
44 if (
this == &ptr) {
return *
this; }
45 if (pObj && --(pObj->count) == 0) {
delete pObj; }
46 if ((pObj = ptr.pObj)) { pObj->count++; }
52 if (pObj && --(pObj->count) == 0) {
delete pObj; }
59 template <
typename T,
int N>
class DArray;
61 template <
typename T,
int N>
63 friend class DArray<T, N>;
65 inline T&
operator* () {
return ptr[idx % N]; }
66 inline T* operator-> () {
return &ptr[idx % N]; }
67 inline NIter& operator++ () { idx++;
return *
this;}
68 inline NIter& operator+= (
int n) { idx += n;
return *
this;}
70 inline bool operator== (
const NIter& iter) {
return idx == iter.idx && ptr == iter.ptr; }
71 inline bool operator!= (
const NIter& iter) {
return idx != iter.idx || ptr != iter.ptr; }
73 NIter(T* begin,
int last) : ptr(begin), idx(last) {}
80 template <
typename T,
int N>
83 DArray() : last(N), len(0) {}
85 typedef NIter<T, N> iterator;
86 iterator begin() {
return iterator(elems, last); }
87 iterator end() {
return iterator(elems, last + len); }
89 T& insert(
const T& el)
91 len = (len == N ? len : len + 1);
92 last = ((last - 1) + N) % N;
97 #ifdef USE_SMART_INSERT
98 void remove(iterator& it)
104 memmove(&elems[last + 1], &elems[last], (i - last)*
sizeof(T));
105 memset(&elems[last], 0,
sizeof(T));
106 last = (last + 1) % N;
108 memmove(&elems[i], &elems[i + 1], (last - i - 1)*
sizeof(T));
109 memset(&elems[last - 1], 0,
sizeof(T));
117 #ifndef USE_DIRTY_RESET
118 for (
int i = 0; i < len; i++) {
126 static const int size = N;
127 const T& operator [](
const int idx)
const {
return elems[idx]; }
128 T& operator [](
const int idx) {
return elems[idx]; }
137 template <
typename T,
int N>
140 typedef std::auto_ptr<CArray> Ptr;
144 for (iterator i = begin(); i != end(); ++i) {
150 iterator begin() {
return &elems[0]; }
151 iterator end() {
return &elems[N]; }
154 static const int size = N;
156 const T& operator [](
const int idx)
const {
return elems[idx]; }
157 T& operator [](
const int idx) {
return elems[idx]; }