00001 // -*- Mode: c++ -*- 00002 00003 #ifndef __MYTH_DEQUE_H__ 00004 #define __MYTH_DEQUE_H__ 00005 00006 #include <QString> 00007 #include <deque> 00008 using namespace std; 00009 00010 template<typename T> 00011 inline T myth_deque_init(const T*) { return (T)(0); } 00012 template<> 00013 inline QString myth_deque_init(const QString*) { return QString(); } 00014 00020 template<typename T> 00021 class MythDeque : public deque<T> 00022 { 00023 public: 00025 T dequeue() 00026 { 00027 T *dummy = NULL; 00028 if (deque<T>::empty()) 00029 return myth_deque_init(dummy); 00030 T item = deque<T>::front(); 00031 deque<T>::pop_front(); 00032 return item; 00033 } 00035 void enqueue(T d) { deque<T>::push_back(d); } 00036 00037 typedef typename deque<T>::iterator iterator; 00038 typedef typename deque<T>::const_iterator const_iterator; 00039 typedef typename deque<T>::size_type size_type; 00040 00042 iterator find(T const item) 00043 { 00044 for (iterator it = deque<T>::begin(); it != deque<T>::end(); ++it) 00045 if (*it == item) 00046 return it; 00047 return deque<T>::end(); 00048 } 00049 00051 const_iterator find(T const item) const 00052 { 00053 for (const_iterator it = deque<T>::begin(); it != deque<T>::end(); ++it) 00054 if (*it == item) 00055 return it; 00056 return deque<T>::end(); 00057 } 00058 00060 void remove(T const item) 00061 { 00062 iterator it = find(item); 00063 if (it != deque<T>::end()) 00064 deque<T>::erase(it); 00065 } 00066 00068 bool contains(T const item) const 00069 { return find(item) != deque<T>::end(); } 00070 00072 size_type count() const { return deque<T>::size(); } 00073 00075 T head() 00076 { if (!deque<T>::empty()) return deque<T>::front(); 00077 T *dummy = NULL; return myth_deque_init(dummy); } 00079 const T head() const 00080 { if (!deque<T>::empty()) return deque<T>::front(); 00081 T *dummy = NULL; return myth_deque_init(dummy); } 00082 00084 T tail() 00085 { if (!deque<T>::empty()) return deque<T>::back(); 00086 T *dummy = NULL; return myth_deque_init(dummy); } 00088 const T tail() const 00089 { if (!deque<T>::empty()) return deque<T>::back(); 00090 T *dummy = NULL; return myth_deque_init(dummy); } 00091 }; 00092 00093 #endif // __MYTH_DEQUE_H__
1.6.3