00001 #ifndef _AUTO_DELETE_DEQUE_H_ 00002 #define _AUTO_DELETE_DEQUE_H_ 00003 00004 // C++ headers 00005 #include <deque> 00006 #include <algorithm> 00007 00008 template<typename T> 00009 class AutoDeleteDeque 00010 { 00011 public: 00012 AutoDeleteDeque(bool auto_delete = true) : autodelete(auto_delete) {} 00013 ~AutoDeleteDeque() { clear(); } 00014 00015 typedef typename std::deque< T > List; 00016 typedef typename List::iterator iterator; 00017 typedef typename List::const_iterator const_iterator; 00018 typedef typename List::reverse_iterator reverse_iterator; 00019 typedef typename List::const_reverse_iterator const_reverse_iterator; 00020 00021 T operator[](uint index) 00022 { 00023 if (index < list.size()) 00024 return list[index]; 00025 return NULL; 00026 } 00027 const T operator[](uint index) const 00028 { 00029 if (index < list.size()) 00030 return list[index]; 00031 return NULL; 00032 } 00033 00034 T take(uint i); 00035 iterator erase(iterator it) 00036 { 00037 if (autodelete) 00038 delete *it; 00039 return list.erase(it); 00040 } 00041 void clear(void) 00042 { 00043 while (autodelete && !list.empty()) 00044 { 00045 delete list.back(); 00046 list.pop_back(); 00047 } 00048 list.clear(); 00049 } 00050 00051 iterator begin(void) { return list.begin(); } 00052 iterator end(void) { return list.end(); } 00053 const_iterator begin(void) const { return list.begin(); } 00054 const_iterator end(void) const { return list.end(); } 00055 reverse_iterator rbegin(void) { return list.rbegin(); } 00056 reverse_iterator rend(void) { return list.rend(); } 00057 const_reverse_iterator rbegin(void) const { return list.rbegin(); } 00058 const_reverse_iterator rend(void) const { return list.rend(); } 00059 00060 T back(void) { return list.back(); } 00061 const T back(void) const { return list.back(); } 00062 00063 bool empty(void) const { return list.empty(); } 00064 size_t size(void) const { return list.size(); } 00065 void push_front(T info) { list.push_front(info); } 00066 void push_back( T info) { list.push_back( info); } 00067 00068 // compatibility with old Q3PtrList 00069 void setAutoDelete(bool auto_delete) { autodelete = auto_delete; } 00070 00071 protected: 00072 List list; 00073 bool autodelete; 00074 }; 00075 00076 template<typename T> 00077 T AutoDeleteDeque<T>::take(uint index) 00078 { 00079 iterator it = list.begin(); 00080 for (uint i = 0; i < index; i++, it++) 00081 { 00082 if (it == list.end()) 00083 return NULL; 00084 } 00085 T info = *it; 00086 list.erase(it); 00087 return info; 00088 } 00089 00090 #endif // _AUTO_DELETE_DEQUE_H_
1.6.3