23 #ifndef __CLRX_CONTAINERS_H__
24 #define __CLRX_CONTAINERS_H__
26 #include <CLRX/Config.h>
30 #include <initializer_list>
48 Array(): ptr(nullptr), ptrEnd(nullptr)
82 ptr = ptrEnd =
nullptr;
83 const size_t N = cp.
size();
87 std::copy(cp.ptr, cp.ptrEnd, ptr);
100 cp.ptr = cp.ptrEnd =
nullptr;
104 Array(std::initializer_list<T> list)
108 const size_t N = list.size();
112 std::copy(list.begin(), list.end(), ptr);
140 cp.ptr = cp.ptrEnd =
nullptr;
147 assign(list.begin(), list.end());
160 {
return ptrEnd==ptr; }
164 {
return ptrEnd-ptr; }
188 const size_t toMove = std::min(N,
size());
189 for (
size_t k = 0; k < toMove; k++)
190 newPtr[k] = std::move_if_noexcept(ptr[k]);
206 ptr = ptrEnd =
nullptr;
210 template<
typename It>
213 const size_t N = e-b;
220 { std::copy(b, e, newPtr); }
231 std::copy(b, e, ptr);
264 {
return ptrEnd[-1]; }
267 {
return ptrEnd[-1]; }
272 std::swap(ptr, array.ptr);
273 std::swap(ptrEnd, array.ptrEnd);
284 template<
typename Iter>
286 typename std::iterator_traits<Iter>::value_type& v);
296 template<
typename Iter,
typename Comp =
297 std::less<typename std::iterator_traits<Iter>::value_type> >
299 typename std::iterator_traits<Iter>::value_type& v, Comp comp);
308 template<
typename Iter>
310 typename std::iterator_traits<Iter>::value_type::first_type& k);
320 template<
typename Iter,
typename Comp =
321 std::less<typename std::iterator_traits<Iter>::value_type::first_type> >
323 typename std::iterator_traits<Iter>::value_type::first_type& k, Comp comp);
330 template<
typename Iter>
331 void mapSort(Iter begin, Iter end);
338 template<
typename Iter,
typename Comp =
339 std::less<typename std::iterator_traits<Iter>::value_type::first_type> >
340 void mapSort(Iter begin, Iter end, Comp comp);
349 template<
typename Iter>
351 const typename std::iterator_traits<Iter>::value_type& v)
353 auto it = std::lower_bound(begin, end, v);
354 if (it == end || v < *it)
367 template<
typename Iter,
typename Comp>
369 const typename std::iterator_traits<Iter>::value_type& v, Comp comp)
371 auto it = std::lower_bound(begin, end, v, comp);
372 if (it == end || comp(v, *it))
378 template<
typename Iter>
380 typename std::iterator_traits<Iter>::value_type::first_type& k)
382 typedef typename std::iterator_traits<Iter>::value_type::first_type K;
383 typedef typename std::iterator_traits<Iter>::value_type::second_type V;
384 auto it = std::lower_bound(begin, end, std::make_pair(k, V()),
385 [](
const std::pair<K,V>& e1,
const std::pair<K,V>& e2) {
386 return e1.first < e2.first; });
387 if (it == end || k < it->first)
393 template<
typename Iter,
typename Comp>
395 typename std::iterator_traits<Iter>::value_type::first_type& k, Comp comp)
397 typedef typename std::iterator_traits<Iter>::value_type::first_type K;
398 typedef typename std::iterator_traits<Iter>::value_type::second_type V;
399 auto it = std::lower_bound(begin, end, std::make_pair(k, V()),
400 [&comp](
const std::pair<K,V>& e1,
const std::pair<K,V>& e2) {
401 return comp(e1.first, e2.first); });
402 if (it == end || comp(k, it->first))
412 template<
typename Iter>
415 typedef typename std::iterator_traits<Iter>::value_type::first_type K;
416 typedef typename std::iterator_traits<Iter>::value_type::second_type V;
417 std::sort(begin, end, [](
const std::pair<K,V>& e1,
const std::pair<K,V>& e2) {
418 return e1.first < e2.first; });
427 template<
typename Iter,
typename Comp>
430 typedef typename std::iterator_traits<Iter>::value_type::first_type K;
431 typedef typename std::iterator_traits<Iter>::value_type::second_type V;
432 std::sort(begin, end, [&comp](
const std::pair<K,V>& e1,
const std::pair<K,V>& e2) {
433 return comp(e1.first, e2.first); });
const T * begin() const
get iterator to first element
Definition: Containers.h:243
T element_type
element type
Definition: Containers.h:43
Iter binaryMapFind(Iter begin, Iter end, const typename std::iterator_traits< Iter >::value_type::first_type &k)
binary find helper for array-map
Definition: Containers.h:379
void swap(Array &array)
swap two arrays
Definition: Containers.h:270
void allocate(size_t N)
only allocating space without keeping previous content
Definition: Containers.h:167
const T & operator[](size_t i) const
operator of indexing
Definition: Containers.h:152
const T & front() const
get first element
Definition: Containers.h:257
an array class
Definition: Containers.h:38
void resize(size_t N)
resize space with keeping old content
Definition: Containers.h:179
const T * const_iterator
type of constant iterator
Definition: Containers.h:42
Array()
empty constructor
Definition: Containers.h:48
Array(size_t N)
construct array of N elements
Definition: Containers.h:52
Array & operator=(Array &&cp) noexcept
move assignment
Definition: Containers.h:133
T & back()
get last element
Definition: Containers.h:266
Array & operator=(std::initializer_list< T > list)
assignment from initializer list
Definition: Containers.h:145
Array(std::initializer_list< T > list)
constructor with initializer list
Definition: Containers.h:104
T * end()
get iterator to after last element
Definition: Containers.h:253
Array & operator=(const Array &cp)
copy assignment
Definition: Containers.h:125
T * data()
get data
Definition: Containers.h:239
T & front()
get first element
Definition: Containers.h:260
void mapSort(Iter begin, Iter end)
map range of iterators
Definition: Containers.h:413
Array & assign(It b, It e)
assign from range of iterators
Definition: Containers.h:211
T * iterator
type of iterator
Definition: Containers.h:41
~Array()
destructor
Definition: Containers.h:121
Array(It b, It e)
construct array of elements in begin and end
Definition: Containers.h:62
T * begin()
get iterator to first element
Definition: Containers.h:246
Array(const Array &cp)
copy constructor
Definition: Containers.h:79
Iter binaryFind(Iter begin, Iter end, const typename std::iterator_traits< Iter >::value_type &v)
binary find helper
Definition: Containers.h:350
size_t size() const
returns number of elements
Definition: Containers.h:163
const T * data() const
get data
Definition: Containers.h:236
void clear()
clear array
Definition: Containers.h:203
bool empty() const
returns true if empty
Definition: Containers.h:159
Array(Array &&cp) noexcept
move constructor
Definition: Containers.h:96
const T & back() const
get last element
Definition: Containers.h:263
const T * end() const
get iterator to after last element
Definition: Containers.h:250