31#ifndef MTCORE_CORE_HPP
32#define MTCORE_CORE_HPP
35#ifndef MTCORE_NO_STACKTRACE
36#include <cpptrace/cpptrace.hpp>
46#if defined __linux__ || defined __EMSCRIPTEN__
69typedef long double f80;
134#define EXIT_ABORT EXIT_MAX
140#ifndef mt_print_cur_stacktrace
141#ifndef MTCORE_NO_STACKTRACE
146#define mt_print_cur_stacktrace(...) \
147 (void) fprintf(stderr, __VA_ARGS__); \
148 (void) fflush(stderr); \
149 cpptrace::stacktrace::current(1).print(std::cerr);
151#define mt_print_cur_stacktrace(...) \
152 (void) fprintf(stderr, __VA_ARGS__); \
153 (void) fflush(stderr);
157#ifndef mt_print_stacktrace
158#ifndef MTCORE_NO_STACKTRACE
163#define mt_print_stacktrace(TRACE, ...) \
164 (void) fprintf(stderr, __VA_ARGS__); \
165 (void) fflush(stderr); \
166 (TRACE).print(std::cerr);
168#define mt_print_stacktrace(TRACE, ...) \
169 (void) fprintf(stderr, __VA_ARGS__); \
170 (void) fflush(stderr);
180#define not_implemented() unreachable("NOT IMPLEMENTED")
188#define not_implemented() \
189 unreachable("NOT IMPLEMENTED"); \
190 static_assert(false, "CODE NOT IMPLEMENTED");
199#define print_debug(fmt, ...) (void) fprintf(stderr, "\nDEBUG AT %s:%d! " fmt "\n", __FILE__, __LINE__, __VA_ARGS__)
206#define print_debug(fmt, ...)
216#define ensure(check, ...) \
218 mt_print_cur_stacktrace("\nCONDITION FAILED!\n\t" \
219 "CONDITION: %s\n\t" \
223 "%d\n\tERRNO DESC: %s\n", \
224 #check, #__VA_ARGS__, __FILE__, __LINE__, errno, strerror(errno)); \
228#if defined(_MSC_VER) && !defined(__clang__)
232#define unreachable(...) \
233 mt_print_cur_stacktrace("\n\nUNREACHABLE!\n\t" \
237 "%d\n\tERRNO DESC: %s\n", \
238 #__VA_ARGS__, __FILE__, __LINE__, errno, strerror(errno)); \
246#define unreachable(...) \
247 mt_print_cur_stacktrace("\nUNREACHABLE!\n\t" \
251 "%d\n\tERRNO DESC: %s\n", \
252 #__VA_ARGS__, __FILE__, __LINE__, errno, strerror(errno)); \
253 __builtin_unreachable(); \
262#define mtcore_warn_trace(...) \
263 mt_print_cur_stacktrace("\nWARNING!\n\t" \
266 #__VA_ARGS__, __FILE__, __LINE__);
271#define mtcore_warn(...) \
276 #__VA_ARGS__, __FILE__, __LINE__); \
277 (void) fflush(stderr);
284#define mtcore_warn(...)
290#define mtcore_warn_trace(...)
305 template<
typename... Ts>
307 using Ts::operator()...;
310 template<
class... Ts>
313 namespace defer_impl {
317 struct DeferrerBuilder {};
334 Deferrer<F> operator+(DeferrerBuilder, F f) {
339#define DEFER_(LINE) zz_defer##LINE
340#define DEFER(LINE) DEFER_(LINE)
357#define mtdefer auto DEFER(__LINE__) = mtcore::defer_impl::DeferrerBuilder{} + [&]()
const char ** Environ
Environment variable typedef.
CollectionAddNoAllocationError
Errors when adding elements to collections when no allocation is allowed.
uint64_t u64
Alias for 64-bit unsigned ints.
int32_t i32
Alias for 32-bit ints.
wchar_t wchar
Alias for ints the same size as a wide character.
float f32
Alias for 32-bit floats.
int64_t i64
Alias for 64-bit ints.
uint8_t u8
Alias for 8-bit unsigned ints.
uintptr_t uptr
Alias for ints the same size as a pointer.
double f64
Alias for 64-bit floats.
long double f80
Alias for 80-bit floats.
uint16_t u16
Alias for 16-bit unsigned ints.
int16_t i16
Alias for 16-bit ints.
int8_t i8
Alias for 8-bit ints.
uint32_t u32
Alias for 32-bit unsigned ints.
Core library for C++ with Zig-related functionality.
overload(Ts...) -> overload< Ts... >
Visit overload pattern for std::variant.