14#pragma warning(disable:2586)
30 template <>
string ts(
const PropArray &p,
int width,
char notation,
int precision,
char fill);
32 using PropBase = std::variant<int64, double, bool, string, DVect2,
39 using PropBase::PropBase;
41 enum class Type { Int, Double, Bool,
String, DVect2,
42 DVect3, I64Vect2, I64Vect3,
Matrix, DAVect2,
49 inline Type type()
const;
52 inline bool isNull()
const {
return type()==Type::Null; }
53 inline bool isValid()
const {
return not isNull(); }
58 bool canConvert()
const {
static_assert(
sizeof(T)==0);
return false; }
62 bool canConvertVec()
const;
66 bool canConvertType()
const {
return canConvert<decltype(std::get<static_cast<int>(t)>(*this))>(); }
70 T to()
const {
static_assert(
sizeof(T)==0);
return false; }
72 std::vector<T> toVec()
const;
76 auto toType()
const {
return to<decltype(std::get<static_cast<int>(t)>(*this))>(); }
81 typename std::tuple<T,bool> toTest()
const;
85 typename std::variant_alternative_t<static_cast<int>(t),
Property> toTestType()
const;
88 void setValue(
const T &t) { *
this = t; }
90 void setVec(
const std::vector<T> &v);
93 T value()
const {
return to<T>(); }
96 inline double toDouble()
const;
97 inline string toString()
const;
98 inline int64 toInt()
const;
99 inline uint32 toUInt()
const;
100 inline double toDouble(
bool *ok)
const;
101 inline int64 toInt(
bool *ok)
const;
103 static constexpr Type DVectType(uint32 dim) {
return dim==2 ? Type::DVect2 : Type::DVect3; }
104 static constexpr Type DAVectType(uint32 dim) {
return dim==2 ? Type::DAVect2 : Type::DAVect3; }
105 static constexpr Type IVectType(uint32 dim) {
return dim==2 ? Type::I64Vect2 : Type::I64Vect3; }
108 Property::Type Property::type()
const {
109 return static_cast<Type
>(index());
113 auto &vl =
static_cast<const std::vector<base::Property> &
>(lhs);
114 auto &vr =
static_cast<const std::vector<base::Property> &
>(rhs);
118 template <>
BASE_EXPORT bool Property::canConvert<int64>()
const;
119 template <>
BASE_EXPORT bool Property::canConvert<double>()
const;
120 template <>
BASE_EXPORT bool Property::canConvert<bool>()
const;
121 template <>
BASE_EXPORT bool Property::canConvert<string>()
const;
122 template <>
BASE_EXPORT bool Property::canConvert<DVect2>()
const;
123 template <>
BASE_EXPORT bool Property::canConvert<DVect3>()
const;
124 template <>
BASE_EXPORT bool Property::canConvert<I64Vect2>()
const;
125 template <>
BASE_EXPORT bool Property::canConvert<I64Vect3>()
const;
126 template <>
BASE_EXPORT bool Property::canConvert<itasca::Mat>()
const;
127 template <>
BASE_EXPORT bool Property::canConvert<DAVect2>()
const;
128 template <>
BASE_EXPORT bool Property::canConvert<DAVect3>()
const;
129 template <>
BASE_EXPORT bool Property::canConvert<Quat2>()
const;
130 template <>
BASE_EXPORT bool Property::canConvert<Quat3>()
const;
131 template <>
BASE_EXPORT bool Property::canConvert<SymTensor>()
const;
132 template <>
BASE_EXPORT bool Property::canConvert<PropArray>()
const;
134 template <>
BASE_EXPORT int64 Property::to<int64>()
const;
135 template <>
BASE_EXPORT double Property::to<double>()
const;
136 template <>
BASE_EXPORT bool Property::to<bool>()
const;
137 template <>
BASE_EXPORT string Property::to<string>()
const;
138 template <>
BASE_EXPORT DVect2 Property::to<DVect2>()
const;
139 template <>
BASE_EXPORT DVect3 Property::to<DVect3>()
const;
140 template <>
BASE_EXPORT I64Vect2 Property::to<I64Vect2>()
const;
141 template <>
BASE_EXPORT I64Vect3 Property::to<I64Vect3>()
const;
143 template <>
BASE_EXPORT DAVect2 Property::to<DAVect2>()
const;
144 template <>
BASE_EXPORT DAVect3 Property::to<DAVect3>()
const;
148 template <>
BASE_EXPORT PropArray Property::to<PropArray>()
const;
153 Exception(
"Error converting Property from {} to {}.",
154 Property::nameFromType(from),Property::nameFromType(
to)) {
158 template <
typename T>
159 void Property::setVec(
const std::vector<T> &v) {
162 for (
size_t i=0;i<v.size();++i) {
164 pa.back().setValue(v[0]);
165 if (not i) t = pa.back().type();
166 else if (t!=pa.back().type())
throw Exception(
"All elements of a property array must be of the same type.");
171 double Property::toDouble()
const {
return to<double>(); }
172 string Property::toString()
const {
return to<string>(); }
173 int64 Property::toInt()
const {
return to<int64>();}
174 uint32 Property::toUInt()
const {
return static_cast<uint32
>(to<int64>()); }
176 double Property::toDouble(
bool *ok)
const {
177 *ok = canConvert<double>();
178 if (*ok)
return to<double>();
182 int64 Property::toInt(
bool *ok)
const {
183 *ok = canConvert<int64>();
184 if (*ok)
return to<int64>();
188 template <
typename T>
189 typename std::tuple<T,bool> Property::toTest()
const {
190 bool b = canConvert<T>();
196 template <Property::Type t>
197 typename std::variant_alternative_t<static_cast<int>(t),Property> Property::toTestType()
const {
198 using target_type =
decltype(std::get<static_cast<int>(t)>(*this));
199 using return_type = std::tuple<target_type,bool>;
200 bool b = canConvert<target_type>();
201 if (b)
return return_type(to<target_type>(),
true);
202 return return_type(target_type{},
false);
205 template <
typename T>
206 bool Property::canConvertVec()
const {
207 if (type()!=Type::Array)
return false;
208 auto &a = std::get<PropArray>(*
this);
209 if (not a.size())
return true;
210 return a[0].canConvert<T>();
213 template <
typename T>
214 std::vector<T> Property::toVec()
const {
215 if (type()!=Type::Array)
throw PropertyConvertException(type(),Type::Array);
216 auto &a = std::get<PropArray>(*
this);
217 if (not a.size())
return {};
220 ret.push_back(v.to<T>());
226 template <Property::Type t>
227 const auto &get(
const Property &v) {
return std::get<static_cast<int>(t)>(v); }
236 PropDesc(
const string &name,Property::Type type,UVect2 size) : name_(name), type_(type), size_(size) { }
239 Property::Type type_ = Property::Type::Int;
240 UVect2 size_ = UVect2(0);
241 auto operator<=>(
const PropDesc &p)
const =
default;
251struct std::formatter<base::Property> :
public std::formatter<string> {
252 template <
typename ParseContext>
253 constexpr auto parse(ParseContext &ctx) {
return std::formatter<string>::parse(ctx); }
255 template <
typename FormatContext>
256 constexpr auto format(
base::Property const &val, FormatContext &ctx)
const {
257 return std::formatter<string>::format(val.to<
string>(), ctx);
includes std::string and additional functions not included in the standard.
Base exception class for all Itasca code.
Definition baseexception.h:10
A template-based matrix class, size fixed at compile time. Defaults to symmetric sized matrix.
Definition matrix.h:22
2D quaternion-like utility class. In this case only the angle (in radians) is stored as opposed to th...
Definition quat.h:20
3D quaternion utility class.
Definition quat.h:111
A symmetric 2nd order tensor.
Definition symtensor.h:22
Definition property.h:150
std::basic_string< char8 > String
std::string of type Char
Definition basebool.h:9
#define BASE_EXPORT
Definition basedef.h:25
constexpr D to(const T &t)
This template function serves as an alternative to static_cast<T>().
Definition to.h:28
2D and 3D quaternion utility classes.
Definition property.h:234
2D and 3D vector utility classes.