@@ -31,7 +31,7 @@ The header-only part of the Lol Engine framework. | |||||
| `<lol/msg>` | simple message logging | ● `lol::msg::info("hello\n");`<br>● `lol::msg::debug("%d %d\n", x, y);`<br>● also `lol::msg::error`, `lol::msg::warn` | | | `<lol/msg>` | simple message logging | ● `lol::msg::info("hello\n");`<br>● `lol::msg::debug("%d %d\n", x, y);`<br>● also `lol::msg::error`, `lol::msg::warn` | | ||||
| `<lol/thread>` | threading and timing | ● `lol::thread`<br>● `lol::queue<int, 200>` (thread-safe FIFO queue)<br>● `lol::timer` (high precision timer) | | | `<lol/thread>` | threading and timing | ● `lol::thread`<br>● `lol::queue<int, 200>` (thread-safe FIFO queue)<br>● `lol::timer` (high precision timer) | | ||||
| `<lol/unit_test>` | unit test framework | | | | `<lol/unit_test>` | unit test framework | | | ||||
| `<lol/utils>` | various utilities: environment variables, string formatting, std::map and std::vector extensions… | | | |||||
| `<lol/utils>` | various utilities: environment variables, std::map and std::vector extensions… | | | |||||
## Text utilities | ## Text utilities | ||||
@@ -1,7 +1,7 @@ | |||||
// | // | ||||
// Lol Engine | // Lol Engine | ||||
// | // | ||||
// Copyright © 2010–2023 Sam Hocevar <sam@hocevar.net> | |||||
// Copyright © 2010–2024 Sam Hocevar <sam@hocevar.net> | |||||
// © 2013–2015 Benjamin “Touky” Huet <huet.benjamin@gmail.com> | // © 2013–2015 Benjamin “Touky” Huet <huet.benjamin@gmail.com> | ||||
// | // | ||||
// Lol Engine is free software. It comes without any warranty, to | // Lol Engine is free software. It comes without any warranty, to | ||||
@@ -21,11 +21,11 @@ | |||||
#include "../features.h" | #include "../features.h" | ||||
#include <format> // std::format | |||||
#include <vector> // std::vector | #include <vector> // std::vector | ||||
#include <string> // std::basic_string | #include <string> // std::basic_string | ||||
#include <algorithm> // std::transform | #include <algorithm> // std::transform | ||||
#include <iterator> // std::back_inserter | #include <iterator> // std::back_inserter | ||||
#include <cstdarg> // va_list | |||||
#include <cctype> // size_t | #include <cctype> // size_t | ||||
namespace lol | namespace lol | ||||
@@ -47,7 +47,7 @@ std::vector<std::basic_string<T>> split(std::basic_string<T> const &s, | |||||
return ret; | return ret; | ||||
} | } | ||||
// Split a string along multiple separator | |||||
// Split a string along multiple separator characters | |||||
template<typename T> | template<typename T> | ||||
std::vector<std::basic_string<T>> split(std::basic_string<T> const &s, | std::vector<std::basic_string<T>> split(std::basic_string<T> const &s, | ||||
std::basic_string<T> const &seps) | std::basic_string<T> const &seps) | ||||
@@ -148,45 +148,4 @@ std::basic_string<T> toupper(T const *s) | |||||
return toupper(std::basic_string<T>(s)); | return toupper(std::basic_string<T>(s)); | ||||
} | } | ||||
// Format a string, printf-style | |||||
template<typename T = char> | |||||
std::basic_string<T> vformat(char const *fmt, va_list ap) | |||||
{ | |||||
va_list ap2; | |||||
#if defined va_copy || !defined _MSC_VER | |||||
// Visual Studio 2010 does not support va_copy. | |||||
va_copy(ap2, ap); | |||||
#else | |||||
ap2 = ap; | |||||
#endif | |||||
// vsnprintf() tells us how many characters we need, not counting | |||||
// the terminating null character. | |||||
size_t needed = vsnprintf(nullptr, 0, fmt, ap2); | |||||
#if defined va_copy || !defined _MSC_VER | |||||
// do not call va_end() if va_copy() wasn't called. | |||||
va_end(ap2); | |||||
#endif | |||||
std::string ret; | |||||
ret.resize(needed); | |||||
vsnprintf(&ret[0], needed + 1, fmt, ap); | |||||
return ret; | |||||
} | |||||
// XXX: we cheat by setting the argument time to char instead of T, because | |||||
// I found no other way to use the printf attribute. | |||||
template<typename T = char> | |||||
std::basic_string<T> lol_attr_printf_format(1, 2) format(char const *fmt, ...) | |||||
{ | |||||
va_list ap; | |||||
va_start(ap, fmt); | |||||
std::basic_string<T> ret = vformat(fmt, ap); | |||||
va_end(ap); | |||||
return ret; | |||||
} | |||||
} // namespace lol | } // namespace lol | ||||
@@ -1,7 +1,7 @@ | |||||
// | // | ||||
// Lol Engine | // Lol Engine | ||||
// | // | ||||
// Copyright © 2010—2020 Sam Hocevar <sam@hocevar.net> | |||||
// Copyright © 2010–2024 Sam Hocevar <sam@hocevar.net> | |||||
// | // | ||||
// Lol Engine is free software. It comes without any warranty, to | // Lol Engine is free software. It comes without any warranty, to | ||||
// the extent permitted by applicable law. You can redistribute it | // the extent permitted by applicable law. You can redistribute it | ||||
@@ -42,13 +42,3 @@ | |||||
# endif | # endif | ||||
#endif | #endif | ||||
// Define some attribute macros | |||||
#ifdef __GNUC__ | |||||
# define lol_attr_printf_format(n, p) __attribute__((format(printf, n, p))) | |||||
#else | |||||
# define lol_attr_printf_format(n, p) | |||||
#endif | |||||
@@ -1,7 +1,7 @@ | |||||
// | // | ||||
// Lol Engine | // Lol Engine | ||||
// | // | ||||
// Copyright © 2010—2020 Sam Hocevar <sam@hocevar.net> | |||||
// Copyright © 2010–2024 Sam Hocevar <sam@hocevar.net> | |||||
// | // | ||||
// Lol Engine is free software. It comes without any warranty, to | // Lol Engine is free software. It comes without any warranty, to | ||||
// the extent permitted by applicable law. You can redistribute it | // the extent permitted by applicable law. You can redistribute it | ||||
@@ -15,6 +15,7 @@ | |||||
#include <cassert> | #include <cassert> | ||||
#include <cmath> // std::tan | #include <cmath> // std::tan | ||||
#include <algorithm> // std::max | #include <algorithm> // std::max | ||||
#include <format> // std::format | |||||
namespace lol | namespace lol | ||||
{ | { | ||||
@@ -24,8 +25,8 @@ inline std::string mat2::tostring() const | |||||
{ | { | ||||
mat2 const &p = *this; | mat2 const &p = *this; | ||||
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]); | |||||
return std::format("[ {:6.6f} {:6.6f}\n", p[0][0], p[1][0]) + | |||||
std::format(" {:6.6f} {:6.6f} ]\n", p[0][1], p[1][1]); | |||||
} | } | ||||
template<> | template<> | ||||
@@ -33,9 +34,9 @@ inline std::string mat3::tostring() const | |||||
{ | { | ||||
mat3 const &p = *this; | mat3 const &p = *this; | ||||
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]); | |||||
return std::format("[ {:6.6f} {:6.6f} {:6.6f}\n", p[0][0], p[1][0], p[2][0]) + | |||||
std::format(" {:6.6f} {:6.6f} {:6.6f}\n", p[0][1], p[1][1], p[2][1]) + | |||||
std::format(" {:6.6f} {:6.6f} {:6.6f} ]\n", p[0][2], p[1][2], p[2][2]); | |||||
} | } | ||||
template<> | template<> | ||||
@@ -43,14 +44,14 @@ inline std::string mat4::tostring() const | |||||
{ | { | ||||
mat4 const &p = *this; | mat4 const &p = *this; | ||||
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]); | |||||
return std::format("[ {:6.6f} {:6.6f} {:6.6f} {:6.6f}\n", | |||||
p[0][0], p[1][0], p[2][0], p[3][0]) + | |||||
std::format(" {:6.6f} {:6.6f} {:6.6f} {:6.6f}\n", | |||||
p[0][1], p[1][1], p[2][1], p[3][1]) + | |||||
std::format(" {:6.6f} {:6.6f} {:6.6f} {:6.6f}\n", | |||||
p[0][2], p[1][2], p[2][2], p[3][2]) + | |||||
std::format(" {:6.6f} {:6.6f} {:6.6f} {:6.6f} ]\n", | |||||
p[0][3], p[1][3], p[2][3], p[3][3]); | |||||
} | } | ||||
template<typename T> | template<typename T> | ||||
@@ -1,7 +1,7 @@ | |||||
// | // | ||||
// Lol Engine | // Lol Engine | ||||
// | // | ||||
// Copyright © 2010—2020 Sam Hocevar <sam@hocevar.net> | |||||
// Copyright © 2010–2024 Sam Hocevar <sam@hocevar.net> | |||||
// | // | ||||
// Lol Engine is free software. It comes without any warranty, to | // Lol Engine is free software. It comes without any warranty, to | ||||
// the extent permitted by applicable law. You can redistribute it | // the extent permitted by applicable law. You can redistribute it | ||||
@@ -12,7 +12,8 @@ | |||||
#pragma once | #pragma once | ||||
#include <cmath> // std::cos, std::sin | |||||
#include <cmath> // std::cos, std::sin | |||||
#include <format> // std::format | |||||
namespace lol | namespace lol | ||||
{ | { | ||||
@@ -20,13 +21,13 @@ namespace lol | |||||
template<> | template<> | ||||
inline std::string cmplx::tostring() const | inline std::string cmplx::tostring() const | ||||
{ | { | ||||
return format("[ %6.6f %6.6f ]", x, y); | |||||
return std::format("[ {:6.6f} {:6.6f} ]", x, y); | |||||
} | } | ||||
template<> | template<> | ||||
inline std::string quat::tostring() const | inline std::string quat::tostring() const | ||||
{ | { | ||||
return format("[ %6.6f %6.6f %6.6f %6.6f ]", w, x, y, z); | |||||
return std::format("[ {:6.6f} {:6.6f} {:6.6f} {:6.6f} ]", w, x, y, z); | |||||
} | } | ||||
@@ -291,5 +292,4 @@ DEFINE_GENERIC_EULER_CONVERSIONS(z, y, x) | |||||
#undef DEFINE_GENERIC_EULER_CONVERSIONS | #undef DEFINE_GENERIC_EULER_CONVERSIONS | ||||
#undef DEFINE_GENERIC_EULER_CONVERSIONS_INNER | #undef DEFINE_GENERIC_EULER_CONVERSIONS_INNER | ||||
} /* namespace lol */ | |||||
} // namespace lol |
@@ -1,7 +1,7 @@ | |||||
// | // | ||||
// Lol Engine | // Lol Engine | ||||
// | // | ||||
// Copyright © 2010—2020 Sam Hocevar <sam@hocevar.net> | |||||
// Copyright © 2010–2024 Sam Hocevar <sam@hocevar.net> | |||||
// | // | ||||
// Lol Engine is free software. It comes without any warranty, to | // Lol Engine is free software. It comes without any warranty, to | ||||
// the extent permitted by applicable law. You can redistribute it | // the extent permitted by applicable law. You can redistribute it | ||||
@@ -12,7 +12,7 @@ | |||||
#pragma once | #pragma once | ||||
#include "../base/string.h" // lol::format | |||||
#include <format> // std::format | |||||
namespace lol | namespace lol | ||||
{ | { | ||||
@@ -20,38 +20,37 @@ namespace lol | |||||
template<> | template<> | ||||
inline std::string vec2::tostring() const | inline std::string vec2::tostring() const | ||||
{ | { | ||||
return format("[ %6.6f %6.6f ]", x, y); | |||||
return std::format("[ {:6.6f} {:6.6f} ]", x, y); | |||||
} | } | ||||
template<> | template<> | ||||
inline std::string ivec2::tostring() const | inline std::string ivec2::tostring() const | ||||
{ | { | ||||
return format("[ %i %i ]", x, y); | |||||
return std::format("[ {} {} ]", x, y); | |||||
} | } | ||||
template<> | template<> | ||||
inline std::string vec3::tostring() const | inline std::string vec3::tostring() const | ||||
{ | { | ||||
return format("[ %6.6f %6.6f %6.6f ]", x, y, z); | |||||
return std::format("[ {:6.6f} {:6.6f} {:6.6f} ]", x, y, z); | |||||
} | } | ||||
template<> | template<> | ||||
inline std::string ivec3::tostring() const | inline std::string ivec3::tostring() const | ||||
{ | { | ||||
return format("[ %i %i %i ]", x, y, z); | |||||
return std::format("[ {} {} {} ]", x, y, z); | |||||
} | } | ||||
template<> | template<> | ||||
inline std::string vec4::tostring() const | inline std::string vec4::tostring() const | ||||
{ | { | ||||
return format("[ %6.6f %6.6f %6.6f %6.6f ]", x, y, z, w); | |||||
return std::format("[ {:6.6f} {:6.6f} {:6.6f} {:6.6f} ]", x, y, z, w); | |||||
} | } | ||||
template<> | template<> | ||||
inline std::string ivec4::tostring() const | inline std::string ivec4::tostring() const | ||||
{ | { | ||||
return format("[ %i %i %i %i ]", x, y, z, w); | |||||
return std::format("[ {} {} {} {} ]", x, y, z, w); | |||||
} | } | ||||
} /* namespace lol */ | |||||
} // namespace lol |