NSVD Reader  0.0.1
boxvec.hpp
Go to the documentation of this file.
1 
5 /*
6  * These codes are licensed under CC0.
7  * http://creativecommons.org/publicdomain/zero/1.0/
8  */
9 
10 #ifndef __NODAMUSHI_BOXVEC_HPP__
11 #define __NODAMUSHI_BOXVEC_HPP__
12 
13 # include <vector>
14 # include <memory>
15 # include <cstdint>
16 # include <utility>
17 # include <algorithm>
18 # include <functional>
19 
20 # include "nodamushi/box.hpp"
21 
22 namespace nodamushi{
23 
27 template<typename T,typename ITR>
28 struct boxitr
29 {
30  ITR itr;
31 
32  boxitr<T,ITR>& operator ++(){++itr;return *this;}
34  boxitr<T,ITR> r{itr};
35  ++itr;
36  return r;
37  }
38 
39  boxitr<T,ITR>& operator --(){--itr;return *this;}
41  boxitr<T,ITR> r{itr};
42  --itr;
43  return r;
44  }
45  boxitr<T,ITR> operator +(int n)const{return {itr+n};}
46  boxitr<T,ITR> operator -(int n)const{return {itr-n};}
47  boxitr<T,ITR>& operator +=(int n){itr+=n;return *this;}
48  boxitr<T,ITR>& operator -=(int n){itr+=n;return *this;}
49 
50 
51  T& operator*()noexcept{return **itr;}
52  const T& operator*()const noexcept{return **itr;}
53  const T& operator->()const noexcept{return (*itr).operator->();}
54  T& operator->()noexcept{return (*itr).operator->();}
55  bool operator <(const boxitr<T,ITR>& i)const noexcept{return itr < i.itr;}
56  bool operator <=(const boxitr<T,ITR>& i)const noexcept{return itr <= i.itr;}
57  bool operator ==(const boxitr<T,ITR>& i)const noexcept{return itr == i.itr;}
58  bool operator !=(const boxitr<T,ITR>& i)const noexcept{return itr != i.itr;}
59  bool operator >(const boxitr<T,ITR>& i)const noexcept{return itr > i.itr;}
60  bool operator >=(const boxitr<T,ITR>& i)const noexcept{return itr >= i.itr;}
61 };
62 
74 template<typename T,typename PTR=::nodamushi::box<T>>
75 class boxvec
76 {
77  public:
78  using box =PTR;
79  using vec_t=std::vector<PTR>;
80 
83  using size_type = typename vec_t::size_type;
84  using reference =T&;
85  using const_reference = const T&;
86  using value_type = T;
89 
90  boxvec():_v{}{}
91  boxvec(size_type initial_capacity):_v{}
92  {
93  _v.reserve(initial_capacity);
94  };
95  //--------------------------------------------------
96  // deap copy
97  //--------------------------------------------------
99  boxvec(const boxvec<T,PTR>& src):_v{}
100  {
101  _v.reserve(src.size());
102  for(const T& t:src)
103  _v.emplace_back(new T(t));
104  }
107  {
108  _v.clear();
109  _v.reserve(src.size());
110  for(const T& t:src)
111  _v.emplace_back(new T(t));
112  return *this;
113  }
114  //--------------------------------------------------
115  template<typename P>
116  boxvec(boxvec<T,P>&& src):_v(std::move(src._v)){}
117  template<typename P>
118  boxvec<T,PTR>& operator=(boxvec<T,P>&& src){_v = std::move(src._v);}
119  //--------------------------------------------------
120 
121  template<typename P>
122  void add_all(const boxvec<T,P>& src)
123  {
124  _v.reserved(src.size()+_v.size());
125  for(const auto& t:src)
126  _v.emplace_back(new T(t));
127  }
128  template<typename P>
129  void add_all(boxvec<T,P>&& src)
130  {
131  _v.reserved(src.size()+_v.size());
132  for(const auto& t:src._v)
133  _v.emplace_back(std::move(t));
134  }
135  operator bool()const noexcept{return !_v.empty();}
136 
137  size_type size()const noexcept{return _v.size();}
138  size_type max_size()const noexcept{return _v.max_size();}
139  size_type capacity()const noexcept{return _v.capacity();}
140  bool empty()const noexcept{return _v.empty();}
141  void reserve(size_type n){_v.reserve(n);}
142  void shurink_to_fit(){_v.shurink_to_fit();}
143 
144  reference operator[](size_type n){return *_v[n];}
145  const_reference operator[](size_type n)const{return *_v[n];}
146 
147  reference at(size_type n){return *(_v.at(n));}
148  const_reference at(size_type n)const{return *(_v.at(n));}
149  PTR ptr_at(size_type n){return _v.at(n);}
150  const PTR ptr_at(size_type n)const{return _v.at(n);}
151 
152 
153  reference front(){return *_v.front();}
154  const_reference front()const{return *_v.front();}
155 
156  reference back(){return *_v.back();}
157  const_reference back()const{return *_v.back();}
158 
159  template <class InputIterator>
160  void assign(InputIterator first, InputIterator last)
161  {
162  while(first!=last){
163  _v.emplace_back(new T(*first));
164  ++first;
165  }
166  }
167 
168  void push_back(const T& t)
169  {
170  _v.emplace_back(new T(t));
171  }
172  void push_back(T&& t)
173  {
174  _v.emplace_back(new T(std::move(t)));
175  }
176  void push_back(box&& t)
177  {
178  _v.emplace_back(std::move(t));
179  }
180 
181  void push_back(const box& t)
182  {
183  _v.emplace_back(t);
184  }
185 
186  template<typename... ARGS>
187  void emplace_back(ARGS&&... args)
188  {
189  _v.emplace_back(new T(std::forward<ARGS>(args)...));
190  }
191  template <class... ARGS>
192  iterator emplace(const_iterator position, ARGS&&... args)
193  {
194  return {_v.emplace(position.itr,new T(std::forward<ARGS>(args)...))};
195  }
196 
197  void pop_back(){_v.pop_back();}
198 
199  iterator insert(iterator position, const T& x)
200  {
201  _v.insert(position.itr,box(new T(x)));
202  }
203  iterator insert(const_iterator position, const T& x)
204  {
205  _v.insert(position.itr,box(new T(x)));
206  }
207 
208  iterator insert(const_iterator position, T&& x)
209  {
210  _v.insert(position.itr,box(new T(std::move(x))));
211  }
212  template <class InputIterator>
214  InputIterator first, InputIterator last)
215  {
216  auto i = position.itr;
217  while(first != last){
218  _v.insert(i,box(new T(*first)));
219  ++first;++i;
220  }
221  return {i};
222  }
223 
224  iterator erase(iterator position){return {_v.erase(position.itr)};}
225  iterator erase(const_iterator position){return {_v.erase(position.itr)};}
226  iterator erase(iterator first,iterator last){return {_v.erase(first.itr,last.itr)};}
227  iterator erase(const_iterator first,const_iterator last){return {_v.erase(first.itr,last.itr)};}
228 
229 
230 
231  void swap(boxvec<T,PTR>& x){_v.swap(x._v);}
232  void clear(){_v.clear();}
233 
234 
235 
236  iterator begin()noexcept{return {_v.begin()};}
237  const_iterator begin()const noexcept{return {_v.begin()};}
238  const_iterator cbegin()const noexcept{return {_v.cbegin()};}
239  iterator end() noexcept{return {_v.end()};}
240  const_iterator end()const noexcept{return {_v.cend()};}
241  const_iterator cend()const noexcept{return {_v.cend()};}
242 
243  typename vec_t::iterator ptr_begin()noexcept{return _v.begin();}
244  typename vec_t::const_iterator ptr_begin()const noexcept{return _v.begin();}
245  typename vec_t::iterator ptr_end() noexcept{return _v.end();}
246  typename vec_t::const_iterator ptr_end()const noexcept{return _v.cend();}
247 
248  reverse_iterator rbegin() noexcept{return {_v.rbegin()};}
249  reverse_iterator rend() noexcept{return {_v.rend()};}
250  const_reverse_iterator rbegin()const noexcept{return {_v.rbegin()};}
251  const_reverse_iterator rend()const noexcept{return {_v.rend()};}
252  const_reverse_iterator crbegin()const noexcept{return {_v.crbegin()};}
253  const_reverse_iterator crend()const noexcept{return {_v.crend()};}
254 
256  void sort(std::function<bool(const T&,const T&)> comp)
257  {
258  std::sort(_v.begin(),_v.end(),
259  [&comp](const box& a,const box& b)->bool{
260  return comp(*a,*b);
261  });
262  }
263 
265  template<bool Compare(const T&,const T&)>
266  void sort()
267  {
268  std::sort(_v.begin(),_v.end(),
269  [](const box& a,const box& b)->bool{
270  return Compare(*a,*b);
271  });
272  }
273 
274  private:
275  vec_t _v;
276 };
277 
278 
279 }// end namespace nodamushi
280 
281 #endif // __NODAMUSHI_BOXVEC_HPP__
void shurink_to_fit()
Definition: boxvec.hpp:142
void add_all(boxvec< T, P > &&src)
Definition: boxvec.hpp:129
void assign(InputIterator first, InputIterator last)
Definition: boxvec.hpp:160
reference operator[](size_type n)
Definition: boxvec.hpp:144
boxvec(boxvec< T, P > &&src)
Definition: boxvec.hpp:116
void push_back(const box &t)
Definition: boxvec.hpp:181
bool operator==(const boxitr< T, ITR > &i) const noexcept
Definition: boxvec.hpp:57
boxitr< T, ITR > & operator+=(int n)
Definition: boxvec.hpp:47
const_iterator cbegin() const noexcept
Definition: boxvec.hpp:238
iterator insert(iterator position, InputIterator first, InputIterator last)
Definition: boxvec.hpp:213
vec_t::iterator ptr_begin() noexcept
Definition: boxvec.hpp:243
vec_t::const_iterator ptr_begin() const noexcept
Definition: boxvec.hpp:244
iterator insert(iterator position, const T &x)
Definition: boxvec.hpp:199
iterator insert(const_iterator position, const T &x)
Definition: boxvec.hpp:203
const_reference operator[](size_type n) const
Definition: boxvec.hpp:145
const_reference front() const
Definition: boxvec.hpp:154
size_type size() const noexcept
Definition: boxvec.hpp:137
iterator for boxvec
Definition: boxvec.hpp:28
Definition: Access.hpp:143
PTR ptr_at(size_type n)
Definition: boxvec.hpp:149
reverse_iterator rend() noexcept
Definition: boxvec.hpp:249
bool operator<(const boxitr< T, ITR > &i) const noexcept
Definition: boxvec.hpp:55
const_reverse_iterator rend() const noexcept
Definition: boxvec.hpp:251
const PTR ptr_at(size_type n) const
Definition: boxvec.hpp:150
box.std::unique_ptr wrapper
void push_back(T &&t)
Definition: boxvec.hpp:172
iterator begin() noexcept
Definition: boxvec.hpp:236
T & operator->() noexcept
Definition: boxvec.hpp:54
const_reverse_iterator crend() const noexcept
Definition: boxvec.hpp:253
const_iterator end() const noexcept
Definition: boxvec.hpp:240
iterator erase(const_iterator first, const_iterator last)
Definition: boxvec.hpp:227
reference front()
Definition: boxvec.hpp:153
iterator emplace(const_iterator position, ARGS &&... args)
Definition: boxvec.hpp:192
bool empty() const noexcept
Definition: boxvec.hpp:140
iterator insert(const_iterator position, T &&x)
Definition: boxvec.hpp:208
const_reverse_iterator crbegin() const noexcept
Definition: boxvec.hpp:252
iterator end() noexcept
Definition: boxvec.hpp:239
reference back()
Definition: boxvec.hpp:156
boxvec(const boxvec< T, PTR > &src)
deap copy
Definition: boxvec.hpp:99
boxitr< T, ITR > & operator -=(int n)
Definition: boxvec.hpp:48
void swap(boxvec< T, PTR > &x)
Definition: boxvec.hpp:231
std::vector< ::nodamushi::box< nodamushi::svd::normalized::Enumeration > > vec_t
Definition: boxvec.hpp:79
void sort()
sort elements
Definition: boxvec.hpp:266
iterator erase(const_iterator position)
Definition: boxvec.hpp:225
boxitr< T, ITR > & operator++()
Definition: boxvec.hpp:32
const_reference back() const
Definition: boxvec.hpp:157
boxvec< T, PTR > & operator=(boxvec< T, P > &&src)
Definition: boxvec.hpp:118
void push_back(box &&t)
Definition: boxvec.hpp:176
size_type capacity() const noexcept
Definition: boxvec.hpp:139
boxvec< T, PTR > & operator=(const boxvec< T, PTR > &src)
deap copy
Definition: boxvec.hpp:106
boxitr< T, ITR > operator+(int n) const
Definition: boxvec.hpp:45
void reserve(size_type n)
Definition: boxvec.hpp:141
void push_back(const T &t)
Definition: boxvec.hpp:168
const_iterator cend() const noexcept
Definition: boxvec.hpp:241
reference at(size_type n)
Definition: boxvec.hpp:147
const_reference at(size_type n) const
Definition: boxvec.hpp:148
iterator erase(iterator position)
Definition: boxvec.hpp:224
T & operator *() noexcept
Definition: boxvec.hpp:51
bool operator !=(const boxitr< T, ITR > &i) const noexcept
Definition: boxvec.hpp:58
reverse_iterator rbegin() noexcept
Definition: boxvec.hpp:248
vec_t::iterator ptr_end() noexcept
Definition: boxvec.hpp:245
boxitr< T, ITR > operator -(int n) const
Definition: boxvec.hpp:46
const T & operator->() const noexcept
Definition: boxvec.hpp:53
boxitr< T, ITR > operator --(int)
Definition: boxvec.hpp:40
vector<pointer<T>>.
Definition: boxvec.hpp:75
void sort(std::function< bool(const T &, const T &)> comp)
sort elements
Definition: boxvec.hpp:256
bool operator<=(const boxitr< T, ITR > &i) const noexcept
Definition: boxvec.hpp:56
vec_t::const_iterator ptr_end() const noexcept
Definition: boxvec.hpp:246
const_reverse_iterator rbegin() const noexcept
Definition: boxvec.hpp:250
boxvec(size_type initial_capacity)
Definition: boxvec.hpp:91
bool operator >=(const boxitr< T, ITR > &i) const noexcept
Definition: boxvec.hpp:60
size_type max_size() const noexcept
Definition: boxvec.hpp:138
bool operator >(const boxitr< T, ITR > &i) const noexcept
Definition: boxvec.hpp:59
boxitr< T, ITR > & operator --()
Definition: boxvec.hpp:39
const_iterator begin() const noexcept
Definition: boxvec.hpp:237
iterator erase(iterator first, iterator last)
Definition: boxvec.hpp:226
void add_all(const boxvec< T, P > &src)
Definition: boxvec.hpp:122
normalized <enumeratedValues> element. iterable
Definition: Enumeration.hpp:27
void emplace_back(ARGS &&... args)
Definition: boxvec.hpp:187