7#if defined(_MSC_VER) && !defined(NOMINMAX)
13#include <fmt/printf.h>
27#define RETURN_ZERO_NONGNU_ONLY return 0;
29#define RETURN_ZERO_NONGNU_ONLY
33#define ALIGN(x, a) __ALIGN_MASK(x, (a - 1))
34#define __ALIGN_MASK(x, mask) (((x) + (mask)) & ~(mask))
40template <
typename... Args>
41inline void Output(
const char *message, Args... args)
46template <
typename... Args>
47inline void Warning(
const char *message, Args... args)
52template <
typename... Args>
53[[noreturn]]
inline void Error(
const char *message, Args... args)
58template <
typename... Args>
59inline void DebugMsg(
const char *message, Args... args)
64std::string
string_join(std::vector<std::string> &v, std::string sep);
68std::string
format_money(
double cents,
bool showCents =
true);
71static inline Sint64 isqrt(Sint64 a)
74 return static_cast<int64_t
>(sqrt(
static_cast<double>(a)));
77static inline Sint64 isqrt(
fixed v)
81 Sint64 ret_sq = -v.
v - 1;
82 for (s = 62; s >= 0; s -= 2) {
85 b = ret_sq + ((2 * ret + 1) << s);
95const char *
pi_strcasestr(
const char *haystack,
const char *needle);
97inline bool starts_with(
const std::string_view s,
const std::string_view t)
99 if (s.size() < t.size())
101 return memcmp(s.data(), t.data(), t.size()) == 0;
104inline bool ends_with(
const std::string_view s,
const std::string_view t)
106 if (s.size() < t.size())
109 return memcmp(s.data() + (s.size() - t.size()), t.data(), t.size()) == 0;
114 if (s.size() < t.size())
117 for (
size_t i = 0; i < t.size(); i++)
118 if (tolower(s.data()[i]) != tolower(t.data()[i]))
124inline bool ends_with_ci(
const std::string_view s,
const std::string_view t)
126 if (s.size() < t.size())
129 for (int64_t i = t.size(); i > 0; i--)
130 if (tolower(s.data()[s.size() - i]) != tolower(t.data()[t.size() - i]))
136inline bool compare_ci(
const std::string_view s,
const std::string_view t)
138 if (s.size() != t.size())
141 for (
size_t i = 0; i < s.size(); i++)
142 if (tolower(s.data()[i]) != tolower(t.data()[i]))
153 std::string_view out = s;
155 size_t end = s.find_first_of(
"\r\n");
156 if (end == std::string_view::npos) {
161 out = { s.data(), end };
163 size_t start = s.find_first_not_of(
"\r\n", end);
164 if (start == std::string_view::npos) {
169 s.remove_prefix(start);
178 size_t start = s.find_first_not_of(
" \t\r\n\v");
179 if (start == std::string::npos)
182 size_t end = s.find_last_not_of(
" \t\r\n\v");
184 return s.substr(start, end);
187static inline size_t SplitSpec(
const std::string &spec, std::vector<int> &output)
189 static const std::string delim(
",");
191 size_t i = 0, start = 0, end = 0;
192 while (end != std::string::npos) {
194 start = spec.find_first_not_of(delim, end);
197 if (start == std::string::npos)
201 end = spec.find_first_of(delim, start);
204 output[i++] = atoi(spec.substr(start, (end == std::string::npos) ? std::string::npos : end - start).c_str());
210static inline size_t SplitSpec(
const std::string &spec, std::vector<float> &output)
212 static const std::string delim(
",");
214 size_t i = 0, start = 0, end = 0;
215 while (end != std::string::npos) {
217 start = spec.find_first_not_of(delim, end);
220 if (start == std::string::npos)
224 end = spec.find_first_of(delim, start);
227 output[i++] = atof(spec.substr(start, (end == std::string::npos) ? std::string::npos : end - start).c_str());
233std::vector<std::string>
SplitString(
const std::string &source,
const std::string &delim);
255void StrToAuto(Sint32 *pVal,
const std::string &str);
256void StrToAuto(Sint64 *pVal,
const std::string &str);
257void StrToAuto(
float *pVal,
const std::string &str);
258void StrToAuto(
double *pVal,
const std::string &str);
271#if defined(_MSC_VER) && (_MSC_VER < 1800)
274static inline double round(
double x)
276 return x >= 0.0 ? floor(x + 0.5) : ceil(x - 0.5);
279static inline float roundf(
float x)
281 return x >= 0.0f ? floorf(x + 0.5f) : ceilf(x - 0.5f);
285static inline Uint32 ceil_pow2(Uint32 v)
326void hexdump(
const unsigned char *buf,
int bufsz);
double val
Definition PrecalcPath.cpp:40
Sint64 v
Definition fixed.h:239
void LogOld(Severity sv, std::string message)
Definition Log.cpp:167
void LogFatalOld(std::string message)
Definition Log.cpp:175
reverse_container_t(value_type &ref)
Definition utils.h:309
iterator end()
Definition utils.h:315
typename T::reverse_iterator iterator
Definition utils.h:304
const_iterator end() const
Definition utils.h:316
typename std::remove_reference< T >::type value_type
Definition utils.h:307
const_iterator begin() const
Definition utils.h:313
iterator begin()
Definition utils.h:312
typename T::const_reverse_iterator const_iterator
Definition utils.h:305
float StrToFloat(const std::string &str)
Definition utils.cpp:448
bool compare_ci(const std::string_view s, const std::string_view t)
Definition utils.h:136
std::string format_date_only(double time)
Definition utils.cpp:83
bool ends_with(const std::string_view s, const std::string_view t)
Definition utils.h:104
void Vector3fToStr(const vector3f &val, char *out, size_t size)
Definition utils.cpp:274
void Vector3dToStr(const vector3d &val, char *out, size_t size)
Definition utils.cpp:292
void Matrix4x4fToStr(const matrix4x4f &val, char *out, size_t size)
Definition utils.cpp:358
void Matrix3x3dToStr(const matrix3x3d &val, char *out, size_t size)
Definition utils.cpp:334
void StrToAuto(Sint32 *pVal, const std::string &str)
Definition utils.cpp:485
void Output(const char *message, Args... args)
Definition utils.h:41
void StrToVector3f(const char *str, vector3f &val)
Definition utils.cpp:505
void Matrix4x4dToStr(const matrix4x4d &val, char *out, size_t size)
Definition utils.cpp:384
bool starts_with(const std::string_view s, const std::string_view t)
Definition utils.h:97
void Matrix3x3fToStr(const matrix3x3f &val, char *out, size_t size)
Definition utils.cpp:310
std::vector< std::string > SplitString(const std::string &source, const std::string &delim)
Definition utils.cpp:190
bool ends_with_ci(const std::string_view s, const std::string_view t)
Definition utils.h:124
Uint64 StrToUInt64(const std::string &str)
Definition utils.cpp:441
std::string_view read_line(std::string_view &s)
Definition utils.h:148
std::string format_money(double cents, bool showCents=true)
Definition utils.cpp:17
std::string FloatToStr(float val)
Definition utils.cpp:240
void DebugMsg(const char *message, Args... args)
Definition utils.h:59
void StrToMatrix3x3f(const char *str, matrix3x3f &val)
Definition utils.cpp:541
std::string string_join(std::vector< std::string > &v, std::string sep)
Definition utils.cpp:94
bool starts_with_ci(const std::string_view s, const std::string_view t)
Definition utils.h:112
void StrToMatrix4x4d(const char *str, matrix4x4d &val)
Definition utils.cpp:601
void Warning(const char *message, Args... args)
Definition utils.h:47
void hexdump(const unsigned char *buf, int bufsz)
Definition utils.cpp:635
reverse_container_t< T > reverse_container(T &ref)
Definition utils.h:324
std::string format_date(double time)
Definition utils.cpp:70
std::string format_duration(double seconds)
Definition utils.cpp:107
void StrToMatrix4x4f(const char *str, matrix4x4f &val)
Definition utils.cpp:581
std::string AutoToStr(Sint32 val)
Definition utils.cpp:410
void StrToMatrix3x3d(const char *str, matrix3x3d &val)
Definition utils.cpp:561
std::string_view strip_spaces(std::string_view &s)
Definition utils.h:173
std::string format_distance(double dist, int precision=2)
Definition utils.cpp:131
const char * pi_strcasestr(const char *haystack, const char *needle)
Definition utils.cpp:159
double StrToDouble(const std::string &str)
Definition utils.cpp:466
std::string DoubleToStr(double val)
Definition utils.cpp:257
void Error(const char *message, Args... args)
Definition utils.h:53
Sint64 StrToSInt64(const std::string &str)
Definition utils.cpp:434
std::string DecimalToDegMinSec(float dec)
Definition utils.cpp:625
void StrToVector3d(const char *str, vector3d &val)
Definition utils.cpp:523