9#ifndef ADOBE_VECTOR_HPP
10#define ADOBE_VECTOR_HPP
29#include <adobe/implementation/swap.hpp>
30#include <adobe/move.hpp>
32#ifdef ADOBE_STD_SERIALIZATION
51class vector : boost::totally_ordered<vector<T, A>, vector<T, A>> {
75 allocator_type& allocator() {
return header_m.get().allocate_finish_m.first(); }
76 const allocator_type& allocator()
const {
return header_m.get().allocate_finish_m.first(); }
78 pointer& finish() {
return header_m.
get().allocate_finish_m.second(); }
79 const pointer& finish()
const {
return header_m.
get().allocate_finish_m.second(); }
81 pointer& end_of_storage() {
return header_m.
get().end_of_storage_m; }
82 const pointer& end_of_storage()
const {
return header_m.get().end_of_storage_m; }
87 void set_finish(T* x) {
88 assert(header_m != 0 || x == 0);
90 header_m->finish() = x;
93 const T* end_of_storage()
const {
return header_m ? header_m->end_of_storage() : 0; }
97 size_type remaining()
const {
return end_of_storage() -
end(); }
100 void append(I f, I l) {
101 append(f, l,
typename std::iterator_traits<I>::iterator_category());
104 template <
typename I>
105 void append(I f, I l, std::input_iterator_tag);
107 template <
typename I>
108 void append(I f, I l, std::forward_iterator_tag);
110 template <
typename I>
111 void append_move(I f, I l) {
112 append_move(f, l,
typename std::iterator_traits<I>::iterator_category());
115 template <
typename I>
116 void append_move(I f, I l, std::input_iterator_tag);
118 template <
typename I>
119 void append_move(I f, I l, std::forward_iterator_tag);
121 template <
typename I>
124 template <
typename I>
135 set_finish(
end() + n);
139 std::uninitialized_fill_n(
end(), n, x);
140 set_finish(
end() + n);
144 std::uninitialized_fill_n(
end(), n, x);
145 set_finish(
end() + n);
152 : std::uninitialized_copy(x.
begin(), x.
end(),
end()));
154 set_finish(std::uninitialized_copy(x.
begin(), x.
end(),
end()));
158 template <
typename I>
159 vector(I f, I l,
typename boost::disable_if<boost::is_integral<I>>
::type* = 0) : header_m(0) {
163 template <
typename I>
165 typename boost::disable_if<boost::is_integral<I>>
::type* = 0)
166 : header_m(allocate(a), 0) {
174 typename allocator_type::template rebind<char>::other alloc(
get_allocator());
175 alloc.deallocate(
reinterpret_cast<char*
>(header_m),
176 (end_of_storage() -
begin()) *
sizeof(T) +
177 (
sizeof(header_t) -
sizeof(T)));
183 vector(move_from<vector> x) : header_m(x.header_m) { x.header_m = 0; }
209 return *(
begin() + n);
213 return *(
begin() + n);
257 template <
typename I>
259 typename boost::disable_if<boost::is_integral<I>>
::type* = 0) {
260 return insert(p, f, l,
typename std::iterator_traits<I>::iterator_category());
263 template <
typename I>
269 assert(pos !=
end());
270 return erase(pos, pos + 1);
282#if defined(_MSC_VER) && _MSC_VER == 1600 && _ITERATOR_DEBUG_LEVEL != 0
284 std::_Equal1(x.
begin(), x.
end(), y.
begin(), std::false_type());
291 return std::lexicographical_compare(x.
begin(), x.
end(), y.
begin(), y.
end());
297template <
typename T,
typename A>
300 if (a == allocator_type())
305 typename allocator_type::template rebind<char>::other alloc(a);
308 reinterpret_cast<header_t*
>(alloc.allocate(
sizeof(header_t) -
sizeof(T) + n *
sizeof(T)));
310 result->finish() = &result->storage_m[0];
311 result->end_of_storage() = result->finish() + n;
316template <
typename T,
typename A>
318void vector<T, A>::append(I f, I l, std::input_iterator_tag) {
325template <
typename T,
typename A>
327void vector<T, A>::append_move(I f, I l, std::input_iterator_tag) {
334template <
typename T,
typename A>
336void vector<T, A>::append(I f, I l, std::forward_iterator_tag) {
337 size_type n(std::distance(f, l));
341 set_finish(std::uninitialized_copy(f, l, end()));
344template <
typename T,
typename A>
346void vector<T, A>::append_move(I f, I l, std::forward_iterator_tag) {
347 size_type n(std::distance(f, l));
354template <
typename T,
typename A>
357 std::input_iterator_tag) {
358 size_type o(p - begin());
359 size_type s =
size();
362 std::rotate(begin() + o, begin() + s, end());
363 return end() - s + o;
366template <
typename T,
typename A>
369 std::forward_iterator_tag) {
370 size_type n(std::distance(f, l));
371 iterator last = end();
372 size_type before = p - begin();
374 if (remaining() < n) {
377 tmp.append_move(begin(), p);
379 tmp.append_move(p, last);
382 size_type after(last - p);
385 append_move(last - n, last);
386 adobe::move_backward(p, last - n, last);
390 std::advance(m, after);
392 append_move(p, last);
396 return begin() + before + n;
399template <
typename T,
typename A>
406 if (remaining() < n) {
409 tmp.append_move(
begin(), p);
410 tmp.append_move(f, l);
411 tmp.append_move(p, last);
417 append_move(last - n, last);
418 move_backward(p, last - n, last);
419 adobe::move(f, l, p);
422 std::advance(m, after);
424 append_move(p, last);
425 adobe::move(f, m, p);
428 return begin() + before + n;
431template <
typename T,
typename A>
441template <
typename T,
typename A>
446 if (remaining() < n) {
449 tmp.append_move(
begin(), p);
450 std::uninitialized_fill_n(tmp.
end(), n, x);
451 tmp.set_finish(tmp.
end() + n);
452 tmp.append_move(p, last);
458 append_move(last - n, last);
459 adobe::move_backward(p, last - n, last);
460 std::fill_n(p, n, x);
462 std::uninitialized_fill_n(last, n - after, x);
463 set_finish(last + (n - after));
464 append_move(p, last);
465 std::fill_n(p, after, x);
468 return begin() + before + n;
471template <
typename T,
typename A>
481template <
typename T,
typename A>
489template <
typename T,
typename A>
499#ifdef ADOBE_STD_SERIALIZATION
501template <
typename T,
typename A>
503 out << begin_sequence;
507 out << format(*first);
519static_assert(
sizeof(vector<int>) ==
sizeof(
void*));
528ADOBE_NAME_TYPE_1(
"vector:version_1:adobe",
530ADOBE_NAME_TYPE_2(
"vector:version_1:adobe",
adobe::version_1::vector<T0, T1>)
vector(I f, I l, const allocator_type &a, typename boost::disable_if< boost::is_integral< I > >::type *=0)
const_reverse_iterator rend() const
const_reference front() const
vector(size_type n, const value_type &x, const allocator_type &a)
vector(size_type n, const value_type &x)
std::reverse_iterator< const T * > const_reverse_iterator
const_iterator begin() const
friend bool operator==(const vector &x, const vector &y)
friend bool operator<(const vector &x, const vector &y)
void reserve(size_type n)
std::reverse_iterator< T * > reverse_iterator
const_reference back() const
friend void swap(vector &x, vector &y)
vector & operator=(vector x)
allocator_type get_allocator() const
vector(move_from< vector > x)
vector(I f, I l, typename boost::disable_if< boost::is_integral< I > >::type *=0)
iterator insert_move(iterator p, I f, I l)
size_type max_size() const
iterator insert(iterator p, value_type x)
void push_back(value_type x)
reference operator[](size_type n)
const_reference operator[](size_type n) const
iterator insert(iterator p, I f, I l, typename boost::disable_if< boost::is_integral< I > >::type *=0)
const_iterator end() const
reverse_iterator rbegin()
size_type capacity() const
std::ptrdiff_t difference_type
const_reverse_iterator rbegin() const
vector(const allocator_type &a)
iterator erase(iterator pos)
const T & const_reference
T::iterator erase(T &x, typename T::iterator f, typename T::iterator l)
const T & max(const T &a, const T &b, R r)
minmax implementation
boost::range_size< Selection >::type size(const Selection &x)
void swap(any_regular_t &x, any_regular_t &y)
void push_back(array_t &v, T x)
constexpr auto construct(T *p, U &&x)
F uninitialized_move(I f, I l, F r)
Similar to std::uninitialized_copy but with move semantics.
auto append(T &c, const R &r)
std::ostream & operator<<(std::ostream &s, const extents_t &x)
void swap(adobe::extents_t::slice_t &x, adobe::extents_t::slice_t &y) BOOST_NOEXCEPT