]>
Commit | Line | Data |
---|---|---|
7c673cae FG |
1 | // Boost.Container static_vector |
2 | // | |
3 | // Copyright (c) 2012-2013 Adam Wulkiewicz, Lodz, Poland. | |
4 | // Copyright (c) 2011-2013 Andrew Hundt. | |
5 | // Copyright (c) 2013-2014 Ion Gaztanaga | |
6 | // | |
7 | // Use, modification and distribution is subject to the Boost Software License, | |
8 | // Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at | |
9 | // http://www.boost.org/LICENSE_1_0.txt) | |
10 | ||
11 | #ifndef BOOST_CONTAINER_STATIC_VECTOR_HPP | |
12 | #define BOOST_CONTAINER_STATIC_VECTOR_HPP | |
13 | ||
14 | #ifndef BOOST_CONFIG_HPP | |
15 | # include <boost/config.hpp> | |
16 | #endif | |
17 | ||
18 | #if defined(BOOST_HAS_PRAGMA_ONCE) | |
19 | # pragma once | |
20 | #endif | |
21 | ||
22 | #include <boost/container/detail/config_begin.hpp> | |
23 | #include <boost/container/detail/workaround.hpp> | |
24 | #include <boost/container/detail/type_traits.hpp> | |
25 | #include <boost/container/vector.hpp> | |
26 | ||
27 | #include <cstddef> | |
28 | #if !defined(BOOST_NO_CXX11_HDR_INITIALIZER_LIST) | |
29 | #include <initializer_list> | |
30 | #endif | |
31 | ||
32 | namespace boost { namespace container { | |
33 | ||
34 | #ifndef BOOST_CONTAINER_DOXYGEN_INVOKED | |
35 | ||
11fdf7f2 | 36 | namespace dtl { |
7c673cae | 37 | |
92f5a8d4 | 38 | template<class T, std::size_t N, std::size_t InplaceAlignment, bool ThrowOnOverflow> |
7c673cae FG |
39 | class static_storage_allocator |
40 | { | |
92f5a8d4 TL |
41 | typedef bool_<ThrowOnOverflow> throw_on_overflow_t; |
42 | ||
43 | static BOOST_NORETURN BOOST_CONTAINER_FORCEINLINE void on_capacity_overflow(true_type) | |
44 | { | |
45 | (throw_bad_alloc)(); | |
46 | } | |
47 | ||
48 | static BOOST_CONTAINER_FORCEINLINE void on_capacity_overflow(false_type) | |
49 | { | |
50 | BOOST_ASSERT_MSG(false, "ERROR: static vector capacity overflow"); | |
51 | } | |
52 | ||
7c673cae FG |
53 | public: |
54 | typedef T value_type; | |
55 | ||
56 | BOOST_CONTAINER_FORCEINLINE static_storage_allocator() BOOST_NOEXCEPT_OR_NOTHROW | |
57 | {} | |
58 | ||
59 | BOOST_CONTAINER_FORCEINLINE static_storage_allocator(const static_storage_allocator &) BOOST_NOEXCEPT_OR_NOTHROW | |
60 | {} | |
61 | ||
62 | BOOST_CONTAINER_FORCEINLINE static_storage_allocator & operator=(const static_storage_allocator &) BOOST_NOEXCEPT_OR_NOTHROW | |
63 | { return *this; } | |
64 | ||
65 | BOOST_CONTAINER_FORCEINLINE T* internal_storage() const BOOST_NOEXCEPT_OR_NOTHROW | |
11fdf7f2 | 66 | { return const_cast<T*>(static_cast<const T*>(static_cast<const void*>(storage.data))); } |
7c673cae FG |
67 | |
68 | BOOST_CONTAINER_FORCEINLINE T* internal_storage() BOOST_NOEXCEPT_OR_NOTHROW | |
11fdf7f2 | 69 | { return static_cast<T*>(static_cast<void*>(storage.data)); } |
7c673cae FG |
70 | |
71 | static const std::size_t internal_capacity = N; | |
72 | ||
73 | std::size_t max_size() const | |
74 | { return N; } | |
75 | ||
92f5a8d4 TL |
76 | static BOOST_CONTAINER_FORCEINLINE void on_capacity_overflow() |
77 | { | |
78 | (on_capacity_overflow)(throw_on_overflow_t()); | |
79 | } | |
80 | ||
11fdf7f2 | 81 | typedef boost::container::dtl::version_type<static_storage_allocator, 0> version; |
7c673cae FG |
82 | |
83 | BOOST_CONTAINER_FORCEINLINE friend bool operator==(const static_storage_allocator &, const static_storage_allocator &) BOOST_NOEXCEPT_OR_NOTHROW | |
84 | { return false; } | |
85 | ||
86 | BOOST_CONTAINER_FORCEINLINE friend bool operator!=(const static_storage_allocator &, const static_storage_allocator &) BOOST_NOEXCEPT_OR_NOTHROW | |
87 | { return true; } | |
88 | ||
89 | private: | |
92f5a8d4 TL |
90 | BOOST_STATIC_ASSERT_MSG(!InplaceAlignment || (InplaceAlignment & (InplaceAlignment-1)) == 0, "Alignment option must be zero or power of two"); |
91 | static const std::size_t final_alignment = InplaceAlignment ? InplaceAlignment : dtl::alignment_of<T>::value; | |
92 | typename dtl::aligned_storage<sizeof(T)*N, final_alignment>::type storage; | |
93 | }; | |
94 | ||
95 | template<class Options> | |
96 | struct get_static_vector_opt | |
97 | { | |
98 | typedef Options type; | |
99 | }; | |
100 | ||
101 | template<> | |
102 | struct get_static_vector_opt<void> | |
103 | { | |
104 | typedef static_vector_null_opt type; | |
105 | }; | |
106 | ||
107 | template <typename T, std::size_t Capacity, class Options> | |
108 | struct get_static_vector_allocator | |
109 | { | |
110 | typedef typename get_static_vector_opt<Options>::type options_t; | |
111 | typedef dtl::static_storage_allocator | |
112 | < T | |
113 | , Capacity | |
114 | , options_t::inplace_alignment | |
115 | , options_t::throw_on_overflow | |
116 | > type; | |
7c673cae FG |
117 | }; |
118 | ||
92f5a8d4 | 119 | |
11fdf7f2 | 120 | } //namespace dtl { |
7c673cae FG |
121 | |
122 | #endif //#ifndef BOOST_CONTAINER_DOXYGEN_INVOKED | |
123 | ||
124 | //! | |
125 | //!@brief A variable-size array container with fixed capacity. | |
126 | //! | |
127 | //!static_vector is a sequence container like boost::container::vector with contiguous storage that can | |
128 | //!change in size, along with the static allocation, low overhead, and fixed capacity of boost::array. | |
129 | //! | |
130 | //!A static_vector is a sequence that supports random access to elements, constant time insertion and | |
131 | //!removal of elements at the end, and linear time insertion and removal of elements at the beginning or | |
132 | //!in the middle. The number of elements in a static_vector may vary dynamically up to a fixed capacity | |
133 | //!because elements are stored within the object itself similarly to an array. However, objects are | |
134 | //!initialized as they are inserted into static_vector unlike C arrays or std::array which must construct | |
135 | //!all elements on instantiation. The behavior of static_vector enables the use of statically allocated | |
136 | //!elements in cases with complex object lifetime requirements that would otherwise not be trivially | |
137 | //!possible. | |
138 | //! | |
139 | //!@par Error Handling | |
140 | //! Insertion beyond the capacity result in throwing std::bad_alloc() if exceptions are enabled or | |
141 | //! calling throw_bad_alloc() if not enabled. | |
142 | //! | |
92f5a8d4 | 143 | //! std::out_of_range is thrown if out of bounds access is performed in <code>at()</code> if exceptions are |
7c673cae FG |
144 | //! enabled, throw_out_of_range() if not enabled. |
145 | //! | |
92f5a8d4 | 146 | //!@tparam T The type of element that will be stored. |
7c673cae | 147 | //!@tparam Capacity The maximum number of elements static_vector can store, fixed at compile time. |
92f5a8d4 TL |
148 | //!@tparam Options A type produced from \c boost::container::static_vector_options. |
149 | template <typename T, std::size_t Capacity, class Options BOOST_CONTAINER_DOCONLY(= void) > | |
7c673cae | 150 | class static_vector |
92f5a8d4 | 151 | : public vector<T, typename dtl::get_static_vector_allocator< T, Capacity, Options>::type> |
7c673cae | 152 | { |
92f5a8d4 | 153 | public: |
7c673cae | 154 | #ifndef BOOST_CONTAINER_DOXYGEN_INVOKED |
92f5a8d4 TL |
155 | typedef typename dtl::get_static_vector_allocator< T, Capacity, Options>::type allocator_type; |
156 | typedef vector<T, allocator_type > base_t; | |
7c673cae FG |
157 | |
158 | BOOST_COPYABLE_AND_MOVABLE(static_vector) | |
159 | ||
92f5a8d4 | 160 | template<class U, std::size_t OtherCapacity, class OtherOptions> |
7c673cae FG |
161 | friend class static_vector; |
162 | ||
b32b8144 | 163 | public: |
7c673cae FG |
164 | #endif //#ifndef BOOST_CONTAINER_DOXYGEN_INVOKED |
165 | ||
166 | public: | |
167 | //! @brief The type of elements stored in the container. | |
168 | typedef typename base_t::value_type value_type; | |
169 | //! @brief The unsigned integral type used by the container. | |
170 | typedef typename base_t::size_type size_type; | |
171 | //! @brief The pointers difference type. | |
172 | typedef typename base_t::difference_type difference_type; | |
173 | //! @brief The pointer type. | |
174 | typedef typename base_t::pointer pointer; | |
175 | //! @brief The const pointer type. | |
176 | typedef typename base_t::const_pointer const_pointer; | |
177 | //! @brief The value reference type. | |
178 | typedef typename base_t::reference reference; | |
179 | //! @brief The value const reference type. | |
180 | typedef typename base_t::const_reference const_reference; | |
181 | //! @brief The iterator type. | |
182 | typedef typename base_t::iterator iterator; | |
183 | //! @brief The const iterator type. | |
184 | typedef typename base_t::const_iterator const_iterator; | |
185 | //! @brief The reverse iterator type. | |
186 | typedef typename base_t::reverse_iterator reverse_iterator; | |
187 | //! @brief The const reverse iterator. | |
188 | typedef typename base_t::const_reverse_iterator const_reverse_iterator; | |
189 | ||
190 | //! @brief The capacity/max size of the container | |
191 | static const size_type static_capacity = Capacity; | |
192 | ||
193 | //! @brief Constructs an empty static_vector. | |
194 | //! | |
195 | //! @par Throws | |
196 | //! Nothing. | |
197 | //! | |
198 | //! @par Complexity | |
199 | //! Constant O(1). | |
200 | BOOST_CONTAINER_FORCEINLINE static_vector() BOOST_NOEXCEPT_OR_NOTHROW | |
201 | : base_t() | |
202 | {} | |
203 | ||
204 | //! @pre <tt>count <= capacity()</tt> | |
205 | //! | |
206 | //! @brief Constructs a static_vector containing count value initialized values. | |
207 | //! | |
208 | //! @param count The number of values which will be contained in the container. | |
209 | //! | |
210 | //! @par Throws | |
92f5a8d4 | 211 | //! If T's value initialization throws. |
7c673cae FG |
212 | //! |
213 | //! @par Complexity | |
214 | //! Linear O(N). | |
215 | BOOST_CONTAINER_FORCEINLINE explicit static_vector(size_type count) | |
216 | : base_t(count) | |
217 | {} | |
218 | ||
219 | //! @pre <tt>count <= capacity()</tt> | |
220 | //! | |
221 | //! @brief Constructs a static_vector containing count default initialized values. | |
222 | //! | |
223 | //! @param count The number of values which will be contained in the container. | |
224 | //! | |
225 | //! @par Throws | |
92f5a8d4 | 226 | //! If T's default initialization throws. |
7c673cae FG |
227 | //! |
228 | //! @par Complexity | |
229 | //! Linear O(N). | |
230 | //! | |
231 | //! @par Note | |
232 | //! Non-standard extension | |
233 | BOOST_CONTAINER_FORCEINLINE static_vector(size_type count, default_init_t) | |
234 | : base_t(count, default_init_t()) | |
235 | {} | |
236 | ||
237 | //! @pre <tt>count <= capacity()</tt> | |
238 | //! | |
239 | //! @brief Constructs a static_vector containing count copies of value. | |
240 | //! | |
241 | //! @param count The number of copies of a values that will be contained in the container. | |
242 | //! @param value The value which will be used to copy construct values. | |
243 | //! | |
244 | //! @par Throws | |
92f5a8d4 | 245 | //! If T's copy constructor throws. |
7c673cae FG |
246 | //! |
247 | //! @par Complexity | |
248 | //! Linear O(N). | |
249 | BOOST_CONTAINER_FORCEINLINE static_vector(size_type count, value_type const& value) | |
250 | : base_t(count, value) | |
251 | {} | |
252 | ||
253 | //! @pre | |
254 | //! @li <tt>distance(first, last) <= capacity()</tt> | |
255 | //! @li Iterator must meet the \c ForwardTraversalIterator concept. | |
256 | //! | |
257 | //! @brief Constructs a static_vector containing copy of a range <tt>[first, last)</tt>. | |
258 | //! | |
259 | //! @param first The iterator to the first element in range. | |
260 | //! @param last The iterator to the one after the last element in range. | |
261 | //! | |
262 | //! @par Throws | |
92f5a8d4 | 263 | //! If T's constructor taking a dereferenced Iterator throws. |
7c673cae FG |
264 | //! |
265 | //! @par Complexity | |
266 | //! Linear O(N). | |
267 | template <typename Iterator> | |
268 | BOOST_CONTAINER_FORCEINLINE static_vector(Iterator first, Iterator last) | |
269 | : base_t(first, last) | |
270 | {} | |
271 | ||
272 | #if !defined(BOOST_NO_CXX11_HDR_INITIALIZER_LIST) | |
273 | //! @pre | |
274 | //! @li <tt>distance(il.begin(), il.end()) <= capacity()</tt> | |
275 | //! | |
276 | //! @brief Constructs a static_vector containing copy of a range <tt>[il.begin(), il.end())</tt>. | |
277 | //! | |
278 | //! @param il std::initializer_list with values to initialize vector. | |
279 | //! | |
280 | //! @par Throws | |
92f5a8d4 | 281 | //! If T's constructor taking a dereferenced std::initializer_list throws. |
7c673cae FG |
282 | //! |
283 | //! @par Complexity | |
284 | //! Linear O(N). | |
285 | BOOST_CONTAINER_FORCEINLINE static_vector(std::initializer_list<value_type> il) | |
286 | : base_t(il) | |
287 | {} | |
288 | #endif | |
289 | ||
290 | //! @brief Constructs a copy of other static_vector. | |
291 | //! | |
292 | //! @param other The static_vector which content will be copied to this one. | |
293 | //! | |
294 | //! @par Throws | |
92f5a8d4 | 295 | //! If T's copy constructor throws. |
7c673cae FG |
296 | //! |
297 | //! @par Complexity | |
298 | //! Linear O(N). | |
299 | BOOST_CONTAINER_FORCEINLINE static_vector(static_vector const& other) | |
300 | : base_t(other) | |
301 | {} | |
302 | ||
b32b8144 FG |
303 | BOOST_CONTAINER_FORCEINLINE static_vector(static_vector const& other, const allocator_type &) |
304 | : base_t(other) | |
305 | {} | |
306 | ||
307 | BOOST_CONTAINER_FORCEINLINE static_vector(BOOST_RV_REF(static_vector) other, const allocator_type &) | |
11fdf7f2 | 308 | BOOST_NOEXCEPT_IF(boost::container::dtl::is_nothrow_move_constructible<value_type>::value) |
b32b8144 FG |
309 | : base_t(BOOST_MOVE_BASE(base_t, other)) |
310 | {} | |
311 | ||
312 | BOOST_CONTAINER_FORCEINLINE explicit static_vector(const allocator_type &) | |
313 | : base_t() | |
314 | {} | |
315 | ||
7c673cae FG |
316 | //! @pre <tt>other.size() <= capacity()</tt>. |
317 | //! | |
318 | //! @brief Constructs a copy of other static_vector. | |
319 | //! | |
320 | //! @param other The static_vector which content will be copied to this one. | |
321 | //! | |
322 | //! @par Throws | |
92f5a8d4 | 323 | //! If T's copy constructor throws. |
7c673cae FG |
324 | //! |
325 | //! @par Complexity | |
326 | //! Linear O(N). | |
92f5a8d4 TL |
327 | template <std::size_t C, class O> |
328 | BOOST_CONTAINER_FORCEINLINE static_vector(static_vector<T, C, O> const& other) | |
7c673cae FG |
329 | : base_t(other) |
330 | {} | |
331 | ||
332 | //! @brief Move constructor. Moves Values stored in the other static_vector to this one. | |
333 | //! | |
334 | //! @param other The static_vector which content will be moved to this one. | |
335 | //! | |
336 | //! @par Throws | |
92f5a8d4 TL |
337 | //! @li If \c has_nothrow_move<T>::value is \c true and T's move constructor throws. |
338 | //! @li If \c has_nothrow_move<T>::value is \c false and T's copy constructor throws. | |
7c673cae FG |
339 | //! |
340 | //! @par Complexity | |
341 | //! Linear O(N). | |
342 | BOOST_CONTAINER_FORCEINLINE static_vector(BOOST_RV_REF(static_vector) other) | |
11fdf7f2 | 343 | BOOST_NOEXCEPT_IF(boost::container::dtl::is_nothrow_move_constructible<value_type>::value) |
7c673cae FG |
344 | : base_t(BOOST_MOVE_BASE(base_t, other)) |
345 | {} | |
346 | ||
347 | //! @pre <tt>other.size() <= capacity()</tt> | |
348 | //! | |
349 | //! @brief Move constructor. Moves Values stored in the other static_vector to this one. | |
350 | //! | |
351 | //! @param other The static_vector which content will be moved to this one. | |
352 | //! | |
353 | //! @par Throws | |
92f5a8d4 TL |
354 | //! @li If \c has_nothrow_move<T>::value is \c true and T's move constructor throws. |
355 | //! @li If \c has_nothrow_move<T>::value is \c false and T's copy constructor throws. | |
7c673cae FG |
356 | //! |
357 | //! @par Complexity | |
358 | //! Linear O(N). | |
92f5a8d4 TL |
359 | template <std::size_t C, class O> |
360 | BOOST_CONTAINER_FORCEINLINE static_vector(BOOST_RV_REF_BEG static_vector<T, C, O> BOOST_RV_REF_END other) | |
361 | : base_t(BOOST_MOVE_BASE(typename static_vector<T BOOST_MOVE_I C>::base_t, other)) | |
7c673cae FG |
362 | {} |
363 | ||
364 | //! @brief Copy assigns Values stored in the other static_vector to this one. | |
365 | //! | |
366 | //! @param other The static_vector which content will be copied to this one. | |
367 | //! | |
368 | //! @par Throws | |
92f5a8d4 | 369 | //! If T's copy constructor or copy assignment throws. |
7c673cae FG |
370 | //! |
371 | //! @par Complexity | |
372 | //! Linear O(N). | |
373 | BOOST_CONTAINER_FORCEINLINE static_vector & operator=(BOOST_COPY_ASSIGN_REF(static_vector) other) | |
374 | { | |
375 | return static_cast<static_vector&>(base_t::operator=(static_cast<base_t const&>(other))); | |
376 | } | |
377 | ||
378 | #if !defined(BOOST_NO_CXX11_HDR_INITIALIZER_LIST) | |
379 | //! @brief Copy assigns Values stored in std::initializer_list to *this. | |
380 | //! | |
381 | //! @param il The std::initializer_list which content will be copied to this one. | |
382 | //! | |
383 | //! @par Throws | |
92f5a8d4 | 384 | //! If T's copy constructor or copy assignment throws. |
7c673cae FG |
385 | //! |
386 | //! @par Complexity | |
387 | //! Linear O(N). | |
388 | BOOST_CONTAINER_FORCEINLINE static_vector & operator=(std::initializer_list<value_type> il) | |
389 | { return static_cast<static_vector&>(base_t::operator=(il)); } | |
390 | #endif | |
391 | ||
392 | //! @pre <tt>other.size() <= capacity()</tt> | |
393 | //! | |
394 | //! @brief Copy assigns Values stored in the other static_vector to this one. | |
395 | //! | |
396 | //! @param other The static_vector which content will be copied to this one. | |
397 | //! | |
398 | //! @par Throws | |
92f5a8d4 | 399 | //! If T's copy constructor or copy assignment throws. |
7c673cae FG |
400 | //! |
401 | //! @par Complexity | |
402 | //! Linear O(N). | |
92f5a8d4 TL |
403 | template <std::size_t C, class O> |
404 | BOOST_CONTAINER_FORCEINLINE static_vector & operator=(static_vector<T, C, O> const& other) | |
7c673cae FG |
405 | { |
406 | return static_cast<static_vector&>(base_t::operator= | |
92f5a8d4 | 407 | (static_cast<typename static_vector<T, C, O>::base_t const&>(other))); |
7c673cae FG |
408 | } |
409 | ||
410 | //! @brief Move assignment. Moves Values stored in the other static_vector to this one. | |
411 | //! | |
412 | //! @param other The static_vector which content will be moved to this one. | |
413 | //! | |
414 | //! @par Throws | |
92f5a8d4 TL |
415 | //! @li If \c has_nothrow_move<T>::value is \c true and T's move constructor or move assignment throws. |
416 | //! @li If \c has_nothrow_move<T>::value is \c false and T's copy constructor or copy assignment throws. | |
7c673cae FG |
417 | //! |
418 | //! @par Complexity | |
419 | //! Linear O(N). | |
420 | BOOST_CONTAINER_FORCEINLINE static_vector & operator=(BOOST_RV_REF(static_vector) other) | |
92f5a8d4 | 421 | BOOST_NOEXCEPT_IF(boost::container::dtl::is_nothrow_move_assignable<value_type>::value) |
7c673cae FG |
422 | { |
423 | return static_cast<static_vector&>(base_t::operator=(BOOST_MOVE_BASE(base_t, other))); | |
424 | } | |
425 | ||
426 | //! @pre <tt>other.size() <= capacity()</tt> | |
427 | //! | |
428 | //! @brief Move assignment. Moves Values stored in the other static_vector to this one. | |
429 | //! | |
430 | //! @param other The static_vector which content will be moved to this one. | |
431 | //! | |
432 | //! @par Throws | |
92f5a8d4 TL |
433 | //! @li If \c has_nothrow_move<T>::value is \c true and T's move constructor or move assignment throws. |
434 | //! @li If \c has_nothrow_move<T>::value is \c false and T's copy constructor or copy assignment throws. | |
7c673cae FG |
435 | //! |
436 | //! @par Complexity | |
437 | //! Linear O(N). | |
92f5a8d4 TL |
438 | template <std::size_t C, class O> |
439 | BOOST_CONTAINER_FORCEINLINE static_vector & operator=(BOOST_RV_REF_BEG static_vector<T, C, O> BOOST_RV_REF_END other) | |
7c673cae FG |
440 | { |
441 | return static_cast<static_vector&>(base_t::operator= | |
92f5a8d4 | 442 | (BOOST_MOVE_BASE(typename static_vector<T BOOST_MOVE_I C>::base_t, other))); |
7c673cae FG |
443 | } |
444 | ||
445 | #ifdef BOOST_CONTAINER_DOXYGEN_INVOKED | |
446 | ||
447 | //! @brief Destructor. Destroys Values stored in this container. | |
448 | //! | |
449 | //! @par Throws | |
450 | //! Nothing | |
451 | //! | |
452 | //! @par Complexity | |
453 | //! Linear O(N). | |
454 | ~static_vector(); | |
455 | ||
456 | //! @brief Swaps contents of the other static_vector and this one. | |
457 | //! | |
458 | //! @param other The static_vector which content will be swapped with this one's content. | |
459 | //! | |
460 | //! @par Throws | |
92f5a8d4 TL |
461 | //! @li If \c has_nothrow_move<T>::value is \c true and T's move constructor or move assignment throws, |
462 | //! @li If \c has_nothrow_move<T>::value is \c false and T's copy constructor or copy assignment throws, | |
7c673cae FG |
463 | //! |
464 | //! @par Complexity | |
465 | //! Linear O(N). | |
466 | void swap(static_vector & other); | |
467 | ||
468 | //! @pre <tt>other.size() <= capacity() && size() <= other.capacity()</tt> | |
469 | //! | |
470 | //! @brief Swaps contents of the other static_vector and this one. | |
471 | //! | |
472 | //! @param other The static_vector which content will be swapped with this one's content. | |
473 | //! | |
474 | //! @par Throws | |
92f5a8d4 TL |
475 | //! @li If \c has_nothrow_move<T>::value is \c true and T's move constructor or move assignment throws, |
476 | //! @li If \c has_nothrow_move<T>::value is \c false and T's copy constructor or copy assignment throws, | |
7c673cae FG |
477 | //! |
478 | //! @par Complexity | |
479 | //! Linear O(N). | |
92f5a8d4 TL |
480 | template <std::size_t C, class O> |
481 | void swap(static_vector<T, C, O> & other); | |
7c673cae FG |
482 | |
483 | //! @pre <tt>count <= capacity()</tt> | |
484 | //! | |
485 | //! @brief Inserts or erases elements at the end such that | |
486 | //! the size becomes count. New elements are value initialized. | |
487 | //! | |
488 | //! @param count The number of elements which will be stored in the container. | |
489 | //! | |
490 | //! @par Throws | |
92f5a8d4 | 491 | //! If T's value initialization throws. |
7c673cae FG |
492 | //! |
493 | //! @par Complexity | |
494 | //! Linear O(N). | |
495 | void resize(size_type count); | |
496 | ||
497 | //! @pre <tt>count <= capacity()</tt> | |
498 | //! | |
499 | //! @brief Inserts or erases elements at the end such that | |
500 | //! the size becomes count. New elements are default initialized. | |
501 | //! | |
502 | //! @param count The number of elements which will be stored in the container. | |
503 | //! | |
504 | //! @par Throws | |
92f5a8d4 | 505 | //! If T's default initialization throws. |
7c673cae FG |
506 | //! |
507 | //! @par Complexity | |
508 | //! Linear O(N). | |
509 | //! | |
510 | //! @par Note | |
511 | //! Non-standard extension | |
512 | void resize(size_type count, default_init_t); | |
513 | ||
514 | //! @pre <tt>count <= capacity()</tt> | |
515 | //! | |
516 | //! @brief Inserts or erases elements at the end such that | |
517 | //! the size becomes count. New elements are copy constructed from value. | |
518 | //! | |
519 | //! @param count The number of elements which will be stored in the container. | |
520 | //! @param value The value used to copy construct the new element. | |
521 | //! | |
522 | //! @par Throws | |
92f5a8d4 | 523 | //! If T's copy constructor throws. |
7c673cae FG |
524 | //! |
525 | //! @par Complexity | |
526 | //! Linear O(N). | |
527 | void resize(size_type count, value_type const& value); | |
528 | ||
529 | //! @pre <tt>count <= capacity()</tt> | |
530 | //! | |
531 | //! @brief This call has no effect because the Capacity of this container is constant. | |
532 | //! | |
533 | //! @param count The number of elements which the container should be able to contain. | |
534 | //! | |
535 | //! @par Throws | |
536 | //! Nothing. | |
537 | //! | |
538 | //! @par Complexity | |
539 | //! Linear O(N). | |
540 | void reserve(size_type count) BOOST_NOEXCEPT_OR_NOTHROW; | |
541 | ||
542 | //! @pre <tt>size() < capacity()</tt> | |
543 | //! | |
544 | //! @brief Adds a copy of value at the end. | |
545 | //! | |
546 | //! @param value The value used to copy construct the new element. | |
547 | //! | |
548 | //! @par Throws | |
92f5a8d4 | 549 | //! If T's copy constructor throws. |
7c673cae FG |
550 | //! |
551 | //! @par Complexity | |
552 | //! Constant O(1). | |
553 | void push_back(value_type const& value); | |
554 | ||
555 | //! @pre <tt>size() < capacity()</tt> | |
556 | //! | |
557 | //! @brief Moves value to the end. | |
558 | //! | |
559 | //! @param value The value to move construct the new element. | |
560 | //! | |
561 | //! @par Throws | |
92f5a8d4 | 562 | //! If T's move constructor throws. |
7c673cae FG |
563 | //! |
564 | //! @par Complexity | |
565 | //! Constant O(1). | |
566 | void push_back(BOOST_RV_REF(value_type) value); | |
567 | ||
568 | //! @pre <tt>!empty()</tt> | |
569 | //! | |
570 | //! @brief Destroys last value and decreases the size. | |
571 | //! | |
572 | //! @par Throws | |
573 | //! Nothing by default. | |
574 | //! | |
575 | //! @par Complexity | |
576 | //! Constant O(1). | |
577 | void pop_back(); | |
578 | ||
579 | //! @pre | |
580 | //! @li \c p must be a valid iterator of \c *this in range <tt>[begin(), end()]</tt>. | |
581 | //! @li <tt>size() < capacity()</tt> | |
582 | //! | |
583 | //! @brief Inserts a copy of element at p. | |
584 | //! | |
585 | //! @param p The position at which the new value will be inserted. | |
586 | //! @param value The value used to copy construct the new element. | |
587 | //! | |
588 | //! @par Throws | |
92f5a8d4 TL |
589 | //! @li If T's copy constructor or copy assignment throws |
590 | //! @li If T's move constructor or move assignment throws. | |
7c673cae FG |
591 | //! |
592 | //! @par Complexity | |
593 | //! Constant or linear. | |
594 | iterator insert(const_iterator p, value_type const& value); | |
595 | ||
596 | //! @pre | |
597 | //! @li \c p must be a valid iterator of \c *this in range <tt>[begin(), end()]</tt>. | |
598 | //! @li <tt>size() < capacity()</tt> | |
599 | //! | |
600 | //! @brief Inserts a move-constructed element at p. | |
601 | //! | |
602 | //! @param p The position at which the new value will be inserted. | |
603 | //! @param value The value used to move construct the new element. | |
604 | //! | |
605 | //! @par Throws | |
92f5a8d4 | 606 | //! If T's move constructor or move assignment throws. |
7c673cae FG |
607 | //! |
608 | //! @par Complexity | |
609 | //! Constant or linear. | |
610 | iterator insert(const_iterator p, BOOST_RV_REF(value_type) value); | |
611 | ||
612 | //! @pre | |
613 | //! @li \c p must be a valid iterator of \c *this in range <tt>[begin(), end()]</tt>. | |
614 | //! @li <tt>size() + count <= capacity()</tt> | |
615 | //! | |
616 | //! @brief Inserts a count copies of value at p. | |
617 | //! | |
618 | //! @param p The position at which new elements will be inserted. | |
619 | //! @param count The number of new elements which will be inserted. | |
620 | //! @param value The value used to copy construct new elements. | |
621 | //! | |
622 | //! @par Throws | |
92f5a8d4 TL |
623 | //! @li If T's copy constructor or copy assignment throws. |
624 | //! @li If T's move constructor or move assignment throws. | |
7c673cae FG |
625 | //! |
626 | //! @par Complexity | |
627 | //! Linear O(N). | |
628 | iterator insert(const_iterator p, size_type count, value_type const& value); | |
629 | ||
630 | //! @pre | |
631 | //! @li \c p must be a valid iterator of \c *this in range <tt>[begin(), end()]</tt>. | |
632 | //! @li <tt>distance(first, last) <= capacity()</tt> | |
633 | //! @li \c Iterator must meet the \c ForwardTraversalIterator concept. | |
634 | //! | |
635 | //! @brief Inserts a copy of a range <tt>[first, last)</tt> at p. | |
636 | //! | |
637 | //! @param p The position at which new elements will be inserted. | |
638 | //! @param first The iterator to the first element of a range used to construct new elements. | |
639 | //! @param last The iterator to the one after the last element of a range used to construct new elements. | |
640 | //! | |
641 | //! @par Throws | |
92f5a8d4 TL |
642 | //! @li If T's constructor and assignment taking a dereferenced \c Iterator. |
643 | //! @li If T's move constructor or move assignment throws. | |
7c673cae FG |
644 | //! |
645 | //! @par Complexity | |
646 | //! Linear O(N). | |
647 | template <typename Iterator> | |
648 | iterator insert(const_iterator p, Iterator first, Iterator last); | |
649 | ||
650 | //! @pre | |
651 | //! @li \c p must be a valid iterator of \c *this in range <tt>[begin(), end()]</tt>. | |
652 | //! @li <tt>distance(il.begin(), il.end()) <= capacity()</tt> | |
653 | //! | |
654 | //! @brief Inserts a copy of a range <tt>[il.begin(), il.end())</tt> at p. | |
655 | //! | |
656 | //! @param p The position at which new elements will be inserted. | |
657 | //! @param il The std::initializer_list which contains elements that will be inserted. | |
658 | //! | |
659 | //! @par Throws | |
92f5a8d4 | 660 | //! @li If T's constructor and assignment taking a dereferenced std::initializer_list iterator. |
7c673cae FG |
661 | //! |
662 | //! @par Complexity | |
663 | //! Linear O(N). | |
664 | iterator insert(const_iterator p, std::initializer_list<value_type> il); | |
665 | ||
666 | //! @pre \c p must be a valid iterator of \c *this in range <tt>[begin(), end())</tt> | |
667 | //! | |
92f5a8d4 | 668 | //! @brief Erases T from p. |
7c673cae FG |
669 | //! |
670 | //! @param p The position of the element which will be erased from the container. | |
671 | //! | |
672 | //! @par Throws | |
92f5a8d4 | 673 | //! If T's move assignment throws. |
7c673cae FG |
674 | //! |
675 | //! @par Complexity | |
676 | //! Linear O(N). | |
677 | iterator erase(const_iterator p); | |
678 | ||
679 | //! @pre | |
680 | //! @li \c first and \c last must define a valid range | |
681 | //! @li iterators must be in range <tt>[begin(), end()]</tt> | |
682 | //! | |
683 | //! @brief Erases Values from a range <tt>[first, last)</tt>. | |
684 | //! | |
685 | //! @param first The position of the first element of a range which will be erased from the container. | |
686 | //! @param last The position of the one after the last element of a range which will be erased from the container. | |
687 | //! | |
688 | //! @par Throws | |
92f5a8d4 | 689 | //! If T's move assignment throws. |
7c673cae FG |
690 | //! |
691 | //! @par Complexity | |
692 | //! Linear O(N). | |
693 | iterator erase(const_iterator first, const_iterator last); | |
694 | ||
695 | //! @pre <tt>distance(first, last) <= capacity()</tt> | |
696 | //! | |
697 | //! @brief Assigns a range <tt>[first, last)</tt> of Values to this container. | |
698 | //! | |
699 | //! @param first The iterator to the first element of a range used to construct new content of this container. | |
700 | //! @param last The iterator to the one after the last element of a range used to construct new content of this container. | |
701 | //! | |
702 | //! @par Throws | |
92f5a8d4 | 703 | //! If T's copy constructor or copy assignment throws, |
7c673cae FG |
704 | //! |
705 | //! @par Complexity | |
706 | //! Linear O(N). | |
707 | template <typename Iterator> | |
708 | void assign(Iterator first, Iterator last); | |
709 | ||
710 | //! @pre <tt>distance(il.begin(), il.end()) <= capacity()</tt> | |
711 | //! | |
712 | //! @brief Assigns a range <tt>[il.begin(), il.end())</tt> of Values to this container. | |
713 | //! | |
714 | //! @param il std::initializer_list with values used to construct new content of this container. | |
715 | //! | |
716 | //! @par Throws | |
92f5a8d4 | 717 | //! If T's copy constructor or copy assignment throws, |
7c673cae FG |
718 | //! |
719 | //! @par Complexity | |
720 | //! Linear O(N). | |
721 | void assign(std::initializer_list<value_type> il); | |
722 | ||
723 | //! @pre <tt>count <= capacity()</tt> | |
724 | //! | |
725 | //! @brief Assigns a count copies of value to this container. | |
726 | //! | |
727 | //! @param count The new number of elements which will be container in the container. | |
728 | //! @param value The value which will be used to copy construct the new content. | |
729 | //! | |
730 | //! @par Throws | |
92f5a8d4 | 731 | //! If T's copy constructor or copy assignment throws. |
7c673cae FG |
732 | //! |
733 | //! @par Complexity | |
734 | //! Linear O(N). | |
735 | void assign(size_type count, value_type const& value); | |
736 | ||
737 | //! @pre <tt>size() < capacity()</tt> | |
738 | //! | |
92f5a8d4 | 739 | //! @brief Inserts a T constructed with |
7c673cae FG |
740 | //! \c std::forward<Args>(args)... in the end of the container. |
741 | //! | |
742 | //! @return A reference to the created object. | |
743 | //! | |
744 | //! @param args The arguments of the constructor of the new element which will be created at the end of the container. | |
745 | //! | |
746 | //! @par Throws | |
92f5a8d4 | 747 | //! If in-place constructor throws or T's move constructor throws. |
7c673cae FG |
748 | //! |
749 | //! @par Complexity | |
750 | //! Constant O(1). | |
751 | template<class ...Args> | |
752 | reference emplace_back(Args &&...args); | |
753 | ||
754 | //! @pre | |
755 | //! @li \c p must be a valid iterator of \c *this in range <tt>[begin(), end()]</tt> | |
756 | //! @li <tt>size() < capacity()</tt> | |
757 | //! | |
92f5a8d4 | 758 | //! @brief Inserts a T constructed with |
7c673cae FG |
759 | //! \c std::forward<Args>(args)... before p |
760 | //! | |
761 | //! @param p The position at which new elements will be inserted. | |
762 | //! @param args The arguments of the constructor of the new element. | |
763 | //! | |
764 | //! @par Throws | |
92f5a8d4 | 765 | //! If in-place constructor throws or if T's move constructor or move assignment throws. |
7c673cae FG |
766 | //! |
767 | //! @par Complexity | |
768 | //! Constant or linear. | |
769 | template<class ...Args> | |
770 | iterator emplace(const_iterator p, Args &&...args); | |
771 | ||
772 | //! @brief Removes all elements from the container. | |
773 | //! | |
774 | //! @par Throws | |
775 | //! Nothing. | |
776 | //! | |
777 | //! @par Complexity | |
778 | //! Constant O(1). | |
779 | void clear() BOOST_NOEXCEPT_OR_NOTHROW; | |
780 | ||
781 | //! @pre <tt>i < size()</tt> | |
782 | //! | |
783 | //! @brief Returns reference to the i-th element. | |
784 | //! | |
785 | //! @param i The element's index. | |
786 | //! | |
787 | //! @return reference to the i-th element | |
788 | //! from the beginning of the container. | |
789 | //! | |
790 | //! @par Throws | |
791 | //! \c std::out_of_range exception by default. | |
792 | //! | |
793 | //! @par Complexity | |
794 | //! Constant O(1). | |
795 | reference at(size_type i); | |
796 | ||
797 | //! @pre <tt>i < size()</tt> | |
798 | //! | |
799 | //! @brief Returns const reference to the i-th element. | |
800 | //! | |
801 | //! @param i The element's index. | |
802 | //! | |
803 | //! @return const reference to the i-th element | |
804 | //! from the beginning of the container. | |
805 | //! | |
806 | //! @par Throws | |
807 | //! \c std::out_of_range exception by default. | |
808 | //! | |
809 | //! @par Complexity | |
810 | //! Constant O(1). | |
811 | const_reference at(size_type i) const; | |
812 | ||
813 | //! @pre <tt>i < size()</tt> | |
814 | //! | |
815 | //! @brief Returns reference to the i-th element. | |
816 | //! | |
817 | //! @param i The element's index. | |
818 | //! | |
819 | //! @return reference to the i-th element | |
820 | //! from the beginning of the container. | |
821 | //! | |
822 | //! @par Throws | |
823 | //! Nothing by default. | |
824 | //! | |
825 | //! @par Complexity | |
826 | //! Constant O(1). | |
827 | reference operator[](size_type i); | |
828 | ||
829 | //! @pre <tt>i < size()</tt> | |
830 | //! | |
831 | //! @brief Returns const reference to the i-th element. | |
832 | //! | |
833 | //! @param i The element's index. | |
834 | //! | |
835 | //! @return const reference to the i-th element | |
836 | //! from the beginning of the container. | |
837 | //! | |
838 | //! @par Throws | |
839 | //! Nothing by default. | |
840 | //! | |
841 | //! @par Complexity | |
842 | //! Constant O(1). | |
843 | const_reference operator[](size_type i) const; | |
844 | ||
845 | //! @pre <tt>i =< size()</tt> | |
846 | //! | |
847 | //! @brief Returns a iterator to the i-th element. | |
848 | //! | |
849 | //! @param i The element's index. | |
850 | //! | |
851 | //! @return a iterator to the i-th element. | |
852 | //! | |
853 | //! @par Throws | |
854 | //! Nothing by default. | |
855 | //! | |
856 | //! @par Complexity | |
857 | //! Constant O(1). | |
858 | iterator nth(size_type i); | |
859 | ||
860 | //! @pre <tt>i =< size()</tt> | |
861 | //! | |
862 | //! @brief Returns a const_iterator to the i-th element. | |
863 | //! | |
864 | //! @param i The element's index. | |
865 | //! | |
866 | //! @return a const_iterator to the i-th element. | |
867 | //! | |
868 | //! @par Throws | |
869 | //! Nothing by default. | |
870 | //! | |
871 | //! @par Complexity | |
872 | //! Constant O(1). | |
873 | const_iterator nth(size_type i) const; | |
874 | ||
875 | //! @pre <tt>begin() <= p <= end()</tt> | |
876 | //! | |
877 | //! @brief Returns the index of the element pointed by p. | |
878 | //! | |
879 | //! @param p An iterator to the element. | |
880 | //! | |
881 | //! @return The index of the element pointed by p. | |
882 | //! | |
883 | //! @par Throws | |
884 | //! Nothing by default. | |
885 | //! | |
886 | //! @par Complexity | |
887 | //! Constant O(1). | |
888 | size_type index_of(iterator p); | |
889 | ||
890 | //! @pre <tt>begin() <= p <= end()</tt> | |
891 | //! | |
892 | //! @brief Returns the index of the element pointed by p. | |
893 | //! | |
894 | //! @param p A const_iterator to the element. | |
895 | //! | |
896 | //! @return a const_iterator to the i-th element. | |
897 | //! | |
898 | //! @par Throws | |
899 | //! Nothing by default. | |
900 | //! | |
901 | //! @par Complexity | |
902 | //! Constant O(1). | |
903 | size_type index_of(const_iterator p) const; | |
904 | ||
905 | //! @pre \c !empty() | |
906 | //! | |
907 | //! @brief Returns reference to the first element. | |
908 | //! | |
909 | //! @return reference to the first element | |
910 | //! from the beginning of the container. | |
911 | //! | |
912 | //! @par Throws | |
913 | //! Nothing by default. | |
914 | //! | |
915 | //! @par Complexity | |
916 | //! Constant O(1). | |
917 | reference front(); | |
918 | ||
919 | //! @pre \c !empty() | |
920 | //! | |
921 | //! @brief Returns const reference to the first element. | |
922 | //! | |
923 | //! @return const reference to the first element | |
924 | //! from the beginning of the container. | |
925 | //! | |
926 | //! @par Throws | |
927 | //! Nothing by default. | |
928 | //! | |
929 | //! @par Complexity | |
930 | //! Constant O(1). | |
931 | const_reference front() const; | |
932 | ||
933 | //! @pre \c !empty() | |
934 | //! | |
935 | //! @brief Returns reference to the last element. | |
936 | //! | |
937 | //! @return reference to the last element | |
938 | //! from the beginning of the container. | |
939 | //! | |
940 | //! @par Throws | |
941 | //! Nothing by default. | |
942 | //! | |
943 | //! @par Complexity | |
944 | //! Constant O(1). | |
945 | reference back(); | |
946 | ||
947 | //! @pre \c !empty() | |
948 | //! | |
949 | //! @brief Returns const reference to the first element. | |
950 | //! | |
951 | //! @return const reference to the last element | |
952 | //! from the beginning of the container. | |
953 | //! | |
954 | //! @par Throws | |
955 | //! Nothing by default. | |
956 | //! | |
957 | //! @par Complexity | |
958 | //! Constant O(1). | |
959 | const_reference back() const; | |
960 | ||
961 | //! @brief Pointer such that <tt>[data(), data() + size())</tt> is a valid range. | |
962 | //! For a non-empty vector <tt>data() == &front()</tt>. | |
963 | //! | |
964 | //! @par Throws | |
965 | //! Nothing. | |
966 | //! | |
967 | //! @par Complexity | |
968 | //! Constant O(1). | |
92f5a8d4 | 969 | T * data() BOOST_NOEXCEPT_OR_NOTHROW; |
7c673cae FG |
970 | |
971 | //! @brief Const pointer such that <tt>[data(), data() + size())</tt> is a valid range. | |
972 | //! For a non-empty vector <tt>data() == &front()</tt>. | |
973 | //! | |
974 | //! @par Throws | |
975 | //! Nothing. | |
976 | //! | |
977 | //! @par Complexity | |
978 | //! Constant O(1). | |
92f5a8d4 | 979 | const T * data() const BOOST_NOEXCEPT_OR_NOTHROW; |
7c673cae FG |
980 | |
981 | //! @brief Returns iterator to the first element. | |
982 | //! | |
983 | //! @return iterator to the first element contained in the vector. | |
984 | //! | |
985 | //! @par Throws | |
986 | //! Nothing. | |
987 | //! | |
988 | //! @par Complexity | |
989 | //! Constant O(1). | |
990 | iterator begin() BOOST_NOEXCEPT_OR_NOTHROW; | |
991 | ||
992 | //! @brief Returns const iterator to the first element. | |
993 | //! | |
994 | //! @return const_iterator to the first element contained in the vector. | |
995 | //! | |
996 | //! @par Throws | |
997 | //! Nothing. | |
998 | //! | |
999 | //! @par Complexity | |
1000 | //! Constant O(1). | |
1001 | const_iterator begin() const BOOST_NOEXCEPT_OR_NOTHROW; | |
1002 | ||
1003 | //! @brief Returns const iterator to the first element. | |
1004 | //! | |
1005 | //! @return const_iterator to the first element contained in the vector. | |
1006 | //! | |
1007 | //! @par Throws | |
1008 | //! Nothing. | |
1009 | //! | |
1010 | //! @par Complexity | |
1011 | //! Constant O(1). | |
1012 | const_iterator cbegin() const BOOST_NOEXCEPT_OR_NOTHROW; | |
1013 | ||
1014 | //! @brief Returns iterator to the one after the last element. | |
1015 | //! | |
1016 | //! @return iterator pointing to the one after the last element contained in the vector. | |
1017 | //! | |
1018 | //! @par Throws | |
1019 | //! Nothing. | |
1020 | //! | |
1021 | //! @par Complexity | |
1022 | //! Constant O(1). | |
1023 | iterator end() BOOST_NOEXCEPT_OR_NOTHROW; | |
1024 | ||
1025 | //! @brief Returns const iterator to the one after the last element. | |
1026 | //! | |
1027 | //! @return const_iterator pointing to the one after the last element contained in the vector. | |
1028 | //! | |
1029 | //! @par Throws | |
1030 | //! Nothing. | |
1031 | //! | |
1032 | //! @par Complexity | |
1033 | //! Constant O(1). | |
1034 | const_iterator end() const BOOST_NOEXCEPT_OR_NOTHROW; | |
1035 | ||
1036 | //! @brief Returns const iterator to the one after the last element. | |
1037 | //! | |
1038 | //! @return const_iterator pointing to the one after the last element contained in the vector. | |
1039 | //! | |
1040 | //! @par Throws | |
1041 | //! Nothing. | |
1042 | //! | |
1043 | //! @par Complexity | |
1044 | //! Constant O(1). | |
1045 | const_iterator cend() const BOOST_NOEXCEPT_OR_NOTHROW; | |
1046 | ||
1047 | //! @brief Returns reverse iterator to the first element of the reversed container. | |
1048 | //! | |
1049 | //! @return reverse_iterator pointing to the beginning | |
1050 | //! of the reversed static_vector. | |
1051 | //! | |
1052 | //! @par Throws | |
1053 | //! Nothing. | |
1054 | //! | |
1055 | //! @par Complexity | |
1056 | //! Constant O(1). | |
1057 | reverse_iterator rbegin() BOOST_NOEXCEPT_OR_NOTHROW; | |
1058 | ||
1059 | //! @brief Returns const reverse iterator to the first element of the reversed container. | |
1060 | //! | |
1061 | //! @return const_reverse_iterator pointing to the beginning | |
1062 | //! of the reversed static_vector. | |
1063 | //! | |
1064 | //! @par Throws | |
1065 | //! Nothing. | |
1066 | //! | |
1067 | //! @par Complexity | |
1068 | //! Constant O(1). | |
1069 | const_reverse_iterator rbegin() const BOOST_NOEXCEPT_OR_NOTHROW; | |
1070 | ||
1071 | //! @brief Returns const reverse iterator to the first element of the reversed container. | |
1072 | //! | |
1073 | //! @return const_reverse_iterator pointing to the beginning | |
1074 | //! of the reversed static_vector. | |
1075 | //! | |
1076 | //! @par Throws | |
1077 | //! Nothing. | |
1078 | //! | |
1079 | //! @par Complexity | |
1080 | //! Constant O(1). | |
1081 | const_reverse_iterator crbegin() const BOOST_NOEXCEPT_OR_NOTHROW; | |
1082 | ||
1083 | //! @brief Returns reverse iterator to the one after the last element of the reversed container. | |
1084 | //! | |
1085 | //! @return reverse_iterator pointing to the one after the last element | |
1086 | //! of the reversed static_vector. | |
1087 | //! | |
1088 | //! @par Throws | |
1089 | //! Nothing. | |
1090 | //! | |
1091 | //! @par Complexity | |
1092 | //! Constant O(1). | |
1093 | reverse_iterator rend() BOOST_NOEXCEPT_OR_NOTHROW; | |
1094 | ||
1095 | //! @brief Returns const reverse iterator to the one after the last element of the reversed container. | |
1096 | //! | |
1097 | //! @return const_reverse_iterator pointing to the one after the last element | |
1098 | //! of the reversed static_vector. | |
1099 | //! | |
1100 | //! @par Throws | |
1101 | //! Nothing. | |
1102 | //! | |
1103 | //! @par Complexity | |
1104 | //! Constant O(1). | |
1105 | const_reverse_iterator rend() const BOOST_NOEXCEPT_OR_NOTHROW; | |
1106 | ||
1107 | //! @brief Returns const reverse iterator to the one after the last element of the reversed container. | |
1108 | //! | |
1109 | //! @return const_reverse_iterator pointing to the one after the last element | |
1110 | //! of the reversed static_vector. | |
1111 | //! | |
1112 | //! @par Throws | |
1113 | //! Nothing. | |
1114 | //! | |
1115 | //! @par Complexity | |
1116 | //! Constant O(1). | |
1117 | const_reverse_iterator crend() const BOOST_NOEXCEPT_OR_NOTHROW; | |
1118 | ||
92f5a8d4 TL |
1119 | #endif //#ifdef BOOST_CONTAINER_DOXYGEN_INVOKED |
1120 | ||
1121 | //! @brief Returns container's capacity. | |
1122 | //! | |
1123 | //! @return container's capacity. | |
1124 | //! | |
1125 | //! @par Throws | |
1126 | //! Nothing. | |
1127 | //! | |
1128 | //! @par Complexity | |
1129 | //! Constant O(1). | |
1130 | BOOST_CONTAINER_FORCEINLINE static size_type capacity() BOOST_NOEXCEPT_OR_NOTHROW | |
1131 | { return static_capacity; } | |
1132 | ||
1133 | //! @brief Returns container's capacity. | |
1134 | //! | |
1135 | //! @return container's capacity. | |
1136 | //! | |
1137 | //! @par Throws | |
1138 | //! Nothing. | |
1139 | //! | |
1140 | //! @par Complexity | |
1141 | //! Constant O(1). | |
1142 | BOOST_CONTAINER_FORCEINLINE static size_type max_size() BOOST_NOEXCEPT_OR_NOTHROW | |
1143 | { return static_capacity; } | |
1144 | ||
1145 | #ifdef BOOST_CONTAINER_DOXYGEN_INVOKED | |
7c673cae FG |
1146 | |
1147 | //! @brief Returns the number of stored elements. | |
1148 | //! | |
1149 | //! @return Number of elements contained in the container. | |
1150 | //! | |
1151 | //! @par Throws | |
1152 | //! Nothing. | |
1153 | //! | |
1154 | //! @par Complexity | |
1155 | //! Constant O(1). | |
1156 | size_type size() const BOOST_NOEXCEPT_OR_NOTHROW; | |
1157 | ||
1158 | //! @brief Queries if the container contains elements. | |
1159 | //! | |
1160 | //! @return true if the number of elements contained in the | |
1161 | //! container is equal to 0. | |
1162 | //! | |
1163 | //! @par Throws | |
1164 | //! Nothing. | |
1165 | //! | |
1166 | //! @par Complexity | |
1167 | //! Constant O(1). | |
1168 | bool empty() const BOOST_NOEXCEPT_OR_NOTHROW; | |
1169 | #else | |
1170 | ||
1171 | BOOST_CONTAINER_FORCEINLINE friend void swap(static_vector &x, static_vector &y) | |
1172 | { | |
1173 | x.swap(y); | |
1174 | } | |
1175 | ||
1176 | #endif // BOOST_CONTAINER_DOXYGEN_INVOKED | |
1177 | ||
1178 | }; | |
1179 | ||
1180 | #ifdef BOOST_CONTAINER_DOXYGEN_INVOKED | |
1181 | ||
1182 | //! @brief Checks if contents of two static_vectors are equal. | |
1183 | //! | |
1184 | //! @ingroup static_vector_non_member | |
1185 | //! | |
1186 | //! @param x The first static_vector. | |
1187 | //! @param y The second static_vector. | |
1188 | //! | |
1189 | //! @return \c true if containers have the same size and elements in both containers are equal. | |
1190 | //! | |
1191 | //! @par Complexity | |
1192 | //! Linear O(N). | |
92f5a8d4 TL |
1193 | template<typename V, std::size_t C1, std::size_t C2, class O1, class O2> |
1194 | bool operator== (static_vector<V, C1, O1> const& x, static_vector<V, C2, O2> const& y); | |
7c673cae FG |
1195 | |
1196 | //! @brief Checks if contents of two static_vectors are not equal. | |
1197 | //! | |
1198 | //! @ingroup static_vector_non_member | |
1199 | //! | |
1200 | //! @param x The first static_vector. | |
1201 | //! @param y The second static_vector. | |
1202 | //! | |
1203 | //! @return \c true if containers have different size or elements in both containers are not equal. | |
1204 | //! | |
1205 | //! @par Complexity | |
1206 | //! Linear O(N). | |
92f5a8d4 TL |
1207 | template<typename V, std::size_t C1, std::size_t C2, class O1, class O2> |
1208 | bool operator!= (static_vector<V, C1, O1> const& x, static_vector<V, C2, O2> const& y); | |
7c673cae FG |
1209 | |
1210 | //! @brief Lexicographically compares static_vectors. | |
1211 | //! | |
1212 | //! @ingroup static_vector_non_member | |
1213 | //! | |
1214 | //! @param x The first static_vector. | |
1215 | //! @param y The second static_vector. | |
1216 | //! | |
1217 | //! @return \c true if x compares lexicographically less than y. | |
1218 | //! | |
1219 | //! @par Complexity | |
1220 | //! Linear O(N). | |
92f5a8d4 TL |
1221 | template<typename V, std::size_t C1, std::size_t C2, class O1, class O2> |
1222 | bool operator< (static_vector<V, C1, O1> const& x, static_vector<V, C2, O2> const& y); | |
7c673cae FG |
1223 | |
1224 | //! @brief Lexicographically compares static_vectors. | |
1225 | //! | |
1226 | //! @ingroup static_vector_non_member | |
1227 | //! | |
1228 | //! @param x The first static_vector. | |
1229 | //! @param y The second static_vector. | |
1230 | //! | |
1231 | //! @return \c true if y compares lexicographically less than x. | |
1232 | //! | |
1233 | //! @par Complexity | |
1234 | //! Linear O(N). | |
92f5a8d4 TL |
1235 | template<typename V, std::size_t C1, std::size_t C2, class O1, class O2> |
1236 | bool operator> (static_vector<V, C1, O1> const& x, static_vector<V, C2, O2> const& y); | |
7c673cae FG |
1237 | |
1238 | //! @brief Lexicographically compares static_vectors. | |
1239 | //! | |
1240 | //! @ingroup static_vector_non_member | |
1241 | //! | |
1242 | //! @param x The first static_vector. | |
1243 | //! @param y The second static_vector. | |
1244 | //! | |
1245 | //! @return \c true if y don't compare lexicographically less than x. | |
1246 | //! | |
1247 | //! @par Complexity | |
1248 | //! Linear O(N). | |
92f5a8d4 TL |
1249 | template<typename V, std::size_t C1, std::size_t C2, class O1, class O2> |
1250 | bool operator<= (static_vector<V, C1, O1> const& x, static_vector<V, C2, O2> const& y); | |
7c673cae FG |
1251 | |
1252 | //! @brief Lexicographically compares static_vectors. | |
1253 | //! | |
1254 | //! @ingroup static_vector_non_member | |
1255 | //! | |
1256 | //! @param x The first static_vector. | |
1257 | //! @param y The second static_vector. | |
1258 | //! | |
1259 | //! @return \c true if x don't compare lexicographically less than y. | |
1260 | //! | |
1261 | //! @par Complexity | |
1262 | //! Linear O(N). | |
92f5a8d4 TL |
1263 | template<typename V, std::size_t C1, std::size_t C2, class O1, class O2> |
1264 | bool operator>= (static_vector<V, C1, O1> const& x, static_vector<V, C2, O2> const& y); | |
7c673cae FG |
1265 | |
1266 | //! @brief Swaps contents of two static_vectors. | |
1267 | //! | |
1268 | //! This function calls static_vector::swap(). | |
1269 | //! | |
1270 | //! @ingroup static_vector_non_member | |
1271 | //! | |
1272 | //! @param x The first static_vector. | |
1273 | //! @param y The second static_vector. | |
1274 | //! | |
1275 | //! @par Complexity | |
1276 | //! Linear O(N). | |
92f5a8d4 TL |
1277 | template<typename V, std::size_t C1, std::size_t C2, class O1, class O2> |
1278 | inline void swap(static_vector<V, C1, O1> & x, static_vector<V, C2, O2> & y); | |
7c673cae FG |
1279 | |
1280 | #else | |
1281 | ||
92f5a8d4 TL |
1282 | template<typename V, std::size_t C1, std::size_t C2, class O1, class O2> |
1283 | inline void swap(static_vector<V, C1, O1> & x, static_vector<V, C2, O2> & y | |
11fdf7f2 | 1284 | , typename dtl::enable_if_c< C1 != C2>::type * = 0) |
7c673cae FG |
1285 | { |
1286 | x.swap(y); | |
1287 | } | |
1288 | ||
1289 | #endif // BOOST_CONTAINER_DOXYGEN_INVOKED | |
1290 | ||
1291 | }} // namespace boost::container | |
1292 | ||
1293 | #include <boost/container/detail/config_end.hpp> | |
1294 | ||
1295 | #endif // BOOST_CONTAINER_STATIC_VECTOR_HPP |