UdonLibrary 1.0.0
機械システム研究部 C++ ライブラリ
読み取り中…
検索中…
一致する文字列を見つけられません
ArrayView.hpp
[詳解]
1//
2// 配列参照クラス
3//
4// Copyright (c) 2022-2024 udonrobo
5//
6
7#pragma once
8
11#include <cstddef> // std::ptrdiff_t
12#include <iterator>
13#include <algorithm>
14#include <cstring>
15
16#if UDON_PLATFORM_OUTPUT_STREAM == UDON_PLATFORM_OUTPUT_CONSOLE
17# include <iostream>
18#endif
19
20namespace Udon
21{
22
23
25 template <typename T>
27 {
28 public:
29 using size_type = size_t;
30 using value_type = T;
31 using reference = T&;
32 using const_reference = const T&;
33 using pointer = T*;
34 using const_pointer = const T*;
35 using iterator = T*;
36 using const_iterator = const T*;
37 using reverse_iterator = std::reverse_iterator<iterator>;
38 using const_reverse_iterator = std::reverse_iterator<const_iterator>;
39
40 private:
41 pointer m_data;
42 size_type m_size;
43
44 public:
46 : m_data()
47 , m_size()
48 {
49 }
50
51 template <size_t N>
52 ArrayView(value_type (&array)[N])
53 : m_data(array)
54 , m_size(N)
55 {
56 }
57
58 ArrayView(pointer m_data, const size_type count)
59 : m_data(m_data)
60 , m_size(count)
61 {
62 }
63
64 template <typename InputIterator, typename = typename std::enable_if<std::is_convertible<typename std::iterator_traits<InputIterator>::iterator_category, std::input_iterator_tag>::value>::type>
65 ArrayView(InputIterator first, InputIterator last)
66 : m_data(first)
67 , m_size(std::distance(first, last))
68 {
69 }
70
71 template <typename Other>
73 : m_data(other.data())
74 , m_size(other.size())
75 {
76 }
77
78 template <typename Container, typename = decltype(std::declval<Container>().data(), std::declval<Container>().size())>
79 ArrayView(Container&& container)
80 : m_data(container.data())
81 , m_size(container.size())
82 {
83 }
84
85 explicit operator bool() const noexcept
86 {
87 return m_size;
88 }
89
90 constexpr size_type size() const
91 {
92 return m_size;
93 }
94
96 {
97 return m_data;
98 }
100 {
101 return m_data;
102 }
103
105 {
106 return m_data[index];
107 }
109 {
110 return m_data[index];
111 }
112
113 reference at(const size_type index)
114 {
115 return m_data[index];
116 }
117 const_reference at(const size_type index) const
118 {
119 return m_data[index];
120 }
121
123 {
124 return m_data[0];
125 }
127 {
128 return m_data[0];
129 }
130
132 {
133 return m_data[m_size - 1];
134 }
136 {
137 return m_data[m_size - 1];
138 }
139
140 bool empty() const
141 {
142 return m_size == 0;
143 }
144
145 void clear()
146 {
147 fill(value_type());
148 }
149
150 void fill(const value_type& value)
151 {
152 for (auto& v : *this)
153 {
154 v = value;
155 }
156 }
157
162 {
163 return {
164 std::next(cbegin(), count),
165 m_size - count
166 };
167 }
168
172 ArrayView removeBackView(size_type count) { return { begin(), m_size - count }; }
173 ArrayView removeBackView(size_type count) const { return { begin(), m_size - count }; }
174
179 ArrayView subView(size_type beginIndex, size_type endIndex) const
180 {
181 return {
182 std::next(cbegin(), beginIndex),
183 std::min(endIndex - beginIndex, m_size)
184 };
185 }
186
191 ArrayView subView(size_type beginIndex) const
192 {
193 return {
194 std::next(cbegin(), beginIndex),
195 std::min(m_size - beginIndex, m_size)
196 };
197 }
198
202 ArrayView subViewUntil(const value_type& terminate) const
203 {
204 return {
205 cbegin(),
206 std::find(cbegin(), cend(), terminate)
207 };
208 }
209
216 bool startsWith(const ArrayView& rhs) const
217 {
218 if (size() >= rhs.size())
219 {
220 return std::equal(rhs.cbegin(), rhs.cend(), cbegin());
221 }
222 else
223 {
224 return false;
225 }
226 }
227
228 friend bool operator==(const ArrayView& lhs, const ArrayView& rhs)
229 {
230 if (lhs.size() == rhs.size())
231 {
232 return std::equal(lhs.cbegin(), lhs.cend(), rhs.cbegin());
233 }
234 else
235 {
236 return false;
237 }
238 }
239 friend bool operator!=(const ArrayView& lhs, const ArrayView& rhs)
240 {
241 return not(lhs == rhs);
242 }
243
245 {
246 return { m_data };
247 }
249 {
250 return { m_data };
251 }
252
254 {
255 return { m_data + m_size };
256 }
258 {
259 return { m_data + m_size };
260 }
261
263 {
264 return { m_data };
265 }
266
268 {
269 return { m_data + m_size };
270 }
271
273 {
274 return const_reverse_iterator{ end() };
275 }
277 {
278 return reverse_iterator{ end() };
279 }
280
282 {
283 return const_reverse_iterator{ begin() };
284 }
286 {
287 return reverse_iterator{ begin() };
288 }
289
291 {
292 return const_reverse_iterator{ cend() };
293 }
294
296 {
297 return const_reverse_iterator{ cbegin() };
298 }
299
300#if UDON_PLATFORM_OUTPUT_STREAM == UDON_PLATFORM_OUTPUT_CONSOLE
301 friend std::ostream& operator<<(std::ostream& ostm, const ArrayView& rhs)
302 {
303 bool isFirst = true;
304 for (auto&& element : rhs)
305 {
306 if (isFirst)
307 {
308 ostm << element;
309 }
310 else
311 {
312 ostm << ", " << element;
313 }
314 isFirst = false;
315 }
316 return ostm;
317 }
318#endif
319
320#ifdef ARDUINO
321 void show() const
322 {
323 Serial.print("[");
324 for (size_type i = 0; i < m_size; ++i)
325 {
326 Serial.print(m_data[i]);
327 if (i < m_size - 1)
328 {
329 Serial.print(", ");
330 }
331 }
332 Serial.print("]");
333 }
334#endif
335 };
336
337} // namespace Udon
配列参照クラス
Definition ArrayView.hpp:27
const_reverse_iterator rend() const
Definition ArrayView.hpp:281
T * iterator
Definition ArrayView.hpp:35
reference front()
Definition ArrayView.hpp:122
ArrayView removeBackView(size_type count) const
Definition ArrayView.hpp:173
ArrayView(Container &&container)
Definition ArrayView.hpp:79
friend std::ostream & operator<<(std::ostream &ostm, const ArrayView &rhs)
Definition ArrayView.hpp:301
ArrayView removeFrontView(size_type count) const
先頭から指定要素削除したビューを作成する。
Definition ArrayView.hpp:161
T * pointer
Definition ArrayView.hpp:33
const_iterator cbegin() const
Definition ArrayView.hpp:262
ArrayView()
Definition ArrayView.hpp:45
void fill(const value_type &value)
Definition ArrayView.hpp:150
const_iterator end() const
Definition ArrayView.hpp:257
const_reference operator[](const size_type index) const
Definition ArrayView.hpp:108
const_pointer data() const
Definition ArrayView.hpp:99
ArrayView(const ArrayView< Other > &other)
Definition ArrayView.hpp:72
void clear()
Definition ArrayView.hpp:145
ArrayView(pointer m_data, const size_type count)
Definition ArrayView.hpp:58
ArrayView(value_type(&array)[N])
Definition ArrayView.hpp:52
const_reference front() const
Definition ArrayView.hpp:126
const_reverse_iterator crbegin() const
Definition ArrayView.hpp:290
friend bool operator!=(const ArrayView &lhs, const ArrayView &rhs)
Definition ArrayView.hpp:239
const_iterator cend() const
Definition ArrayView.hpp:267
T & reference
Definition ArrayView.hpp:31
iterator end()
Definition ArrayView.hpp:253
std::reverse_iterator< const_iterator > const_reverse_iterator
Definition ArrayView.hpp:38
bool startsWith(const ArrayView &rhs) const
自身が指定のビューから始まるかどうか
Definition ArrayView.hpp:216
reverse_iterator rbegin()
Definition ArrayView.hpp:276
reference operator[](const size_type index)
Definition ArrayView.hpp:104
ArrayView subView(size_type beginIndex, size_type endIndex) const
指定された範囲からビューを作成する。
Definition ArrayView.hpp:179
ArrayView subView(size_type beginIndex) const
指定された範囲からビューを作成する。
Definition ArrayView.hpp:191
const_reverse_iterator rbegin() const
Definition ArrayView.hpp:272
const_reference back() const
Definition ArrayView.hpp:135
ArrayView removeBackView(size_type count)
末尾から指定要素削除したビューを作成する。
Definition ArrayView.hpp:172
const T & const_reference
Definition ArrayView.hpp:32
const T * const_pointer
Definition ArrayView.hpp:34
const_reference at(const size_type index) const
Definition ArrayView.hpp:117
reverse_iterator rend()
Definition ArrayView.hpp:285
const_iterator begin() const
Definition ArrayView.hpp:248
std::reverse_iterator< iterator > reverse_iterator
Definition ArrayView.hpp:37
ArrayView(InputIterator first, InputIterator last)
Definition ArrayView.hpp:65
bool empty() const
Definition ArrayView.hpp:140
const T * const_iterator
Definition ArrayView.hpp:36
constexpr size_type size() const
Definition ArrayView.hpp:90
T value_type
Definition ArrayView.hpp:30
reference back()
Definition ArrayView.hpp:131
iterator begin()
Definition ArrayView.hpp:244
const_reverse_iterator crend() const
Definition ArrayView.hpp:295
size_t size_type
Definition ArrayView.hpp:29
pointer data()
Definition ArrayView.hpp:95
friend bool operator==(const ArrayView &lhs, const ArrayView &rhs)
Definition ArrayView.hpp:228
ArrayView subViewUntil(const value_type &terminate) const
特定の値まで検索し、そこまでの範囲の一つ手前までをビューとする。
Definition ArrayView.hpp:202
reference at(const size_type index)
Definition ArrayView.hpp:113
Definition Bit.hpp:12
Definition Typedef.hpp:94