WebCFace 3.2.0
Web-based Communication Framework & Dashboard-like UI
Loading...
Searching...
No Matches
val_adaptor_vec.h
Go to the documentation of this file.
1#pragma once
2#include "val_adaptor.h"
4#ifdef WEBCFACE_MESON
5#include "webcface-config.h"
6#else
7#include "webcface/common/webcface-config.h"
8#endif
9
11
18 mutable std::vector<ValAdaptor> vec;
19
20 public:
22 ValAdaptorVector(const ValAdaptor &val);
23 ValAdaptorVector &operator=(const ValAdaptor &val);
24 ValAdaptorVector(std::vector<ValAdaptor> init);
25 ValAdaptorVector &operator=(std::vector<ValAdaptor> init);
26
28 ValAdaptorVector &operator=(StringInitializer str);
29
30 template <typename T,
31 typename std::enable_if_t<
32 !std::is_same_v<ValAdaptor, T> &&
33 !std::is_same_v<ValAdaptorVector, T> &&
34 !std::is_constructible_v<StringInitializer, T> &&
35 std::is_constructible_v<ValAdaptor, T>,
36 std::nullptr_t> = nullptr>
37 explicit ValAdaptorVector(T &&val)
38 : ValAdaptorVector(ValAdaptor(std::forward<T>(val))) {}
39 template <typename T,
40 typename std::enable_if_t<
41 !std::is_same_v<ValAdaptor, T> &&
42 !std::is_same_v<ValAdaptorVector, T> &&
43 !std::is_constructible_v<StringInitializer, T> &&
44 std::is_constructible_v<ValAdaptor, T>,
45 std::nullptr_t> = nullptr>
47 return *this = ValAdaptor(std::forward<T>(val));
48 }
49
50 template <
51 typename R,
52 typename std::enable_if_t<
53 !std::is_same_v<ValAdaptor, R> &&
54 !std::is_same_v<ValAdaptorVector, R> &&
55 !std::is_constructible_v<StringInitializer, R> &&
56 !std::is_constructible_v<ValAdaptor, R> &&
57 std::is_constructible_v<
58 ValAdaptor, decltype(*std::begin(std::declval<R>()))> &&
59 std::is_constructible_v<ValAdaptor,
60 decltype(*std::end(std::declval<R>()))>,
61 std::nullptr_t> = nullptr>
62 ValAdaptorVector(const R &range)
63 : vec(std::begin(range), std::end(range)) {}
64 template <
65 typename R,
66 typename std::enable_if_t<
67 !std::is_same_v<ValAdaptor, R> &&
68 !std::is_same_v<ValAdaptorVector, R> &&
69 !std::is_constructible_v<StringInitializer, R> &&
70 !std::is_constructible_v<ValAdaptor, R> &&
71 std::is_constructible_v<
72 ValAdaptor, decltype(*std::begin(std::declval<R>()))> &&
73 std::is_constructible_v<ValAdaptor,
74 decltype(*std::end(std::declval<R>()))>,
75 std::nullptr_t> = nullptr>
76 ValAdaptorVector &operator=(const R &range) {
77 return *this =
78 std::vector<ValAdaptor>(std::begin(range), std::end(range));
79 }
80 template <typename T, std::size_t N,
81 typename std::enable_if_t<
82 !std::is_same_v<T, char> && !std::is_same_v<T, wchar_t> &&
83 std::is_convertible_v<T, ValAdaptor>,
84 std::nullptr_t> = nullptr>
85 ValAdaptorVector(const T (&range)[N])
86 : vec(std::begin(range), std::end(range)) {}
87 template <typename T, std::size_t N,
88 typename std::enable_if_t<
89 !std::is_same_v<T, char> && !std::is_same_v<T, wchar_t> &&
90 std::is_convertible_v<T, ValAdaptor>,
91 std::nullptr_t> = nullptr>
92 ValAdaptorVector &operator=(const T (&range)[N]) {
93 return *this =
94 std::vector<ValAdaptor>(std::begin(range), std::end(range));
95 }
96
104 const ValAdaptor &get() const;
113 bool empty() const;
114
115 ValType valType() const;
116
117 explicit operator const ValAdaptor &() const { return get(); }
118 template <typename T,
119 typename std::enable_if_t<std::is_convertible_v<ValAdaptor, T>,
120 std::nullptr_t> = nullptr>
121 operator T() const {
122 return get().as<T>();
123 }
124 template <typename T,
125 typename std::enable_if_t<!std::is_convertible_v<ValAdaptor, T>,
126 std::nullptr_t> = nullptr,
127#ifdef _MSC_VER
128 // gccでなぜか正しく機能しない
129 typename = decltype(std::declval<ValAdaptor>().operator T())>
130#else
131 // msvcでなぜか正しく機能しない
132 typename std::enable_if_t<std::is_constructible_v<T, ValAdaptor>,
133 std::nullptr_t> = nullptr>
134#endif
135 explicit operator T() const {
136 return get().as<T>();
137 }
138 template <typename T,
139 typename = std::void_t<
140 decltype(std::declval<ValAdaptor>().operator T())>>
141 std::vector<T> asVector() const {
142 return std::vector<T>(vec.begin(), vec.end());
143 }
144 template <typename T,
145 typename = std::void_t<
146 decltype(std::declval<ValAdaptor>().operator T())>>
147 operator std::vector<T>() const {
148 return asVector<T>();
149 }
150 template <typename T, std::size_t N,
151 typename = std::void_t<
152 decltype(std::declval<ValAdaptor>().operator T())>>
153 std::array<T, N> asArray() const {
154 if (N != vec.size()) {
155 throw ValTypeMismatch(
156 "array of size " + std::to_string(vec.size()) +
157 " cannot be converted to array<" + std::to_string(N) + ">");
158 }
159 std::array<T, N> a;
160 for (std::size_t i = 0; i < N; i++) {
161 a[i] = vec[i].as<T>();
162 }
163 return a;
164 }
165 template <typename T, std::size_t N,
166 typename = std::void_t<
167 decltype(std::declval<ValAdaptor>().operator T())>>
168 operator std::array<T, N>() const {
169 return asArray<T, N>();
170 }
171
172 template <typename T>
173 T as() const {
174 if constexpr (std::is_same_v<T, ValAdaptorVector>) {
175 return *this;
176 } else {
177 return this->operator T();
178 }
179 }
180
181 const ValAdaptor &operator[](std::size_t index) const { return at(index); }
182 const ValAdaptor &at(std::size_t index) const;
183
184 const ValAdaptor *data() const;
185 const ValAdaptor *begin() const { return data(); }
186 const ValAdaptor *end() const { return data() + size(); }
187 const ValAdaptor *cbegin() const { return data(); }
188 const ValAdaptor *cend() const { return data() + size(); }
189
190 std::size_t size() const;
191
192 [[deprecated("(ver3.0〜) use asStringView() or asString() instead")]]
193 std::string asStringRef() const {
194 return asString();
195 }
196 [[deprecated("(ver3.0〜) use asWStringView() or asWString() instead")]]
197 std::wstring asWStringRef() const {
198 return asWString();
199 }
200 StringView asStringView() const { return get().asStringView(); }
201 WStringView asWStringView() const { return get().asWStringView(); }
202 std::string_view asU8StringView() const { return get().asU8StringView(); }
203 std::string asString() const { return get().asString(); }
204 std::wstring asWString() const { return get().asWString(); }
205 double asDouble() const { return get().asDouble(); }
206 int asInt() const { return get().asInt(); }
207 long long asLLong() const { return get().asLLong(); }
208 bool asBool() const { return get().asBool(); }
209
210 bool operator==(const ValAdaptorVector &other) const;
211 bool operator!=(const ValAdaptorVector &other) const {
212 return !(*this == other);
213 }
214
215 template <typename T, typename std::enable_if_t<
216 std::is_constructible_v<ValAdaptorVector, T> &&
217 !std::is_same_v<ValAdaptorVector, T>,
218 std::nullptr_t> = nullptr>
219 bool operator==(const T &other) const {
220 return *this == ValAdaptorVector(other);
221 }
222 template <typename T, typename std::enable_if_t<
223 std::is_constructible_v<ValAdaptorVector, T> &&
224 !std::is_same_v<ValAdaptorVector, T>,
225 std::nullptr_t> = nullptr>
226 bool operator!=(const T &other) const {
227 return *this != ValAdaptorVector(other);
228 }
229};
230
231template <typename T, typename V,
232 typename std::enable_if_t<
233 std::is_same_v<V, ValAdaptorVector> &&
234 std::is_constructible_v<ValAdaptorVector, T> &&
235 !std::is_same_v<ValAdaptorVector, T>,
236 std::nullptr_t> = nullptr>
237bool operator==(const T &other, const V &val) {
238 return val == ValAdaptorVector(other);
239}
240template <typename T, typename V,
241 typename std::enable_if_t<
242 std::is_same_v<V, ValAdaptorVector> &&
243 std::is_constructible_v<ValAdaptorVector, T> &&
244 !std::is_same_v<ValAdaptorVector, T>,
245 std::nullptr_t> = nullptr>
246bool operator!=(const T &other, const V &val) {
247 return val != ValAdaptorVector(other);
248}
249
256template <int n = 0, typename T>
257void argToTuple(const std::vector<ValAdaptorVector> &args, T &tuple) {
258 constexpr int tuple_size = std::tuple_size<T>::value;
259 if constexpr (n < tuple_size) {
260 using Type = typename std::tuple_element<n, T>::type;
261 std::get<n>(tuple) = args[n].as<Type>();
262 argToTuple<n + 1>(args, tuple);
263 }
264}
265
266template <typename T>
267[[deprecated("Unknown type T is passed to webcface::valTypeOf(). "
268 "This should not happen. Maybe there's a bug in WebCFace...")]]
269inline void warningOnUnknownType() {}
270
277template <typename T>
279 if constexpr (std::is_void_v<T>) {
280 return ValType::none_;
281 } else if constexpr (!std::is_constructible_v<ValAdaptor, T> &&
282 std::is_constructible_v<ValAdaptorVector, T>) {
283 return static_cast<ValType>(
284 static_cast<int>(ValType::vector_) +
285 static_cast<int>(
286 valTypeOf<decltype(*std::declval<T>().begin())>()));
287 } else if constexpr (std::is_same_v<bool, std::decay_t<T>>) {
288 return ValType::bool_;
289 } else if constexpr (std::is_integral_v<std::decay_t<T>>) {
290 return ValType::int_;
291 } else if constexpr (std::is_floating_point_v<std::decay_t<T>>) {
292 return ValType::float_;
293 } else if constexpr (std::is_constructible_v<StringInitializer, T>) {
294 return ValType::string_;
295 } else {
296 warningOnUnknownType<T>();
297 return ValType::none_;
298 }
299}
300
SharedString のpublicなコンストラクタインタフェース (入力専用)
Definition encoding.h:235
webcfaceで管理されている文字列を参照するstring_view
Definition encoding.h:71
ValAdaptorのVector.
Definition val_adaptor_vec.h:17
std::string_view asU8StringView() const
Definition val_adaptor_vec.h:202
T as() const
Definition val_adaptor_vec.h:173
bool operator==(const T &other) const
Definition val_adaptor_vec.h:219
std::string asString() const
Definition val_adaptor_vec.h:203
ValAdaptorVector & operator=(T &&val)
Definition val_adaptor_vec.h:46
std::string asStringRef() const
Definition val_adaptor_vec.h:193
const ValAdaptor & operator[](std::size_t index) const
Definition val_adaptor_vec.h:181
ValAdaptorVector & operator=(const T(&range)[N])
Definition val_adaptor_vec.h:92
StringView asStringView() const
Definition val_adaptor_vec.h:200
std::wstring asWStringRef() const
Definition val_adaptor_vec.h:197
const ValAdaptor * cbegin() const
Definition val_adaptor_vec.h:187
ValAdaptorVector(const T(&range)[N])
Definition val_adaptor_vec.h:85
const ValAdaptor * begin() const
Definition val_adaptor_vec.h:185
long long asLLong() const
Definition val_adaptor_vec.h:207
bool operator!=(const T &other) const
Definition val_adaptor_vec.h:226
bool operator!=(const ValAdaptorVector &other) const
Definition val_adaptor_vec.h:211
bool asBool() const
Definition val_adaptor_vec.h:208
int asInt() const
Definition val_adaptor_vec.h:206
const ValAdaptor * end() const
Definition val_adaptor_vec.h:186
ValAdaptorVector(const R &range)
Definition val_adaptor_vec.h:62
double asDouble() const
Definition val_adaptor_vec.h:205
const ValAdaptor * cend() const
Definition val_adaptor_vec.h:188
ValAdaptorVector(T &&val)
Definition val_adaptor_vec.h:37
std::wstring asWString() const
Definition val_adaptor_vec.h:204
std::array< T, N > asArray() const
Definition val_adaptor_vec.h:153
std::vector< T > asVector() const
Definition val_adaptor_vec.h:141
WStringView asWStringView() const
Definition val_adaptor_vec.h:201
数値、文字列などの値を相互変換するクラス
Definition val_adaptor.h:91
bool operator==(const T &other, const InputRef &ref)
Definition text.h:608
const auto & get(const AxisAngle &aa)
Definition transform.h:227
void argToTuple(const std::vector< ValAdaptorVector > &args, T &tuple)
ValAdaptorのリストから任意の型のタプルに変換する
Definition val_adaptor_vec.h:257
void warningOnUnknownType()
Definition val_adaptor_vec.h:269
ValType
引数や戻り値の型を表すenum
Definition val_adaptor.h:22
ValType valTypeOf()
TのValTypeを得る
Definition val_adaptor_vec.h:278
bool operator!=(const T &other, const InputRef &ref)
Definition text.h:614
ValAdaptorの変換エラー
Definition exception.h:35
#define WEBCFACE_DLL
Definition webcface-config.h:69
#define WEBCFACE_NS_END
Definition webcface-config.h:113
#define WEBCFACE_NS_BEGIN
Definition webcface-config.h:112