annotate libcxx/include/__split_buffer @ 252:1f2b6ac9f198 llvm-original

LLVM16-1
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Fri, 18 Aug 2023 09:04:13 +0900
parents c4bab56944e8
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
150
anatofuz
parents:
diff changeset
1 // -*- C++ -*-
236
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
2 //===----------------------------------------------------------------------===//
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
3 //
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
4 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
5 // See https://llvm.org/LICENSE.txt for license information.
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
6 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
7 //
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
8 //===----------------------------------------------------------------------===//
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
9
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
10 #ifndef _LIBCPP___SPLIT_BUFFER
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
11 #define _LIBCPP___SPLIT_BUFFER
150
anatofuz
parents:
diff changeset
12
236
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
13 #include <__algorithm/max.h>
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
14 #include <__algorithm/move.h>
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
15 #include <__algorithm/move_backward.h>
150
anatofuz
parents:
diff changeset
16 #include <__config>
236
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
17 #include <__iterator/distance.h>
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
18 #include <__iterator/iterator_traits.h>
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
19 #include <__iterator/move_iterator.h>
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
20 #include <__memory/allocate_at_least.h>
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
21 #include <__memory/allocator.h>
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
22 #include <__memory/allocator_traits.h>
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
23 #include <__memory/compressed_pair.h>
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
24 #include <__memory/pointer_traits.h>
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
25 #include <__memory/swap_allocator.h>
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
26 #include <__type_traits/add_lvalue_reference.h>
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
27 #include <__type_traits/enable_if.h>
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
28 #include <__type_traits/integral_constant.h>
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
29 #include <__type_traits/is_nothrow_default_constructible.h>
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
30 #include <__type_traits/is_nothrow_move_assignable.h>
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
31 #include <__type_traits/is_nothrow_move_constructible.h>
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
32 #include <__type_traits/is_swappable.h>
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
33 #include <__type_traits/is_trivially_destructible.h>
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
34 #include <__type_traits/remove_reference.h>
223
5f17cb93ff66 LLVM13 (2021/7/18)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 221
diff changeset
35 #include <__utility/forward.h>
236
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
36 #include <__utility/move.h>
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
37 #include <cstddef>
150
anatofuz
parents:
diff changeset
38
anatofuz
parents:
diff changeset
39 #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
236
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
40 # pragma GCC system_header
150
anatofuz
parents:
diff changeset
41 #endif
anatofuz
parents:
diff changeset
42
anatofuz
parents:
diff changeset
43 _LIBCPP_PUSH_MACROS
anatofuz
parents:
diff changeset
44 #include <__undef_macros>
anatofuz
parents:
diff changeset
45
anatofuz
parents:
diff changeset
46
anatofuz
parents:
diff changeset
47 _LIBCPP_BEGIN_NAMESPACE_STD
anatofuz
parents:
diff changeset
48
236
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
49 // __split_buffer allocates a contiguous chunk of memory and stores objects in the range [__begin_, __end_).
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
50 // It has uninitialized memory in the ranges [__first_, __begin_) and [__end_, __end_cap_.first()). That allows
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
51 // it to grow both in the front and back without having to move the data.
150
anatofuz
parents:
diff changeset
52
anatofuz
parents:
diff changeset
53 template <class _Tp, class _Allocator = allocator<_Tp> >
anatofuz
parents:
diff changeset
54 struct __split_buffer
anatofuz
parents:
diff changeset
55 {
anatofuz
parents:
diff changeset
56 public:
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
57 using value_type = _Tp;
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
58 using allocator_type = _Allocator;
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
59 using __alloc_rr = __libcpp_remove_reference_t<allocator_type>;
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
60 using __alloc_traits = allocator_traits<__alloc_rr>;
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
61 using reference = value_type&;
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
62 using const_reference = const value_type&;
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
63 using size_type = typename __alloc_traits::size_type;
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
64 using difference_type = typename __alloc_traits::difference_type;
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
65 using pointer = typename __alloc_traits::pointer;
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
66 using const_pointer = typename __alloc_traits::const_pointer;
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
67 using iterator = pointer;
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
68 using const_iterator = const_pointer;
150
anatofuz
parents:
diff changeset
69
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
70 pointer __first_;
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
71 pointer __begin_;
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
72 pointer __end_;
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
73 __compressed_pair<pointer, allocator_type> __end_cap_;
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
74
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
75 using __alloc_ref = __add_lvalue_reference_t<allocator_type>;
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
76 using __alloc_const_ref = __add_lvalue_reference_t<allocator_type>;
150
anatofuz
parents:
diff changeset
77
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
78 __split_buffer(const __split_buffer&) = delete;
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
79 __split_buffer& operator=(const __split_buffer&) = delete;
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
80
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
81 _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI __split_buffer()
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
82 _NOEXCEPT_(is_nothrow_default_constructible<allocator_type>::value)
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
83 : __first_(nullptr), __begin_(nullptr), __end_(nullptr), __end_cap_(nullptr, __default_init_tag()) {}
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
84
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
85 _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI explicit __split_buffer(__alloc_rr& __a)
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
86 : __first_(nullptr), __begin_(nullptr), __end_(nullptr), __end_cap_(nullptr, __a) {}
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
87
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
88 _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI explicit __split_buffer(const __alloc_rr& __a)
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
89 : __first_(nullptr), __begin_(nullptr), __end_(nullptr), __end_cap_(nullptr, __a) {}
150
anatofuz
parents:
diff changeset
90
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
91 _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
92 __split_buffer(size_type __cap, size_type __start, __alloc_rr& __a);
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
93
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
94 _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI __split_buffer(__split_buffer&& __c)
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
95 _NOEXCEPT_(is_nothrow_move_constructible<allocator_type>::value);
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
96
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
97 _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI __split_buffer(__split_buffer&& __c, const __alloc_rr& __a);
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
98
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
99 _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI __split_buffer& operator=(__split_buffer&& __c)
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
100 _NOEXCEPT_((__alloc_traits::propagate_on_container_move_assignment::value &&
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
101 is_nothrow_move_assignable<allocator_type>::value) ||
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
102 !__alloc_traits::propagate_on_container_move_assignment::value);
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
103
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
104 _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI ~__split_buffer();
150
anatofuz
parents:
diff changeset
105
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
106 _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI __alloc_rr& __alloc() _NOEXCEPT { return __end_cap_.second(); }
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
107 _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI const __alloc_rr& __alloc() const _NOEXCEPT {
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
108 return __end_cap_.second();
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
109 }
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
110
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
111 _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI pointer& __end_cap() _NOEXCEPT { return __end_cap_.first(); }
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
112 _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI const pointer& __end_cap() const _NOEXCEPT {
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
113 return __end_cap_.first();
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
114 }
150
anatofuz
parents:
diff changeset
115
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
116 _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI iterator begin() _NOEXCEPT { return __begin_; }
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
117 _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI const_iterator begin() const _NOEXCEPT { return __begin_; }
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
118
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
119 _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI iterator end() _NOEXCEPT { return __end_; }
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
120 _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI const_iterator end() const _NOEXCEPT { return __end_; }
150
anatofuz
parents:
diff changeset
121
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
122 _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI void clear() _NOEXCEPT { __destruct_at_end(__begin_); }
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
123
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
124 _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI size_type size() const {
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
125 return static_cast<size_type>(__end_ - __begin_);
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
126 }
150
anatofuz
parents:
diff changeset
127
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
128 _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI bool empty() const { return __end_ == __begin_; }
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
129
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
130 _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI size_type capacity() const {
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
131 return static_cast<size_type>(__end_cap() - __first_);
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
132 }
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
133
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
134 _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI size_type __front_spare() const {
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
135 return static_cast<size_type>(__begin_ - __first_);
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
136 }
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
137
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
138 _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI size_type __back_spare() const {
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
139 return static_cast<size_type>(__end_cap() - __end_);
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
140 }
150
anatofuz
parents:
diff changeset
141
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
142 _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI reference front() { return *__begin_; }
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
143 _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI const_reference front() const { return *__begin_; }
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
144 _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI reference back() { return *(__end_ - 1); }
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
145 _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI const_reference back() const { return *(__end_ - 1); }
150
anatofuz
parents:
diff changeset
146
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
147 _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI void reserve(size_type __n);
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
148 _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI void shrink_to_fit() _NOEXCEPT;
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
149 _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI void push_front(const_reference __x);
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
150 _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI void push_back(const_reference __x);
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
151 _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI void push_front(value_type&& __x);
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
152 _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI void push_back(value_type&& __x);
150
anatofuz
parents:
diff changeset
153
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
154 template <class... _Args>
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
155 _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI void emplace_back(_Args&&... __args);
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
156
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
157 _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI void pop_front() { __destruct_at_begin(__begin_ + 1); }
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
158 _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI void pop_back() { __destruct_at_end(__end_ - 1); }
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
159
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
160 _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI void __construct_at_end(size_type __n);
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
161 _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI void __construct_at_end(size_type __n, const_reference __x);
150
anatofuz
parents:
diff changeset
162
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
163 template <class _InputIter>
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
164 _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
165 __enable_if_t<__has_exactly_input_iterator_category<_InputIter>::value>
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
166 __construct_at_end(_InputIter __first, _InputIter __last);
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
167
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
168 template <class _ForwardIterator>
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
169 _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
170 __enable_if_t<__has_forward_iterator_category<_ForwardIterator>::value>
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
171 __construct_at_end(_ForwardIterator __first, _ForwardIterator __last);
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
172
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
173 template <class _Iterator, class _Sentinel>
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
174 _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
175 void __construct_at_end_with_sentinel(_Iterator __first, _Sentinel __last);
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
176
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
177 template <class _Iterator>
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
178 _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
179 void __construct_at_end_with_size(_Iterator __first, size_type __n);
150
anatofuz
parents:
diff changeset
180
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
181 _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI void __destruct_at_begin(pointer __new_begin) {
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
182 __destruct_at_begin(__new_begin, is_trivially_destructible<value_type>());
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
183 }
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
184
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
185 _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI void __destruct_at_begin(pointer __new_begin, false_type);
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
186 _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI void __destruct_at_begin(pointer __new_begin, true_type);
150
anatofuz
parents:
diff changeset
187
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
188 _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI void __destruct_at_end(pointer __new_last) _NOEXCEPT {
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
189 __destruct_at_end(__new_last, false_type());
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
190 }
150
anatofuz
parents:
diff changeset
191
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
192 _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI void __destruct_at_end(pointer __new_last, false_type) _NOEXCEPT;
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
193 _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI void __destruct_at_end(pointer __new_last, true_type) _NOEXCEPT;
150
anatofuz
parents:
diff changeset
194
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
195 _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI void swap(__split_buffer& __x)
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
196 _NOEXCEPT_(!__alloc_traits::propagate_on_container_swap::value || __is_nothrow_swappable<__alloc_rr>::value);
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
197
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
198 _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI bool __invariants() const;
150
anatofuz
parents:
diff changeset
199
anatofuz
parents:
diff changeset
200 private:
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
201 _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI void __move_assign_alloc(__split_buffer& __c, true_type)
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
202 _NOEXCEPT_(is_nothrow_move_assignable<allocator_type>::value) {
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
203 __alloc() = _VSTD::move(__c.__alloc());
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
204 }
150
anatofuz
parents:
diff changeset
205
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
206 _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI void __move_assign_alloc(__split_buffer&, false_type) _NOEXCEPT {}
150
anatofuz
parents:
diff changeset
207
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
208 struct _ConstructTransaction {
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
209 _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI explicit _ConstructTransaction(
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
210 pointer* __p, size_type __n) _NOEXCEPT
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
211 : __pos_(*__p),
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
212 __end_(*__p + __n),
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
213 __dest_(__p) {}
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
214
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
215 _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI ~_ConstructTransaction() { *__dest_ = __pos_; }
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
216
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
217 pointer __pos_;
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
218 const pointer __end_;
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
219
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
220 private:
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
221 pointer* __dest_;
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
222 };
150
anatofuz
parents:
diff changeset
223 };
anatofuz
parents:
diff changeset
224
anatofuz
parents:
diff changeset
225 template <class _Tp, class _Allocator>
236
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
226 _LIBCPP_CONSTEXPR_SINCE_CXX20
150
anatofuz
parents:
diff changeset
227 bool
anatofuz
parents:
diff changeset
228 __split_buffer<_Tp, _Allocator>::__invariants() const
anatofuz
parents:
diff changeset
229 {
anatofuz
parents:
diff changeset
230 if (__first_ == nullptr)
anatofuz
parents:
diff changeset
231 {
anatofuz
parents:
diff changeset
232 if (__begin_ != nullptr)
anatofuz
parents:
diff changeset
233 return false;
anatofuz
parents:
diff changeset
234 if (__end_ != nullptr)
anatofuz
parents:
diff changeset
235 return false;
anatofuz
parents:
diff changeset
236 if (__end_cap() != nullptr)
anatofuz
parents:
diff changeset
237 return false;
anatofuz
parents:
diff changeset
238 }
anatofuz
parents:
diff changeset
239 else
anatofuz
parents:
diff changeset
240 {
anatofuz
parents:
diff changeset
241 if (__begin_ < __first_)
anatofuz
parents:
diff changeset
242 return false;
anatofuz
parents:
diff changeset
243 if (__end_ < __begin_)
anatofuz
parents:
diff changeset
244 return false;
anatofuz
parents:
diff changeset
245 if (__end_cap() < __end_)
anatofuz
parents:
diff changeset
246 return false;
anatofuz
parents:
diff changeset
247 }
anatofuz
parents:
diff changeset
248 return true;
anatofuz
parents:
diff changeset
249 }
anatofuz
parents:
diff changeset
250
anatofuz
parents:
diff changeset
251 // Default constructs __n objects starting at __end_
anatofuz
parents:
diff changeset
252 // throws if construction throws
anatofuz
parents:
diff changeset
253 // Precondition: __n > 0
anatofuz
parents:
diff changeset
254 // Precondition: size() + __n <= capacity()
anatofuz
parents:
diff changeset
255 // Postcondition: size() == size() + __n
anatofuz
parents:
diff changeset
256 template <class _Tp, class _Allocator>
236
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
257 _LIBCPP_CONSTEXPR_SINCE_CXX20
150
anatofuz
parents:
diff changeset
258 void
anatofuz
parents:
diff changeset
259 __split_buffer<_Tp, _Allocator>::__construct_at_end(size_type __n)
anatofuz
parents:
diff changeset
260 {
anatofuz
parents:
diff changeset
261 _ConstructTransaction __tx(&this->__end_, __n);
anatofuz
parents:
diff changeset
262 for (; __tx.__pos_ != __tx.__end_; ++__tx.__pos_) {
anatofuz
parents:
diff changeset
263 __alloc_traits::construct(this->__alloc(), _VSTD::__to_address(__tx.__pos_));
anatofuz
parents:
diff changeset
264 }
anatofuz
parents:
diff changeset
265 }
anatofuz
parents:
diff changeset
266
anatofuz
parents:
diff changeset
267 // Copy constructs __n objects starting at __end_ from __x
anatofuz
parents:
diff changeset
268 // throws if construction throws
anatofuz
parents:
diff changeset
269 // Precondition: __n > 0
anatofuz
parents:
diff changeset
270 // Precondition: size() + __n <= capacity()
anatofuz
parents:
diff changeset
271 // Postcondition: size() == old size() + __n
anatofuz
parents:
diff changeset
272 // Postcondition: [i] == __x for all i in [size() - __n, __n)
anatofuz
parents:
diff changeset
273 template <class _Tp, class _Allocator>
236
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
274 _LIBCPP_CONSTEXPR_SINCE_CXX20
150
anatofuz
parents:
diff changeset
275 void
anatofuz
parents:
diff changeset
276 __split_buffer<_Tp, _Allocator>::__construct_at_end(size_type __n, const_reference __x)
anatofuz
parents:
diff changeset
277 {
anatofuz
parents:
diff changeset
278 _ConstructTransaction __tx(&this->__end_, __n);
anatofuz
parents:
diff changeset
279 for (; __tx.__pos_ != __tx.__end_; ++__tx.__pos_) {
anatofuz
parents:
diff changeset
280 __alloc_traits::construct(this->__alloc(),
anatofuz
parents:
diff changeset
281 _VSTD::__to_address(__tx.__pos_), __x);
anatofuz
parents:
diff changeset
282 }
anatofuz
parents:
diff changeset
283 }
anatofuz
parents:
diff changeset
284
anatofuz
parents:
diff changeset
285 template <class _Tp, class _Allocator>
anatofuz
parents:
diff changeset
286 template <class _InputIter>
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
287 _LIBCPP_CONSTEXPR_SINCE_CXX20 __enable_if_t<__has_exactly_input_iterator_category<_InputIter>::value>
150
anatofuz
parents:
diff changeset
288 __split_buffer<_Tp, _Allocator>::__construct_at_end(_InputIter __first, _InputIter __last)
anatofuz
parents:
diff changeset
289 {
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
290 __construct_at_end_with_sentinel(__first, __last);
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
291 }
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
292
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
293 template <class _Tp, class _Allocator>
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
294 template <class _Iterator, class _Sentinel>
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
295 _LIBCPP_CONSTEXPR_SINCE_CXX20
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
296 void __split_buffer<_Tp, _Allocator>::__construct_at_end_with_sentinel(_Iterator __first, _Sentinel __last) {
150
anatofuz
parents:
diff changeset
297 __alloc_rr& __a = this->__alloc();
anatofuz
parents:
diff changeset
298 for (; __first != __last; ++__first)
anatofuz
parents:
diff changeset
299 {
anatofuz
parents:
diff changeset
300 if (__end_ == __end_cap())
anatofuz
parents:
diff changeset
301 {
anatofuz
parents:
diff changeset
302 size_type __old_cap = __end_cap() - __first_;
anatofuz
parents:
diff changeset
303 size_type __new_cap = _VSTD::max<size_type>(2 * __old_cap, 8);
anatofuz
parents:
diff changeset
304 __split_buffer __buf(__new_cap, 0, __a);
236
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
305 for (pointer __p = __begin_; __p != __end_; ++__p, (void) ++__buf.__end_)
150
anatofuz
parents:
diff changeset
306 __alloc_traits::construct(__buf.__alloc(),
anatofuz
parents:
diff changeset
307 _VSTD::__to_address(__buf.__end_), _VSTD::move(*__p));
anatofuz
parents:
diff changeset
308 swap(__buf);
anatofuz
parents:
diff changeset
309 }
anatofuz
parents:
diff changeset
310 __alloc_traits::construct(__a, _VSTD::__to_address(this->__end_), *__first);
anatofuz
parents:
diff changeset
311 ++this->__end_;
anatofuz
parents:
diff changeset
312 }
anatofuz
parents:
diff changeset
313 }
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
314 template <class _Tp, class _Allocator>
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
315 template <class _ForwardIterator>
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
316 _LIBCPP_CONSTEXPR_SINCE_CXX20 __enable_if_t<__has_forward_iterator_category<_ForwardIterator>::value>
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
317 __split_buffer<_Tp, _Allocator>::__construct_at_end(_ForwardIterator __first, _ForwardIterator __last)
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
318 {
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
319 __construct_at_end_with_size(__first, std::distance(__first, __last));
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
320 }
150
anatofuz
parents:
diff changeset
321
anatofuz
parents:
diff changeset
322 template <class _Tp, class _Allocator>
anatofuz
parents:
diff changeset
323 template <class _ForwardIterator>
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
324 _LIBCPP_CONSTEXPR_SINCE_CXX20
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
325 void __split_buffer<_Tp, _Allocator>::__construct_at_end_with_size(_ForwardIterator __first, size_type __n) {
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
326 _ConstructTransaction __tx(&this->__end_, __n);
236
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
327 for (; __tx.__pos_ != __tx.__end_; ++__tx.__pos_, (void) ++__first) {
150
anatofuz
parents:
diff changeset
328 __alloc_traits::construct(this->__alloc(),
anatofuz
parents:
diff changeset
329 _VSTD::__to_address(__tx.__pos_), *__first);
anatofuz
parents:
diff changeset
330 }
anatofuz
parents:
diff changeset
331 }
anatofuz
parents:
diff changeset
332
anatofuz
parents:
diff changeset
333 template <class _Tp, class _Allocator>
236
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
334 _LIBCPP_CONSTEXPR_SINCE_CXX20
150
anatofuz
parents:
diff changeset
335 inline
anatofuz
parents:
diff changeset
336 void
anatofuz
parents:
diff changeset
337 __split_buffer<_Tp, _Allocator>::__destruct_at_begin(pointer __new_begin, false_type)
anatofuz
parents:
diff changeset
338 {
anatofuz
parents:
diff changeset
339 while (__begin_ != __new_begin)
221
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
340 __alloc_traits::destroy(__alloc(), _VSTD::__to_address(__begin_++));
150
anatofuz
parents:
diff changeset
341 }
anatofuz
parents:
diff changeset
342
anatofuz
parents:
diff changeset
343 template <class _Tp, class _Allocator>
236
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
344 _LIBCPP_CONSTEXPR_SINCE_CXX20
150
anatofuz
parents:
diff changeset
345 inline
anatofuz
parents:
diff changeset
346 void
anatofuz
parents:
diff changeset
347 __split_buffer<_Tp, _Allocator>::__destruct_at_begin(pointer __new_begin, true_type)
anatofuz
parents:
diff changeset
348 {
anatofuz
parents:
diff changeset
349 __begin_ = __new_begin;
anatofuz
parents:
diff changeset
350 }
anatofuz
parents:
diff changeset
351
anatofuz
parents:
diff changeset
352 template <class _Tp, class _Allocator>
236
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
353 _LIBCPP_CONSTEXPR_SINCE_CXX20
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
354 inline _LIBCPP_HIDE_FROM_ABI
150
anatofuz
parents:
diff changeset
355 void
anatofuz
parents:
diff changeset
356 __split_buffer<_Tp, _Allocator>::__destruct_at_end(pointer __new_last, false_type) _NOEXCEPT
anatofuz
parents:
diff changeset
357 {
anatofuz
parents:
diff changeset
358 while (__new_last != __end_)
221
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
359 __alloc_traits::destroy(__alloc(), _VSTD::__to_address(--__end_));
150
anatofuz
parents:
diff changeset
360 }
anatofuz
parents:
diff changeset
361
anatofuz
parents:
diff changeset
362 template <class _Tp, class _Allocator>
236
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
363 _LIBCPP_CONSTEXPR_SINCE_CXX20
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
364 inline _LIBCPP_HIDE_FROM_ABI
150
anatofuz
parents:
diff changeset
365 void
anatofuz
parents:
diff changeset
366 __split_buffer<_Tp, _Allocator>::__destruct_at_end(pointer __new_last, true_type) _NOEXCEPT
anatofuz
parents:
diff changeset
367 {
anatofuz
parents:
diff changeset
368 __end_ = __new_last;
anatofuz
parents:
diff changeset
369 }
anatofuz
parents:
diff changeset
370
anatofuz
parents:
diff changeset
371 template <class _Tp, class _Allocator>
236
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
372 _LIBCPP_CONSTEXPR_SINCE_CXX20
150
anatofuz
parents:
diff changeset
373 __split_buffer<_Tp, _Allocator>::__split_buffer(size_type __cap, size_type __start, __alloc_rr& __a)
anatofuz
parents:
diff changeset
374 : __end_cap_(nullptr, __a)
anatofuz
parents:
diff changeset
375 {
236
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
376 if (__cap == 0) {
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
377 __first_ = nullptr;
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
378 } else {
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
379 auto __allocation = std::__allocate_at_least(__alloc(), __cap);
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
380 __first_ = __allocation.ptr;
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
381 __cap = __allocation.count;
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
382 }
150
anatofuz
parents:
diff changeset
383 __begin_ = __end_ = __first_ + __start;
anatofuz
parents:
diff changeset
384 __end_cap() = __first_ + __cap;
anatofuz
parents:
diff changeset
385 }
anatofuz
parents:
diff changeset
386
anatofuz
parents:
diff changeset
387 template <class _Tp, class _Allocator>
236
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
388 _LIBCPP_CONSTEXPR_SINCE_CXX20
150
anatofuz
parents:
diff changeset
389 __split_buffer<_Tp, _Allocator>::~__split_buffer()
anatofuz
parents:
diff changeset
390 {
anatofuz
parents:
diff changeset
391 clear();
anatofuz
parents:
diff changeset
392 if (__first_)
anatofuz
parents:
diff changeset
393 __alloc_traits::deallocate(__alloc(), __first_, capacity());
anatofuz
parents:
diff changeset
394 }
anatofuz
parents:
diff changeset
395
anatofuz
parents:
diff changeset
396 template <class _Tp, class _Allocator>
236
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
397 _LIBCPP_CONSTEXPR_SINCE_CXX20
150
anatofuz
parents:
diff changeset
398 __split_buffer<_Tp, _Allocator>::__split_buffer(__split_buffer&& __c)
anatofuz
parents:
diff changeset
399 _NOEXCEPT_(is_nothrow_move_constructible<allocator_type>::value)
anatofuz
parents:
diff changeset
400 : __first_(_VSTD::move(__c.__first_)),
anatofuz
parents:
diff changeset
401 __begin_(_VSTD::move(__c.__begin_)),
anatofuz
parents:
diff changeset
402 __end_(_VSTD::move(__c.__end_)),
anatofuz
parents:
diff changeset
403 __end_cap_(_VSTD::move(__c.__end_cap_))
anatofuz
parents:
diff changeset
404 {
anatofuz
parents:
diff changeset
405 __c.__first_ = nullptr;
anatofuz
parents:
diff changeset
406 __c.__begin_ = nullptr;
anatofuz
parents:
diff changeset
407 __c.__end_ = nullptr;
anatofuz
parents:
diff changeset
408 __c.__end_cap() = nullptr;
anatofuz
parents:
diff changeset
409 }
anatofuz
parents:
diff changeset
410
anatofuz
parents:
diff changeset
411 template <class _Tp, class _Allocator>
236
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
412 _LIBCPP_CONSTEXPR_SINCE_CXX20
150
anatofuz
parents:
diff changeset
413 __split_buffer<_Tp, _Allocator>::__split_buffer(__split_buffer&& __c, const __alloc_rr& __a)
anatofuz
parents:
diff changeset
414 : __end_cap_(nullptr, __a)
anatofuz
parents:
diff changeset
415 {
anatofuz
parents:
diff changeset
416 if (__a == __c.__alloc())
anatofuz
parents:
diff changeset
417 {
anatofuz
parents:
diff changeset
418 __first_ = __c.__first_;
anatofuz
parents:
diff changeset
419 __begin_ = __c.__begin_;
anatofuz
parents:
diff changeset
420 __end_ = __c.__end_;
anatofuz
parents:
diff changeset
421 __end_cap() = __c.__end_cap();
anatofuz
parents:
diff changeset
422 __c.__first_ = nullptr;
anatofuz
parents:
diff changeset
423 __c.__begin_ = nullptr;
anatofuz
parents:
diff changeset
424 __c.__end_ = nullptr;
anatofuz
parents:
diff changeset
425 __c.__end_cap() = nullptr;
anatofuz
parents:
diff changeset
426 }
anatofuz
parents:
diff changeset
427 else
anatofuz
parents:
diff changeset
428 {
236
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
429 auto __allocation = std::__allocate_at_least(__alloc(), __c.size());
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
430 __first_ = __allocation.ptr;
150
anatofuz
parents:
diff changeset
431 __begin_ = __end_ = __first_;
236
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
432 __end_cap() = __first_ + __allocation.count;
150
anatofuz
parents:
diff changeset
433 typedef move_iterator<iterator> _Ip;
anatofuz
parents:
diff changeset
434 __construct_at_end(_Ip(__c.begin()), _Ip(__c.end()));
anatofuz
parents:
diff changeset
435 }
anatofuz
parents:
diff changeset
436 }
anatofuz
parents:
diff changeset
437
anatofuz
parents:
diff changeset
438 template <class _Tp, class _Allocator>
236
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
439 _LIBCPP_CONSTEXPR_SINCE_CXX20
150
anatofuz
parents:
diff changeset
440 __split_buffer<_Tp, _Allocator>&
anatofuz
parents:
diff changeset
441 __split_buffer<_Tp, _Allocator>::operator=(__split_buffer&& __c)
anatofuz
parents:
diff changeset
442 _NOEXCEPT_((__alloc_traits::propagate_on_container_move_assignment::value &&
anatofuz
parents:
diff changeset
443 is_nothrow_move_assignable<allocator_type>::value) ||
anatofuz
parents:
diff changeset
444 !__alloc_traits::propagate_on_container_move_assignment::value)
anatofuz
parents:
diff changeset
445 {
anatofuz
parents:
diff changeset
446 clear();
anatofuz
parents:
diff changeset
447 shrink_to_fit();
anatofuz
parents:
diff changeset
448 __first_ = __c.__first_;
anatofuz
parents:
diff changeset
449 __begin_ = __c.__begin_;
anatofuz
parents:
diff changeset
450 __end_ = __c.__end_;
anatofuz
parents:
diff changeset
451 __end_cap() = __c.__end_cap();
anatofuz
parents:
diff changeset
452 __move_assign_alloc(__c,
anatofuz
parents:
diff changeset
453 integral_constant<bool,
anatofuz
parents:
diff changeset
454 __alloc_traits::propagate_on_container_move_assignment::value>());
anatofuz
parents:
diff changeset
455 __c.__first_ = __c.__begin_ = __c.__end_ = __c.__end_cap() = nullptr;
anatofuz
parents:
diff changeset
456 return *this;
anatofuz
parents:
diff changeset
457 }
anatofuz
parents:
diff changeset
458
anatofuz
parents:
diff changeset
459 template <class _Tp, class _Allocator>
236
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
460 _LIBCPP_CONSTEXPR_SINCE_CXX20
150
anatofuz
parents:
diff changeset
461 void
anatofuz
parents:
diff changeset
462 __split_buffer<_Tp, _Allocator>::swap(__split_buffer& __x)
anatofuz
parents:
diff changeset
463 _NOEXCEPT_(!__alloc_traits::propagate_on_container_swap::value||
anatofuz
parents:
diff changeset
464 __is_nothrow_swappable<__alloc_rr>::value)
anatofuz
parents:
diff changeset
465 {
anatofuz
parents:
diff changeset
466 _VSTD::swap(__first_, __x.__first_);
anatofuz
parents:
diff changeset
467 _VSTD::swap(__begin_, __x.__begin_);
anatofuz
parents:
diff changeset
468 _VSTD::swap(__end_, __x.__end_);
anatofuz
parents:
diff changeset
469 _VSTD::swap(__end_cap(), __x.__end_cap());
221
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
470 _VSTD::__swap_allocator(__alloc(), __x.__alloc());
150
anatofuz
parents:
diff changeset
471 }
anatofuz
parents:
diff changeset
472
anatofuz
parents:
diff changeset
473 template <class _Tp, class _Allocator>
236
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
474 _LIBCPP_CONSTEXPR_SINCE_CXX20
150
anatofuz
parents:
diff changeset
475 void
anatofuz
parents:
diff changeset
476 __split_buffer<_Tp, _Allocator>::reserve(size_type __n)
anatofuz
parents:
diff changeset
477 {
anatofuz
parents:
diff changeset
478 if (__n < capacity())
anatofuz
parents:
diff changeset
479 {
anatofuz
parents:
diff changeset
480 __split_buffer<value_type, __alloc_rr&> __t(__n, 0, __alloc());
anatofuz
parents:
diff changeset
481 __t.__construct_at_end(move_iterator<pointer>(__begin_),
anatofuz
parents:
diff changeset
482 move_iterator<pointer>(__end_));
anatofuz
parents:
diff changeset
483 _VSTD::swap(__first_, __t.__first_);
anatofuz
parents:
diff changeset
484 _VSTD::swap(__begin_, __t.__begin_);
anatofuz
parents:
diff changeset
485 _VSTD::swap(__end_, __t.__end_);
anatofuz
parents:
diff changeset
486 _VSTD::swap(__end_cap(), __t.__end_cap());
anatofuz
parents:
diff changeset
487 }
anatofuz
parents:
diff changeset
488 }
anatofuz
parents:
diff changeset
489
anatofuz
parents:
diff changeset
490 template <class _Tp, class _Allocator>
236
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
491 _LIBCPP_CONSTEXPR_SINCE_CXX20
150
anatofuz
parents:
diff changeset
492 void
anatofuz
parents:
diff changeset
493 __split_buffer<_Tp, _Allocator>::shrink_to_fit() _NOEXCEPT
anatofuz
parents:
diff changeset
494 {
anatofuz
parents:
diff changeset
495 if (capacity() > size())
anatofuz
parents:
diff changeset
496 {
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
497 #ifndef _LIBCPP_HAS_NO_EXCEPTIONS
150
anatofuz
parents:
diff changeset
498 try
anatofuz
parents:
diff changeset
499 {
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
500 #endif // _LIBCPP_HAS_NO_EXCEPTIONS
150
anatofuz
parents:
diff changeset
501 __split_buffer<value_type, __alloc_rr&> __t(size(), 0, __alloc());
anatofuz
parents:
diff changeset
502 __t.__construct_at_end(move_iterator<pointer>(__begin_),
anatofuz
parents:
diff changeset
503 move_iterator<pointer>(__end_));
anatofuz
parents:
diff changeset
504 __t.__end_ = __t.__begin_ + (__end_ - __begin_);
anatofuz
parents:
diff changeset
505 _VSTD::swap(__first_, __t.__first_);
anatofuz
parents:
diff changeset
506 _VSTD::swap(__begin_, __t.__begin_);
anatofuz
parents:
diff changeset
507 _VSTD::swap(__end_, __t.__end_);
anatofuz
parents:
diff changeset
508 _VSTD::swap(__end_cap(), __t.__end_cap());
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
509 #ifndef _LIBCPP_HAS_NO_EXCEPTIONS
150
anatofuz
parents:
diff changeset
510 }
anatofuz
parents:
diff changeset
511 catch (...)
anatofuz
parents:
diff changeset
512 {
anatofuz
parents:
diff changeset
513 }
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
514 #endif // _LIBCPP_HAS_NO_EXCEPTIONS
150
anatofuz
parents:
diff changeset
515 }
anatofuz
parents:
diff changeset
516 }
anatofuz
parents:
diff changeset
517
anatofuz
parents:
diff changeset
518 template <class _Tp, class _Allocator>
236
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
519 _LIBCPP_CONSTEXPR_SINCE_CXX20
150
anatofuz
parents:
diff changeset
520 void
anatofuz
parents:
diff changeset
521 __split_buffer<_Tp, _Allocator>::push_front(const_reference __x)
anatofuz
parents:
diff changeset
522 {
anatofuz
parents:
diff changeset
523 if (__begin_ == __first_)
anatofuz
parents:
diff changeset
524 {
anatofuz
parents:
diff changeset
525 if (__end_ < __end_cap())
anatofuz
parents:
diff changeset
526 {
anatofuz
parents:
diff changeset
527 difference_type __d = __end_cap() - __end_;
anatofuz
parents:
diff changeset
528 __d = (__d + 1) / 2;
anatofuz
parents:
diff changeset
529 __begin_ = _VSTD::move_backward(__begin_, __end_, __end_ + __d);
anatofuz
parents:
diff changeset
530 __end_ += __d;
anatofuz
parents:
diff changeset
531 }
anatofuz
parents:
diff changeset
532 else
anatofuz
parents:
diff changeset
533 {
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
534 size_type __c = std::max<size_type>(2 * static_cast<size_t>(__end_cap() - __first_), 1);
150
anatofuz
parents:
diff changeset
535 __split_buffer<value_type, __alloc_rr&> __t(__c, (__c + 3) / 4, __alloc());
anatofuz
parents:
diff changeset
536 __t.__construct_at_end(move_iterator<pointer>(__begin_),
anatofuz
parents:
diff changeset
537 move_iterator<pointer>(__end_));
anatofuz
parents:
diff changeset
538 _VSTD::swap(__first_, __t.__first_);
anatofuz
parents:
diff changeset
539 _VSTD::swap(__begin_, __t.__begin_);
anatofuz
parents:
diff changeset
540 _VSTD::swap(__end_, __t.__end_);
anatofuz
parents:
diff changeset
541 _VSTD::swap(__end_cap(), __t.__end_cap());
anatofuz
parents:
diff changeset
542 }
anatofuz
parents:
diff changeset
543 }
anatofuz
parents:
diff changeset
544 __alloc_traits::construct(__alloc(), _VSTD::__to_address(__begin_-1), __x);
anatofuz
parents:
diff changeset
545 --__begin_;
anatofuz
parents:
diff changeset
546 }
anatofuz
parents:
diff changeset
547
anatofuz
parents:
diff changeset
548 template <class _Tp, class _Allocator>
236
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
549 _LIBCPP_CONSTEXPR_SINCE_CXX20
150
anatofuz
parents:
diff changeset
550 void
anatofuz
parents:
diff changeset
551 __split_buffer<_Tp, _Allocator>::push_front(value_type&& __x)
anatofuz
parents:
diff changeset
552 {
anatofuz
parents:
diff changeset
553 if (__begin_ == __first_)
anatofuz
parents:
diff changeset
554 {
anatofuz
parents:
diff changeset
555 if (__end_ < __end_cap())
anatofuz
parents:
diff changeset
556 {
anatofuz
parents:
diff changeset
557 difference_type __d = __end_cap() - __end_;
anatofuz
parents:
diff changeset
558 __d = (__d + 1) / 2;
anatofuz
parents:
diff changeset
559 __begin_ = _VSTD::move_backward(__begin_, __end_, __end_ + __d);
anatofuz
parents:
diff changeset
560 __end_ += __d;
anatofuz
parents:
diff changeset
561 }
anatofuz
parents:
diff changeset
562 else
anatofuz
parents:
diff changeset
563 {
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
564 size_type __c = std::max<size_type>(2 * static_cast<size_t>(__end_cap() - __first_), 1);
150
anatofuz
parents:
diff changeset
565 __split_buffer<value_type, __alloc_rr&> __t(__c, (__c + 3) / 4, __alloc());
anatofuz
parents:
diff changeset
566 __t.__construct_at_end(move_iterator<pointer>(__begin_),
anatofuz
parents:
diff changeset
567 move_iterator<pointer>(__end_));
anatofuz
parents:
diff changeset
568 _VSTD::swap(__first_, __t.__first_);
anatofuz
parents:
diff changeset
569 _VSTD::swap(__begin_, __t.__begin_);
anatofuz
parents:
diff changeset
570 _VSTD::swap(__end_, __t.__end_);
anatofuz
parents:
diff changeset
571 _VSTD::swap(__end_cap(), __t.__end_cap());
anatofuz
parents:
diff changeset
572 }
anatofuz
parents:
diff changeset
573 }
anatofuz
parents:
diff changeset
574 __alloc_traits::construct(__alloc(), _VSTD::__to_address(__begin_-1),
anatofuz
parents:
diff changeset
575 _VSTD::move(__x));
anatofuz
parents:
diff changeset
576 --__begin_;
anatofuz
parents:
diff changeset
577 }
anatofuz
parents:
diff changeset
578
anatofuz
parents:
diff changeset
579 template <class _Tp, class _Allocator>
236
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
580 _LIBCPP_CONSTEXPR_SINCE_CXX20
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
581 inline _LIBCPP_HIDE_FROM_ABI
150
anatofuz
parents:
diff changeset
582 void
anatofuz
parents:
diff changeset
583 __split_buffer<_Tp, _Allocator>::push_back(const_reference __x)
anatofuz
parents:
diff changeset
584 {
anatofuz
parents:
diff changeset
585 if (__end_ == __end_cap())
anatofuz
parents:
diff changeset
586 {
anatofuz
parents:
diff changeset
587 if (__begin_ > __first_)
anatofuz
parents:
diff changeset
588 {
anatofuz
parents:
diff changeset
589 difference_type __d = __begin_ - __first_;
anatofuz
parents:
diff changeset
590 __d = (__d + 1) / 2;
anatofuz
parents:
diff changeset
591 __end_ = _VSTD::move(__begin_, __end_, __begin_ - __d);
anatofuz
parents:
diff changeset
592 __begin_ -= __d;
anatofuz
parents:
diff changeset
593 }
anatofuz
parents:
diff changeset
594 else
anatofuz
parents:
diff changeset
595 {
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
596 size_type __c = std::max<size_type>(2 * static_cast<size_t>(__end_cap() - __first_), 1);
150
anatofuz
parents:
diff changeset
597 __split_buffer<value_type, __alloc_rr&> __t(__c, __c / 4, __alloc());
anatofuz
parents:
diff changeset
598 __t.__construct_at_end(move_iterator<pointer>(__begin_),
anatofuz
parents:
diff changeset
599 move_iterator<pointer>(__end_));
anatofuz
parents:
diff changeset
600 _VSTD::swap(__first_, __t.__first_);
anatofuz
parents:
diff changeset
601 _VSTD::swap(__begin_, __t.__begin_);
anatofuz
parents:
diff changeset
602 _VSTD::swap(__end_, __t.__end_);
anatofuz
parents:
diff changeset
603 _VSTD::swap(__end_cap(), __t.__end_cap());
anatofuz
parents:
diff changeset
604 }
anatofuz
parents:
diff changeset
605 }
anatofuz
parents:
diff changeset
606 __alloc_traits::construct(__alloc(), _VSTD::__to_address(__end_), __x);
anatofuz
parents:
diff changeset
607 ++__end_;
anatofuz
parents:
diff changeset
608 }
anatofuz
parents:
diff changeset
609
anatofuz
parents:
diff changeset
610 template <class _Tp, class _Allocator>
236
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
611 _LIBCPP_CONSTEXPR_SINCE_CXX20
150
anatofuz
parents:
diff changeset
612 void
anatofuz
parents:
diff changeset
613 __split_buffer<_Tp, _Allocator>::push_back(value_type&& __x)
anatofuz
parents:
diff changeset
614 {
anatofuz
parents:
diff changeset
615 if (__end_ == __end_cap())
anatofuz
parents:
diff changeset
616 {
anatofuz
parents:
diff changeset
617 if (__begin_ > __first_)
anatofuz
parents:
diff changeset
618 {
anatofuz
parents:
diff changeset
619 difference_type __d = __begin_ - __first_;
anatofuz
parents:
diff changeset
620 __d = (__d + 1) / 2;
anatofuz
parents:
diff changeset
621 __end_ = _VSTD::move(__begin_, __end_, __begin_ - __d);
anatofuz
parents:
diff changeset
622 __begin_ -= __d;
anatofuz
parents:
diff changeset
623 }
anatofuz
parents:
diff changeset
624 else
anatofuz
parents:
diff changeset
625 {
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
626 size_type __c = std::max<size_type>(2 * static_cast<size_t>(__end_cap() - __first_), 1);
150
anatofuz
parents:
diff changeset
627 __split_buffer<value_type, __alloc_rr&> __t(__c, __c / 4, __alloc());
anatofuz
parents:
diff changeset
628 __t.__construct_at_end(move_iterator<pointer>(__begin_),
anatofuz
parents:
diff changeset
629 move_iterator<pointer>(__end_));
anatofuz
parents:
diff changeset
630 _VSTD::swap(__first_, __t.__first_);
anatofuz
parents:
diff changeset
631 _VSTD::swap(__begin_, __t.__begin_);
anatofuz
parents:
diff changeset
632 _VSTD::swap(__end_, __t.__end_);
anatofuz
parents:
diff changeset
633 _VSTD::swap(__end_cap(), __t.__end_cap());
anatofuz
parents:
diff changeset
634 }
anatofuz
parents:
diff changeset
635 }
anatofuz
parents:
diff changeset
636 __alloc_traits::construct(__alloc(), _VSTD::__to_address(__end_),
anatofuz
parents:
diff changeset
637 _VSTD::move(__x));
anatofuz
parents:
diff changeset
638 ++__end_;
anatofuz
parents:
diff changeset
639 }
anatofuz
parents:
diff changeset
640
anatofuz
parents:
diff changeset
641 template <class _Tp, class _Allocator>
anatofuz
parents:
diff changeset
642 template <class... _Args>
236
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
643 _LIBCPP_CONSTEXPR_SINCE_CXX20
150
anatofuz
parents:
diff changeset
644 void
anatofuz
parents:
diff changeset
645 __split_buffer<_Tp, _Allocator>::emplace_back(_Args&&... __args)
anatofuz
parents:
diff changeset
646 {
anatofuz
parents:
diff changeset
647 if (__end_ == __end_cap())
anatofuz
parents:
diff changeset
648 {
anatofuz
parents:
diff changeset
649 if (__begin_ > __first_)
anatofuz
parents:
diff changeset
650 {
anatofuz
parents:
diff changeset
651 difference_type __d = __begin_ - __first_;
anatofuz
parents:
diff changeset
652 __d = (__d + 1) / 2;
anatofuz
parents:
diff changeset
653 __end_ = _VSTD::move(__begin_, __end_, __begin_ - __d);
anatofuz
parents:
diff changeset
654 __begin_ -= __d;
anatofuz
parents:
diff changeset
655 }
anatofuz
parents:
diff changeset
656 else
anatofuz
parents:
diff changeset
657 {
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
658 size_type __c = std::max<size_type>(2 * static_cast<size_t>(__end_cap() - __first_), 1);
150
anatofuz
parents:
diff changeset
659 __split_buffer<value_type, __alloc_rr&> __t(__c, __c / 4, __alloc());
anatofuz
parents:
diff changeset
660 __t.__construct_at_end(move_iterator<pointer>(__begin_),
anatofuz
parents:
diff changeset
661 move_iterator<pointer>(__end_));
anatofuz
parents:
diff changeset
662 _VSTD::swap(__first_, __t.__first_);
anatofuz
parents:
diff changeset
663 _VSTD::swap(__begin_, __t.__begin_);
anatofuz
parents:
diff changeset
664 _VSTD::swap(__end_, __t.__end_);
anatofuz
parents:
diff changeset
665 _VSTD::swap(__end_cap(), __t.__end_cap());
anatofuz
parents:
diff changeset
666 }
anatofuz
parents:
diff changeset
667 }
anatofuz
parents:
diff changeset
668 __alloc_traits::construct(__alloc(), _VSTD::__to_address(__end_),
anatofuz
parents:
diff changeset
669 _VSTD::forward<_Args>(__args)...);
anatofuz
parents:
diff changeset
670 ++__end_;
anatofuz
parents:
diff changeset
671 }
anatofuz
parents:
diff changeset
672
anatofuz
parents:
diff changeset
673 template <class _Tp, class _Allocator>
236
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
674 _LIBCPP_CONSTEXPR_SINCE_CXX20
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
675 inline _LIBCPP_HIDE_FROM_ABI
150
anatofuz
parents:
diff changeset
676 void
anatofuz
parents:
diff changeset
677 swap(__split_buffer<_Tp, _Allocator>& __x, __split_buffer<_Tp, _Allocator>& __y)
anatofuz
parents:
diff changeset
678 _NOEXCEPT_(_NOEXCEPT_(__x.swap(__y)))
anatofuz
parents:
diff changeset
679 {
anatofuz
parents:
diff changeset
680 __x.swap(__y);
anatofuz
parents:
diff changeset
681 }
anatofuz
parents:
diff changeset
682
anatofuz
parents:
diff changeset
683 _LIBCPP_END_NAMESPACE_STD
anatofuz
parents:
diff changeset
684
anatofuz
parents:
diff changeset
685 _LIBCPP_POP_MACROS
anatofuz
parents:
diff changeset
686
236
c4bab56944e8 LLVM 16
kono
parents: 223
diff changeset
687 #endif // _LIBCPP___SPLIT_BUFFER