Itasca C++ Interface
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Modules Pages
basestring.h
Go to the documentation of this file.
1 #pragma once
2 
7 #include "basedef.h"
8 #include <string>
9 #include <cctype>
10 #define FMT_API BASE_EXPORT
11 #define FMT_EXTERN_TEMPLATE_API BASE_EXPORT
12 #ifdef _WIN32
13 #include <codeanalysis\warnings.h>
14 #pragma warning(push)
15 #pragma warning ( disable : ALL_CODE_ANALYSIS_WARNINGS )
16 #endif
17 #ifdef INTELCOMP
18 # pragma warning(disable:177)
19 # pragma warning(disable:280) // selector expression is constant
20 #endif
21 #include "base/fmt/format.h"
22 #pragma warning(pop)
23 using wstring = std::wstring; // Old string class to avoid interface compatibility breaks
24 using string = std::string; // Bring into global namespace like the other base types (uint32, etc)
25 using String = std::wstring; // DEPRECATED - should not be used in new code.
26 
27 BASE_EXPORT bool isInt(const string &in,int32 *i=nullptr);
28 BASE_EXPORT bool isUInt(const string &in,uint32 *u=nullptr);
29 BASE_EXPORT bool isLong(const string &in,int64 *l=nullptr);
30 BASE_EXPORT bool isULong(const string &in,uint64 *ul=nullptr);
31 BASE_EXPORT bool isDouble(const string &in,double *d=nullptr);
32 BASE_EXPORT bool isBool(const string &in,bool *b=nullptr,const string &out="on,off,true,false,yes,no");
33 
34 inline int32 toInt(const string &in) { int32 ret(0); isInt(in, &ret); return ret; }
35 inline uint32 toUInt(const string &in) { uint32 ret(0); isUInt(in, &ret); return ret; }
36 inline int64 toLong(const string &in) { int64 ret(0); isLong(in, &ret); return ret; };
37 inline uint64 toULong(const string &in) { uint64 ret(0); isULong(in, &ret); return ret; };
38 inline double toDouble(const string &in) { double ret(0); isDouble(in, &ret); return ret; };
39 inline bool toBool(const string &in, const string &out = "on,off,true,false,yes,no") { bool b{false}; isBool(in, &b, out); return b; }
40 
41 class StringList : public std::vector<string> {
42 public:
43  using std::vector<string>::vector;
44 
45  StringList() {}
46  StringList(std::initializer_list<string> list) : std::vector<string>(list) {}
47  StringList(const StringList &s) : std::vector<string>(s) {}
48  StringList(const std::vector<string> &v) : std::vector<string>(v) {}
49  StringList(StringList &&v) noexcept : std::vector<string>(std::move(v)) {}
50  StringList(std::vector<string> &&v) noexcept : std::vector<string>(std::move(v)) {}
51 
52  const StringList &operator=(const StringList &in) { std::vector<string>::operator=(in); return *this; }
53 
54  const StringList &operator+=(const string &s) { push_back(s); return *this; }
55  const StringList &operator+=(const std::vector<string> &v) { for (auto &s : v) push_back(s); return *this; }
56  const StringList &operator<<(const string &s) { return operator+=(s); }
57  StringList operator+(const StringList &s) const { StringList ret(*this); ret += s; return ret; }
58 };
59 
60 //BASE_EXPORT string tostd::string(const std::u16string &s);
61 BASE_EXPORT string tostring(const std::wstring &s);
62 BASE_EXPORT std::wstring towstring(const string &s);
63 BASE_EXPORT int32 caseInsensitiveCompare(const string &s1, const string &s2);
64 BASE_EXPORT string toUpper(const string &s);
65 BASE_EXPORT string toLower(const string &s);
66 BASE_EXPORT string join(const std::vector<string> &s,const string &sep);
67 BASE_EXPORT std::vector<string> split(const string &s, const string &sep,bool keepEmptyParts=false);
68 BASE_EXPORT string trimmed(const string &s); // Remove whitespace at beginning and end
69 
70 // < and == functors for strings - to use in std containers when CI comparisons are wanted!
71 struct StringCILess {
72 public:
73  bool operator()(const string &left, const string &right) const {
74  return caseInsensitiveCompare(left,right) < 0;
75  }
76 };
77 struct StringCIEqual {
78 public:
79  bool operator()(const string &left, const string &right) const {
80  return caseInsensitiveCompare(left,right) == 0;
81  }
82 };
83 struct StringCIHash {
84 public:
85  uint32 operator()(const string &in) const {
86  uint32 h = 0;
87  auto len = in.size();
88  auto *p = in.data();
89  for (size_t i = 0; i<len; ++i)
90  h = 31 * h + std::toupper(p[i]);
91  return h;
92  }
93 };
94 
95 // Might want to move this to a dedicated header so not everybody has to include these containers
96 
97 #include <map>
98 #include <unordered_map>
99 #include <set>
100 #include <unordered_set>
101 
102 template <typename T> using StringMap = std::map<string, T, StringCILess>;
103 
104 template <typename T> using StringHashMap = std::unordered_map<string, T, StringCIHash, StringCIEqual>;
105 
106 template <typename T> using StringSet = std::set<string, T, StringCILess>;
107 
108 template <typename T> using StringHashSet = std::unordered_set<string, T, StringCIHash, StringCIEqual>;
109 
111 
112 // EoF
Definition: basestring.h:71
Definition: basestring.h:77
BASE_EXPORT bool isDouble(const string &in, double *d=nullptr)
Definition: basestring.cpp:71
BASE_EXPORT bool isLong(const string &in, int64 *l=nullptr)
Definition: basestring.cpp:41
double toDouble(const string &in)
Definition: basestring.h:38
bool isInt(const QString &in, int *i)
Definition: baseqstring.cpp:298
#define BASE_EXPORT
Definition: basedef.h:21
uint32 toUInt(const string &in)
Definition: basestring.h:35
BASE_EXPORT bool isUInt(const string &in, uint32 *u=nullptr)
Definition: basestring.cpp:26
bool toBool(const string &in, const string &out="on,off,true,false,yes,no")
Definition: basestring.h:39
Definition: basestring.h:83
Definition: basestring.h:41
Base type definitions - if QT is not in use.
bool isBool(const QString &in, bool *b, const QString &out)
Definition: baseqstring.cpp:284
uint64 toULong(const string &in)
Definition: basestring.h:37
BASE_EXPORT bool isULong(const string &in, uint64 *ul=nullptr)
Definition: basestring.cpp:56