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 <cassert>
00029 #include <memory>
00030 #include <iterator>
00031 #include <string>
00032 #include <iostream>
00033 namespace ost {
00034
00037 template <typename T>
00038 class TEMPLATE_DEF_EXPORT PodVector {
00039 public:
00040 PodVector(): begin_(NULL), end_(NULL), capacity_(NULL) {}
00041 PodVector(const PodVector<T>& rhs)
00042 {
00043 this->do_reserve(rhs.capacity());
00044 this->raw_set(rhs.data(), rhs.size());
00045 }
00046 ~PodVector()
00047 {
00048 if (begin_) {
00049 free(begin_);
00050 }
00051 }
00052 typedef T value_type;
00053 typedef T& reference;
00054 typedef const T& const_reference;
00055 typedef T* iterator;
00056 typedef std::reverse_iterator<iterator> reverse_iterator;
00057 typedef const T* const_iterator;
00058 typedef std::reverse_iterator<const_iterator> const_reverse_iterator;
00059
00060 iterator begin() { return begin_; }
00061 iterator end() { return end_; }
00062 const_iterator begin() const { return begin_; }
00063 const_iterator end() const { return end_; }
00064
00065 reverse_iterator rbegin() { return reverse_iterator(begin_); }
00066 reverse_iterator rend() { return reverse_iterator(end_); }
00067 const_reverse_iterator rbegin() const
00068 {
00069 return const_reverse_iterator(begin_);
00070 }
00071 const_reverse_iterator rend() const
00072 {
00073 return const_reverse_iterator(end_);
00074 }
00075
00076 size_t capacity() const { return capacity_-begin_; }
00077 size_t size() const { return end_-begin_; }
00078
00079 reference front()
00080 {
00081 return *begin_;
00082 }
00083 const_reference front() const
00084 {
00085 return *begin_;
00086 }
00087
00088 void push_back(const_reference val)
00089 {
00090 if (end_>=capacity_) {
00091 this->do_reserve(this->capacity()*2);
00092 }
00093 memcpy(end_, &val, sizeof(value_type));
00094 ++end_;
00095 }
00096
00097 void pop_back()
00098 {
00099 --end_;
00100 }
00101
00102 void clear()
00103 {
00104 this->do_reserve(0);
00105 end_=begin_;
00106 }
00107
00108 void reserve(size_t n)
00109 {
00110 return do_reserve(n);
00111 }
00112
00113 reference operator[](size_t index)
00114 {
00115 return begin_[index];
00116 }
00117 const_reference operator[](size_t index) const
00118 {
00119 return begin_[index];
00120 }
00121 T* data() { return begin_; }
00122
00123 const T* data() const { return begin_; }
00124
00125 void raw_set(T* data, size_t n)
00126 {
00127 this->do_reserve(n);
00128 memcpy(begin_, data, sizeof(T)*n);
00129 end_=begin_+n;
00130 }
00131 private:
00132 void do_reserve(size_t n);
00133 value_type* begin_;
00134 value_type* end_;
00135 value_type* capacity_;
00136 };
00137
00138 template <typename T>
00139 void PodVector<T>::do_reserve(size_t n)
00140 {
00141 size_t old_size=this->size();
00142 n=(n==0 ? 1 : n);
00143 if (n==this->capacity()) {
00144 return;
00145 }
00146 begin_=reinterpret_cast<T*>(realloc(begin_, n*sizeof(T)));
00147 end_=begin_+old_size;
00148 capacity_=begin_+n;
00149 }
00150
00151 }
00152
00153 #endif