1 #ifndef FLOATING_ARRAY_H_INCLUDED_ 2 #define FLOATING_ARRAY_H_INCLUDED_ 9 std::ptrdiff_t value = 0;
10 explicit operator ptrdiff_t()
const {
return value; }
14 using is_input_iterator =
15 std::is_convertible<std::input_iterator_tag,
16 typename std::iterator_traits<I>::iterator_category>;
18 constexpr
bool is_input_iterator_v = is_input_iterator<I>::value;
20 template <
typename T,
typename Allocator = std::allocator<T>>
23 using BC = std::deque<T, Allocator>;
27 using value_type =
typename BC::value_type;
28 using allocator_type =
typename BC::allocator_type;
29 using size_type =
typename BC::size_type;
30 using index_type = std::ptrdiff_t;
31 using difference_type =
typename BC::difference_type;
32 using reference =
typename BC::reference;
33 using const_reference =
typename BC::const_reference;
34 using pointer =
typename BC::pointer;
35 using const_pointer =
typename BC::const_pointer;
36 using iterator =
typename BC::iterator;
37 using const_iterator =
typename BC::const_iterator;
38 using reverse_iterator =
typename BC::reverse_iterator;
39 using const_reverse_iterator =
typename BC::const_reverse_iterator;
44 const Allocator& alloc = Allocator())
45 : BC(count, value, alloc) {}
47 const Allocator& alloc = Allocator())
49 template <
typename InputIt,
50 typename = std::enable_if_t<is_input_iterator_v<InputIt>>>
52 const Allocator& alloc = Allocator())
53 : BC(first, last, alloc) {}
54 floating_array(
const floating_array& other) =
default;
55 floating_array(
const floating_array& other,
const Allocator& alloc)
56 : BC(static_cast<const BC&>(other), alloc), offset(other.offset) {}
57 floating_array(floating_array&& other) noexcept =
default;
58 floating_array(floating_array&& other,
const Allocator& alloc) noexcept(
59 noexcept(BC(static_cast<BC&&>(other), alloc)))
60 : BC(static_cast<BC&&>(other), alloc), offset(other.offset) {}
61 floating_array(std::initializer_list<T> init,
62 const Allocator& alloc = Allocator())
65 explicit floating_array(
origin_tag o,
const Allocator& alloc = Allocator())
66 : BC(alloc), offset(o) {}
67 floating_array(
origin_tag o, size_type count,
const T& value = T(),
68 const Allocator& alloc = Allocator())
69 : BC(count, value, alloc), offset(o) {}
70 template <
typename InputIt,
71 typename = std::enable_if_t<is_input_iterator_v<InputIt>>>
72 floating_array(
origin_tag o, InputIt first, InputIt last,
73 const Allocator& alloc = Allocator())
74 : BC(first, last, alloc), offset(o) {}
75 floating_array(
origin_tag o, std::initializer_list<T> init,
76 const Allocator& alloc = Allocator())
77 : BC(init, alloc), offset(o) {}
79 floating_array& operator=(
const floating_array& other) =
default;
80 floating_array& operator=(floating_array&& other) noexcept(
81 std::allocator_traits<Allocator>::is_always_equal::value) =
default;
82 floating_array& operator=(std::initializer_list<T> ilist) {
88 void assign(size_type count,
const T& value) {
89 BC::assign(count, value);
92 template <
typename InputIt,
93 typename = std::enable_if_t<is_input_iterator_v<InputIt>>>
94 void assign(InputIt first, InputIt last) {
95 BC::assign(first, last);
98 void assign(std::initializer_list<T> ilist) {
104 void assign(
origin_tag o, size_type count,
const T& value) {
105 BC::assign(count, value);
108 template <
typename InputIt,
109 typename = std::enable_if_t<is_input_iterator_v<InputIt>>>
110 void assign(
origin_tag o, InputIt first, InputIt last) {
111 BC::assign(first, last);
114 void assign(
origin_tag o, std::initializer_list<T> ilist) {
120 using BC::get_allocator;
122 reference at(index_type i) {
return BC::at(i - offset); }
123 const_reference at(index_type i)
const {
return BC::at(i - offset); }
124 reference operator[](index_type i) {
return BC::operator[](i - offset); }
125 const_reference operator[](index_type i)
const {
126 return BC::operator[](i - offset);
144 if (low() < 0 && high() > 0) {
145 return begin() - low();
149 const_iterator zero()
const {
150 if (low() < 0 && high() > 0) {
151 return begin() - low();
156 const_iterator czero()
const {
return zero(); }
157 reverse_iterator rzero() {
return reverse_iterator(zero()); }
158 const_reverse_iterator rzero()
const {
159 return const_reverse_iterator(zero());
161 const_reverse_iterator crzero()
const {
return rzero(); }
165 using BC::shrink_to_fit;
168 index_type high()
const {
return size() + offset; }
169 index_type low()
const {
return offset; }
171 void clear() noexcept {
178 using BC::emplace_back;
182 void push_front(
const T& value) {
183 BC::push_front(value);
186 void push_front(T&& value) {
187 BC::push_front(value);
191 template <
typename... Args>
192 reference emplace_front(Args&&... args) {
193 BC::emplace_front(std::forward<Args>(args)...);
202 void swap(floating_array& other) noexcept(
203 std::allocator_traits<Allocator>::is_always_equal::value) {
205 swap(static_cast<BC&>(*
this), static_cast<BC&>(other));
206 swap(offset, other.offset);
209 friend bool operator==(
const floating_array&,
const floating_array&);
211 ~floating_array() =
default;
214 difference_type offset{0};
217 template <
typename T,
typename Alloc>
220 return (lhs.low() == rhs.low()) &&
221 (
static_cast<std::deque<T, Alloc>&
>(lhs) ==
222 static_cast<std::deque<T, Alloc>&
>(rhs));
225 template <
typename T,
typename Alloc>
228 return !(lhs == rhs);
231 template <
typename T,
typename Alloc>
232 bool operator<(const floating_array<T, Alloc>& lhs,
234 return std::lexicographical_compare(lhs.begin(), lhs.end(), rhs.begin(),
238 template <
typename T,
typename Alloc>
239 bool operator<=(const floating_array<T, Alloc>& lhs,
241 return (lhs == rhs) || std::lexicographical_compare(lhs.begin(), lhs.end(),
242 rhs.begin(), rhs.end());
245 template <
typename T,
typename Alloc>
248 return std::lexicographical_compare(rhs.begin(), rhs.end(), lhs.begin(),
252 template <
typename T,
typename Alloc>
255 return (lhs == rhs) || std::lexicographical_compare(rhs.begin(), rhs.end(),
256 lhs.begin(), lhs.end());
259 template <
typename T,
typename Alloc>
264 #endif // FLOATING_ARRAY_H_INCLUDED_ Definition: floating_array.h:8
Definition: floating_array.h:21