#pragma once //convert any (supported) type to a const char* without constructing a new nall::string //this is used inside string{...} to build nall::string values namespace nall { //booleans template<> struct stringify { stringify(bool value) : _value(value) {} auto data() const -> const char* { return _value ? "true" : "false"; } auto size() const -> uint { return _value ? 4 : 5; } bool _value; }; template<> struct stringify { stringify(bool value) : _value(value) {} auto data() const -> const char* { return _value ? "true" : "false"; } auto size() const -> uint { return _value ? 4 : 5; } bool _value; }; //characters template<> struct stringify { stringify(char source) { _data[0] = source; _data[1] = 0; } auto data() const -> const char* { return _data; } auto size() const -> uint { return 1; } char _data[2]; }; //signed integers template<> struct stringify { stringify(signed char source) { integer(_data, source); } auto data() const -> const char* { return _data; } auto size() const -> uint { return strlen(_data); } char _data[2 + sizeof(signed char) * 3]; }; template<> struct stringify { stringify(signed short source) { integer(_data, source); } auto data() const -> const char* { return _data; } auto size() const -> uint { return strlen(_data); } char _data[2 + sizeof(signed short) * 3]; }; template<> struct stringify { stringify(signed int source) { integer(_data, source); } auto data() const -> const char* { return _data; } auto size() const -> uint { return strlen(_data); } char _data[2 + sizeof(signed int) * 3]; }; template<> struct stringify { stringify(signed long source) { integer(_data, source); } auto data() const -> const char* { return _data; } auto size() const -> uint { return strlen(_data); } char _data[2 + sizeof(signed long) * 3]; }; template<> struct stringify { stringify(signed long long source) { integer(_data, source); } auto data() const -> const char* { return _data; } auto size() const -> uint { return strlen(_data); } char _data[2 + sizeof(signed long long) * 3]; }; template struct stringify> { stringify(Integer source) { integer(_data, source); } auto data() const -> const char* { return _data; } auto size() const -> uint { return strlen(_data); } char _data[2 + sizeof(int64_t) * 3]; }; //unsigned integers template<> struct stringify { stringify(unsigned char source) { natural(_data, source); } auto data() const -> const char* { return _data; } auto size() const -> uint { return strlen(_data); } char _data[1 + sizeof(unsigned char) * 3]; }; template<> struct stringify { stringify(unsigned short source) { natural(_data, source); } auto data() const -> const char* { return _data; } auto size() const -> uint { return strlen(_data); } char _data[1 + sizeof(unsigned short) * 3]; }; template<> struct stringify { stringify(unsigned int source) { natural(_data, source); } auto data() const -> const char* { return _data; } auto size() const -> uint { return strlen(_data); } char _data[1 + sizeof(unsigned int) * 3]; }; template<> struct stringify { stringify(unsigned long source) { natural(_data, source); } auto data() const -> const char* { return _data; } auto size() const -> uint { return strlen(_data); } char _data[1 + sizeof(unsigned long) * 3]; }; template<> struct stringify { stringify(unsigned long long source) { natural(_data, source); } auto data() const -> const char* { return _data; } auto size() const -> uint { return strlen(_data); } char _data[1 + sizeof(unsigned long long) * 3]; }; template struct stringify> { stringify(Natural source) { natural(_data, source); } auto data() const -> const char* { return _data; } auto size() const -> uint { return strlen(_data); } char _data[1 + sizeof(uint64_t) * 3]; }; //floating-point template<> struct stringify { stringify(float source) { real(_data, source); } auto data() const -> const char* { return _data; } auto size() const -> uint { return strlen(_data); } char _data[256]; }; template<> struct stringify { stringify(double source) { real(_data, source); } auto data() const -> const char* { return _data; } auto size() const -> uint { return strlen(_data); } char _data[256]; }; template<> struct stringify { stringify(long double source) { real(_data, source); } auto data() const -> const char* { return _data; } auto size() const -> uint { return strlen(_data); } char _data[256]; }; template struct stringify> { stringify(Real source) { real(_data, source); } auto data() const -> const char* { return _data; } auto size() const -> uint { return strlen(_data); } char _data[256]; }; //arrays template<> struct stringify> { stringify(vector source) { _text.resize(source.size()); memory::copy(_text.data(), source.data(), source.size()); } auto data() const -> const char* { return _text.data(); } auto size() const -> uint { return _text.size(); } vector _text; }; template<> struct stringify&> { stringify(const vector& source) { _text.resize(source.size()); memory::copy(_text.data(), source.data(), source.size()); } auto data() const -> const char* { return _text.data(); } auto size() const -> uint { return _text.size(); } vector _text; }; //char arrays template<> struct stringify { stringify(char* source) : _data(source ? source : "") {} auto data() const -> const char* { return _data; } auto size() const -> uint { return strlen(_data); } const char* _data; }; template<> struct stringify { stringify(const char* source) : _data(source ? source : "") {} auto data() const -> const char* { return _data; } auto size() const -> uint { return strlen(_data); } const char* _data; }; //strings template<> struct stringify { stringify(const string& source) : _text(source) {} auto data() const -> const char* { return _text.data(); } auto size() const -> uint { return _text.size(); } const string& _text; }; template<> struct stringify { stringify(const string& source) : _text(source) {} auto data() const -> const char* { return _text.data(); } auto size() const -> uint { return _text.size(); } const string& _text; }; template<> struct stringify { stringify(const string_view& source) : _view(source) {} auto data() const -> const char* { return _view.data(); } auto size() const -> uint { return _view.size(); } const string_view& _view; }; template<> struct stringify { stringify(const string_view& source) : _view(source) {} auto data() const -> const char* { return _view.data(); } auto size() const -> uint { return _view.size(); } const string_view& _view; }; // template auto make_string(T value) -> stringify { return stringify(forward(value)); } }