#ifdef NALL_STRING_INTERNAL_HPP namespace nall { //convert any (supported) type to a const char* without constructing a new nall::string //this is used inside istring(...) to build nall::string values template struct stringify; // base types template<> struct stringify { bool value; operator const char*() const { return value ? "true" : "false"; } stringify(bool value) : value(value) {} }; template<> struct stringify { char data[256]; operator const char*() const { return data; } stringify(char value) { integer(data, value); } }; // signed integers template<> struct stringify { char data[256]; operator const char*() const { return data; } stringify(signed char value) { integer(data, value); } }; template<> struct stringify { char data[256]; operator const char*() const { return data; } stringify(signed short value) { integer(data, value); } }; template<> struct stringify { char data[256]; operator const char*() const { return data; } stringify(signed int value) { integer(data, value); } }; template<> struct stringify { char data[256]; operator const char*() const { return data; } stringify(signed long value) { integer(data, value); } }; template<> struct stringify { char data[256]; operator const char*() const { return data; } stringify(signed long long value) { integer(data, value); } }; template struct stringify> { char data[256]; operator const char*() const { return data; } stringify(int_t value) { integer(data, value); } }; // unsigned integers template<> struct stringify { char data[256]; operator const char*() const { return data; } stringify(unsigned char value) { decimal(data, value); } }; template<> struct stringify { char data[256]; operator const char*() const { return data; } stringify(unsigned short value) { decimal(data, value); } }; template<> struct stringify { char data[256]; operator const char*() const { return data; } stringify(unsigned int value) { decimal(data, value); } }; template<> struct stringify { char data[256]; operator const char*() const { return data; } stringify(unsigned long value) { decimal(data, value); } }; template<> struct stringify { char data[256]; operator const char*() const { return data; } stringify(unsigned long long value) { decimal(data, value); } }; template struct stringify> { char data[256]; operator const char*() const { return data; } stringify(uint_t value) { decimal(data, value); } }; // floating-point template<> struct stringify { char data[256]; operator const char*() const { return data; } stringify(float value) { fp(data, value); } }; template<> struct stringify { char data[256]; operator const char*() const { return data; } stringify(double value) { fp(data, value); } }; template<> struct stringify { char data[256]; operator const char*() const { return data; } stringify(long double value) { fp(data, value); } }; // arrays template<> struct stringify> { char* text; operator const char*() const { return text; } stringify(vector value) { text = new char[value.size() + 1](); memcpy(text, value.data(), value.size()); } ~stringify() { delete[] text; } }; template<> struct stringify&> { char* text; operator const char*() const { return text; } stringify(const vector& value) { text = new char[value.size() + 1](); memcpy(text, value.data(), value.size()); } ~stringify() { delete[] text; } }; // strings template<> struct stringify { const char* value; operator const char*() const { return value; } stringify(char* value) : value(value) {} }; template<> struct stringify { const char* value; operator const char*() const { return value; } stringify(const char* value) : value(value) {} }; template<> struct stringify { const string& value; operator const char*() const { return value; } stringify(const string& value) : value(value) {} }; template<> struct stringify { const string& value; operator const char*() const { return value; } stringify(const string& value) : value(value) {} }; #if defined(QSTRING_H) template<> struct stringify { const QString& value; operator const char*() const { return value.toUtf8().constData(); } stringify(const QString& value) : value(value) {} }; template<> struct stringify { const QString& value; operator const char*() const { return value.toUtf8().constData(); } stringify(const QString& value) : value(value) {} }; string::operator QString() const { return QString::fromUtf8(*this); } #endif // template stringify make_string(T value) { return stringify(std::forward(value)); } } #endif