00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00036 #ifndef OW_LIST_HPP_INCLUDE_GUARD_
00037 #define OW_LIST_HPP_INCLUDE_GUARD_
00038 #include "OW_config.h"
00039 #include "OW_COWReference.hpp"
00040 #include <list>
00041
00042 namespace OW_NAMESPACE
00043 {
00044
00045
00046 template<class T> class List;
00047
00048 template <class T>
00049 inline bool operator==(const List<T>& x, const List<T>& y);
00050
00051 template <class T>
00052 inline bool operator<(const List<T>& x, const List<T>& y);
00053
00054
00058 template<class T> class List
00059 {
00060 private:
00061 typedef std::list<T> L;
00062 COWReference<L> m_impl;
00063 public:
00064 typedef typename L::value_type value_type;
00065 typedef typename L::pointer pointer;
00066 typedef typename L::const_pointer const_pointer;
00067 typedef typename L::reference reference;
00068 typedef typename L::const_reference const_reference;
00069 typedef typename L::size_type size_type;
00070 typedef typename L::difference_type difference_type;
00071 typedef typename L::iterator iterator;
00072 typedef typename L::const_iterator const_iterator;
00073 typedef typename L::reverse_iterator reverse_iterator;
00074 typedef typename L::const_reverse_iterator const_reverse_iterator;
00075 List() : m_impl(new L) {}
00076 explicit List(L* toWrap) : m_impl(toWrap)
00077 { }
00078 template<class InputIterator>
00079 List(InputIterator first, InputIterator last) : m_impl(new L(first, last))
00080 {
00081 }
00082 List(size_type n, const T& value) : m_impl(new L(n, value))
00083 {
00084 }
00085 List(int n, const T& value) : m_impl(new L(n, value))
00086 {
00087 }
00088 List(long n, const T& value) : m_impl(new L(n, value))
00089 {
00090 }
00091 explicit List(size_type n) : m_impl(new L(n))
00092 {
00093 }
00094 L* getImpl()
00095 {
00096 return &*m_impl;
00097 }
00098 iterator begin()
00099 {
00100 return m_impl->begin();
00101 }
00102 const_iterator begin() const
00103 {
00104 return m_impl->begin();
00105 }
00106 iterator end()
00107 {
00108 return m_impl->end();
00109 }
00110 const_iterator end() const
00111 {
00112 return m_impl->end();
00113 }
00114 reverse_iterator rbegin()
00115 {
00116 return m_impl->rbegin();
00117 }
00118 const_reverse_iterator rbegin() const
00119 {
00120 return m_impl->rbegin();
00121 }
00122 reverse_iterator rend()
00123 {
00124 return m_impl->rend();
00125 }
00126 const_reverse_iterator rend() const
00127 {
00128 return m_impl->rend();
00129 }
00130 bool empty() const
00131 {
00132 return m_impl->empty();
00133 }
00134 size_type size() const
00135 {
00136 return m_impl->size();
00137 }
00138 size_type max_size() const
00139 {
00140 return m_impl->max_size();
00141 }
00142 reference front()
00143 {
00144 return m_impl->front();
00145 }
00146 const_reference front() const
00147 {
00148 return m_impl->front();
00149 }
00150 reference back()
00151 {
00152 return m_impl->back();
00153 }
00154 const_reference back() const
00155 {
00156 return m_impl->back();
00157 }
00158 void swap(List<T>& x)
00159 {
00160 m_impl.swap(x.m_impl);
00161 }
00162 iterator insert(iterator position, const T& x)
00163 {
00164 return m_impl->insert(position, x);
00165 }
00166 iterator insert(iterator position)
00167 {
00168 return m_impl->insert(position);
00169 }
00170 template<class InputIterator>
00171 void insert(iterator position, InputIterator first, InputIterator last)
00172 {
00173 m_impl->insert(position, first, last);
00174 }
00175 void insert(iterator pos, size_type n, const T& x)
00176 {
00177 m_impl->insert(pos, n, x);
00178 }
00179 void insert(iterator pos, int n, const T& x)
00180 {
00181 m_impl->insert(pos, n, x);
00182 }
00183 void insert(iterator pos, long n, const T& x)
00184 {
00185 m_impl->insert(pos, n, x);
00186 }
00187 void push_front(const T& x)
00188 {
00189 m_impl->push_front(x);
00190 }
00191 void push_back(const T& x)
00192 {
00193 m_impl->push_back(x);
00194 }
00195 iterator erase(iterator position)
00196 {
00197 return m_impl->erase(position);
00198 }
00199 iterator erase(iterator first, iterator last)
00200 {
00201 return m_impl->erase(first, last);
00202 }
00203 void resize(size_type new_size, const T& x)
00204 {
00205 m_impl->resize(new_size, x);
00206 }
00207 void resize(size_type new_size)
00208 {
00209 m_impl->resize(new_size);
00210 }
00211 void clear()
00212 {
00213 m_impl->clear();
00214 }
00215 void pop_front()
00216 {
00217 m_impl->pop_front();
00218 }
00219 void pop_back()
00220 {
00221 m_impl->pop_back();
00222 }
00223 void splice(iterator position, List& x)
00224 {
00225 m_impl->splice(position, *x.m_impl);
00226 }
00227 void splice(iterator position, List& x, iterator i)
00228 {
00229 m_impl->splice(position, *x.m_impl, i);
00230 }
00231 void splice(iterator position, List& x, iterator first, iterator last)
00232 {
00233 m_impl->splice(position, *x.m_impl, first, last);
00234 }
00235 void remove(const T& value)
00236 {
00237 m_impl->remove(value);
00238 }
00239 void unique()
00240 {
00241 m_impl->unique();
00242 }
00243 void merge(List& x)
00244 {
00245 m_impl->merge(*x.m_impl);
00246 }
00247 void reverse()
00248 {
00249 m_impl->reverse();
00250 }
00251 void sort()
00252 {
00253 m_impl->sort();
00254 }
00255 template<class Predicate> void remove_if (Predicate p)
00256 {
00257 m_impl->remove_if (p);
00258 }
00259 template<class BinaryPredicate> void unique(BinaryPredicate bp)
00260 {
00261 m_impl->unique(bp);
00262 }
00263 template<class StrictWeakOrdering> void merge(List& x, StrictWeakOrdering swo)
00264 {
00265 m_impl->merge(*x.m_impl, swo);
00266 }
00267 template<class StrictWeakOrdering> void
00268 sort(StrictWeakOrdering swo)
00269 {
00270 m_impl->sort(swo);
00271 }
00272 friend bool operator== <>(const List<T>& x,
00273 const List<T>& y);
00274 friend bool operator< <>(const List<T>& x,
00275 const List<T>& y);
00276 };
00277 template <class T>
00278 inline bool operator==(const List<T>& x, const List<T>& y)
00279 {
00280 return *x.m_impl == *y.m_impl;
00281 }
00282 template <class T>
00283 inline bool operator<(const List<T>& x, const List<T>& y)
00284 {
00285 return *x.m_impl < *y.m_impl;
00286 }
00287 template <class T>
00288 inline void swap(List<T>& x, List<T>& y)
00289 {
00290 x.swap(y);
00291 }
00292 template <class T>
00293 std::list<T>* COWReferenceClone(std::list<T>* obj)
00294 {
00295 return new std::list<T>(*obj);
00296 }
00297
00298 }
00299
00300 #endif