Arduino Libraries
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros
vector.hpp
Go to the documentation of this file.
1 // Author: Mario S. Könz <mskoenz@gmx.net>
2 // Date: 20.05.2013 12:21:03 EDT
3 // File: vector.hpp
4 
5 /* This program is free software. It comes without any warranty, to
6  * the extent permitted by applicable law. You can redistribute it
7  * and/or modify it under the terms of the Do What The Fuck You Want
8  * To Public License, Version 2, as published by Sam Hocevar. See
9  * http://www.wtfpl.net/ or COPYING for more details. */
10 
11 #ifndef __VECTOR_HEADER
12 #define __VECTOR_HEADER
13 
14 #include "ard_assert.hpp"
15 
16 #include "../com/archive_enum.hpp"
17 
18 namespace ustd {
19 
20  template<typename T>
21  class vector {
22  public:
23  typedef T value_type;
24  typedef uint16_t size_type;
25  //------------------- ctors -------------------
26  vector(): array_((T*)malloc(sizeof(T))), size_(0) {
27  }
28  ~vector() {
29  free(array_);
30  }
31  explicit vector(size_type const & size, T const & val = T()): array_((T*)malloc(size * sizeof(T))), size_(size) {
32  for(size_type i = 0; i < size_; ++i) {
33  array_[i] = val;
34  }
35  }
36  vector(vector const & arg): array_((T*)malloc(arg.size_ * sizeof(T))), size_(arg.size_) {
37  for(size_type i = 0; i < size_; ++i) {
38  array_[i] = arg.array_[i];
39  }
40  }
41  vector & operator=(vector const & rhs) {
42  clear();
43  reserve(rhs.size());
44  shrink_to_fit();
45  for(size_type i = 0; i < rhs.size(); ++i)
46  push_back(rhs[i]);
47  return (*this);
48  }
49  //------------------- ops -------------------
50  void push_back(T const & in) {
51  if(size_ == capacity()) {
52  array_ = (T*)realloc(array_, size_ * 2 * sizeof(T));
53  }
54  ASSERT_MSG(array_ != NULL, "no RAM for vector of this size")
55  array_[size_] = in;
56  ++size_;
57  }
58  void pop_back() {
59  --size_;
60  }
61  size_type find(T const & val, size_type pos = 0) const {
62  for(; pos < size_; ++pos) {
63  if(array_[pos] == val)
64  return pos;
65  }
66  return size_;
67  }
68  void clear() {
69  size_ = 0;
70  }
71  void erase(size_type const & pos) {
72  if(pos < size_) {
73  for(size_type i = pos; i < size_; ++i) {
74  array_[i] = array_[i + 1];
75  }
76  pop_back();
77  }
78  }
79  //------------------- getter -------------------
80  T & operator[](size_type const & pos) {
81  ASSERT(pos >= 0)
82  ASSERT(pos < size_)
83  return array_[pos];
84  }
85  T const & operator[](size_type const & pos) const {
86  ASSERT(pos >= 0)
87  ASSERT(pos < size_)
88  return array_[pos];
89  }
90  T & back() {
91  ASSERT(size_ > 0)
92  return array_[size_ - 1];
93  }
94  T const & back() const {
95  ASSERT(size_ > 0)
96  return array_[size_ - 1];
97  }
98  T & front() {
99  ASSERT(size_ > 0)
100  return array_[0];
101  }
102  T const & front() const {
103  ASSERT(size_ > 0)
104  return array_[0];
105  }
106  T * data() {
107  return array_;
108  }
109  //------------------- size/capacity -------------------
110  size_type const & size() const {
111  return size_;
112  }
113  size_type capacity() const {
114  //this 'hack' makes the vector not portable, but I don't need to save the capacity => -2 bytes ;) You need to know how the memory works
115  return (*((size_type *)(size_type(array_) - 2))) / sizeof(T);
116  }
117  void reserve(size_type const & new_capacity) {
118  if(new_capacity > capacity()) {
119  array_ = (T*)realloc(array_, new_capacity * sizeof(T));
120  }
121  }
122  void shrink_to_fit() {
123  if(size_ != 0)
124  array_ = (T*)realloc(array_, size_ * sizeof(T));
125  }
126  void resize(size_type const & new_size, T const & val = T()) {
127  reserve(new_size);
128  while(new_size > size_)
129  push_back(val);
130 
131  size_ = new_size;
132  }
133  //------------------- info -------------------
134  bool empty() const {
135  return (size_ == size_type());
136  }
137  //------------------- iterator -------------------
138  //~ struct iterator {
139  //~ iterator(vector & vec, size_type const & pos): vec_(vec), pos_(pos) {
140  //~ }
141  //~ iterator & operator++() {
142  //~ ++pos_;
143  //~ return (*this);
144  //~ }
145  //~ bool operator!=(iterator const & rhs) const {
146  //~ return pos_ != rhs.pos_;
147  //~ }
148  //~ value_type & operator*() {
149  //~ return vec_[pos_];
150  //~ }
151  //~ vector & vec_;
152  //~ size_type pos_;
153  //~ };
154  //~ iterator begin() {
155  //~ return iterator((*this), 0);
156  //~ }
157  //~ iterator end() {
158  //~ return iterator((*this), size_);
159  //~ }
160  constexpr size_type begin() const {
161  return 0;
162  }
163  size_type const & end() const {
164  return size();
165  }
166  //------------------- print & serialize-------------------
167  template<typename S>
168  void print(S & os) const {
169  os << F("[");
170  for(size_type i = 0; i < size_; ++i) {
171  os << array_[i];
172  if(i != size_ - 1)
173  os << F(", ");
174  }
175  os << F("]");
176  }
177  template<typename Archive>
178  void serialize(Archive & ar) {
179  ar & size_;
180  if(Archive::type == archive_enum::input) {
181  reserve(size_);
182  }
183  for(size_type i = 0; i < size_; ++i) {
184  ar & array_[i];
185  }
186  }
187  private:
188  T * array_;
189  size_type size_;
190  };
191 }//end namespace ustd
192 
193 #endif //__VECTOR_HEADER
T const & front() const
Definition: vector.hpp:102
size_type const & end() const
Definition: vector.hpp:163
constexpr size_type begin() const
Definition: vector.hpp:160
bool empty() const
Definition: vector.hpp:134
size_type const & size() const
Definition: vector.hpp:110
#define ASSERT_MSG(exp, msg)
Definition: ard_assert.hpp:34
void push_back(T const &in)
Definition: vector.hpp:50
vector()
Definition: vector.hpp:26
void pop_back()
Definition: vector.hpp:58
size_type capacity() const
Definition: vector.hpp:113
T * data()
Definition: vector.hpp:106
Definition: vector.hpp:21
T & operator[](size_type const &pos)
Definition: vector.hpp:80
uint16_t size_type
Definition: vector.hpp:24
void print(S &os) const
Definition: vector.hpp:168
T & front()
Definition: vector.hpp:98
void resize(size_type const &new_size, T const &val=T())
Definition: vector.hpp:126
void reserve(size_type const &new_capacity)
Definition: vector.hpp:117
T const & operator[](size_type const &pos) const
Definition: vector.hpp:85
~vector()
Definition: vector.hpp:28
void clear()
Definition: vector.hpp:68
void shrink_to_fit()
Definition: vector.hpp:122
T & back()
Definition: vector.hpp:90
void serialize(Archive &ar)
Definition: vector.hpp:178
size_type find(T const &val, size_type pos=0) const
Definition: vector.hpp:61
#define F(x)
Definition: ustd_generic.hpp:15
void erase(size_type const &pos)
Definition: vector.hpp:71
vector(vector const &arg)
Definition: vector.hpp:36
vector & operator=(vector const &rhs)
Definition: vector.hpp:41
vector(size_type const &size, T const &val=T())
Definition: vector.hpp:31
T const & back() const
Definition: vector.hpp:94
T value_type
Definition: vector.hpp:23
#define ASSERT(exp)
Definition: ard_assert.hpp:33