1#ifndef SimTK_SimTKCOMMON_STRING_H_
2#define SimTK_SimTKCOMMON_STRING_H_
41#pragma warning(disable:4996)
46template <
class N>
class negator;
47template <
class R>
class conjugate;
73String(
const char* s) : std::string(s) { }
76explicit String(
char c) {push_back(c);}
79String(
const std::string& s) : std::string(s) { }
83String(
const String& s,
int start,
int len) : std::string(s,start,len) { }
87operator const char*()
const {
return c_str(); }
92 return std::string::operator[]((std::string::size_type)i);
98 return std::string::operator[]((std::string::size_type)i);
102char&
operator[](std::string::size_type i) {
return std::string::operator[](i);}
104char operator[](std::string::size_type i)
const {
return std::string::operator[](i);}
108int size()
const {
return (
int)std::string::size();}
112int length()
const {
return (
int)std::string::length();}
122explicit String(
int i,
const char* fmt=
"%d")
123{
const int n=32;
char buf[n]; snprintf(buf,n,fmt,i); (*this)=buf; }
125explicit String(
long i,
const char* fmt=
"%ld")
126{
const int n=64;
char buf[n]; snprintf(buf,n,fmt,i); (*this)=buf; }
128explicit String(
long long i,
const char* fmt=
"%lld")
129{
const int n=64;
char buf[n]; snprintf(buf,n,fmt,i); (*this)=buf; }
131explicit String(
unsigned int s,
const char* fmt=
"%u")
132{
const int n=32;
char buf[n]; snprintf(buf,n,fmt,s); (*this)=buf; }
134explicit String(
unsigned long s,
const char* fmt=
"%lu")
135{
const int n=64;
char buf[n]; snprintf(buf,n,fmt,s); (*this)=buf; }
137explicit String(
unsigned long long s,
const char* fmt=
"%llu")
138{
const int n=64;
char buf[n]; snprintf(buf,n,fmt,s); (*this)=buf; }
155explicit String(std::complex<float> r,
const char* fmt=
"%.9g")
156{ (*this)=
"(" +
String(r.real(),fmt) +
"," +
String(r.imag(),fmt) +
")"; }
160explicit String(std::complex<double> r,
const char* fmt=
"%.17g")
161{ (*this)=
"(" +
String(r.real(),fmt) +
"," +
String(r.imag(),fmt) +
")"; }
165explicit String(
bool b) : std::string(b?
"true":
"false") { }
173template <
class T>
inline explicit
185template <
class T>
inline explicit
186String(
const T& t,
int precision);
190template <
class T>
explicit
197 new (
this)
String(T(nt), fmt);
202template <
class T>
explicit
204 new (
this)
String(std::complex<T>(ct));
209 new (
this)
String(std::complex<T>(ct), fmt);
245template <
class T>
inline bool tryConvertTo(T& out)
const;
253template <
class T>
inline void convertTo(T& out)
const;
262{ T temp; convertTo<T>(temp);
return temp; }
337template <
class T>
inline
338auto stringStreamInsertHelper(std::ostringstream& os,
const T& t,
bool)
339 ->
decltype(
static_cast<std::ostringstream&
>(os << t)) {
345template <
class T>
inline
346auto stringStreamInsertHelper(std::ostringstream& os,
const T& t,
int)
347 -> std::ostringstream& {
349 "Type T=%s has no stream insertion operator<<(T) and there "
350 "is no specialized String(T) constructor.",
355template <
class T>
inline
356auto stringStreamExtractHelper(std::istringstream& is, T& t,
bool)
357 ->
decltype(
static_cast<std::istringstream&
>(is >> t)) {
362template <
class T>
inline
363auto stringStreamExtractHelper(std::istringstream& is, T& t,
int)
364 -> std::istringstream& {
366 "String::tryConvertTo<T>()",
367 "Type T=%s has no stream extraction operator>>(T) and there "
368 "is no specialized tryConvertTo<T>() constructor.",
376template <
class T>
inline
378 std::ostringstream os;
379 *
this = stringStreamInsertHelper(os, t,
true).str();
387template <
class T>
inline
389 std::ostringstream os;
394 os << std::setprecision(precision);
395 *
this = stringStreamInsertHelper(os, t,
true).str();
403template <
class T>
inline static
405 std::istringstream sstream(value);
406 stringStreamExtractHelper(sstream, out,
true);
407 if (sstream.fail())
return false;
408 if (sstream.eof())
return true;
412 return sstream.eof();
437{ out = value;
return true; }
442{ out = value;
return true; }
445template <
class T>
inline
454template <
class T>
inline
456 std::complex<T> cmplx;
465template<
class T>
inline static
468 "Can't interpret a string as a pointer (%s*).",
473template <
class T>
inline bool
477template <
class T>
inline void
479 const int MaxStr = 50;
480 const bool convertOK = tryConvertTo<T>(out);
481 if (convertOK)
return;
485 String shorter = this->substr(0, MaxStr);
486 if (shorter.
size() < this->size()) shorter +=
" ...";
488 "Couldn't interpret string '%s' as type T=%s.",
503template <
class T>
inline static
517template <
class T>
inline static
This file contains macros which are convenient to use for sprinkling error checking around liberally ...
#define SimTK_ERRCHK2_ALWAYS(cond, whereChecked, fmt, a1, a2)
Definition ExceptionMacros.h:289
#define SimTK_ERRCHK1_ALWAYS(cond, whereChecked, fmt, a1)
Definition ExceptionMacros.h:285
This is a user-includable header which includes everything needed to make use of SimMatrix Scalar cod...
Mandatory first inclusion for any Simbody source or header file.
#define SimTK_SimTKCOMMON_EXPORT
Definition SimTKcommon/include/SimTKcommon/internal/common.h:224
SimTK::String is a plug-compatible std::string replacement (plus some additional functionality) inten...
Definition String.h:64
char operator[](std::string::size_type i) const
Pass through to string::operator[].
Definition String.h:104
int size() const
Override std::string size() method to return an int instead of the inconvenient unsigned type size_ty...
Definition String.h:108
static String toLower(const std::string &in)
Downshift the given std::string returning a new SimTK::String in which all the letters have be made l...
Definition String.h:317
String(const char *s)
This is an implicit conversion from const char* to String.
Definition String.h:73
String(const conjugate< T > &ct)
Constructing a String from a conjugate value converts to the underlying complex type and then uses on...
Definition String.h:203
static void convertStringTo(const String &in, T &out)
This method converts its String argument to type T and returns it into the variable supplied as its s...
Definition String.h:504
String(const negator< T > &nt, const char *fmt)
Same, but allows for format specification.
Definition String.h:196
String(const negator< T > &nt)
Constructing a String from a negated value converts to the underlying native type and then uses one o...
Definition String.h:191
String(unsigned long s, const char *fmt="%lu")
Format an unsigned long as a printable String.
Definition String.h:134
String(char c)
We allow creating a String from a char but you have to do it explicitly.
Definition String.h:76
String(const conjugate< T > &ct, const char *fmt)
Same, but allows for format specification.
Definition String.h:208
String & toLower()
Downshift the given String in place, so that uppercase letters are replaced with their lowercase equi...
String(long long i, const char *fmt="%lld")
Format a long long as a printable String.
Definition String.h:128
String(std::complex< float > r, const char *fmt="%.9g")
Format a complex<float> as a printable String (real,imag) with parentheses and a comma as shown.
Definition String.h:155
String()
Default constructor produces an empty string.
Definition String.h:68
String & toUpper()
Upshift the given String in place, so that lowercase letters are replaced with their uppercase equiva...
bool tryConvertToDouble(double &out) const
Special-purpose method for interpreting this String as a double.
String(unsigned int s, const char *fmt="%u")
Format an unsigned int as a printable String.
Definition String.h:131
static T convertStringTo(const String &in)
This method converts its String argument to type T and returns it as its function value; this is part...
Definition String.h:518
int length() const
Override std::string length() method to return an int instead of the inconvenient unsigned type size_...
Definition String.h:112
String(float r, const char *fmt="%.9g")
Format a float as a printable String.
String(const String &s, int start, int len)
Construct a String as a copy of a substring beginning at position start with length len.
Definition String.h:83
String(double r, const char *fmt="%.17g")
Format a double as a printable String.
String(std::complex< double > r, const char *fmt="%.17g")
Format a complex<double> as a printable String (real,imag) with parentheses and a comma as shown.
Definition String.h:160
char & operator[](int i)
Add operator[] that takes int index instead of size_type.
Definition String.h:90
String(const std::string &s)
This is an implicit conversion from std::string to String.
Definition String.h:79
String & replaceAllChar(const std::string &in, char oldChar, char newChar)
Copy the input std::string to a new SimTK::String while substituting newChar for oldChar wherever old...
Definition String.h:326
bool tryConvertToBool(bool &out) const
Special-purpose method for interpreting this String as a bool.
String & trimWhiteSpace()
Trim this String in place, removing all the initial leading and trailing white space,...
bool tryConvertTo(T &out) const
Attempt to convert this String to an object of type T, returning a status value to indicate success o...
Definition String.h:474
static String trimWhiteSpace(const std::string &in)
Copy the input std::string to a new SimTK::String leaving off all the initial leading and trailing wh...
String(int i, const char *fmt="%d")
Format an int as a printable String.
Definition String.h:122
String & replaceAllChar(char oldChar, char newChar)
Substitute in place newChar for oldChar wherever oldChar appears in this String.
char & operator[](std::string::size_type i)
Pass through to string::operator[].
Definition String.h:102
String(long i, const char *fmt="%ld")
Format a long as a printable String.
Definition String.h:125
static String toUpper(const std::string &in)
Upshift the given std::string returning a new SimTK::String in which all the letters have been made u...
Definition String.h:313
T convertTo() const
A more convenient form of convertTo<T>() that returns the result as its function argument,...
Definition String.h:261
void convertTo(T &out) const
Convert this String to an object of type T using the tryConvertTo<T>() method but throwing an error o...
Definition String.h:478
String(unsigned long long s, const char *fmt="%llu")
Format an unsigned long long as a printable String.
Definition String.h:137
bool tryConvertToFloat(float &out) const
Special-purpose method for interpreting this String as a float.
String(bool b)
Format a bool as a printable String "true" or "false"; if you want "1" or "0" cast the bool to an int...
Definition String.h:165
char operator[](int i) const
Add operator[] that takes int index instead of size_type.
Definition String.h:96
SimTK::conjugate<R> should be instantiated only for float, double.
Definition conjugate.h:178
negator<N>, where N is a number type (real, complex, conjugate), is represented in memory identically...
Definition negator.h:75
constexpr int LosslessNumDigitsReal
This is the smallest number of decimal digits you should store in a text file if you want to be able ...
Definition Scalar.h:136
This is the top-level SimTK namespace into which all SimTK names are placed to avoid collision with o...
Definition Assembler.h:37
static bool tryConvertStringTo(const String &value, T &out)
Definition String.h:404
Obtain human-readable and XML-usable names for arbitrarily-complicated C++ types.
Definition SimTKcommon/include/SimTKcommon/internal/common.h:881
static const std::string & namestr()
The default implementation of namestr() attempts to return a nicely demangled and canonicalized type ...
Definition SimTKcommon/include/SimTKcommon/internal/common.h:890