00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #ifndef OST_POD_VECTOR_HH
00020 #define OST_POD_VECTOR_HH
00021
00022
00023
00024
00025
00026 #include <ost/module_config.hh>
00027
00028 #include <memory>
00029 #include <iterator>
00030 #include <string>
00031
00032 namespace ost {
00033
00036 template <typename T>
00037 class TEMPLATE_DEF_EXPORT PodVector {
00038 public:
00039 PodVector(): begin_(NULL), end_(NULL), capacity_(NULL) {}
00040 typedef T value_type;
00041 typedef T& reference;
00042 typedef const T& const_reference;
00043 typedef T* iterator;
00044 typedef std::reverse_iterator<iterator> reverse_iterator;
00045 typedef const T* const_iterator;
00046 typedef std::reverse_iterator<const_iterator> const_reverse_iterator;
00047
00048 iterator begin() { return begin_; }
00049 iterator end() { return end_; }
00050 const_iterator begin() const { return begin_; }
00051 const_iterator end() const { return end_; }
00052
00053 reverse_iterator rbegin() { return reverse_iterator(begin_); }
00054 reverse_iterator rend() { return reverse_iterator(end_); }
00055 const_reverse_iterator rbegin() const
00056 {
00057 return const_reverse_iterator(begin_);
00058 }
00059 const_reverse_iterator rend() const
00060 {
00061 return const_reverse_iterator(end_);
00062 }
00063
00064 size_t capacity() const { return capacity_-begin_; }
00065 size_t size() const { return end_-begin_; }
00066
00067 reference front()
00068 {
00069 return *begin_;
00070 }
00071 const_reference front() const
00072 {
00073 return *begin_;
00074 }
00075
00076 void push_back(const_reference val)
00077 {
00078 if (end_<=capacity_) {
00079 this->do_reserve(this->capacity()*2);
00080 }
00081 memcpy(end_, &val, sizeof(value_type));
00082 ++end_;
00083 }
00084
00085 void pop_back()
00086 {
00087 --end_;
00088 }
00089
00090 void clear() { return this->do_reserve(0); }
00091
00092 void reserve(size_t n)
00093 {
00094 return do_reserve(n);
00095 }
00096
00097 reference operator[](size_t index)
00098 {
00099 return begin_[index];
00100 }
00101 const_reference operator[](size_t index) const
00102 {
00103 return begin_[index];
00104 }
00105 private:
00106 void do_reserve(size_t n);
00107 value_type* begin_;
00108 value_type* end_;
00109 value_type* capacity_;
00110 };
00111
00112 template <typename T>
00113 void PodVector<T>::do_reserve(size_t n)
00114 {
00115 size_t old_size=this->size();
00116 n=(n==0 ? 1 : n);
00117 if (n==this->capacity()) {
00118 return;
00119 }
00120 begin_=reinterpret_cast<T*>(realloc(begin_, n*sizeof(T)));
00121 end_=begin_+old_size;
00122 capacity_=begin_+n;
00123 }
00124
00125 }
00126
00127 #endif