Brickworks > API documentation > bw_common
A common header to make sure that a bunch of basic definitions are available and consistent for all Brickworks modules.
Module type: foundation
Version: 1.1.0
Brickworks requires definitions of:
NULL
(C only) and size_t
, normally supplied by stddef.h
;(u)int{8,16,32,64}_t
, INT{8,16,32,64}_{MIN,MAX}
, and UINT{8,16,32,64}_MAX
, normally supplied by stdint.h
;INFINITY
, normally supplied by math.h
.You can control whether those definitions are taken from said headers or you can supply them yourselves. In particular:
BW_NO_STDLIB
or BW_NO_STDDEF_H
is defined, then stddef.h
is not
d;BW_NO_STDLIB
or BW_NO_STDINT_H
is defined, then stdint.h
is not
d;BW_NO_STDLIB
or BW_NO_MATH_H
is defined, then math.h
is not
d.A BW_NULL
macro is defined whose value is either NULL
(C) or nullptr
(C++).
C++ APIs of Brickworks modules typically include overloaded methods that use std::array
arguments, and thus require the <array>
header file.
If this is not wanted, defining BW_CXX_NO_ARRAY
suppresses such methods and the inclusion of said header file.
BW_RESTRICT
is a preprocessor definition that wraps the restrict
keyword.
If it is not defined already, then it gets defined as restrict
if C99 is supported, otherwise it has no effect (typically when compiling C++ code).
Both macros are assert()
-like. BW_ASSERT
is meant to perform rapid/basic validity checks (e.g., input pointer is not NULL
, input float
number is finite), while BW_ASSERT_DEEP
should be used for deeper checks (e.g., validate data structures and internal states).
If BW_NO_DEBUG
is defined then "calls" to both BW_ASSERT
and BW_ASSERT_DEEP
will be stripped away by the preprocessor.
Whether BW_NO_DEBUG
is defined or not, "calls" to BW_ASSERT_DEEP
will still be stripped anyway if BW_DEBUG_DEEP
is not defined.
Otherwise, BW_ASSERT
and BW_ASSERT_DEEP
can either be provided by you, otherwise BW_ASSERT
is defined as assert
(assert.h
is d and
BW_NO_STDLIB
must not be defined — please mind that assert.h
is still influenced by NDEBUG
), and BW_ASSERT_DEEP
is defined as BW_ASSERT
.
static inline char bw_is_inf(
float x);
Returns non-0
if x
is positive or negative infinity, 0
otherwise.
static inline char bw_is_nan(
float x);
Returns non-0
if x
is NaN, 0
otherwise.
static inline char bw_is_finite(
float x);
Returns non-0
if x
is finite (neither NaN nor positive or negative infinity), 0
otherwise.
static inline char bw_has_inf(
const float * BW_RESTRICT x,
size_t n_elems);
Scans the fist n_elems
in buffer x
and returns non-0
if it contains at least one positive or negative inifinity value, 0
otherwise.
static inline char bw_has_nan(
const float * BW_RESTRICT x,
size_t n_elems);
Scans the fist n_elems
in buffer x
and returns non-0
if it contains at least one NaN value, 0
otherwise.
static inline char bw_has_only_finite(
const float * BW_RESTRICT x,
size_t n_elems);
Scans the fist n_elems
in buffer x
and returns non-0
if it only finds finite values (neither NaN nor positive or negative infinity), 0
otherwise.
static inline uint32_t bw_hash_sdbm(
const char * BW_RESTRICT string);
Returns the sdbm hash of the given string
.
BW_NULL
and relaxed NULL
definition requirement in C++.BW_CXX_NO_ARRAY
.bw_hash_sdbm()
.BW_SIZE_T
and went for size_t
instead.BW_NO_STDLIB
, BW_NO_STDDEF_H
, BW_NO_STDINT_H
, and BW_NO_MATH_H
.BW_NO_DEBUG
to replace NDEBUG
and prevented useless inclusion of assert.h
.BW_RESTRICT
specifiers to input arguments.extern "C"
to functions.BW_ASSERT
, bw_is_inf()
, bw_is_nan()
, bw_is_finite()
, bw_has_inf()
, bw_has_nan()
, bw_has_only_finite()
, and bw_hash_sdbm()
.BW_SIZE_T
.BW_SIZE_T
.BW_MALLOC
, BW_REALLOC
, and BW_FREE
.BW_RESTRICT
.