17#ifndef DAF_UTILS_HPP_INCLUDED
18#define DAF_UTILS_HPP_INCLUDED
20#include "src/DafDefines.h"
22#ifndef __STDC_LIMIT_MACROS
23# define __STDC_LIMIT_MACROS
41#ifdef DAF_PROPER_CPP11_SUPPORT
47#if defined(DAF_OS_WINDOWS) && defined(_MSC_VER)
49typedef SSIZE_T ssize_t;
52#if ! defined(CARLA_MATH_UTILS_HPP_INCLUDED) && ! defined(DAF_PROPER_CPP11_SUPPORT) && ! defined(DAF_OS_MAC)
54inline float fmin(
float __x,
float __y)
55 {
return __builtin_fminf(__x, __y); }
56inline float fmax(
float __x,
float __y)
57 {
return __builtin_fmaxf(__x, __y); }
58inline float rint(
float __x)
59 {
return __builtin_rintf(__x); }
60inline float round(
float __x)
61 {
return __builtin_roundf(__x); }
66# define M_PI 3.14159265358979323846
82static inline constexpr
83int64_t
d_cconst(
const uint8_t a,
const uint8_t b,
const uint8_t c,
const uint8_t d)
noexcept
85 return (a << 24) | (b << 16) | (c << 8) | (d << 0);
91static inline constexpr
94 return (str[0] << 24) | (str[1] << 16) | (str[2] << 8) | str[3];
100static inline constexpr
101uint32_t
d_version(
const uint8_t major,
const uint8_t minor,
const uint8_t micro)
noexcept
103 return uint32_t(major << 16) | uint32_t(minor << 8) | (micro << 0);
127FILE* __d_fopen(
const char*
const filename, FILE*
const fallback)
noexcept
129 if (std::getenv(
"DAF_CAPTURE_CONSOLE_OUTPUT") ==
nullptr)
135 ret = std::fopen(filename,
"a+");
152void d_debug(
const char*
const fmt, ...) noexcept
154 static FILE*
const output = __d_fopen(
"/tmp/dpf.debug.log", stdout);
160 if (output == stdout)
163 std::fprintf(output,
"\x1b[37;1m[daf] ");
165 std::fprintf(output,
"\x1b[30;1m[daf] ");
167 std::vfprintf(output, fmt, args);
168 std::fprintf(output,
"\x1b[0m\n");
172 std::fprintf(output,
"[daf] ");
173 std::vfprintf(output, fmt, args);
174 std::fprintf(output,
"\n");
189 static FILE*
const output = __d_fopen(
"/tmp/dpf.stdout.log", stdout);
194 std::fprintf(output,
"[daf] ");
195 std::vfprintf(output, fmt, args);
196 std::fprintf(output,
"\n");
198 if (output != stdout)
211 static FILE*
const output = __d_fopen(
"/tmp/dpf.stderr.log", stderr);
216 std::fprintf(output,
"[daf] ");
217 std::vfprintf(output, fmt, args);
218 std::fprintf(output,
"\n");
220 if (output != stderr)
233 static FILE*
const output = __d_fopen(
"/tmp/dpf.stderr2.log", stderr);
239 if (output == stdout)
241 std::fprintf(output,
"\x1b[31m[daf] ");
242 std::vfprintf(output, fmt, args);
243 std::fprintf(output,
"\x1b[0m\n");
247 std::fprintf(output,
"[daf] ");
248 std::vfprintf(output, fmt, args);
249 std::fprintf(output,
"\n");
261void d_safe_assert(
const char*
const assertion,
const char*
const file,
const int line)
noexcept
263 d_stderr2(
"assertion failure: \"%s\" in file %s, line %i", assertion, file, line);
271 const int line,
const int value)
noexcept
273 d_stderr2(
"assertion failure: \"%s\" in file %s, line %i, value %i", assertion, file, line, value);
281 const int line,
const uint value)
noexcept
283 d_stderr2(
"assertion failure: \"%s\" in file %s, line %i, value %u", assertion, file, line, value);
291 const int line,
const int v1,
const int v2)
noexcept
293 d_stderr2(
"assertion failure: \"%s\" in file %s, line %i, v1 %i, v2 %i", assertion, file, line, v1, v2);
301 const int line,
const uint v1,
const uint v2)
noexcept
303 d_stderr2(
"assertion failure: \"%s\" in file %s, line %i, v1 %u, v2 %u", assertion, file, line, v1, v2);
311 const int line)
noexcept
313 d_stderr2(
"assertion failure: %s, condition \"%s\" in file %s, line %i", message, assertion, file, line);
320void d_safe_exception(
const char*
const exception,
const char*
const file,
const int line)
noexcept
322 d_stderr2(
"exception caught: \"%s\" in file %s, line %i", exception, file, line);
341static inline constexpr
344 return std::abs(v1-v2) < std::numeric_limits<T>::epsilon();
352static inline constexpr
355 return std::abs(v1-v2) >= std::numeric_limits<T>::epsilon();
362static inline constexpr
365 return std::abs(value) < std::numeric_limits<T>::epsilon();
372static inline constexpr
375 return std::abs(value) >= std::numeric_limits<T>::epsilon();
391 std::memcpy(&bits, &value,
sizeof(bits));
392 const volatile uint64_t opaque = bits;
393 return (opaque & 0x7ff0000000000000ULL) != 0x7ff0000000000000ULL;
404 std::memcpy(&bits, &value,
sizeof(bits));
405 const volatile uint32_t opaque = bits;
406 return (opaque & 0x7f800000U) != 0x7f800000U;
415 DAF_SAFE_ASSERT_RETURN(size > 0, 0);
432static inline constexpr
435 return static_cast<int32_t
>(value +
static_cast<T
>(0.5));
443static inline constexpr
446 return static_cast<uint32_t
>(value +
static_cast<T
>(0.5));
454static inline constexpr
457 return static_cast<int32_t
>(value -
static_cast<T
>(0.5));
464static inline constexpr
467 return value >= 0 ?
static_cast<int32_t
>(value +
static_cast<T
>(0.5))
468 :
static_cast<int32_t
>(value -
static_cast<T
>(0.5));
476#ifndef DONT_SET_USING_DAF_NAMESPACE
static constexpr uint32_t d_roundToUnsignedInt(const T &value)
Definition DafUtils.hpp:444
static constexpr bool d_isNotEqual(const T &v1, const T &v2)
Definition DafUtils.hpp:353
static constexpr int32_t d_roundToIntPositive(const T &value)
Definition DafUtils.hpp:433
static constexpr bool d_isEqual(const T &v1, const T &v2)
Definition DafUtils.hpp:342
static bool d_isFinite(const double value) noexcept
Definition DafUtils.hpp:388
static constexpr int32_t d_roundToInt(const T &value)
Definition DafUtils.hpp:465
static constexpr bool d_isNotZero(const T &value)
Definition DafUtils.hpp:373
static constexpr int32_t d_roundToIntNegative(const T &value)
Definition DafUtils.hpp:455
static uint32_t d_nextPowerOf2(uint32_t size) noexcept
Definition DafUtils.hpp:413
static constexpr bool d_isZero(const T &value)
Definition DafUtils.hpp:363
static void d_pass() noexcept
Definition DafUtils.hpp:110
static constexpr int64_t d_cconst(const uint8_t a, const uint8_t b, const uint8_t c, const uint8_t d) noexcept
Definition DafUtils.hpp:83
static constexpr uint32_t d_version(const uint8_t major, const uint8_t minor, const uint8_t micro) noexcept
Definition DafUtils.hpp:101
static void d_stderr(const char *const fmt,...) noexcept
Definition DafUtils.hpp:209
static void d_custom_safe_assert(const char *const message, const char *const assertion, const char *const file, const int line) noexcept
Definition DafUtils.hpp:310
static void d_stdout(const char *const fmt,...) noexcept
Definition DafUtils.hpp:187
static void d_safe_assert(const char *const assertion, const char *const file, const int line) noexcept
Definition DafUtils.hpp:261
static void d_safe_exception(const char *const exception, const char *const file, const int line) noexcept
Definition DafUtils.hpp:320
static void d_stderr2(const char *const fmt,...) noexcept
Definition DafUtils.hpp:231
static void d_safe_assert_int2(const char *const assertion, const char *const file, const int line, const int v1, const int v2) noexcept
Definition DafUtils.hpp:290
static void d_debug(const char *const fmt,...) noexcept
Definition DafUtils.hpp:152
static void d_safe_assert_int(const char *const assertion, const char *const file, const int line, const int value) noexcept
Definition DafUtils.hpp:270
static void d_safe_assert_uint2(const char *const assertion, const char *const file, const int line, const uint v1, const uint v2) noexcept
Definition DafUtils.hpp:300
static void d_safe_assert_uint(const char *const assertion, const char *const file, const int line, const uint value) noexcept
Definition DafUtils.hpp:280
Definition DafUtils.hpp:481