55struct static_vector_traits
57 template <
typename Container,
typename T>
58 static void push(Container& container,
const T& value)
60 container.push_back(value);
62 template <
typename Container>
63 static void temp_to_output(Container& temp, Container& output)
65 output.assign(temp.begin(), temp.end());
75template <
typename T,
size_t maxsize>
inline
76static_vector<T, maxsize>::static_vector():
83template <
typename T,
size_t maxsize>
inline
84static_vector<T, maxsize>::static_vector(size_type count):
85 static_vector(count, value_type())
91template <
typename T,
size_t maxsize>
inline
92static_vector<T, maxsize>::static_vector(size_type count,
const value_type& value):
95 insert(end(), count, value);
100template <
typename T,
size_t maxsize>
101template <
typename InputIterator>
inline
102static_vector<T, maxsize>::static_vector(InputIterator first, InputIterator last):
105 insert(end(), first, last, meta::Wrap<
typename meta::IsIntegral<InputIterator>::Type>());
110template <
typename T,
size_t maxsize>
inline
111static_vector<T, maxsize>::static_vector(
const static_vector<T, maxsize>& other):
115 insert(end(), other.begin(), other.end(), meta::Wrap<meta::False>());
120template <
typename T,
size_t maxsize>
inline
121static_vector<T, maxsize>::static_vector(static_vector<T, maxsize>&& other) :
125 iterator first = other.begin();
126 iterator last = other.end();
127 iterator pos = begin();
128 while (first != last)
130 new (pos++) value_type(std::move(* first++));
136template <
typename T,
size_t maxsize>
137static_vector<T, maxsize>::static_vector(std::initializer_list<value_type> init) :
138 static_vector(init.begin(), init.end())
144template <
typename T,
size_t maxsize>
inline
145static_vector<T, maxsize>::~static_vector()
152template <
typename T,
size_t maxsize>
inline
153static_vector<T, maxsize>& static_vector<T, maxsize>::operator=(
const static_vector<T, maxsize>& other)
156 erase(begin(), end());
157 insert(end(), other.begin(), other.end(), meta::Wrap<meta::False>());
163template <
typename T,
size_t maxsize>
inline
164static_vector<T, maxsize>& static_vector<T, maxsize>::operator=(static_vector<T, maxsize>&& other)
167 iterator left = begin();
168 iterator right = other.begin();
169 if (size_ < other.size_)
171 for (
size_t k = 0; k < size_; ++k)
172 *left++ = std::move(*right++);
173 for (
size_t k = size_; k < other.size_; ++k)
174 new (left++) value_type(std::move(*right++));
178 for (
size_t k = 0; k < other.size_; ++k)
179 *left++ = std::move(*right++);
180 for (
size_t k = other.size_; k < size_; ++k)
181 (left++)->~value_type();
189template <
typename T,
size_t maxsize>
190void static_vector<T, maxsize>::assign(size_type count,
const value_type& value)
193 insert(end(), count, value);
198template <
typename T,
size_t maxsize>
199template <
typename InputIterator>
200void static_vector<T, maxsize>::assign(InputIterator first, InputIterator last)
203 insert(end(), first, last, meta::Wrap<
typename meta::IsIntegral<InputIterator>::Type>());
208template <
typename T,
size_t maxsize>
209void static_vector<T, maxsize>::assign(std::initializer_list<value_type> init)
211 assign(init.begin(), init.end());
216template <
typename T,
size_t maxsize>
inline
217typename static_vector<T, maxsize>::iterator
218static_vector<T, maxsize>::begin() noexcept
220 return get_element(0);
225template <
typename T,
size_t maxsize>
inline
226typename static_vector<T, maxsize>::const_iterator
227static_vector<T, maxsize>::begin() const noexcept
229 return get_element(0);
234template <
typename T,
size_t maxsize>
inline
235typename static_vector<T, maxsize>::const_iterator
236static_vector<T, maxsize>::cbegin() const noexcept
238 return get_element(0);
243template <
typename T,
size_t maxsize>
inline
244typename static_vector<T, maxsize>::iterator
245static_vector<T, maxsize>::end() noexcept
247 return get_element(size_);
252template <
typename T,
size_t maxsize>
inline
253typename static_vector<T, maxsize>::const_iterator
254static_vector<T, maxsize>::end() const noexcept
256 return get_element(size_);
261template <
typename T,
size_t maxsize>
inline
262typename static_vector<T, maxsize>::const_iterator
263static_vector<T, maxsize>::cend() const noexcept
265 return get_element(size_);
270template <
typename T,
size_t maxsize>
inline
271typename static_vector<T, maxsize>::reverse_iterator
272static_vector<T, maxsize>::rbegin() noexcept
274 return reverse_iterator(get_element(size_));
279template <
typename T,
size_t maxsize>
inline
280typename static_vector<T, maxsize>::const_reverse_iterator
281static_vector<T, maxsize>::rbegin() const noexcept
283 return const_reverse_iterator(get_element(size_));
288template <
typename T,
size_t maxsize>
inline
289typename static_vector<T, maxsize>::const_reverse_iterator
290static_vector<T, maxsize>::crbegin() const noexcept
292 return const_reverse_iterator(get_element(size_));
297template <
typename T,
size_t maxsize>
inline
298typename static_vector<T, maxsize>::reverse_iterator
299static_vector<T, maxsize>::rend() noexcept
301 return reverse_iterator(get_element(0));
306template <
typename T,
size_t maxsize>
inline
307typename static_vector<T, maxsize>::const_reverse_iterator
308static_vector<T, maxsize>::rend() const noexcept
310 return const_reverse_iterator(get_element(0));
315template <
typename T,
size_t maxsize>
inline
316typename static_vector<T, maxsize>::const_reverse_iterator
317static_vector<T, maxsize>::crend() const noexcept
319 return const_reverse_iterator(get_element(0));
324template <
typename T,
size_t maxsize>
inline
325typename static_vector<T, maxsize>::size_type
326static_vector<T, maxsize>::size() const noexcept
333template <
typename T,
size_t maxsize>
334constexpr typename static_vector<T, maxsize>::size_type
335static_vector<T, maxsize>::max_size() const noexcept
342template <
typename T,
size_t maxsize>
343void static_vector<T, maxsize>::resize(size_type n,
const value_type& value)
345 enforce_valid_size(n);
348 get_element(--size_)->~value_type();
352 new (get_element(size_)) value_type(value);
359template <
typename T,
size_t maxsize>
360constexpr typename static_vector<T, maxsize>::size_type
361static_vector<T, maxsize>::capacity() const noexcept
368template <
typename T,
size_t maxsize>
inline
369bool static_vector<T, maxsize>::empty() const noexcept
376template <
typename T,
size_t maxsize>
inline
377void static_vector<T, maxsize>::reserve(size_type n)
379 enforce_valid_size(n);
384template <
typename T,
size_t maxsize>
inline
385typename static_vector<T, maxsize>::reference
386static_vector<T, maxsize>::operator[](size_type i)
388 return *get_element(i);
393template <
typename T,
size_t maxsize>
inline
394typename static_vector<T, maxsize>::const_reference
395static_vector<T, maxsize>::operator[](size_type i)
const
397 return *get_element(i);
402template <
typename T,
size_t maxsize>
403typename static_vector<T, maxsize>::reference
404static_vector<T, maxsize>::at(size_type i)
408 throw std::out_of_range(
"index out of range in lass::stde::static_vector::at");
410 return *get_element(i);
415template <
typename T,
size_t maxsize>
416typename static_vector<T, maxsize>::const_reference
417static_vector<T, maxsize>::at(size_type i)
const
421 throw std::out_of_range(
"index out of range in lass::stde::static_vector::at");
423 return *get_element(i);
428template <
typename T,
size_t maxsize>
429typename static_vector<T, maxsize>::reference
430static_vector<T, maxsize>::front()
432 return *get_element(0);
437template <
typename T,
size_t maxsize>
438typename static_vector<T, maxsize>::const_reference
439static_vector<T, maxsize>::front()
const
441 return *get_element(0);
446template <
typename T,
size_t maxsize>
447typename static_vector<T, maxsize>::reference
448static_vector<T, maxsize>::back()
450 return *get_element(size_ - 1);
455template <
typename T,
size_t maxsize>
456typename static_vector<T, maxsize>::const_reference
457static_vector<T, maxsize>::back()
const
459 return *get_element(size_ - 1);
464template <
typename T,
size_t maxsize>
465void static_vector<T, maxsize>::push_back(
const value_type& value)
467 enforce_valid_size(size_ + 1);
468 new (get_element(size_)) value_type(value);
474template <
typename T,
size_t maxsize>
475void static_vector<T, maxsize>::push_back(value_type&& value)
477 enforce_valid_size(size_ + 1);
478 new (get_element(size_)) value_type(std::move(value));
484template <
typename T,
size_t maxsize>
485template <
typename... Args>
486typename static_vector<T, maxsize>::reference
487static_vector<T, maxsize>::emplace_back(Args&&... args)
489 enforce_valid_size(size_ + 1);
490 new (get_element(size_)) value_type(std::forward<Args>(args)...);
497template <
typename T,
size_t maxsize>
498void static_vector<T, maxsize>::pop_back()
500 get_element(--size_)->~value_type();
505template <
typename T,
size_t maxsize>
506typename static_vector<T, maxsize>::iterator
507static_vector<T, maxsize>::insert(const_iterator position,
const value_type& value)
509 iterator pos =
const_cast<iterator
>(position);
510 enforce_valid_size(size_ + 1);
511 move_to_back(pos, end(), 1);
512 new (pos) value_type(value);
519template <
typename T,
size_t maxsize>
520typename static_vector<T, maxsize>::iterator
521static_vector<T, maxsize>::insert(const_iterator position, value_type&& value)
523 iterator pos =
const_cast<iterator
>(position);
524 enforce_valid_size(size_ + 1);
525 move_to_back(pos, end(), 1);
526 new (pos) value_type(std::move(value));
533template <
typename T,
size_t maxsize>
534typename static_vector<T, maxsize>::iterator
535static_vector<T, maxsize>::insert(const_iterator position, size_type n,
const value_type& value)
537 iterator pos =
const_cast<iterator
>(position);
542 enforce_valid_size(size_ + n);
543 move_to_back(pos, end(), n);
544 for (iterator p = pos, last = pos + n; p != last; ++p)
546 new (p) value_type(value);
554template <
typename T,
size_t maxsize>
555template <
typename InputIterator>
556typename static_vector<T, maxsize>::iterator
557static_vector<T, maxsize>::insert(const_iterator position, InputIterator first, InputIterator last)
559 return insert(position, first, last, meta::Wrap<
typename meta::IsIntegral<InputIterator>::Type>());
564template <
typename T,
size_t maxsize>
565typename static_vector<T, maxsize>::iterator
566static_vector<T, maxsize>::insert(const_iterator position, std::initializer_list<value_type> init)
568 return insert(position, init.begin(), init.end());
573template <
typename T,
size_t maxsize>
574template <
typename... Args>
575typename static_vector<T, maxsize>::iterator
576static_vector<T, maxsize>::emplace(const_iterator position, Args&&... args)
578 iterator pos =
const_cast<iterator
>(position);
579 enforce_valid_size(size_ + 1);
580 move_to_back(pos, end(), 1);
581 new (pos) value_type(std::forward<Args>(args)...);
588template <
typename T,
size_t maxsize>
589typename static_vector<T, maxsize>::iterator
590static_vector<T, maxsize>::erase(iterator position)
592 position->~value_type();
593 move_to_front(position + 1, end(), 1);
600template <
typename T,
size_t maxsize>
601typename static_vector<T, maxsize>::iterator
602static_vector<T, maxsize>::erase(iterator first, iterator last)
604 for (iterator i = first; i != last; ++i)
608 const size_type n =
static_cast<size_type
>(last - first);
609 move_to_front(last, end(), n);
616template <
typename T,
size_t maxsize>
617void static_vector<T, maxsize>::clear()
619 for (size_type i = 0; i < size_; ++i)
621 get_element(i)->~value_type();
626template <
typename T,
size_t maxsize>
627void static_vector<T, maxsize>::swap(static_vector<T, maxsize>& other)
629 static_vector<T, maxsize>* left =
this;
630 static_vector<T, maxsize>* right = &other;
631 if (left->size_ > right->size_)
633 std::swap(left, right);
635 LASS_ASSERT(left->size_ <= right->size_);
636 iterator l = left->begin();
637 const iterator lend = left->end();
638 iterator r = right->begin();
639 const iterator rend = right->end();
642 std::swap(*l++, *r++);
646 new (l++) value_type(std::move(*r));
647 (r++)->~value_type();
649 std::swap(size_, other.size_);
655template <
typename T,
size_t maxsize>
inline
656void static_vector<T, maxsize>::move_to_back(iterator first, iterator last, size_type step)
658 while (last != first)
661 new (last + step) value_type(std::move(*last));
668template <
typename T,
size_t maxsize>
inline
669void static_vector<T, maxsize>::move_to_front(iterator first, iterator last, size_type step)
671 while (first != last)
673 new (first - step) value_type(std::move(*first));
674 first->~value_type();
681template <
typename T,
size_t maxsize>
682template <
typename IntegerType>
683typename static_vector<T, maxsize>::iterator
684static_vector<T, maxsize>::insert(const_iterator position, IntegerType n, IntegerType value, meta::Wrap<meta::True>)
686 return insert(position,
static_cast<size_t>(n),
static_cast<value_type
>(value));
690template <
typename T,
size_t maxsize>
691template <
typename InputIterator>
692typename static_vector<T, maxsize>::iterator
693static_vector<T, maxsize>::insert(const_iterator position, InputIterator first, InputIterator last, meta::Wrap<meta::False>)
695 iterator pos =
const_cast<iterator
>(position);
700 const size_type n =
static_cast<size_type
>(std::distance(first, last));
701 enforce_valid_size(size_ + n);
702 move_to_back(pos, end(), n);
704 while (first != last)
706 new (p++) value_type(*first++);
714template <
typename T,
size_t maxsize>
715void static_vector<T, maxsize>::assign(
size_t count, value_type value, meta::Wrap<meta::True> )
717 enforce_valid_size(count);
719 insert(begin(), count, value, meta::Wrap<meta::True>());
724template <
typename T,
size_t maxsize>
725template <
typename InputIterator>
726void static_vector<T, maxsize>::assign(InputIterator first, InputIterator last, meta::Wrap<meta::False> )
728 const size_type n = std::distance(first, last);
729 enforce_valid_size(n);
731 insert(begin(), first, last, meta::Wrap<meta::False>());
736template <
typename T,
size_t maxsize>
inline
737void static_vector<T, maxsize>::enforce_valid_size(size_type new_size)
const
739 if (new_size > max_size_)
741 throw std::length_error(
"lass::stde::static_vector cannot reallocate to expand capacity");
760template <
typename T,
size_t maxsize>
761bool operator==(
const static_vector<T, maxsize>& a,
const static_vector<T, maxsize>& b)
763 if (a.size() != b.size())
767 typedef typename static_vector<T, maxsize>::const_iterator const_iterator;
768 const const_iterator a_end = a.end();
769 for (const_iterator i = a.begin(), j = b.begin(); i != a_end; ++i, ++j)
791template <
typename T,
size_t maxsize>
792bool operator!=(
const static_vector<T, maxsize>& a,
const static_vector<T, maxsize>& b)
811template <
typename T,
size_t maxsize>
812bool operator<(
const static_vector<T, maxsize>& a,
const static_vector<T, maxsize>& b)
814 typedef typename static_vector<T, maxsize>::const_iterator const_iterator;
815 const const_iterator a_end = a.end();
816 const const_iterator b_end = b.end();
817 const_iterator i = a.begin();
818 const_iterator j = b.begin();
819 while (i != a_end && j != b_end)
843template <
typename T,
size_t maxsize>
844bool operator>(
const static_vector<T, maxsize>& a,
const static_vector<T, maxsize>& b)
861template <
typename T,
size_t maxsize>
862bool operator<=(
const static_vector<T, maxsize>& a,
const static_vector<T, maxsize>& b)
879template <
typename T,
size_t maxsize>
880bool operator>=(
const static_vector<T, maxsize>& a,
const static_vector<T, maxsize>& b)
895template <
typename T,
size_t maxsize,
typename Char,
typename Traits>
896std::basic_ostream<Char, Traits>&
897operator<<(std::basic_ostream<Char, Traits>& ostream,
900 return impl::print_sequence(
901 ostream, container.begin(), container.end(),
"[",
", ",
"]");
916template <
typename T,
size_t maxsize,
typename Char,
typename Traits>
917std::basic_istream<Char, Traits>&
919 static_vector<T, maxsize>& container)
921 std::basic_istream<Char, Traits>& result =
922 impl::read_container<impl::static_vector_traits, impl::value_traits, T, Char>(
923 istream, container,
'[',
',', 0,
']');
it looks like a vector, it smells like a vector, but it only uses a fixed amout of memory
bool operator>=(const static_vector< T, maxsize > &a, const static_vector< T, maxsize > &b)
returns wether b is lexicographical less or equal to a.
bool operator>(const static_vector< T, maxsize > &a, const static_vector< T, maxsize > &b)
returns wether b is lexicographical less than a.
bool operator==(const static_vector< T, maxsize > &a, const static_vector< T, maxsize > &b)
returns wether a and b are lexicographical idential.
bool operator!=(const static_vector< T, maxsize > &a, const static_vector< T, maxsize > &b)
returns wether a and b are not lexicographical idential.
bool operator<=(const static_vector< T, maxsize > &a, const static_vector< T, maxsize > &b)
returns wether a is lexicographical less or equal to b.
bool operator<(const static_vector< T, maxsize > &a, const static_vector< T, maxsize > &b)
returns wether a is lexicographical less than b.
std::basic_istream< Char, Traits > & operator>>(std::basic_istream< Char, Traits > &istream, static_vector< T, maxsize > &container)
reads list from stream.
lass extensions to the standard library
Library for Assembled Shared Sources.