00001
00031 #ifndef _adevs_bag_h
00032 #define _adevs_bag_h
00033 #include <cstdlib>
00034
00035 namespace adevs
00036 {
00037
00045 template <class T> class Bag
00046 {
00047 public:
00049 class iterator
00050 {
00051 public:
00052 iterator(unsigned int start = 0, T* b = NULL):
00053 i(start),b(b){}
00054 iterator(const iterator& src):
00055 i(src.i),b(src.b){}
00056 const iterator& operator=(const iterator& src)
00057 {
00058 i = src.i;
00059 b = src.b;
00060 return *this;
00061 }
00062 bool operator==(const iterator& src) const { return i==src.i; }
00063 bool operator!=(const iterator& src) const { return i!=src.i; }
00064 T& operator*() { return b[i]; }
00065 const T& operator*() const { return b[i]; }
00066 iterator& operator++() { i++; return *this; }
00067 iterator& operator--() { i--; return *this; }
00068 iterator& operator++(int) { ++i; return *this; }
00069 iterator& operator--(int) { --i; return *this; }
00070 private:
00071 friend class Bag<T>;
00072 unsigned int i;
00073 T* b;
00074 };
00075 typedef iterator const_iterator;
00077 Bag(unsigned int cap = 8):
00078 cap_(cap),size_(0),b(new T[cap]){}
00080 Bag(const Bag<T>& src):
00081 cap_(src.cap_),
00082 size_(src.size_)
00083 {
00084 b = new T[src.cap_];
00085 for (unsigned int i = 0; i < size_; i++)
00086 b[i] = src.b[i];
00087 }
00089 const Bag<T>& operator=(const Bag<T>& src)
00090 {
00091 cap_ = src.cap_;
00092 size_ = src.size_;
00093 delete [] b;
00094 b = new T[src.cap_];
00095 for (unsigned int i = 0; i < size_; i++)
00096 b[i] = src.b[i];
00097 return *this;
00098 }
00100 Bag<T>& swap(Bag<T>& src)
00101 {
00102 unsigned tmp_cap_, tmp_size_;
00103 T* tmp_b;
00104 tmp_cap_ = src.cap_;
00105 tmp_size_ = src.size_;
00106 tmp_b = src.b;
00107 src.cap_ = cap_;
00108 src.size_ = size_;
00109 src.b = b;
00110 cap_ = tmp_cap_;
00111 size_ = tmp_size_;
00112 b = tmp_b;
00113 return *this;
00114 }
00116 unsigned count(const T& a) const
00117 {
00118 unsigned result = 0;
00119 for (unsigned i = 0; i < size_; i++)
00120 if (b[i] == a) result++;
00121 return result;
00122 }
00124 unsigned size() const { return size_; }
00126 bool empty() const { return size_ == 0; }
00128 iterator begin() const { return iterator(0,b); }
00130 iterator end() const { return iterator(size_,b); }
00132 void erase(const T& k)
00133 {
00134 iterator p = find(k);
00135 if (p != end()) erase(p);
00136 }
00138 void erase(iterator p)
00139 {
00140 size_--;
00141 b[p.i] = b[size_];
00142 }
00144 void clear() { size_ = 0; }
00146 iterator find(const T& k) const
00147 {
00148 for (unsigned i = 0; i < size_; i++)
00149 if (b[i] == k) return iterator(i,b);
00150 return end();
00151 }
00153 void insert(const T& t)
00154 {
00155 if (cap_ == size_) enlarge(2*cap_);
00156 b[size_] = t;
00157 size_++;
00158 }
00159 ~Bag() { delete [] b; }
00160 private:
00161 unsigned cap_, size_;
00162 T* b;
00164 void enlarge(unsigned adjustment)
00165 {
00166 cap_ = cap_ + adjustment;
00167 T* rb = new T[cap_];
00168 for (unsigned i = 0; i < size_; i++)
00169 rb[i] = b[i];
00170 delete [] b;
00171 b = rb;
00172 }
00173 };
00174
00175 }
00176
00177 #endif