00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #ifndef SGE_RAW_VECTOR_HPP_INCLUDED
00022 #define SGE_RAW_VECTOR_HPP_INCLUDED
00023
00024 #include "config.h"
00025 #ifndef SGE_HAVE_STATIC_ASSERT
00026 #include <boost/static_assert.hpp>
00027 #endif
00028 #include <boost/type_traits/is_pod.hpp>
00029 #include <iterator>
00030 #include <memory>
00031
00032 namespace sge
00033 {
00034
00035 template<typename T, typename A = std::allocator<T> >
00036 class raw_vector {
00037 #ifdef SGE_HAVE_STATIC_ASSERT
00038 static_assert(boost::is_pod<T>::value, "raw_vector::value_type must be POD");
00039 #else
00040 BOOST_STATIC_ASSERT(boost::is_pod<T>::value);
00041 #endif
00042 public:
00043 typedef T value_type;
00044 typedef A allocator_type;
00045 typedef typename A::size_type size_type;
00046 typedef typename A::difference_type difference_type;
00047 typedef typename A::pointer pointer;
00048 typedef typename A::const_pointer const_pointer;
00049 typedef typename A::reference reference;
00050 typedef typename A::const_reference const_reference;
00051 typedef pointer iterator;
00052 typedef const_pointer const_iterator;
00053 typedef std::reverse_iterator<iterator> reverse_iterator;
00054 typedef std::reverse_iterator<const_iterator> const_reverse_iterator;
00055
00056 iterator begin();
00057 const_iterator begin() const;
00058 iterator end();
00059 const_iterator end() const;
00060
00061 reverse_iterator rbegin();
00062 const_reverse_iterator rbegin() const;
00063 reverse_iterator rend();
00064 const_reverse_iterator rend() const;
00065
00066 reference operator[] (size_type n);
00067 const_reference operator[] (size_type n) const;
00068 reference at(size_type n);
00069 const_reference at(size_type n) const;
00070 reference front();
00071 const_reference front() const;
00072 reference back();
00073 const_reference back() const;
00074
00075 pointer data();
00076 const_pointer data() const;
00077
00078 explicit raw_vector(const A& a = A());
00079 explicit raw_vector(size_type sz, const A& a = A());
00080 raw_vector(size_type sz, const T& t, const A& a = A());
00081
00082 template <typename In>
00083 raw_vector (In beg, In end, const A& a = A());
00084
00085 raw_vector (const raw_vector& x);
00086 ~raw_vector();
00087
00088 raw_vector& operator= (const raw_vector& x);
00089
00090 template <typename In>
00091 void assign (In beg, In end);
00092 void assign (size_type n, const T& value);
00093
00094 void push_back (const T& x);
00095 void pop_back();
00096 void clear();
00097
00098 size_type size() const;
00099 bool empty() const;
00100 size_type max_size() const;
00101 size_type capacity() const;
00102
00103 void swap (raw_vector& x);
00104 void resize_uninitialized(size_type sz);
00105 void resize(size_type sz, const T& value = T());
00106 void reserve(size_type sz);
00107
00108 allocator_type get_allocator() const;
00109
00110 iterator insert(iterator position, const T& x);
00111 void insert(iterator position, size_type n, const T& x);
00112 template <typename In>
00113 void insert(iterator position, In first, In last);
00114
00115 iterator erase(iterator position);
00116 iterator erase(iterator first, iterator last);
00117 private:
00118 void range_check(size_type n) const;
00119 size_type new_capacity(size_type new_size) const;
00120 void set_pointers(pointer src, size_type sz, size_type cap);
00121 void deallocate();
00122
00123 struct impl {
00124 impl(const A&);
00125 impl(const A&, size_type);
00126
00127 A a;
00128 pointer first,
00129 last,
00130 cap;
00131 };
00132
00133 impl i;
00134 };
00135
00136 template <typename T, typename A>
00137 bool operator==(const raw_vector<T, A>& x, const raw_vector<T,A>& y);
00138
00139 template <typename T, typename A>
00140 bool operator< (const raw_vector<T, A>& x, const raw_vector<T, A>& y);
00141
00142 template <typename T, typename A>
00143 bool operator!=(const raw_vector<T, A>& x, const raw_vector<T, A>& y);
00144
00145 template <typename T, typename A>
00146 bool operator> (const raw_vector<T, A>& x, const raw_vector<T, A>& y);
00147
00148 template <typename T, typename A>
00149 bool operator>=(const raw_vector<T, A>& x, const raw_vector<T, A>& y);
00150
00151 template <typename T, typename A>
00152 bool operator<=(const raw_vector<T, A>& x, const raw_vector<T, A>& y);
00153
00154 template <typename T, typename A>
00155 void swap(raw_vector<T, A>& x, raw_vector<T, A>& y);
00156
00157
00158 }
00159
00160 #endif