Library of Assembled Shared Sources
static_vector.inl
Go to the documentation of this file.
1/** @file
2 * @author Bram de Greve (bram@cocamware.com)
3 * @author Tom De Muer (tom@cocamware.com)
4 *
5 * *** BEGIN LICENSE INFORMATION ***
6 *
7 * The contents of this file are subject to the Common Public Attribution License
8 * Version 1.0 (the "License"); you may not use this file except in compliance with
9 * the License. You may obtain a copy of the License at
10 * http://lass.sourceforge.net/cpal-license. The License is based on the
11 * Mozilla Public License Version 1.1 but Sections 14 and 15 have been added to cover
12 * use of software over a computer network and provide for limited attribution for
13 * the Original Developer. In addition, Exhibit A has been modified to be consistent
14 * with Exhibit B.
15 *
16 * Software distributed under the License is distributed on an "AS IS" basis, WITHOUT
17 * WARRANTY OF ANY KIND, either express or implied. See the License for the specific
18 * language governing rights and limitations under the License.
19 *
20 * The Original Code is LASS - Library of Assembled Shared Sources.
21 *
22 * The Initial Developer of the Original Code is Bram de Greve and Tom De Muer.
23 * The Original Developer is the Initial Developer.
24 *
25 * All portions of the code written by the Initial Developer are:
26 * Copyright (C) 2004-2022 the Initial Developer.
27 * All Rights Reserved.
28 *
29 * Contributor(s):
30 *
31 * Alternatively, the contents of this file may be used under the terms of the
32 * GNU General Public License Version 2 or later (the GPL), in which case the
33 * provisions of GPL are applicable instead of those above. If you wish to allow use
34 * of your version of this file only under the terms of the GPL and not to allow
35 * others to use your version of this file under the CPAL, indicate your decision by
36 * deleting the provisions above and replace them with the notice and other
37 * provisions required by the GPL License. If you do not delete the provisions above,
38 * a recipient may use your version of this file under either the CPAL or the GPL.
39 *
40 * *** END LICENSE INFORMATION ***
41 */
42
43#include "../meta/is_integral.h"
44
45namespace lass
46{
47namespace stde
48{
49
50namespace impl
51{
52
53/** @internal
54 */
55struct static_vector_traits
56{
57 template <typename Container, typename T>
58 static void push(Container& container, const T& value)
59 {
60 container.push_back(value);
61 }
62 template <typename Container>
63 static void temp_to_output(Container& temp, Container& output)
64 {
65 output.assign(temp.begin(), temp.end());
66 }
67};
68
69}
70
71
72
73// --- public --------------------------------------------------------------------------------------
74
75template <typename T, size_t maxsize> inline
76static_vector<T, maxsize>::static_vector():
77 size_(0)
78{
79}
80
81
82
83template <typename T, size_t maxsize> inline
84static_vector<T, maxsize>::static_vector(size_type count):
85 static_vector(count, value_type())
86{
87}
88
89
90
91template <typename T, size_t maxsize> inline
92static_vector<T, maxsize>::static_vector(size_type count, const value_type& value):
93 size_(0)
94{
95 insert(end(), count, value);
96}
97
98
99
100template <typename T, size_t maxsize>
101template <typename InputIterator> inline
102static_vector<T, maxsize>::static_vector(InputIterator first, InputIterator last):
103 size_(0)
104{
105 insert(end(), first, last, meta::Wrap<typename meta::IsIntegral<InputIterator>::Type>());
106}
107
108
109
110template <typename T, size_t maxsize> inline
111static_vector<T, maxsize>::static_vector(const static_vector<T, maxsize>& other):
112 size_(0)
113{
114 // may optimize this for T with trivial copy constructors.
115 insert(end(), other.begin(), other.end(), meta::Wrap<meta::False>());
116}
117
118
119
120template <typename T, size_t maxsize> inline
121static_vector<T, maxsize>::static_vector(static_vector<T, maxsize>&& other) :
122 size_(other.size_)
123{
124 // may optimize this for T with trivial copy constructors.
125 iterator first = other.begin();
126 iterator last = other.end();
127 iterator pos = begin();
128 while (first != last)
129 {
130 new (pos++) value_type(std::move(* first++));
131 }
132}
133
134
135
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())
139{
140}
141
142
143
144template <typename T, size_t maxsize> inline
145static_vector<T, maxsize>::~static_vector()
146{
147 clear();
148}
149
150
151
152template <typename T, size_t maxsize> inline
153static_vector<T, maxsize>& static_vector<T, maxsize>::operator=(const static_vector<T, maxsize>& other)
154{
155 // may optimize this for T with trivial copy constructors.
156 erase(begin(), end());
157 insert(end(), other.begin(), other.end(), meta::Wrap<meta::False>());
158 return *this;
159}
160
161
162
163template <typename T, size_t maxsize> inline
164static_vector<T, maxsize>& static_vector<T, maxsize>::operator=(static_vector<T, maxsize>&& other)
165{
166 // may optimize this for T with trivial copy constructors.
167 iterator left = begin();
168 iterator right = other.begin();
169 if (size_ < other.size_)
170 {
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++));
175 }
176 else
177 {
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();
182 }
183 size_ = other.size_;
184 return *this;
185}
186
187
188
189template <typename T, size_t maxsize>
190void static_vector<T, maxsize>::assign(size_type count, const value_type& value)
191{
192 clear();
193 insert(end(), count, value);
194}
195
196
197
198template <typename T, size_t maxsize>
199template <typename InputIterator>
200void static_vector<T, maxsize>::assign(InputIterator first, InputIterator last)
201{
202 clear();
203 insert(end(), first, last, meta::Wrap<typename meta::IsIntegral<InputIterator>::Type>());
204}
205
206
207
208template <typename T, size_t maxsize>
209void static_vector<T, maxsize>::assign(std::initializer_list<value_type> init)
210{
211 assign(init.begin(), init.end());
212}
213
214
215
216template <typename T, size_t maxsize> inline
217typename static_vector<T, maxsize>::iterator
218static_vector<T, maxsize>::begin() noexcept
219{
220 return get_element(0);
221}
222
223
224
225template <typename T, size_t maxsize> inline
226typename static_vector<T, maxsize>::const_iterator
227static_vector<T, maxsize>::begin() const noexcept
228{
229 return get_element(0);
230}
231
232
233
234template <typename T, size_t maxsize> inline
235typename static_vector<T, maxsize>::const_iterator
236static_vector<T, maxsize>::cbegin() const noexcept
237{
238 return get_element(0);
239}
240
241
242
243template <typename T, size_t maxsize> inline
244typename static_vector<T, maxsize>::iterator
245static_vector<T, maxsize>::end() noexcept
246{
247 return get_element(size_);
248}
249
250
251
252template <typename T, size_t maxsize> inline
253typename static_vector<T, maxsize>::const_iterator
254static_vector<T, maxsize>::end() const noexcept
255{
256 return get_element(size_);
257}
258
259
260
261template <typename T, size_t maxsize> inline
262typename static_vector<T, maxsize>::const_iterator
263static_vector<T, maxsize>::cend() const noexcept
264{
265 return get_element(size_);
266}
267
268
269
270template <typename T, size_t maxsize> inline
271typename static_vector<T, maxsize>::reverse_iterator
272static_vector<T, maxsize>::rbegin() noexcept
273{
274 return reverse_iterator(get_element(size_));
275}
276
277
278
279template <typename T, size_t maxsize> inline
280typename static_vector<T, maxsize>::const_reverse_iterator
281static_vector<T, maxsize>::rbegin() const noexcept
282{
283 return const_reverse_iterator(get_element(size_));
284}
285
286
287
288template <typename T, size_t maxsize> inline
289typename static_vector<T, maxsize>::const_reverse_iterator
290static_vector<T, maxsize>::crbegin() const noexcept
291{
292 return const_reverse_iterator(get_element(size_));
293}
294
295
296
297template <typename T, size_t maxsize> inline
298typename static_vector<T, maxsize>::reverse_iterator
299static_vector<T, maxsize>::rend() noexcept
300{
301 return reverse_iterator(get_element(0));
302}
303
304
305
306template <typename T, size_t maxsize> inline
307typename static_vector<T, maxsize>::const_reverse_iterator
308static_vector<T, maxsize>::rend() const noexcept
309{
310 return const_reverse_iterator(get_element(0));
311}
312
313
314
315template <typename T, size_t maxsize> inline
316typename static_vector<T, maxsize>::const_reverse_iterator
317static_vector<T, maxsize>::crend() const noexcept
318{
319 return const_reverse_iterator(get_element(0));
320}
321
322
323
324template <typename T, size_t maxsize> inline
325typename static_vector<T, maxsize>::size_type
326static_vector<T, maxsize>::size() const noexcept
327{
328 return size_;
329}
330
331
332
333template <typename T, size_t maxsize>
334constexpr typename static_vector<T, maxsize>::size_type
335static_vector<T, maxsize>::max_size() const noexcept
336{
337 return max_size_;
338}
339
340
341
342template <typename T, size_t maxsize>
343void static_vector<T, maxsize>::resize(size_type n, const value_type& value)
344{
345 enforce_valid_size(n);
346 while (size_ > n)
347 {
348 get_element(--size_)->~value_type();
349 }
350 while (size_ < n)
351 {
352 new (get_element(size_)) value_type(value);
353 ++size_;
354 }
355}
356
357
358
359template <typename T, size_t maxsize>
360constexpr typename static_vector<T, maxsize>::size_type
361static_vector<T, maxsize>::capacity() const noexcept
362{
363 return max_size_;
364}
365
366
367
368template <typename T, size_t maxsize> inline
369bool static_vector<T, maxsize>::empty() const noexcept
370{
371 return size_ == 0;
372}
373
374
375
376template <typename T, size_t maxsize> inline
377void static_vector<T, maxsize>::reserve(size_type n)
378{
379 enforce_valid_size(n);
380}
381
382
383
384template <typename T, size_t maxsize> inline
385typename static_vector<T, maxsize>::reference
386static_vector<T, maxsize>::operator[](size_type i)
387{
388 return *get_element(i);
389}
390
391
392
393template <typename T, size_t maxsize> inline
394typename static_vector<T, maxsize>::const_reference
395static_vector<T, maxsize>::operator[](size_type i) const
396{
397 return *get_element(i);
398}
399
400
401
402template <typename T, size_t maxsize>
403typename static_vector<T, maxsize>::reference
404static_vector<T, maxsize>::at(size_type i)
405{
406 if (i >= size_)
407 {
408 throw std::out_of_range("index out of range in lass::stde::static_vector::at");
409 }
410 return *get_element(i);
411}
412
413
414
415template <typename T, size_t maxsize>
416typename static_vector<T, maxsize>::const_reference
417static_vector<T, maxsize>::at(size_type i) const
418{
419 if (i >= size_)
420 {
421 throw std::out_of_range("index out of range in lass::stde::static_vector::at");
422 }
423 return *get_element(i);
424}
425
426
427
428template <typename T, size_t maxsize>
429typename static_vector<T, maxsize>::reference
430static_vector<T, maxsize>::front()
431{
432 return *get_element(0);
433}
434
435
436
437template <typename T, size_t maxsize>
438typename static_vector<T, maxsize>::const_reference
439static_vector<T, maxsize>::front() const
440{
441 return *get_element(0);
442}
443
444
445
446template <typename T, size_t maxsize>
447typename static_vector<T, maxsize>::reference
448static_vector<T, maxsize>::back()
449{
450 return *get_element(size_ - 1);
451}
452
453
454
455template <typename T, size_t maxsize>
456typename static_vector<T, maxsize>::const_reference
457static_vector<T, maxsize>::back() const
458{
459 return *get_element(size_ - 1);
460}
461
462
463
464template <typename T, size_t maxsize>
465void static_vector<T, maxsize>::push_back(const value_type& value)
466{
467 enforce_valid_size(size_ + 1);
468 new (get_element(size_)) value_type(value);
469 ++size_;
470}
471
472
473
474template <typename T, size_t maxsize>
475void static_vector<T, maxsize>::push_back(value_type&& value)
476{
477 enforce_valid_size(size_ + 1);
478 new (get_element(size_)) value_type(std::move(value));
479 ++size_;
480}
481
482
483
484template <typename T, size_t maxsize>
485template <typename... Args>
486typename static_vector<T, maxsize>::reference
487static_vector<T, maxsize>::emplace_back(Args&&... args)
488{
489 enforce_valid_size(size_ + 1);
490 new (get_element(size_)) value_type(std::forward<Args>(args)...);
491 ++size_;
492 return back();
493}
494
495
496
497template <typename T, size_t maxsize>
498void static_vector<T, maxsize>::pop_back()
499{
500 get_element(--size_)->~value_type();
501}
502
503
504
505template <typename T, size_t maxsize>
506typename static_vector<T, maxsize>::iterator
507static_vector<T, maxsize>::insert(const_iterator position, const value_type& value)
508{
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);
513 ++size_;
514 return pos;
515}
516
517
518
519template <typename T, size_t maxsize>
520typename static_vector<T, maxsize>::iterator
521static_vector<T, maxsize>::insert(const_iterator position, value_type&& value)
522{
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));
527 ++size_;
528 return pos;
529}
530
531
532
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)
536{
537 iterator pos = const_cast<iterator>(position);
538 if (n == 0)
539 {
540 return pos;
541 }
542 enforce_valid_size(size_ + n);
543 move_to_back(pos, end(), n);
544 for (iterator p = pos, last = pos + n; p != last; ++p)
545 {
546 new (p) value_type(value);
547 }
548 size_ += n;
549 return pos;
550}
551
552
553
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)
558{
559 return insert(position, first, last, meta::Wrap<typename meta::IsIntegral<InputIterator>::Type>());
560}
561
562
563
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)
567{
568 return insert(position, init.begin(), init.end());
569}
570
571
572
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)
577{
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)...);
582 ++size_;
583 return pos;
584}
585
586
587
588template <typename T, size_t maxsize>
589typename static_vector<T, maxsize>::iterator
590static_vector<T, maxsize>::erase(iterator position)
591{
592 position->~value_type();
593 move_to_front(position + 1, end(), 1);
594 --size_;
595 return position;
596}
597
598
599
600template <typename T, size_t maxsize>
601typename static_vector<T, maxsize>::iterator
602static_vector<T, maxsize>::erase(iterator first, iterator last)
603{
604 for (iterator i = first; i != last; ++i)
605 {
606 i->~value_type();
607 }
608 const size_type n = static_cast<size_type>(last - first);
609 move_to_front(last, end(), n);
610 size_ -= n;
611 return first;
612}
613
614
615
616template <typename T, size_t maxsize>
617void static_vector<T, maxsize>::clear()
618{
619 for (size_type i = 0; i < size_; ++i)
620 {
621 get_element(i)->~value_type();
622 }
623 size_ = 0;
624}
625
626template <typename T, size_t maxsize>
627void static_vector<T, maxsize>::swap(static_vector<T, maxsize>& other)
628{
629 static_vector<T, maxsize>* left = this;
630 static_vector<T, maxsize>* right = &other;
631 if (left->size_ > right->size_)
632 {
633 std::swap(left, right);
634 }
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();
640 while (l != lend)
641 {
642 std::swap(*l++, *r++);
643 }
644 while (r != rend)
645 {
646 new (l++) value_type(std::move(*r));
647 (r++)->~value_type();
648 }
649 std::swap(size_, other.size_);
650}
651
652
653// --- private -------------------------------------------------------------------------------------
654
655template <typename T, size_t maxsize> inline
656void static_vector<T, maxsize>::move_to_back(iterator first, iterator last, size_type step)
657{
658 while (last != first)
659 {
660 --last;
661 new (last + step) value_type(std::move(*last));
662 last->~value_type();
663 }
664}
665
666
667
668template <typename T, size_t maxsize> inline
669void static_vector<T, maxsize>::move_to_front(iterator first, iterator last, size_type step)
670{
671 while (first != last)
672 {
673 new (first - step) value_type(std::move(*first));
674 first->~value_type();
675 ++first;
676 }
677}
678
679
680
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>)
685{
686 return insert(position, static_cast<size_t>(n), static_cast<value_type>(value));
687}
688
689
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>)
694{
695 iterator pos = const_cast<iterator>(position);
696 if (first == last)
697 {
698 return pos;
699 }
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);
703 iterator p = pos;
704 while (first != last)
705 {
706 new (p++) value_type(*first++);
707 }
708 size_ += n;
709 return pos;
710}
711
712
713
714template <typename T, size_t maxsize>
715void static_vector<T, maxsize>::assign(size_t count, value_type value, meta::Wrap<meta::True> /*parameter_is_integral*/)
716{
717 enforce_valid_size(count);
718 clear();
719 insert(begin(), count, value, meta::Wrap<meta::True>());
720}
721
722
723
724template <typename T, size_t maxsize>
725template <typename InputIterator>
726void static_vector<T, maxsize>::assign(InputIterator first, InputIterator last, meta::Wrap<meta::False> /*parameter_is_iterator*/)
727{
728 const size_type n = std::distance(first, last);
729 enforce_valid_size(n);
730 clear();
731 insert(begin(), first, last, meta::Wrap<meta::False>());
732}
733
734
735
736template <typename T, size_t maxsize> inline
737void static_vector<T, maxsize>::enforce_valid_size(size_type new_size) const
738{
739 if (new_size > max_size_)
740 {
741 throw std::length_error("lass::stde::static_vector cannot reallocate to expand capacity");
742 }
743}
744
745
746
747// --- free ----------------------------------------------------------------------------------------
748
749/** returns wether @a a and @a b are lexicographical idential.
750 * @relates static_vector
751 *
752 * @param a first @c static_vector
753 * @param b second @c static_vector
754 *
755 * returns true if <tt>a.size() == b.size()</tt> and each element of @a is considered
756 * equal to its corresponding element in @a b by using @c operator==
757 *
758 * @complexity O(N) with N = <tt>a.size() == b.size() ? a.size() : 1</tt>
759 */
760template <typename T, size_t maxsize>
761bool operator==(const static_vector<T, maxsize>& a, const static_vector<T, maxsize>& b)
762{
763 if (a.size() != b.size())
764 {
765 return false;
766 }
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)
770 {
771 if (*i != *j)
772 {
773 return false;
774 }
775 }
776 return true;
777}
778
779
780
781/** returns wether @a a and @a b are not lexicographical idential.
782 * @relates static_vector
783 *
784 * @param a first @c static_vector
785 * @param b second @c static_vector
786 *
787 * Is equivalent to <tt>!(a == b)</tt>
788 *
789 * @complexity O(N) with N = <tt>a.size() == b.size() ? a.size() : 1</tt>
790 */
791template <typename T, size_t maxsize>
792bool operator!=(const static_vector<T, maxsize>& a, const static_vector<T, maxsize>& b)
793{
794 return !(a == b);
795}
796
797
798
799/** returns wether @a a is lexicographical less than @a b.
800 * @relates static_vector
801 *
802 * @param a first @c static_vector
803 * @param b second @c static_vector
804 *
805 * returns true if for the first difference between @a a and @a b the element of @a a is less
806 * than the corresponding one of @a b. In case no different elements between @a and @a b can be
807 * found, it returns true if <tt>a.size() < b.size()</tt>
808 *
809 * @complexity O(N) with N = <tt>std::min(a.size(), b.size())</tt>
810 */
811template <typename T, size_t maxsize>
812bool operator<(const static_vector<T, maxsize>& a, const static_vector<T, maxsize>& b)
813{
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)
820 {
821 if (!(*i < *j))
822 {
823 return false;
824 }
825 ++i;
826 ++j;
827 }
828 return j != b_end;
829}
830
831
832
833/** returns wether @a b is lexicographical less than @a a.
834 * @relates static_vector
835 *
836 * @param a first @c static_vector
837 * @param b second @c static_vector
838 *
839 * Is equivalent to <tt>(b < a)</tt>
840 *
841 * @complexity O(N) with N = <tt>std::min(a.size(), b.size())</tt>
842 */
843template <typename T, size_t maxsize>
844bool operator>(const static_vector<T, maxsize>& a, const static_vector<T, maxsize>& b)
845{
846 return b < a;
847}
848
849
850
851/** returns wether @a a is lexicographical less or equal to @a b.
852 * @relates static_vector
853 *
854 * @param a first @c static_vector
855 * @param b second @c static_vector
856 *
857 * Is equivalent to <tt>!(b < a)</tt>
858 *
859 * @complexity O(N) with N = <tt>std::min(a.size(), b.size())</tt>
860 */
861template <typename T, size_t maxsize>
862bool operator<=(const static_vector<T, maxsize>& a, const static_vector<T, maxsize>& b)
863{
864 return !(b < a);
865}
866
867
868
869/** returns wether @a b is lexicographical less or equal to @a a.
870 * @relates static_vector
871 *
872 * @param a first @c static_vector
873 * @param b second @c static_vector
874 *
875 * Is equivalent to <tt>!(a < b)</tt>
876 *
877 * @complexity O(N) with N = <tt>std::min(a.size(), b.size())</tt>
878 */
879template <typename T, size_t maxsize>
880bool operator>=(const static_vector<T, maxsize>& a, const static_vector<T, maxsize>& b)
881{
882 return !(a < b);
883}
884
885
886
887/** @relates static_vector
888 * writes static_vector to output stream.
889 *
890 * @param ostream should be a good stream.
891 * @param container @c static_vector to be written as [foo, bar, spam, ham]
892 *
893 * @b complexity: O(N) with N = @c container.size()
894 */
895template <typename T, size_t maxsize, typename Char, typename Traits>
896std::basic_ostream<Char, Traits>&
897operator<<(std::basic_ostream<Char, Traits>& ostream,
898 const static_vector<T, maxsize>& container)
899{
900 return impl::print_sequence(
901 ostream, container.begin(), container.end(), "[", ", ", "]");
902}
903
904
905
906/** @relates static_vector
907 * reads list from stream.
908 *
909 * @param istream should be a good stream.
910 * @param container @c static_vector to be read as [foo, bar, spam, ham]
911 *
912 * @b complexity: O(N) with N = number of elements to be read.
913 *
914 * @pre @a maxsize should be large enough to read all elements
915 */
916template <typename T, size_t maxsize, typename Char, typename Traits>
917std::basic_istream<Char, Traits>&
918operator>>(std::basic_istream<Char, Traits>& istream,
919 static_vector<T, maxsize>& container)
920{
921 std::basic_istream<Char, Traits>& result =
922 impl::read_container<impl::static_vector_traits, impl::value_traits, T, Char>(
923 istream, container, '[', ',', 0, ']');
924 return result;
925}
926
927
928}
929
930}
931
932// EOF
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.
Definition config.h:53