/* * Copyright (c) 2015 Andrew Kelley * * This file is part of zig, which is MIT licensed. * See http://opensource.org/licenses/MIT */ #ifndef ZIG_UTIL_HPP #define ZIG_UTIL_HPP #include #include #include void zig_panic(const char *format, ...) __attribute__((cold)) __attribute__ ((noreturn)) __attribute__ ((format (printf, 1, 2))); template __attribute__((malloc)) static inline T *allocate_nonzero(size_t count) { T *ptr = reinterpret_cast(malloc(count * sizeof(T))); if (!ptr) zig_panic("allocation failed"); return ptr; } template __attribute__((malloc)) static inline T *allocate(size_t count) { T *ptr = reinterpret_cast(calloc(count, sizeof(T))); if (!ptr) zig_panic("allocation failed"); return ptr; } template static inline T *reallocate_nonzero(T * old, size_t new_count) { T *ptr = reinterpret_cast(realloc(old, new_count * sizeof(T))); if (!ptr) zig_panic("allocation failed"); return ptr; } char *zig_alloc_sprintf(int *len, const char *format, ...) __attribute__ ((format (printf, 2, 3))); template constexpr long array_length(const T (&)[n]) { return n; } #endif