Itasca C++ Interface
baseqstring.h
1 #pragma once
9 #include "basetoqt.h"
10 #include "basestring.h"
11 
12 //#include <xfunctional>
13 
24 BASE_EXPORT QString toQString(const QString &s,int width=0,char fill=' ');
25 BASE_EXPORT QString toQString(const char *str,int width=0,char fill=' ');
26 BASE_EXPORT QString toQString(const qint8 &v,int width=0,char fill=' ');
27 BASE_EXPORT QString toQString(const quint8 &v,int width=0,char fill=' ');
28 BASE_EXPORT QString toQString(const qint16 &v,int width=0,char fill=' ');
29 BASE_EXPORT QString toQString(const quint16 &v,int width=0,char fill=' ');
30 BASE_EXPORT QString toQString(const qint32 &v,int width=0,char fill=' ');
31 BASE_EXPORT QString toQString(const quint32 &v,int width=0,char fill=' ');
32 BASE_EXPORT QString toQString(const qint64 &v,int width=0,char fill=' ');
33 BASE_EXPORT QString toQString(const quint64 &v,int width=0,char fill=' ');
34 BASE_EXPORT QString toQString(const wstring &v,int width,char fill=' ');
35 BASE_EXPORT QString toQString(const string &v, int width, char fill = ' ');
36 BASE_EXPORT QString toQString(const float & v,int width=0,char format='g',int precision=-1,char fill=' ');
37 BASE_EXPORT QString toQString(const double &v,int width=0,char format='g',int precision=-1,char fill=' ');
38 BASE_EXPORT QString toQString(const SymTensor &v,int width=0,char format='g',int precision=-1,char fill=' ');
39 BASE_EXPORT QString toQString(const QVariant &v,int width=0,char fill=' ',char format='g',int precision=-1);
41 BASE_EXPORT QString toQString(const void *v,int width=0,char fill=' ');
44 BASE_EXPORT QString toQString(bool b,const QString &out="on,off",int width=0,char fill=' ');
45 
46 
47 // Template version of toQString, that uses the same argument list
48 template <class T>
49 QString toQStringT(const T &t,int width=0,char fill=' ',[[maybe_unused]] char format='g',
50  [[maybe_unused]] int precision=-1) {
51  return toQString(t,width,fill);
52 }
53 template <>
54 inline QString toQStringT(const float &t,int width,char fill,char format,int precision) {
55  return toQString(t,width,format,precision,fill);
56 }
57 template <>
58 inline QString toQStringT(const double &t,int width,char fill,char format,int precision) {
59  return toQString(t,width,format,precision,fill);
60 }
61 template <>
62 inline QString toQStringT(const QVariant &t,int width,char fill,char format,int precision) {
63  return toQString(t,width,fill,format,precision);
64 }
65 template <>
66 inline QString toQStringT(const bool &b,int width,char fill,[[maybe_unused]] char format,
67  [[maybe_unused]] int precision) {
68  return toQString(b,"on,off",width,fill);
69 }
70 
74 template <class T> inline QString toQString(const Vector2<T> &v,int width=0,char fmt='g',int prec=-1,char fill=' ') {
75  QString s("(%1,%2)");
76  int w = (std::abs(width) - 3) / 2;
77  if (width<0) w = -1;
78  s = s.arg(toQStringT(v.x(),w,fill,fmt,prec));
79  s = s.arg(toQStringT(v.y(),w,fill,fmt,prec));
80  return s;
81 }
85 template <class T> inline QString toQString(const Vector3<T> &v,int width=0,char fmt='g',int prec=-1,char fill=' ') {
86  QString s("(%1,%2,%3)");
87  int w = (std::abs(width) - 4) / 3;
88  if (width<0) w = -1;
89  s = s.arg(toQStringT(v.x(),w,fill,fmt,prec));
90  s = s.arg(toQStringT(v.y(),w,fill,fmt,prec));
91  s = s.arg(toQStringT(v.z(),w,fill,fmt,prec));
92  return s;
93 }
94 
98 template <class T> inline QString toQString(const AVector2<T> &v,int width=0,char fmt='g',int prec=-1,char fill=' ') {
99  QString s("(%1)");
100  int w = (std::abs(width) - 3) / 2;
101  if (width<0) w = -1;
102  s = s.arg(toQStringT(v.z(),w,fill,fmt,prec));
103  return s;
104 }
108 template <class T> inline QString toQString(const AVector3<T> &v,int width=0,char fmt='g',int prec=-1,char fill=' ') {
109  QString s("(%1,%2,%3)");
110  int w = (std::abs(width) - 4) / 3;
111  if (width<0) w = -1;
112  s = s.arg(toQStringT(v.x(),w,fill,fmt,prec));
113  s = s.arg(toQStringT(v.y(),w,fill,fmt,prec));
114  s = s.arg(toQStringT(v.z(),w,fill,fmt,prec));
115  return s;
116 }
117 
118 
123 BASE_EXPORT QString toBytes(const quint64 &ul);
124 inline string tostring(const QString &s) { return s.toStdString(); }
125 inline StringList toStringList(const QStringList &sl);
126 inline QStringList toQStringList(const StringList &sl);
127 inline StringList fromQStringList(const QStringList &sl);
128 inline Buffer toBuffer(const QByteArray &ba);
129 
131 BASE_EXPORT QString readLine(QDataStream &ds,qint64 maxlen=0);
133 BASE_EXPORT QString readWord(QDataStream &ds,qint64 maxlen=0,const QString &separators=" \t\r\n");
134 // Converts the string This is a "test" to "This ia a \"test\""
135 BASE_EXPORT QString enquoteString(const QString &s,QChar quote='"');
136 
137 
142 BASE_EXPORT bool isInt(const QString &in,int *i=0);
143 BASE_EXPORT bool isUInt(const QString &in,uint *u=0);
144 BASE_EXPORT bool isLong(const QString &in,qint64 *l=0);
145 BASE_EXPORT bool isULong(const QString &in,quint64 *ul=0);
146 BASE_EXPORT bool isDouble(const QString &in,double *d=0);
153 BASE_EXPORT bool isBool(const QString &in,bool *b=0,const QString &out="on,off,true,false,yes,no");
157 BASE_EXPORT bool toBool(const QString &in,bool *ok=0,const QString &out="on,off,true,false,yes,no");
159 //inline string toString(const wsString &in) { return in.toStdWString(); }
161 //inline String toString(const std::wstring &in) { return in; }
163 //inline String toString(const string &in) { return QString::fromUtf8(in.c_str()).toStdWString(); }
165 inline QString toQString(const std::wstring &in) { return QString::fromStdWString(in); }
167 inline QString toQString(const string &in) { return QString::fromStdString(in); }
168 // compares two Strings
169 //inline int compare(const String &s1,const String &s2,bool case_sensitive=false) {
170 // if (case_sensitive) return s1.compare(s2);
171 //#ifdef __LINUX
172 // else return wcscasecmp(s1.c_str(),s2.c_str());
173 //#else
174 // else return _wcsicmp(s1.c_str(),s2.c_str());
175 //#endif
176 //}
177 
178 // std::hash interface for QStrings!
179 //namespace std {
180 // template <>
181 // class hash<QString> {
182 // public:
183 // size_t operator()(const QString &s) const { return qHash(s); }
184 // };
185 //}
186 
187 // < and == functors for strings - to use in std containers when CI comparisons are wanted!
189 public:
190  bool operator()(const QString &left, const QString &right) const {
191  return left.compare(right,Qt::CaseInsensitive) < 0;
192  }
193 };
195 public:
196  bool operator()(const QString &left, const QString &right) const {
197  return QString::localeAwareCompare(left,right) < 0;
198  }
199 };
201 public:
202  bool operator()(const QString &left, const QString &right) const {
203  return left.compare(right,Qt::CaseInsensitive) == 0;
204  }
205 };
207 public:
208  uint operator()(const QString &in) const {
209  uint h = 0;
210  int len = in.size();
211  auto *p = in.constData();
212  for (int i = 0; i<len; ++i) {
213  h = 31 * h + p[i].toUpper().unicode();
214  }
215  return h;
216  }
217 };
218 
219 
220 template <typename T> using QStringMap = std::map<QString, T, QStringCILess2>;
221 
222 template <typename T> using QStringHashMap = std::unordered_map<QString, T, QStringCIHash2, QStringCIEqual2>;
223 
224 using QStringSet = std::set<QString,QStringCILess2>;
225 
226 using QStringHashSet = std::unordered_set<QString, QStringCIHash2, QStringCIEqual2>;
227 
228 inline StringList toStringList(const QStringList &qsl) {
229  StringList sl;
230  for (auto &s : qsl)
231  sl.push_back(s.toStdString());
232  return sl;
233 }
234 
235 inline QStringList toQStringList(const StringList &sl) {
236  QStringList qsl;
237  for (auto &s : sl)
238  qsl.push_back(QString::fromStdString(s));
239  return qsl;
240 }
241 
242 inline StringList fromQStringList(const QStringList &qsl) {
243  StringList sl;
244  for (auto &qs : qsl)
245  sl.push_back(qs.toStdString());
246  return sl;
247 }
248 
249 inline Buffer toBuffer(const QByteArray &ba) {
250  Buffer buf; buf.reserve(ba.size());
251  buf.insert(buf.end(),ba.begin(), ba.end());
252  return buf;
253 }
254 
255 // This allows you to send QStrings to a fmt::format
256 template <>
257 struct fmt::formatter<QString> : public fmt::formatter<string> {
258  template <typename ParseContext>
259  constexpr auto parse(ParseContext &ctx) { return fmt::formatter<string>::parse(ctx); }
260 
261  template <typename FormatContext>
262  auto format(QString const &val, FormatContext &ctx) {
263  return fmt::formatter<string>::format(val.toStdString(), ctx);
264  }
265 };
266 
267 // For the model information system
268 using StateInfoOutput = QStringMap<QStringList>;
269 
271  StateInfoGroup() { clear(); }
272  StateInfoGroup(const StateInfoGroup& vt) { StateInfoGroup::operator= (vt); }
273  const StateInfoGroup& operator=(const StateInfoGroup& vt) {
274  groups_ = vt.groups_;
275  return *this;
276  }
277 
278  std::vector<std::unordered_map<IString,int>> groups_;
279  int doneGroup_ = 0;
280  void clear() { groups_.clear(); doneGroup_ = 0; groups_.resize(128); }
281  void update(const std::vector<std::pair<int,IString>> &gi) {
282  for (auto &v: gi) {
283  doneGroup_ += 1;
284  groups_[v.first][v.second] += 1;
285  }
286  }
287  void reconcile(const StateInfoGroup &other) {
288  doneGroup_ += other.doneGroup_;
289  for (int j=0; j<(int)other.groups_.size(); ++j) {
290  for (auto &v: other.groups_[j])
291  groups_[j][v.first] += v.second;
292  }
293  }
294  int slotsUsed() const {
295  int ret = 0;
296  for (auto &v: groups_)
297  if (v.size())
298  ++ret;
299  return ret;
300  }
301 };
302 
304  std::vector<std::pair<double,quint64>> lvals_, hvals_;
305  StateInfoValues() {}
306  StateInfoValues(const StateInfoGroup& vt) { StateInfoValues::operator=(vt); }
307  const StateInfoValues& operator=(const StateInfoValues& vt) {
308  lvals_ = vt.lvals_;
309  hvals_ = vt.hvals_;
310  return *this;
311  }
312  void clear() { lvals_.clear(); hvals_.clear(); }
313  void initialize(const std::vector<double> &cval,quint64 id) {
314  for (auto &v: cval) {
315  lvals_.push_back({v,id});
316  hvals_.push_back({v,id});
317  }
318  }
319  void update(const std::vector<double> &cval,quint64 id) {
320  for (int i=0; i<(int)cval.size(); ++i) {
321  if (cval[i] < lvals_[i].first)
322  lvals_[i] = {cval[i],id};
323  else if (cval[i] > hvals_[i].first)
324  hvals_[i] = {cval[i],id};
325  }
326  }
327  void reconcile(const StateInfoValues &cval) {
328  for (int i=0; i<(int)cval.lvals_.size(); ++i) {
329  if (cval.lvals_[i].first < lvals_[i].first)
330  lvals_[i] = cval.lvals_[i];
331  if (cval.hvals_[i].first > hvals_[i].first)
332  hvals_[i] = cval.hvals_[i];
333  }
334  }
335 };
336 // EOF
337 
338 using QSL = QStringList;
339 
340 template <typename T>
341 QString QSN(const T &t) { return toQString(t); }
342 
343 // macro for converting integers to numbers with thousands separators
344 template <typename T>
345 QString NUMSEP(const T &t) { return QString("%L1").arg(t); }
347 // EoF
QString helper functions, plus some additions.
Combines base interface with Qt – allows Qt to interact with other Base types transparently.
2D Angular vector class.
Definition: avect.h:43
const T & z() const
Member access - returns the z component of the 2D angular vector.
Definition: avect.h:70
3D Angular vector class.
Definition: avect.h:176
Definition: basestring.h:134
Definition: basestring.h:77
BASE_EXPORT QString toQString(const QString &s, int width=0, char fill=' ')
Converts from a base type to a QString, using the width and fill character specified.
Definition: baseqstring.cpp:5
BASE_EXPORT QString readWord(QDataStream &ds, qint64 maxlen=0, const QString &separators=" \t\r\n")
Reads a single whitespace delimited word from the QDataStream (since QTextStream is bugged),...
Definition: baseqstring.cpp:340
BASE_EXPORT bool isLong(const QString &in, qint64 *l=0)
This is an overloaded member function, provided for convenience. It differs from the above function o...
Definition: baseqstring.cpp:259
BASE_EXPORT bool isUInt(const QString &in, uint *u=0)
This is an overloaded member function, provided for convenience. It differs from the above function o...
Definition: baseqstring.cpp:252
BASE_EXPORT bool isDouble(const QString &in, double *d=0)
This is an overloaded member function, provided for convenience. It differs from the above function o...
Definition: baseqstring.cpp:273
BASE_EXPORT bool isInt(const QString &in, int *i=0)
Definition: baseqstring.cpp:245
BASE_EXPORT bool isBool(const QString &in, bool *b=0, const QString &out="on,off,true,false,yes,no")
Definition: baseqstring.cpp:231
BASE_EXPORT bool toBool(const QString &in, bool *ok=0, const QString &out="on,off,true,false,yes,no")
Definition: baseqstring.cpp:280
#define BASE_EXPORT
Definition: basedef.h:24
BASE_EXPORT QString readLine(QDataStream &ds, qint64 maxlen=0)
Reads a single QString line from a QDataStream (since QTextStream is bugged), uses '\n' as an end-of-...
Definition: baseqstring.cpp:328
BASE_EXPORT bool isULong(const QString &in, quint64 *ul=0)
This is an overloaded member function, provided for convenience. It differs from the above function o...
Definition: baseqstring.cpp:266
BASE_EXPORT QString toBytes(const quint64 &ul)
Converts number ul into a memory size string.
Definition: baseqstring.h:200
Definition: baseqstring.h:206
Definition: baseqstring.h:188
Definition: baseqstring.h:194
Definition: baseqstring.h:270
Definition: baseqstring.h:303