1 #ifndef SimTK_SimTKCOMMON_STRING_H_ 
    2 #define SimTK_SimTKCOMMON_STRING_H_ 
   40 #pragma warning(disable:4996) 
   47 template <
class N> 
class negator;
 
   48 template <
class R> 
class conjugate;
 
   74 String(
const char* s) : std::string(s) { }
 
   77 explicit String(
char c) {push_back(c);}
 
   80 String(
const std::string& s) : std::string(s) { }
 
   84 String(
const String& s, 
int start, 
int len) : std::string(s,start,len) { }
 
   88 operator const char*() 
const { 
return c_str(); }
 
   93     return std::string::operator[]((std::string::size_type)i);
 
   99     return std::string::operator[]((std::string::size_type)i);
 
  103 char& 
operator[](std::string::size_type i) {
return std::string::operator[](i);}
 
  105 char operator[](std::string::size_type i)
 const {
return std::string::operator[](i);}
 
  109 int size()
 const {
return (
int)std::string::size();}
 
  113 int length()
 const {
return (
int)std::string::length();}
 
  123 explicit String(
int i, 
const char* fmt=
"%d")
 
  124 {   
const int n=32; 
char buf[n]; snprintf(buf,n,fmt,i); (*this)=buf; }
 
  126 explicit String(
long i, 
const char* fmt=
"%ld")
 
  127 {   
const int n=64; 
char buf[n]; snprintf(buf,n,fmt,i); (*this)=buf; }
 
  129 explicit String(
long long i, 
const char* fmt=
"%lld")
 
  130 {   
const int n=64; 
char buf[n]; snprintf(buf,n,fmt,i); (*this)=buf; }
 
  132 explicit String(
unsigned int s, 
const char* fmt=
"%u")
 
  133 {   
const int n=32; 
char buf[n]; snprintf(buf,n,fmt,s); (*this)=buf; }
 
  135 explicit String(
unsigned long s, 
const char* fmt=
"%lu")
 
  136 {   
const int n=64; 
char buf[n]; snprintf(buf,n,fmt,s); (*this)=buf; }
 
  138 explicit String(
unsigned long long s, 
const char* fmt=
"%llu")
 
  139 {   
const int n=64; 
char buf[n]; snprintf(buf,n,fmt,s); (*this)=buf; }
 
  156 explicit String(std::complex<float> r, 
const char* fmt=
"%.9g")
 
  157 {   (*this)=
"(" + 
String(r.real(),fmt) + 
"," + 
String(r.imag(),fmt) + 
")"; }
 
  161 explicit String(std::complex<double> r, 
const char* fmt=
"%.17g")
 
  162 {   (*this)=
"(" + 
String(r.real(),fmt) + 
"," + 
String(r.imag(),fmt) + 
")"; }
 
  166 explicit String(
bool b) : std::string(b?
"true":
"false") { }
 
  174 template <
class T> 
inline explicit 
  186 template <
class T> 
inline explicit 
  187 String(
const T& t, 
int precision);
 
  191 template <
class T> 
explicit 
  198     new (
this) 
String(T(nt), fmt);
 
  203 template <
class T> 
explicit 
  205     new (
this) 
String(std::complex<T>(ct));
 
  210     new (
this) 
String(std::complex<T>(ct), fmt);
 
  246 template <
class T> 
inline bool tryConvertTo(T& out) 
const; 
 
  254 template <
class T> 
inline void convertTo(T& out) 
const; 
 
  263 {   T temp; convertTo<T>(temp); 
return temp; }
 
  315 {   
return String(in).toUpper(); }
 
  319 {   
return String(in).toLower(); }
 
  328 {   
return String(in).replaceAllChar(oldChar, newChar); }
 
  338 template <
class T> 
inline 
  339 auto stringStreamInsertHelper(std::ostringstream& os, 
const T& t, 
bool)
 
  340     -> decltype(
static_cast<std::ostringstream&
>(os << t)) {
 
  346 template <
class T> 
inline 
  347 auto stringStreamInsertHelper(std::ostringstream& os, 
const T& t, 
int)
 
  348                                                     -> std::ostringstream& {
 
  350         "Type T=%s has no stream insertion operator<<(T) and there " 
  351         "is no specialized String(T) constructor.",
 
  356 template <
class T> 
inline 
  357 auto stringStreamExtractHelper(std::istringstream& is, T& t, 
bool)
 
  358     -> decltype(
static_cast<std::istringstream&
>(is >> t)) {
 
  363 template <
class T> 
inline 
  364 auto stringStreamExtractHelper(std::istringstream& is, T& t, 
int)
 
  365                                                     -> std::istringstream& {
 
  367         "String::tryConvertTo<T>()",
 
  368         "Type T=%s has no stream extraction operator>>(T) and there " 
  369         "is no specialized tryConvertTo<T>() constructor.",
 
  377 template <
class T> 
inline 
  379     std::ostringstream os;
 
  380     *
this = stringStreamInsertHelper(os, t, 
true).str();
 
  388 template <
class T> 
inline 
  390     std::ostringstream os;
 
  395     os << std::setprecision(precision);
 
  396     *
this = stringStreamInsertHelper(os, t, 
true).str();
 
  404 template <
class T> 
inline static 
  406     std::istringstream sstream(value);
 
  407     stringStreamExtractHelper(sstream, out, 
true);
 
  408     if (sstream.fail()) 
return false;
 
  409     if (sstream.eof()) 
return true;
 
  413     return sstream.eof();   
 
  438 {   out = value; 
return true; }
 
  443 {   out = value; 
return true; }
 
  446 template <
class T> 
inline 
  455 template <
class T> 
inline 
  457     std::complex<T> cmplx;
 
  466 template<
class T> 
inline static 
  469         "Can't interpret a string as a pointer (%s*).",
 
  474 template <
class T> 
inline bool 
  478 template <
class T> 
inline void 
  480     const int MaxStr = 50;
 
  481     const bool convertOK = tryConvertTo<T>(out);
 
  482     if (convertOK) 
return;
 
  486     String shorter = this->substr(0, MaxStr);
 
  487     if (shorter.
size() < this->size()) shorter += 
" ...";
 
  489         "Couldn't interpret string '%s' as type T=%s.",
 
  504 template <
class T> 
inline static 
  518 template <
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
 
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:65
 
char & operator[](int i)
Add operator[] that takes int index instead of size_type.
Definition: String.h:91
 
char operator[](std::string::size_type i) const
Pass through to string::operator[].
Definition: String.h:105
 
int size() const
Override std::string size() method to return an int instead of the inconvenient unsigned type size_ty...
Definition: String.h:109
 
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:318
 
String(const char *s)
This is an implicit conversion from const char* to String.
Definition: String.h:74
 
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:204
 
String & replaceAllChar(char oldChar, char newChar)
Substitute in place newChar for oldChar wherever oldChar appears in this String.
 
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:505
 
String(const negator< T > &nt, const char *fmt)
Same, but allows for format specification.
Definition: String.h:197
 
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:192
 
String(unsigned long s, const char *fmt="%lu")
Format an unsigned long as a printable String.
Definition: String.h:135
 
String(char c)
We allow creating a String from a char but you have to do it explicitly.
Definition: String.h:77
 
char & operator[](std::string::size_type i)
Pass through to string::operator[].
Definition: String.h:103
 
String(const conjugate< T > &ct, const char *fmt)
Same, but allows for format specification.
Definition: String.h:209
 
String(long long i, const char *fmt="%lld")
Format a long long as a printable String.
Definition: String.h:129
 
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:156
 
String()
Default constructor produces an empty string.
Definition: String.h:69
 
String & toLower()
Downshift the given String in place, so that uppercase letters are replaced with their lowercase equi...
 
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:132
 
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:519
 
int length() const
Override std::string length() method to return an int instead of the inconvenient unsigned type size_...
Definition: String.h:113
 
String(float r, const char *fmt="%.9g")
Format a float as a printable String.
 
String & toUpper()
Upshift the given String in place, so that lowercase letters are replaced with their uppercase equiva...
 
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:84
 
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:161
 
String(const std::string &s)
This is an implicit conversion from std::string to String.
Definition: String.h:80
 
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:475
 
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:123
 
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:327
 
String(long i, const char *fmt="%ld")
Format a long as a printable String.
Definition: String.h:126
 
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:314
 
T convertTo() const
A more convenient form of convertTo<T>() that returns the result as its function argument,...
Definition: String.h:262
 
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:479
 
String(unsigned long long s, const char *fmt="%llu")
Format an unsigned long long as a printable String.
Definition: String.h:138
 
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:166
 
char operator[](int i) const
Add operator[] that takes int index instead of size_type.
Definition: String.h:97
 
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
 
const 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:142
 
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:405
 
Obtain human-readable and XML-usable names for arbitrarily-complicated C++ types.
Definition: SimTKcommon/include/SimTKcommon/internal/common.h:862
 
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:871