22#include <codeanalysis\warnings.h>
26using wstring = std::wstring;
27using string = std::string;
28using string_view = std::string_view;
34BASE_EXPORT std::tuple<int32,bool> isInt32(
const string_view &in);
39BASE_EXPORT std::tuple<bool,bool> isBool(
const string_view &in,
const string_view &out=
"on,off,true,false,yes,no");
42inline std::tuple<int32,bool> isInt32(
const string &in) {
return isInt32(string_view(in)); }
43inline std::tuple<uint32,bool>
isUInt32(
const string &in) {
return isUInt32(string_view(in)); }
44inline std::tuple<int64,bool>
isInt64(
const string &in) {
return isInt64(string_view(in)); }
45inline std::tuple<uint64,bool>
isUInt64(
const string &in) {
return isUInt64(string_view(in)); }
46inline std::tuple<double,bool>
isDouble(
const string &in) {
return isDouble(string_view(in)); }
47inline std::tuple<bool,bool> isBool(
const string &in,
const string_view &out=
"on,off,true,false,yes,no") {
return isBool(string_view(in),out); }
48inline std::tuple<int32,bool> isInt32v(
const string_view &in) {
return isInt32(string_view(in)); }
49inline std::tuple<uint32,bool> isUInt32v(
const string_view &in) {
return isUInt32(string_view(in)); }
50inline std::tuple<int64,bool> isInt64v(
const string_view &in) {
return isInt64(string_view(in)); }
51inline std::tuple<uint64,bool> isUInt64v(
const string_view &in) {
return isUInt64(string_view(in)); }
52inline std::tuple<double,bool> isDoublev(
const string_view &in) {
return isDouble(string_view(in)); }
53inline std::tuple<bool,bool> isBoolv(
const string_view &in,
const string_view &out=
"on,off,true,false,yes,no") {
return isBool(string_view(in),out); }
58template <
typename T,
typename ... Args>
59T toStringConv(
const string_view &in,Args...args,
bool te, std::tuple<T,bool> (*f)(
const string_view &,Args...));
60inline int32 toInt32(
const string_view &in,
bool throwException =
false) {
return toStringConv<int32>(in, throwException, isInt32v); }
61inline uint32 toUInt32(
const string_view &in,
bool throwException=
false) {
return toStringConv<uint32>(in, throwException, isUInt32v); }
62inline int64 toInt64(
const string_view &in,
bool throwException=
false) {
return toStringConv<int64>(in, throwException, isInt64v); }
63inline uint64 toUInt64(
const string_view &in,
bool throwException=
false) {
return toStringConv<uint64>(in, throwException, isUInt64v); }
64inline double toDouble(
const string_view &in,
bool throwException=
false) {
return toStringConv<double>(in, throwException, isDoublev); }
65inline bool toBool(
const string_view &in,
const string_view &out =
"on,off,true,false,yes,no",
bool throwException =
false) {
return toStringConv<bool,const string_view &>(in, out, throwException, isBool); }
66template <
typename ... Args>
67string rformat(
const string &s,Args...args) {
return std::vformat(s,std::make_format_args(args...)); }
73 using std::vector<
string>::vector;
74 enum class Empty { Keep, Skip };
77 StringList(std::initializer_list<string> list) : std::vector<string>(list) {}
79 StringList(
const std::vector<string> &v) : std::vector<string>(v) {}
81 StringList(std::vector<string> &&v) noexcept : std::vector<string>(std::move(v)) {}
82 explicit StringList(
const string_view &s) : std::vector<string>{string(s)} { }
84 const StringList &operator=(
const StringList &in) { std::vector<string>::operator=(in);
return *
this; }
86 const StringList &operator+=(
const string &s) { push_back(s);
return *
this; }
87 const StringList &operator+=(
const std::vector<string> &v) {
for (
auto &s : v) push_back(s);
return *
this; }
88 const StringList &operator<<(
const string &s) {
return operator+=(s); }
93BASE_EXPORT std::vector<string> toStringList(
const std::vector<string_view> &v);
94BASE_EXPORT bool contains(
const std::vector<string> &all,
const string &s2,
bool caseSensitivity=
false);
97BASE_EXPORT string::size_type findRegex(
const StringList &s,
const string_view ®ex,string::size_type start=0);
102[[nodiscard]]
BASE_EXPORT string tostring(
const std::wstring &s);
103[[nodiscard]]
BASE_EXPORT string tostring(
const std::u16string &s);
104[[nodiscard]]
BASE_EXPORT string tostring(
const std::u32string &s);
105[[nodiscard]]
inline string tostring(
const string_view &s) {
return string(s.data(),s.size()); }
106[[nodiscard]]
inline string tostring(
const char *s) {
return string(s); }
107[[nodiscard]]
inline string tostring(
const string & s) {
return s; }
108[[nodiscard]]
BASE_EXPORT std::wstring towstring(
const string &s);
109[[nodiscard]]
BASE_EXPORT std::wstring towstring(
const std::u16string &s);
110[[nodiscard]]
BASE_EXPORT std::u16string tou16string(
const string &s);
111[[nodiscard]]
BASE_EXPORT std::u16string tou16string(
const std::wstring &s);
112[[nodiscard]]
BASE_EXPORT std::u16string tou16string(
const string_view &s);
113[[nodiscard]]
BASE_EXPORT std::u32string tou32string(
const string &s);
114[[nodiscard]]
BASE_EXPORT std::u32string tou32string(
const string_view &s);
115[[nodiscard]]
BASE_EXPORT string toBase64(
const std::vector<char> &in);
116[[nodiscard]]
BASE_EXPORT std::vector<char> fromBase64(
const string &in);
119[[nodiscard]]
BASE_EXPORT string toUpper(
const string_view &s);
120[[nodiscard]]
BASE_EXPORT string toLower(
const string_view &s);
121[[nodiscard]]
BASE_EXPORT string capitalizeFirstLetter(
const string_view &s);
122[[nodiscard]]
BASE_EXPORT uint64 caseInsensitiveHash(
const string_view &s);
125template <
typename T,
typename U> [[nodiscard]] T join(
const std::vector<T> &s,
const U &sep);
126[[nodiscard]]
BASE_EXPORT std::vector<string_view> splitView(
const string_view &s,
const string_view &sep,
bool keepEmptyParts=
false);
127[[nodiscard]]
inline std::vector<string> split(
const string_view &s,
const string_view &sep,
bool keepEmptyParts=
false) {
return toStringList(splitView(s,sep,keepEmptyParts)); }
128[[nodiscard]]
BASE_EXPORT std::vector<string_view> splitViewRegex(
const string_view &s,
const string_view ®ex,
bool keepEmptyParts=
false);
129[[nodiscard]]
inline std::vector<string> splitRegex(
const string_view &s,
const string_view ®ex,
bool keepEmptyParts=
false) {
return toStringList(splitViewRegex(s,regex,keepEmptyParts)); }
132[[nodiscard]]
BASE_EXPORT string_view matchViewRegex(
const string_view &s,
const string_view ®ex,string::size_type start=0);
133[[nodiscard]]
inline string matchRegex(
const string_view &s,
const string_view ®ex,string::size_type start=0) {
return tostring(matchViewRegex(s,regex,start)); }
134[[nodiscard]]
BASE_EXPORT string replaceRegex(
const string &s,
const string_view ®ex,
const string &after);
135[[nodiscard]]
BASE_EXPORT string::size_type find(
const string_view &s1,
const string_view &s2,string::size_type start=0,
bool caseSensitive=
false);
136[[nodiscard]]
BASE_EXPORT string::size_type findRegex(
const string_view &s,
const string_view ®ex,string::size_type start=0);
137[[nodiscard]]
BASE_EXPORT bool exactMatchRegex(
const string_view &s,
const string_view ®ex);
140[[nodiscard]]
BASE_EXPORT string_view trimmed_view(
const string_view &s);
141[[nodiscard]]
inline string trimmed(
const string_view &s) {
return string(trimmed_view(s)); }
142[[nodiscard]]
BASE_EXPORT string simplified(
const string_view &s);
143[[nodiscard]]
BASE_EXPORT string replace(
string s,
const string_view &sub,
const string_view &newsub,
bool caseSensitive=
false);
144[[nodiscard]]
BASE_EXPORT string cleanupTypename(
const char *name);
145[[nodiscard]]
BASE_EXPORT string remove(
string s,
char c);
146[[nodiscard]]
inline string remove(
string s,
const string_view &sub,
bool caseSensitive=
false) {
return replace(s,sub,{},caseSensitive); }
147[[nodiscard]]
BASE_EXPORT string remove(
string s,string::size_type start,string::size_type len);
148[[nodiscard]]
inline string_view chopped(
const string_view &s,string::size_type i) {
if (i>=s.size())
return {};
return s.substr(0,s.length()-i); }
149[[nodiscard]]
BASE_EXPORT string clip(
const string_view &s,string::size_type n);
150[[nodiscard]]
BASE_EXPORT string enquoteString(
const string &s,
char quote=
'"');
151[[nodiscard]]
BASE_EXPORT string_view substr(
const string_view &s,string::size_type pos,string::size_type count=string::npos);
152[[nodiscard]]
inline string_view right(
const string_view &s,string::size_type num) {
return num >= s.length() ? s : s.substr(s.length()-num,num); }
153[[nodiscard]]
BASE_EXPORT string buildRandom(string::size_type length);
156[[nodiscard]]
BASE_EXPORT int32 compare(
const string_view &s1,
const string_view &s2,
bool caseSensitive=
false);
157[[nodiscard]]
inline bool equal(
const string_view &s,
const string_view &c,
bool caseSensitive=
false) {
return compare(s,c,caseSensitive)==0; }
158[[nodiscard]]
BASE_EXPORT bool startsWith(
const string_view &in,
const string_view &check,
bool caseSensitive =
false);
159[[nodiscard]]
BASE_EXPORT bool endsWith(
const string_view &in,
const string_view &check,
bool caseSensitive =
false);
160[[nodiscard]]
BASE_EXPORT bool contains(
const string_view &in,
const string_view &check,
bool caseSensitive =
false);
161[[nodiscard]]
inline bool containsRegex(
const string_view &in,
const string_view ®ex) {
return findRegex(in,regex)!=string::npos; }
162[[nodiscard]]
BASE_EXPORT bool wildcardMatch(
const string_view &patter,
const string_view &test);
163[[nodiscard]]
BASE_EXPORT uint64 firstNonBlankCharacter(
const string_view &s);
166[[nodiscard]]
BASE_EXPORT string formatBytes(uint64 bytes,uint32 precision=3);
173 using std::vector<
char>::vector;
174 Buffer(
const std::vector<char> &v) : std::vector<char>(v) {}
175 Buffer(std::vector<char> &&v) : std::vector<char>(std::move(v)) {}
176 Buffer(
const char *c,
size_t len) : std::vector<char>(c, c+len) {}
177 explicit Buffer(
const string &s) : std::vector<char>(s.begin(),s.end()) {}
179 const Buffer &operator=(
const std::vector<char> &v) { std::vector<char>::operator=(v);
return *
this; }
180 const Buffer &operator=(std::vector<char> &&v) { std::vector<char>::operator=(std::move(v));
return *
this; }
182 void append(
const char *data, uint64 len) { insert(end(),data, data+len); }
183 void operator+=(
const string &s) { insert(end(),s.begin(),s.end()); }
184 void operator+=(
const Buffer &s) { insert(end(),s.begin(),s.end()); }
185 string toString()
const {
return string(begin(), end()); }
186 string_view toStringView()
const {
return string_view(begin(),end()); }
187 const char *constData()
const {
return data(); }
200BASE_EXPORT bool match(
const string &keyword,
const string &token,
bool forceAbbreviationsAllowed=
false);
206inline string getKeyword(
const string &keywords,
const uint64 index,
const string &def={}) {
return getKeyword(split(keywords,
","),index,def); }
210BASE_EXPORT string buildFormat(int64 width,
char notation=
'\0',
int precision=-1,
char fill=
' ');
218 inline string ts(
const T &t,
int width=0,
char notation =
'\0',
int precision = -1,
char fill =
' ');
224 template <
typename T>
225 std::tuple<T, bool> fsTest(
const string_view &) {
static_assert(
sizeof(T{})==0);
return {T{},
false}; }
226 template<>
inline std::tuple<int32, bool> fsTest(
const string_view &in) {
return isInt32v(in); }
227 template<>
inline std::tuple<uint32, bool> fsTest(
const string_view &in) {
return isUInt32v(in); }
228 template<>
inline std::tuple<int64, bool> fsTest(
const string_view &in) {
return isInt64v(in); }
229 template<>
inline std::tuple<uint64, bool> fsTest(
const string_view &in) {
return isUInt64v(in); }
230 template<>
inline std::tuple<double, bool> fsTest(
const string_view &in) {
return isDoublev(in); }
231 template<>
inline std::tuple<bool, bool> fsTest(
const string_view &in) {
return isBoolv(in); }
232 template<>
inline std::tuple<string, bool> fsTest(
const string_view &in) {
return {string(in),
true}; }
234 template <
typename T> T fs(
const string_view &, [[maybe_unused]]
bool throwException =
false) {
static_assert(
sizeof(T{})==0);
return T{}; }
235 template<>
inline int32 fs(
const string_view &in,
bool throwException) {
return toInt32(in,throwException); }
236 template<>
inline uint32 fs(
const string_view &in,
bool throwException) {
return toUInt32(in,throwException); }
237 template<>
inline int64 fs(
const string_view &in,
bool throwException) {
return toInt64(in,throwException); }
238 template<>
inline uint64 fs(
const string_view &in,
bool throwException) {
return toUInt64(in,throwException); }
239 template<>
inline double fs(
const string_view &in,
bool throwException) {
return toDouble(in,throwException); }
240 template<>
inline bool fs(
const string_view &in,
bool throwException) {
return toBool(in,
"on,off,true,false,yes,no",throwException); }
241 template<>
inline string fs(
const string_view &in,
bool) {
return {string(in),
true}; }
247 bool operator()(
const string_view &left,
const string_view &right)
const {
return compare(left,right) < 0; }
251 bool operator()(
const string_view &left,
const string_view &right)
const {
return compare(left,right) == 0; }
255 uint64 operator()(
const string_view &in)
const {
return caseInsensitiveHash(in); }
265#include <unordered_map>
267#include <unordered_set>
269template <
typename T>
using StringMap = std::map<string, T, StringCILess>;
271template <
typename T>
using StringMultiMap = std::multimap<string, T, StringCILess>;
273template <
typename T>
using StringHashMap = std::unordered_map<string, T, StringCIHash, StringCIEqual>;
275using StringSet = std::set<string, StringCILess>;
277using StringHashSet = std::unordered_set<string, StringCIHash, StringCIEqual>;
280inline string base::ts(
const T &t,
int width,
char,
int ,
char fill) {
281 string s = rformat(buildFormat(width,
'\0', -1, fill), t);
283 return clip(s,std::abs(width));
288inline string base::ts(
const string &s,
int width,
char,
int,
char fill) {
289 string ret = rformat(buildFormat(width,
'\0',-1,fill),s);
291 return clip(ret,std::abs(width));
299inline string base::ts(
const double &dIn,
int width,
char notation,
int precision,
char fill) {
303 return rformat(buildFormat(width, notation, precision, fill),d);
307inline string base::ts(
const float &dIn,
int width,
char notation,
int precision,
char fill) {
311 return rformat(buildFormat(width, notation, precision, fill),d);
313template <
typename T,
typename U>
314T join(
const std::vector<T> &s,
const U &sep) {
316 for (StringList::size_type i=0;i<s.size();++i) {
324using StateInfoOutput = StringMap<StringList>;
330template <
typename T,
typename ... Args>
331T toStringConv(
const string_view &in,Args...args,
bool te, std::tuple<T,bool> (*f)(
const string_view &,Args...)) {
332 auto [val, ok] = f(in,args...);
333 if (te==
true && ok==
false)
335 throw std::runtime_error(
"String conversion error.");
337 throw std::exception(
"String conversion error.");
342template <
class ... Args>
343struct FormatCheck :
public std::format_string<std::type_identity_t<Args>...> {
344 template <
unsigned N>
345 consteval FormatCheck(
const char (&s)[N]) : std::format_string<std::type_identity_t<Args>...>(s) {
346 for (
auto i=&(s[0]);i!=&(s[N]);++i) {
349 if (i==&(s[N]))
break;
350 }
else if (*i==
'%') {
354 if (*i >=
'1' and *i <=
'9')
355 assert(0 &&
"%1, %2 etc. token replacement is no longer supported. Use std::format {} syntax.");
363struct std::formatter<
StringList> :
public std::formatter<string> {
364 template <
typename ParseContext>
365 constexpr auto parse(ParseContext &ctx) {
return std::formatter<string>::parse(ctx); }
367 template <
typename FormatContext>
368 constexpr auto format(
StringList const &val, FormatContext &ctx)
const {
369 return std::formatter<string>::format(join(val,
","), ctx);
Base type definitions for the engine.
Definition basestring.h:171
Definition basestring.h:71
BASE_EXPORT std::tuple< double, bool > isDouble(const string_view &in)
This is an overloaded member function, provided for convenience. It differs from the above function o...
Definition basestring.cpp:61
BASE_EXPORT std::tuple< uint64, bool > isUInt64(const string_view &in)
This is an overloaded member function, provided for convenience. It differs from the above function o...
Definition basestring.cpp:52
BASE_EXPORT std::tuple< uint32, bool > isUInt32(const string_view &in)
This is an overloaded member function, provided for convenience. It differs from the above function o...
Definition basestring.cpp:34
#define BASE_EXPORT
Definition basedef.h:25
BASE_EXPORT bool match(const string &keyword, const string &token, bool forceAbbreviationsAllowed=false)
**
Definition basestring.cpp:521
BASE_EXPORT std::tuple< int64, bool > isInt64(const string_view &in)
This is an overloaded member function, provided for convenience. It differs from the above function o...
Definition basestring.cpp:43
Definition basestring.h:249
Definition basestring.h:253
Definition basestring.h:245
A overflow checked shorthand for static_cast<T>().