WebCFace 2.9.0
Web-based Communication Framework & Dashboard-like UI
Loading...
Searching...
No Matches
val_adaptor.h
Go to the documentation of this file.
1#pragma once
2#include <string>
3#include <vector>
4#include <tuple>
5#include <cstdint>
6#include <ostream>
7#include <variant>
8#include "encoding.h"
9#ifdef WEBCFACE_MESON
10#include "webcface-config.h"
11#else
12#include "webcface/common/webcface-config.h"
13#endif
14
16
21enum class ValType {
22 none_ = 0,
23 string_ = 1,
24 bool_ = 2,
25 int_ = 3,
26 float_ = 4,
27 double_ = 4,
28 vector_ = 16,
29 vector_string_ = 17,
30 vector_bool_ = 18,
31 vector_int_ = 19,
32 vector_float_ = 20,
33 vector_double_ = 20,
34};
35
40inline std::string valTypeStr(ValType a) {
41 if (static_cast<int>(a) & static_cast<int>(ValType::vector_)) {
42 return std::string("vector<") +
43 valTypeStr(static_cast<ValType>(
44 static_cast<int>(a) ^ static_cast<int>(ValType::vector_))) +
45 ">";
46 }
47 switch (a) {
48 case ValType::none_:
49 return "none";
50 case ValType::string_:
51 return "string";
52 case ValType::bool_:
53 return "bool";
54 case ValType::int_:
55 return "int";
56 case ValType::float_:
57 return "float";
58 default:
59 return "unknown";
60 }
61}
66inline std::ostream &operator<<(std::ostream &os, ValType a) {
67 return os << valTypeStr(a);
68}
69
86 mutable SharedString as_str;
87
88 std::variant<double, std::int64_t> as_val;
89 ValType type;
90
91 enum ValVariant { DOUBLEV = 0, INT64V = 1 };
92
93 void initStr() const;
94 void initWStr() const;
95
96 public:
97 ValAdaptor();
98
102 explicit ValAdaptor(const SharedString &str);
106 ValAdaptor &operator=(const SharedString &str);
107
113 explicit ValAdaptor(StringInitializer str);
119 ValAdaptor &operator=(StringInitializer str);
120
126 template <typename Bool, typename std::enable_if_t<
127 std::is_same_v<Bool, bool>, bool> = true>
128 explicit ValAdaptor(Bool value);
137 template <typename Bool>
138 auto operator=(Bool v)
139 -> std::enable_if_t<std::is_same_v<Bool, bool>, ValAdaptor &>;
140
141 explicit ValAdaptor(std::int64_t value);
142 ValAdaptor &operator=(std::int64_t v);
143
144 explicit ValAdaptor(double value);
145 ValAdaptor &operator=(double v);
146
147 template <typename T, typename std::enable_if_t<!std::is_same_v<T, bool> &&
148 std::is_integral_v<T>,
149 std::nullptr_t> = nullptr>
150 explicit ValAdaptor(T value)
151 : ValAdaptor(static_cast<std::int64_t>(value)) {}
152 template <typename T, typename std::enable_if_t<!std::is_same_v<T, bool> &&
153 std::is_integral_v<T>,
154 std::nullptr_t> = nullptr>
156 return *this = static_cast<std::int64_t>(v);
157 }
158
159 template <typename T, typename std::enable_if_t<std::is_floating_point_v<T>,
160 std::nullptr_t> = nullptr>
161 explicit ValAdaptor(T value) : ValAdaptor(static_cast<double>(value)) {}
162 template <typename T, typename std::enable_if_t<std::is_floating_point_v<T>,
163 std::nullptr_t> = nullptr>
165 return *this = static_cast<double>(v);
166 }
167
168 ValType valType() const { return type; }
169
170 static const ValAdaptor &emptyVal();
171
176 bool empty() const;
177
188 [[deprecated("(ver2.10〜) use asStringView() or asString() instead")]]
189 std::string asStringRef() const {
190 return asString();
191 }
201 StringView asStringView() const;
211 [[deprecated("(ver2.10〜) use asWStringView() or asWString() instead")]]
212 std::wstring asWStringRef() const {
213 return asWString();
214 }
223 WStringView asWStringView() const;
227 std::string_view asU8StringView() const;
232 std::string asString() const { return std::string(asStringView()); }
237 std::wstring asWString() const { return std::wstring(asWStringView()); }
238
248 template <typename T,
249 typename std::enable_if_t<std::is_convertible_v<StringView, T>,
250 std::nullptr_t> = nullptr>
251 operator T() const {
252 return asStringView();
253 }
263 template <typename T, typename std::enable_if_t<
264 !std::is_convertible_v<StringView, T> &&
265 std::is_convertible_v<WStringView, T>,
266 std::nullptr_t> = nullptr>
267 operator T() const {
268 return asWStringView();
269 }
278 template <typename T, typename std::enable_if_t<
279 !std::is_convertible_v<StringView, T> &&
280 !std::is_convertible_v<WStringView, T> &&
281 std::is_constructible_v<T, StringView>,
282 std::nullptr_t> = nullptr>
283 explicit operator T() const {
284 return T(asStringView());
285 }
294 template <typename T, typename std::enable_if_t<
295 !std::is_convertible_v<StringView, T> &&
296 !std::is_convertible_v<WStringView, T> &&
297 !std::is_constructible_v<T, StringView> &&
298 std::is_constructible_v<T, WStringView>,
299 std::nullptr_t> = nullptr>
300 explicit operator T() const {
301 return T(asWStringView());
302 }
303
308 double asDouble() const;
313 int asInt() const;
318 long long asLLong() const;
330 template <typename T>
331 T as() const {
332 if constexpr (std::is_same_v<T, ValAdaptor>) {
333 return *this;
334 } else {
335 // ↓ MSVCでなぜかコンパイルできない
336 // return static_cast<T>(*this);
337 return this->operator T();
338 }
339 }
343 template <typename T,
344 typename std::enable_if_t<std::is_convertible_v<double, T> &&
345 !std::is_same_v<T, bool>,
346 std::nullptr_t> = nullptr>
347 operator T() const {
348 if constexpr (std::is_floating_point_v<T>) {
349 return static_cast<T>(asDouble());
350 } else if constexpr (sizeof(T) > sizeof(int)) {
351 return static_cast<T>(asLLong());
352 } else {
353 return static_cast<T>(asInt());
354 }
355 }
356
365 bool asBool() const;
369 operator bool() const { return asBool(); }
370
371 bool operator==(const ValAdaptor &other) const;
372 bool operator!=(const ValAdaptor &other) const { return !(*this == other); }
373
374 template <typename T, typename std::enable_if_t<
375 std::is_constructible_v<ValAdaptor, T> &&
376 !std::is_same_v<ValAdaptor, T>,
377 std::nullptr_t> = nullptr>
378 bool operator==(const T &other) const {
379 return *this == ValAdaptor(other);
380 }
381 template <typename T, typename std::enable_if_t<
382 std::is_constructible_v<ValAdaptor, T> &&
383 !std::is_same_v<ValAdaptor, T>,
384 std::nullptr_t> = nullptr>
385 bool operator!=(const T &other) const {
386 return *this != ValAdaptor(other);
387 }
388};
389
390extern template ValAdaptor::ValAdaptor(bool value);
391extern template ValAdaptor &ValAdaptor::operator= <bool>(bool v);
392
393
394template <typename T,
395 typename std::enable_if_t<std::is_constructible_v<ValAdaptor, T> &&
396 !std::is_same_v<ValAdaptor, T>,
397 std::nullptr_t> = nullptr>
398bool operator==(const T &other, const ValAdaptor &val) {
399 return val == ValAdaptor(other);
400}
401template <typename T,
402 typename std::enable_if_t<std::is_constructible_v<ValAdaptor, T> &&
403 !std::is_same_v<ValAdaptor, T>,
404 std::nullptr_t> = nullptr>
405bool operator!=(const T &other, const ValAdaptor &val) {
406 return val != ValAdaptor(other);
407}
408
409inline std::ostream &operator<<(std::ostream &os, const ValAdaptor &a) {
410 return os << a.asStringView();
411}
412
u8stringとstringとwstringをshared_ptrで持ち共有する
Definition encoding.h:159
SharedString のpublicなコンストラクタインタフェース (入力専用)
Definition encoding.h:215
webcfaceで管理されている文字列を参照するstring_view
Definition encoding.h:60
数値、文字列などの値を相互変換するクラス
Definition val_adaptor.h:81
T as() const
数値として返す 明示的なキャストをする
Definition val_adaptor.h:331
bool operator==(const T &other) const
Definition val_adaptor.h:378
std::string asString() const
文字列として返す(コピー)
Definition val_adaptor.h:232
static const ValAdaptor & emptyVal()
std::string asStringRef() const
文字列として返す
Definition val_adaptor.h:189
StringView asStringView() const
null終端の文字列を返す
Definition val_adaptor.cc:90
std::wstring asWStringRef() const
文字列として返す (wstring)
Definition val_adaptor.h:212
bool operator!=(const ValAdaptor &other) const
Definition val_adaptor.h:372
bool operator!=(const T &other) const
Definition val_adaptor.h:385
ValAdaptor(T value)
Definition val_adaptor.h:150
ValType valType() const
Definition val_adaptor.h:168
ValAdaptor & operator=(T v)
Definition val_adaptor.h:155
std::wstring asWString() const
文字列として返す(コピー) (wstring)
Definition val_adaptor.h:237
std::ostream & operator<<(std::ostream &os, const Arg &arg)
Definition func_info.cc:98
bool operator==(const T &other, const InputRef &ref)
Definition text.h:638
std::string valTypeStr(ValType a)
型名を文字列で取得
Definition val_adaptor.h:40
ValType
引数や戻り値の型を表すenum
Definition val_adaptor.h:21
bool operator!=(const T &other, const InputRef &ref)
Definition text.h:644
#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