@@ -138,7 +138,7 @@ public: | |||||
m_yaw_angle += seconds * 0.2f; | m_yaw_angle += seconds * 0.2f; | ||||
} | } | ||||
m_text->SetText(String::format( | |||||
m_text->SetText(lol::format( | |||||
"cursor: (%0.3f, %0.3f) - pixel (%d, %d)", | "cursor: (%0.3f, %0.3f) - pixel (%d, %d)", | ||||
m_mouse->GetCursor(0).x, m_mouse->GetCursor(0).y, | m_mouse->GetCursor(0).x, m_mouse->GetCursor(0).y, | ||||
m_mouse->GetCursorPixel(0).x, m_mouse->GetCursorPixel(0).y)); | m_mouse->GetCursorPixel(0).x, m_mouse->GetCursorPixel(0).y)); | ||||
@@ -163,6 +163,11 @@ uint32_t hash<char const *>::operator ()(char const *s) const | |||||
return HashCharString(s); | return HashCharString(s); | ||||
} | } | ||||
uint32_t hash<std::string>::operator ()(std::string const &s) const | |||||
{ | |||||
return HashCharString(&s[0]); | |||||
} | |||||
uint32_t hash<char const *>::operator ()(String const &s) const | uint32_t hash<char const *>::operator ()(String const &s) const | ||||
{ | { | ||||
return HashCharString(&s[0]); | return HashCharString(&s[0]); | ||||
@@ -94,7 +94,7 @@ void msg::helper(MessageType type, char const *fmt, va_list ap) | |||||
ANDROID_LOG_ERROR | ANDROID_LOG_ERROR | ||||
}; | }; | ||||
String buf = String::vformat(fmt, ap); | |||||
std::string buf = vformat(fmt, ap); | |||||
__android_log_print(prio[(int)type], "LOL", "[%d] %s", (int)gettid(), &buf[0]); | __android_log_print(prio[(int)type], "LOL", "[%d] %s", (int)gettid(), &buf[0]); | ||||
#else | #else | ||||
@@ -107,11 +107,11 @@ void msg::helper(MessageType type, char const *fmt, va_list ap) | |||||
}; | }; | ||||
# if defined _WIN32 | # if defined _WIN32 | ||||
String buf = String(prefix[(int)type]) + ": " + String::vformat(fmt, ap); | |||||
std::string buf = std::string(prefix[(int)type]) + ": " + vformat(fmt, ap); | |||||
array<WCHAR> widechar; | array<WCHAR> widechar; | ||||
widechar.resize(buf.count() + 1); | |||||
MultiByteToWideChar(CP_UTF8, 0, buf.C(), buf.count() + 1, widechar.data(), widechar.count()); | |||||
widechar.resize(buf.length() + 1); | |||||
MultiByteToWideChar(CP_UTF8, 0, buf.c_str(), buf.length() + 1, widechar.data(), widechar.count()); | |||||
OutputDebugStringW(widechar.data()); | OutputDebugStringW(widechar.data()); | ||||
# else | # else | ||||
fprintf(stderr, "%s: ", prefix[(int)type]); | fprintf(stderr, "%s: ", prefix[(int)type]); | ||||
@@ -54,26 +54,17 @@ array<std::string> split(std::string const &s, std::string const &seps) | |||||
return ret; | return ret; | ||||
} | } | ||||
/* | |||||
* XXX: deprecated | |||||
*/ | |||||
String String::format(char const *format, ...) | |||||
std::string format(char const *format, ...) | |||||
{ | { | ||||
String ret; | |||||
va_list ap; | va_list ap; | ||||
va_start(ap, format); | va_start(ap, format); | ||||
ret = String::vformat(format, ap); | |||||
std::string ret = vformat(format, ap); | |||||
va_end(ap); | va_end(ap); | ||||
return ret; | return ret; | ||||
} | } | ||||
String String::vformat(char const *format, va_list ap) | |||||
std::string vformat(char const *format, va_list ap) | |||||
{ | { | ||||
String ret; | |||||
va_list ap2; | va_list ap2; | ||||
#if defined va_copy || !defined _MSC_VER | #if defined va_copy || !defined _MSC_VER | ||||
/* Visual Studio 2010 does not support va_copy. */ | /* Visual Studio 2010 does not support va_copy. */ | ||||
@@ -91,9 +82,8 @@ String String::vformat(char const *format, va_list ap) | |||||
va_end(ap2); | va_end(ap2); | ||||
#endif | #endif | ||||
((super &)ret).reserve(needed); | |||||
ret.m_count = needed; | |||||
std::string ret; | |||||
ret.resize(needed); | |||||
vsnprintf(&ret[0], needed, format, ap); | vsnprintf(&ret[0], needed, format, ap); | ||||
return ret; | return ret; | ||||
@@ -31,28 +31,28 @@ vec4 const Color::light_gray = vec4(.75f, .75f, .75f, 1); | |||||
/* | /* | ||||
* Conversion from colours to hexadecimal | * Conversion from colours to hexadecimal | ||||
*/ | */ | ||||
String Color::HexString4Bpp(vec3 c) | |||||
std::string Color::HexString4Bpp(vec3 c) | |||||
{ | { | ||||
uvec3 c2 = (uvec3)(clamp(c, 0.f, 1.f) * 255.999f); | uvec3 c2 = (uvec3)(clamp(c, 0.f, 1.f) * 255.999f); | ||||
return String::format("%01x%01x%01x", c2.r, c2.g, c2.b); | |||||
return format("%01x%01x%01x", c2.r, c2.g, c2.b); | |||||
} | } | ||||
String Color::HexString4Bpp(vec4 c) | |||||
std::string Color::HexString4Bpp(vec4 c) | |||||
{ | { | ||||
uvec4 c2 = (uvec4)(clamp(c, 0.f, 1.f) * 15.999f); | uvec4 c2 = (uvec4)(clamp(c, 0.f, 1.f) * 15.999f); | ||||
return String::format("%01x%1x%01x%01x", c2.r, c2.g, c2.b, c2.a); | |||||
return format("%01x%1x%01x%01x", c2.r, c2.g, c2.b, c2.a); | |||||
} | } | ||||
String Color::HexString8Bpp(vec3 c) | |||||
std::string Color::HexString8Bpp(vec3 c) | |||||
{ | { | ||||
uvec3 c2 = (uvec3)(clamp(c, 0.f, 1.f) * 255.999f); | uvec3 c2 = (uvec3)(clamp(c, 0.f, 1.f) * 255.999f); | ||||
return String::format("%02x%02x%02x", c2.r, c2.g, c2.b); | |||||
return format("%02x%02x%02x", c2.r, c2.g, c2.b); | |||||
} | } | ||||
String Color::HexString8Bpp(vec4 c) | |||||
std::string Color::HexString8Bpp(vec4 c) | |||||
{ | { | ||||
uvec4 c2 = (uvec4)(clamp(c, 0.f, 1.f) * 15.999f); | uvec4 c2 = (uvec4)(clamp(c, 0.f, 1.f) * 15.999f); | ||||
return String::format("%02x%2x%02x%02x", c2.r, c2.g, c2.b, c2.a); | |||||
return format("%02x%2x%02x%02x", c2.r, c2.g, c2.b, c2.a); | |||||
} | } | ||||
/* | /* | ||||
@@ -20,9 +20,9 @@ static String g_name_joystick() | |||||
{ | { | ||||
return String("Joystick"); | return String("Joystick"); | ||||
} | } | ||||
static String g_name_joystick(const uint64_t num) | |||||
static std::string g_name_joystick(const uint64_t num) | |||||
{ | { | ||||
return String::format("Joystick%d", (int)num); | |||||
return format("Joystick%d", (int)num); | |||||
} | } | ||||
# define _SC(id, str, name) const String g_name_key_##name(#name); | # define _SC(id, str, name) const String g_name_key_##name(#name); | ||||
@@ -41,6 +41,11 @@ template<> struct hash<char const *> | |||||
uint32_t operator()(String const &s) const; | uint32_t operator()(String const &s) const; | ||||
}; | }; | ||||
template<> struct hash<std::string> | |||||
{ | |||||
uint32_t operator()(std::string const &s) const; | |||||
}; | |||||
template<> struct hash<String> | template<> struct hash<String> | ||||
{ | { | ||||
uint32_t operator()(String const &s) const; | uint32_t operator()(String const &s) const; | ||||
@@ -30,6 +30,9 @@ array<std::string> split(std::string const &s, char sep); | |||||
/* Split a string along multiple separators */ | /* Split a string along multiple separators */ | ||||
array<std::string> split(std::string const &s, std::string const &seps); | array<std::string> split(std::string const &s, std::string const &seps); | ||||
std::string format(char const *format, ...) LOL_ATTR_FORMAT(1, 2); | |||||
std::string vformat(char const *format, va_list ap); | |||||
} /* namespace lol */ | } /* namespace lol */ | ||||
// | // | ||||
@@ -80,6 +83,12 @@ public: | |||||
((super &)*this)[item_count] = '\0'; | ((super &)*this)[item_count] = '\0'; | ||||
} | } | ||||
/* Legacy constructor for std::string */ | |||||
inline String(std::string const &s) | |||||
: String(s.c_str()) | |||||
{ | |||||
} | |||||
inline String(String const &s) | inline String(String const &s) | ||||
: super((super const &)s) | : super((super const &)s) | ||||
{ | { | ||||
@@ -354,9 +363,6 @@ public: | |||||
return res < 0; | return res < 0; | ||||
} | } | ||||
static String format(char const *format, ...) LOL_ATTR_FORMAT(1, 2); | |||||
static String vformat(char const *format, va_list ap); | |||||
}; | }; | ||||
inline String operator +(char c, String const &s) | inline String operator +(char c, String const &s) | ||||
@@ -337,10 +337,10 @@ public: | |||||
/* | /* | ||||
* Convert colors to hex strings. | * Convert colors to hex strings. | ||||
*/ | */ | ||||
static String HexString4Bpp(vec3 c); | |||||
static String HexString4Bpp(vec4 c); | |||||
static String HexString8Bpp(vec3 c); | |||||
static String HexString8Bpp(vec4 c); | |||||
static std::string HexString4Bpp(vec3 c); | |||||
static std::string HexString4Bpp(vec4 c); | |||||
static std::string HexString8Bpp(vec3 c); | |||||
static std::string HexString8Bpp(vec4 c); | |||||
/* | /* | ||||
* Convert hex strings to colors. | * Convert hex strings to colors. | ||||
@@ -133,7 +133,7 @@ struct LOL_ATTR_NODISCARD mat_t<T, 2, 2> | |||||
} | } | ||||
void printf() const; | void printf() const; | ||||
String tostring() const; | |||||
std::string tostring() const; | |||||
static const mat_t<T,2,2> identity; | static const mat_t<T,2,2> identity; | ||||
@@ -260,7 +260,7 @@ struct LOL_ATTR_NODISCARD mat_t<T, 3, 3> | |||||
} | } | ||||
void printf() const; | void printf() const; | ||||
String tostring() const; | |||||
std::string tostring() const; | |||||
static const mat_t<T,3,3> identity; | static const mat_t<T,3,3> identity; | ||||
@@ -436,7 +436,7 @@ struct LOL_ATTR_NODISCARD mat_t<T, 4, 4> | |||||
static mat_t<T,4,4> shifted_perspective(T fov_y, T screen_size, T screen_ratio_yx, T near, T far); | static mat_t<T,4,4> shifted_perspective(T fov_y, T screen_size, T screen_ratio_yx, T near, T far); | ||||
void printf() const; | void printf() const; | ||||
String tostring() const; | |||||
std::string tostring() const; | |||||
static const mat_t<T,4,4> identity; | static const mat_t<T,4,4> identity; | ||||
@@ -214,7 +214,7 @@ private: | |||||
} \ | } \ | ||||
\ | \ | ||||
void printf() const; \ | void printf() const; \ | ||||
class String tostring() const; | |||||
std::string tostring() const; | |||||
/* | /* | ||||
* 2-element vectors | * 2-element vectors | ||||
@@ -19,7 +19,7 @@ namespace lol | |||||
#define LOL_PRINTF_TOSTRING(type, ...) \ | #define LOL_PRINTF_TOSTRING(type, ...) \ | ||||
template<> void type::printf() const { msg::debug(__VA_ARGS__); } \ | template<> void type::printf() const { msg::debug(__VA_ARGS__); } \ | ||||
template<> String type::tostring() const { return String::format(__VA_ARGS__); } | |||||
template<> std::string type::tostring() const { return format(__VA_ARGS__); } | |||||
LOL_PRINTF_TOSTRING(vec2, "[ %6.6f %6.6f ]\n", x, y); | LOL_PRINTF_TOSTRING(vec2, "[ %6.6f %6.6f ]\n", x, y); | ||||
LOL_PRINTF_TOSTRING(ivec2, "[ %i %i ]\n", x, y); | LOL_PRINTF_TOSTRING(ivec2, "[ %i %i ]\n", x, y); | ||||
@@ -38,12 +38,12 @@ template<> void mat2::printf() const | |||||
msg::debug(" %6.6f %6.6f ]\n", p[0][1], p[1][1]); | msg::debug(" %6.6f %6.6f ]\n", p[0][1], p[1][1]); | ||||
} | } | ||||
template<> String mat2::tostring() const | |||||
template<> std::string mat2::tostring() const | |||||
{ | { | ||||
mat2 const &p = *this; | mat2 const &p = *this; | ||||
return String::format("[ %6.6f %6.6f\n", p[0][0], p[1][0]) + | |||||
String::format(" %6.6f %6.6f ]\n", p[0][1], p[1][1]); | |||||
return format("[ %6.6f %6.6f\n", p[0][0], p[1][0]) + | |||||
format(" %6.6f %6.6f ]\n", p[0][1], p[1][1]); | |||||
} | } | ||||
template<> void mat3::printf() const | template<> void mat3::printf() const | ||||
@@ -55,13 +55,13 @@ template<> void mat3::printf() const | |||||
msg::debug(" %6.6f %6.6f %6.6f ]\n", p[0][2], p[1][2], p[2][2]); | msg::debug(" %6.6f %6.6f %6.6f ]\n", p[0][2], p[1][2], p[2][2]); | ||||
} | } | ||||
template<> String mat3::tostring() const | |||||
template<> std::string mat3::tostring() const | |||||
{ | { | ||||
mat3 const &p = *this; | mat3 const &p = *this; | ||||
return String::format("[ %6.6f %6.6f %6.6f\n", p[0][0], p[1][0], p[2][0]) + | |||||
String::format(" %6.6f %6.6f %6.6f\n", p[0][1], p[1][1], p[2][1]) + | |||||
String::format(" %6.6f %6.6f %6.6f ]\n", p[0][2], p[1][2], p[2][2]); | |||||
return format("[ %6.6f %6.6f %6.6f\n", p[0][0], p[1][0], p[2][0]) + | |||||
format(" %6.6f %6.6f %6.6f\n", p[0][1], p[1][1], p[2][1]) + | |||||
format(" %6.6f %6.6f %6.6f ]\n", p[0][2], p[1][2], p[2][2]); | |||||
} | } | ||||
template<> void mat4::printf() const | template<> void mat4::printf() const | ||||
@@ -78,18 +78,18 @@ template<> void mat4::printf() const | |||||
p[0][3], p[1][3], p[2][3], p[3][3]); | p[0][3], p[1][3], p[2][3], p[3][3]); | ||||
} | } | ||||
template<> String mat4::tostring() const | |||||
template<> std::string mat4::tostring() const | |||||
{ | { | ||||
mat4 const &p = *this; | mat4 const &p = *this; | ||||
return String::format("[ %6.6f %6.6f %6.6f %6.6f\n", | |||||
p[0][0], p[1][0], p[2][0], p[3][0]) + | |||||
String::format(" %6.6f %6.6f %6.6f %6.6f\n", | |||||
p[0][1], p[1][1], p[2][1], p[3][1]) + | |||||
String::format(" %6.6f %6.6f %6.6f %6.6f\n", | |||||
p[0][2], p[1][2], p[2][2], p[3][2]) + | |||||
String::format(" %6.6f %6.6f %6.6f %6.6f ]\n", | |||||
p[0][3], p[1][3], p[2][3], p[3][3]); | |||||
return format("[ %6.6f %6.6f %6.6f %6.6f\n", | |||||
p[0][0], p[1][0], p[2][0], p[3][0]) + | |||||
format(" %6.6f %6.6f %6.6f %6.6f\n", | |||||
p[0][1], p[1][1], p[2][1], p[3][1]) + | |||||
format(" %6.6f %6.6f %6.6f %6.6f\n", | |||||
p[0][2], p[1][2], p[2][2], p[3][2]) + | |||||
format(" %6.6f %6.6f %6.6f %6.6f ]\n", | |||||
p[0][3], p[1][3], p[2][3], p[3][3]); | |||||
} | } | ||||
} /* namespace lol */ | } /* namespace lol */ | ||||
@@ -193,12 +193,12 @@ SdlInput::SdlInput(int app_w, int app_h, int screen_w, int screen_h) | |||||
continue; | continue; | ||||
} | } | ||||
//String::format("Joystick%d", i + 1).C() | |||||
//format("Joystick%d", i + 1).c_str() | |||||
InputDeviceInternal* stick = new InputDeviceInternal(g_name_joystick(i + 1)); | InputDeviceInternal* stick = new InputDeviceInternal(g_name_joystick(i + 1)); | ||||
for (int j = 0; j < SDL_JoystickNumAxes(sdlstick); ++j) | for (int j = 0; j < SDL_JoystickNumAxes(sdlstick); ++j) | ||||
stick->AddAxis(String::format("Axis%d", j + 1).C()); | |||||
stick->AddAxis(format("Axis%d", j + 1).c_str()); | |||||
for (int j = 0; j < SDL_JoystickNumButtons(sdlstick); ++j) | for (int j = 0; j < SDL_JoystickNumButtons(sdlstick); ++j) | ||||
stick->AddKey(String::format("Button%d", j + 1).C()); | |||||
stick->AddKey(format("Button%d", j + 1).c_str()); | |||||
m_data->m_joysticks.push(sdlstick, stick); | m_data->m_joysticks.push(sdlstick, stick); | ||||
} | } | ||||
@@ -72,12 +72,12 @@ lolunit_declare_fixture(map_test) | |||||
lolunit_declare_test(map_remove_string) | lolunit_declare_test(map_remove_string) | ||||
{ | { | ||||
map<String, uint64_t> m; | |||||
array<String> a; | |||||
map<std::string, uint64_t> m; | |||||
array<std::string> a; | |||||
for (int i = 0; i < 20; i++) | for (int i = 0; i < 20; i++) | ||||
{ | { | ||||
a << String::format("test_str_%i", i); | |||||
a << format("test_str_%i", i); | |||||
m[a.last()] = -1; | m[a.last()] = -1; | ||||
} | } | ||||
for (int i = 0; i < a.count(); i++) | for (int i = 0; i < a.count(); i++) | ||||
@@ -144,15 +144,15 @@ lolunit_declare_fixture(string_test) | |||||
} | } | ||||
lolunit_declare_test(string_printf) | |||||
lolunit_declare_test(string_format) | |||||
{ | { | ||||
String s1 = "3a"; | |||||
String s2 = String::format("%d%x", 3, 10); | |||||
std::string s1 = "3a"; | |||||
std::string s2 = format("%d%x", 3, 10); | |||||
lolunit_assert(s1 == s2); | lolunit_assert(s1 == s2); | ||||
String s3 = "abc 3"; | |||||
String s4 = String::format("abc %d", 3); | |||||
std::string s3 = "abc 3"; | |||||
std::string s4 = format("abc %d", 3); | |||||
lolunit_assert(s3 == s4); | lolunit_assert(s3 == s4); | ||||
} | } | ||||
@@ -93,7 +93,7 @@ lolunit_declare_fixture(color_test) | |||||
vec3 v2 = Color::RGBToHSV(v1); | vec3 v2 = Color::RGBToHSV(v1); | ||||
vec3 v3 = Color::HSVToRGB(v2); | vec3 v3 = Color::HSVToRGB(v2); | ||||
String rgb = String::format("[%f %f %f]", v1.r, v1.g, v1.b); | |||||
std::string rgb = format("[%f %f %f]", v1.r, v1.g, v1.b); | |||||
lolunit_set_context(&rgb[0]); | lolunit_set_context(&rgb[0]); | ||||
if (r != g || g != b) | if (r != g || g != b) | ||||
@@ -115,7 +115,7 @@ lolunit_declare_fixture(color_test) | |||||
vec3 v2 = Color::RGBToHSL(v1); | vec3 v2 = Color::RGBToHSL(v1); | ||||
vec3 v3 = Color::HSVToHSL(Color::RGBToHSV(v1)); | vec3 v3 = Color::HSVToHSL(Color::RGBToHSV(v1)); | ||||
String rgb = String::format("[%f %f %f]", v1.r, v1.g, v1.b); | |||||
std::string rgb = format("[%f %f %f]", v1.r, v1.g, v1.b); | |||||
lolunit_set_context(&rgb[0]); | lolunit_set_context(&rgb[0]); | ||||
/* Don’t check hue if saturation is zero. */ | /* Don’t check hue if saturation is zero. */ | ||||
@@ -60,7 +60,7 @@ void Text::SetText(String const &text) | |||||
void Text::SetInt(int val) | void Text::SetInt(int val) | ||||
{ | { | ||||
data->m_text = String::format("%i", val); | |||||
data->m_text = format("%i", val); | |||||
} | } | ||||
void Text::SetPos(vec3 pos) | void Text::SetPos(vec3 pos) | ||||