Stroika Library 3.0d25
 
Loading...
Searching...
No Matches
DataTypes.inl
1/*
2 * Copyright(c) Sophist Solutions, Inc. 1990-2026. All rights reserved
3 */
4
6
7 /*
8 ********************************************************************************
9 ********************** UPnP::DataTypes::DefaultDataType ************************
10 ********************************************************************************
11 */
12 template <IValue T>
14 {
15 using namespace Foundation;
16 if constexpr (same_as<T, bool>) {
17 return DataType::eBoolean;
18 }
19 else if constexpr (same_as<T, uint8_t>) {
20 return DataType::eUI1;
21 }
22 else if constexpr (same_as<T, uint16_t>) {
23 return DataType::eUI2;
24 }
25 else if constexpr (same_as<T, uint32_t>) {
26 return DataType::eUI4;
27 }
28 else if constexpr (same_as<T, uint64_t>) {
29 return DataType::eUI8;
30 }
31 else if constexpr (same_as<T, int8_t>) {
32 return DataType::eI1;
33 }
34 else if constexpr (same_as<T, int16_t>) {
35 return DataType::eI2;
36 }
37 else if constexpr (same_as<T, int32_t>) {
38 return DataType::eI4;
39 }
40 else if constexpr (same_as<T, int64_t>) {
41 return DataType::eI8;
42 }
43 else if constexpr (same_as<T, float>) {
44 return DataType::eR4;
45 }
46 else if constexpr (same_as<T, double>) {
47 return DataType::eR8;
48 }
49 else if constexpr (same_as<T, Characters::Character>) {
50 return DataType::eChar;
51 }
52 else if constexpr (same_as<T, String>) {
53 return DataType::eString;
54 }
55 else if constexpr (same_as<T, Time::Date>) {
56 return DataType::eDate;
57 }
58 else if constexpr (same_as<T, Time::DateTime>) {
59 return DataType::eDateTimeTZ;
60 }
61 else if constexpr (same_as<T, Time::TimeOfDay>) {
62 return DataType::eTime;
63 }
64 else if constexpr (same_as<T, Memory::BLOB>) {
65 return DataType::eBinBase64;
66 }
67 else if constexpr (same_as<T, IO::Network::URI>) {
68 return DataType::eURI;
69 }
70 else {
71 static_assert (same_as<T, Common::GUID>);
72 return DataType::eUUID;
73 }
74 }
75
76 /*
77 ********************************************************************************
78 ************************* UPnP::DataTypes::IsTypeOf ****************************
79 ********************************************************************************
80 */
81 template <IValue T>
82 constexpr bool IsTypeOf (DataType t)
83 {
84 using namespace Foundation;
85 switch (t) {
86 case DataType::eUI1:
87 return same_as<T, uint8_t>;
88 case DataType::eUI2:
89 return same_as<T, uint16_t>;
90 case DataType::eUI4:
91 return same_as<T, uint32_t>;
92 case DataType::eUI8:
93 return same_as<T, uint64_t>;
94 case DataType::eI1:
95 return same_as<T, int8_t>;
96 case DataType::eI2:
97 return same_as<T, int16_t>;
98 case DataType::eI4:
99 case DataType::eInt:
100 return same_as<T, int32_t>;
101 case DataType::eI8:
102 return same_as<T, int64_t>;
103 case DataType::eR4:
104 return same_as<T, float>;
105 case DataType::eR8:
106 case DataType::eNumber:
107 case DataType::eFixed14_4:
108 case DataType::eFloat:
109 return same_as<T, double>;
110 case DataType::eChar:
111 return same_as<T, Characters::Character>;
112 case DataType::eString:
113 return same_as<T, String>;
114 case DataType::eDate:
115 return same_as<T, Time::Date>;
116 case DataType::eDateTime:
117 case DataType::eDateTimeTZ:
118 return same_as<T, Time::DateTime>;
119 case DataType::eTime:
120 case DataType::eTimeTZ:
121 return same_as<T, Time::TimeOfDay>;
122 case DataType::eBoolean:
123 return same_as<T, bool>;
124 case DataType::eBinBase64:
125 case DataType::eBinHex:
126 return same_as<T, Memory::BLOB>;
127 case DataType::eURI:
128 return same_as<T, IO::Network::URI>;
129 case DataType::eUUID:
130 return same_as<T, Common::GUID>;
131 }
132 return false;
133 }
134
135 /*
136 ********************************************************************************
137 ************************** UPnP::DataTypes::ToText *****************************
138 ********************************************************************************
139 */
140 template <IValue T>
141 inline String ToText (const T& v)
142 {
143 return ToText (Value{in_place_type<T>, v}, DefaultDataType<T> ());
144 }
145
146 /*
147 ********************************************************************************
148 ************************* UPnP::DataTypes::FromText ****************************
149 ********************************************************************************
150 */
151 template <IValue T>
152 inline optional<T> FromText (const String& text, DataType t)
153 {
154 Require (IsTypeOf<T> (t));
155 if (optional<Value> v = FromText (text, t)) {
156 return get<T> (*v);
157 }
158 return nullopt;
159 }
160 template <IValue T>
161 inline optional<T> FromText (const String& text)
162 {
163 return FromText<T> (text, DefaultDataType<T> ());
164 }
165
166}
167
169 template <>
170 constexpr EnumNames<Frameworks::UPnP::DataTypes::DataType> DefaultNames<Frameworks::UPnP::DataTypes::DataType>::k{{{
171 {Frameworks::UPnP::DataTypes::DataType::eUI1, L"ui1"},
172 {Frameworks::UPnP::DataTypes::DataType::eUI2, L"ui2"},
173 {Frameworks::UPnP::DataTypes::DataType::eUI4, L"ui4"},
174 {Frameworks::UPnP::DataTypes::DataType::eUI8, L"ui8"},
175 {Frameworks::UPnP::DataTypes::DataType::eI1, L"i1"},
176 {Frameworks::UPnP::DataTypes::DataType::eI2, L"i2"},
177 {Frameworks::UPnP::DataTypes::DataType::eI4, L"i4"},
178 {Frameworks::UPnP::DataTypes::DataType::eI8, L"i8"},
179 {Frameworks::UPnP::DataTypes::DataType::eInt, L"int"},
180 {Frameworks::UPnP::DataTypes::DataType::eR4, L"r4"},
181 {Frameworks::UPnP::DataTypes::DataType::eR8, L"r8"},
182 {Frameworks::UPnP::DataTypes::DataType::eNumber, L"number"},
183 {Frameworks::UPnP::DataTypes::DataType::eFixed14_4, L"fixed.14.4"},
184 {Frameworks::UPnP::DataTypes::DataType::eFloat, L"float"},
185 {Frameworks::UPnP::DataTypes::DataType::eChar, L"char"},
186 {Frameworks::UPnP::DataTypes::DataType::eString, L"string"},
187 {Frameworks::UPnP::DataTypes::DataType::eDate, L"date"},
188 {Frameworks::UPnP::DataTypes::DataType::eDateTime, L"dateTime"},
189 {Frameworks::UPnP::DataTypes::DataType::eDateTimeTZ, L"dateTime.tz"},
190 {Frameworks::UPnP::DataTypes::DataType::eTime, L"time"},
191 {Frameworks::UPnP::DataTypes::DataType::eTimeTZ, L"time.tz"},
192 {Frameworks::UPnP::DataTypes::DataType::eBoolean, L"boolean"},
193 {Frameworks::UPnP::DataTypes::DataType::eBinBase64, L"bin.base64"},
194 {Frameworks::UPnP::DataTypes::DataType::eBinHex, L"bin.hex"},
195 {Frameworks::UPnP::DataTypes::DataType::eURI, L"uri"},
196 {Frameworks::UPnP::DataTypes::DataType::eUUID, L"uuid"},
197 }}};
198}
String is like std::u32string, except it is much easier to use, often much more space efficient,...
Definition String.h:201
variant< bool, uint8_t, uint16_t, uint32_t, uint64_t, int8_t, int16_t, int32_t, int64_t, float, double, Foundation::Characters::Character, String, Foundation::Time::Date, Foundation::Time::DateTime, Foundation::Time::TimeOfDay, Foundation::Memory::BLOB, Foundation::IO::Network::URI, Foundation::Common::GUID > Value
A value of any of UPnP's data types, as its C++ type (the table above) - for code that learns a value...
Definition DataTypes.h:111
constexpr bool IsTypeOf(DataType t)
Whether T is t's C++ type (the table above)
Definition DataTypes.inl:82
DataType
UPnP's data types - each named, as a service's description names it (Common::DefaultNames): ui2,...
Definition DataTypes.h:69
optional< T > FromText(const String &text)
text read as UPnP reads it: as t, if given, else as T's default data type (the table above) - nullopt...
String ToText(const T &v)
v, as UPnP writes it: as t, if given, else as its C++ type's default data type (the table above)
constexpr DataType DefaultDataType()
The data type a T is written as, given none: its default (marked * in the table above)
Definition DataTypes.inl:13