rlib
Convenience library for useful things
Loading...
Searching...
No Matches
rtypes.h
Go to the documentation of this file.
1/* RLIB - Convenience library for useful things
2 * Copyright (C) 2015-2017 Haakon Sporsheim <haakon.sporsheim@gmail.com>
3 *
4 * This library is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Lesser General Public
6 * License as published by the Free Software Foundation; either
7 * version 3.0 of the License, or (at your option) any later version.
8 *
9 * This library is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Lesser General Public License for more details.
13 *
14 * You should have received a copy of the GNU Lesser General Public
15 * License along with this library.
16 * See the COPYING file at the root of the source repository.
17 */
18#ifndef __R_TYPES_H__
19#define __R_TYPES_H__
20
21#if !defined(__RLIB_H_INCLUDE_GUARD__) && !defined(RLIB_COMPILATION)
22#error "#include <rlib.h> only please."
23#endif
24
25#include <rlib/rconfig.h>
26#include <rlib/types/rmacros.h>
27/* *** Some headers are included at the bottom of this file! *** */
28
29#include <limits.h>
30#include <float.h>
31
53
59typedef int rboolean;
67typedef float rfloat;
69typedef double rdouble;
70
72#define RFLOAT_MIN FLT_MIN
74#define RFLOAT_MAX FLT_MAX
76#define RDOUBLE_MIN DBL_MIN
78#define RDOUBLE_MAX DBL_MAX
79/* The platform-specific spellings of infinity / NaN below are
80 * documented identically on every branch; Doxygen picks whichever
81 * branch is active under its preprocessor config, so the comments
82 * have to live on all three so the symbols show up no matter which
83 * branch survives. */
84#if defined(_MSC_VER)
86#define RFLOAT_INFINITY ((rfloat)(1e+300 * 1e+300))
88#define RFLOAT_NAN (RFLOAT_INFINITY * 0.0f)
90#define RDOUBLE_INFINITY ((rdouble)(1e+300 * 1e+300))
92#define RDOUBLE_NAN (RDOUBLE_INFINITY * 0.0)
93#elif defined(__GNUC__)
95#define RFLOAT_INFINITY (__builtin_huge_valf())
97#define RFLOAT_NAN (__builtin_nanf("0x7fc00000"))
99#define RDOUBLE_INFINITY (__builtin_huge_val())
101#define RDOUBLE_NAN ((rdouble)RFLOAT_NAN)
102#else
104#define RFLOAT_INFINITY ((rfloat)1e500)
106#define RFLOAT_NAN (__nan())
108#define RDOUBLE_INFINITY ((rdouble)1e500)
110#define RDOUBLE_NAN ((rdouble)RFLOAT_NAN)
111#endif
112
114#define R_E 2.718281828459045235360287471352662497757247093700
116#define R_LN2 0.693147180559945309417232121458176568075500134360
118#define R_LN10 2.302585092994045684017991454684364207601101488629
120#define R_LOG_2_BASE10 0.301029995663981195213738894724493026768189881462
122#define R_PI 3.141592653589793238462643383279502884197169399375
124#define R_SQRT2 1.414213562373095048801688724209698078569671875377
137typedef char rchar;
139typedef short rshort;
141typedef long rlong;
143typedef char rschar;
145typedef short rsshort;
147typedef long rslong;
149typedef int rsint;
151typedef unsigned char ruchar;
153typedef unsigned short rushort;
155typedef unsigned long rulong;
157typedef unsigned int ruint;
158
159#define RCHAR_MIN CHAR_MIN
160#define RCHAR_MAX CHAR_MAX
161#define RSHORT_MIN SHRT_MIN
162#define RSHORT_MAX SHRT_MAX
163#define RUSHORT_MAX USHRT_MAX
164#define RINT_MIN INT_MIN
165#define RINT_MAX INT_MAX
166#define RUINT_MAX UINT_MAX
167#define RLONG_MIN LONG_MIN
168#define RLONG_MAX LONG_MAX
169#define RULONG_MAX ULONG_MAX
182#ifdef RLIB_DOXYGEN
183/* Doxygen-only mirror of the typedefs emitted into rlib/rconfig.h.
184 * Never compiled (RLIB_DOXYGEN is defined only by the Doxyfile). */
185typedef signed char rint8;
186typedef signed short rint16;
187typedef signed int rint32;
188typedef signed long rint64;
189typedef signed long rintmax;
190typedef unsigned char ruint8;
191typedef unsigned short ruint16;
192typedef unsigned int ruint32;
193typedef unsigned long ruint64;
194typedef unsigned long ruintmax;
195#endif
208#define RINT8_MIN ((rint8) 0x80)
210#define RINT8_MAX ((rint8) 0x7f)
212#define RUINT8_MAX ((ruint8) 0xff)
214#define RINT16_MIN ((rint16) 0x8000)
216#define RINT16_MAX ((rint16) 0x7fff)
218#define RUINT16_MAX ((ruint16) 0xffff)
220#define RINT32_MIN ((rint32) 0x80000000)
222#define RINT32_MAX ((rint32) 0x7fffffff)
224#define RUINT32_MAX ((ruint32) 0xffffffff)
226#define RINT64_MIN ((rint64) RINT64_CONSTANT(0x8000000000000000))
228#define RINT64_MAX RINT64_CONSTANT(0x7fffffffffffffff)
230#define RUINT64_MAX RUINT64_CONSTANT(0xffffffffffffffff)
244#ifdef RLIB_DOXYGEN
245/* Doxygen-only mirror; real definitions are host-resolved in rconfig.h. */
246#define RINT8_MODIFIER "hh"
247#define RINT8_FMT "hhi"
248#define RUINT8_FMT "hhu"
249#define RINT16_MODIFIER "h"
250#define RINT16_FMT "hi"
251#define RUINT16_FMT "hu"
252#define RINT32_MODIFIER ""
253#define RINT32_FMT "i"
254#define RUINT32_FMT "u"
255#define RINT64_MODIFIER "ll"
256#define RINT64_FMT "lli"
257#define RUINT64_FMT "llu"
258#define RINTMAX_MODIFIER "j"
259#define RINTMAX_FMT "ji"
260#define RUINTMAX_FMT "ju"
261#define RSIZE_MODIFIER "z"
262#define RSSIZE_MODIFIER "z"
263#define RSIZE_FMT "zu"
264#define RSSIZE_FMT "zi"
265#define RINTPTR_MODIFIER "t"
266#define RINTPTR_FMT "ti"
267#define RUINTPTR_FMT "tu"
269#define RINT64_CONSTANT(val) val
270#define RUINT64_CONSTANT(val) val
271#define RUINTMAX_MAX ((ruintmax) -1)
272#define RINTMAX_MIN (-RINTMAX_MAX - 1)
273#define RINTMAX_MAX ((rintmax) (RUINTMAX_MAX >> 1))
274#define RSIZE_MAX ((rsize) -1)
275#define RSSIZE_MIN (-RSSIZE_MAX - 1)
276#define RSSIZE_MAX ((rssize) (RSIZE_MAX >> 1))
277#endif
289#ifdef RLIB_DOXYGEN
290typedef unsigned long rsize;
291typedef signed long rssize;
292#endif
296#define ROFFSET_MIN RINT64_MIN
298#define ROFFSET_MAX RINT64_MAX
299
301#define ROFFSET_MODIFIER RINT64_MODIFIER
303#define ROFFSET_FMT RINT64_FMT
305#define ROFFSET_CONSTANT(val) RINT64_CONSTANT(val)
322#ifdef RLIB_DOXYGEN
323typedef signed long rintptr;
324typedef unsigned long ruintptr;
325#endif
327typedef void* rpointer;
329typedef const void* rconstpointer;
331#define RPOINTER_TO_INT(p) ((rsint) (rintptr) (p))
333#define RPOINTER_TO_UINT(p) ((ruint) (ruintptr) (p))
335#define RPOINTER_TO_SIZE(p) ((rsize) (p))
337#define RINT_TO_POINTER(i) ((rpointer) (rintptr) (i))
339#define RUINT_TO_POINTER(u) ((rpointer) (ruintptr) (u))
341#define RSIZE_TO_POINTER(s) ((rpointer) (rsize) (s))
357#define R_CLOCK_TIME_NONE ((RClockTime) -1)
359#define R_CLOCK_TIME_INFINITE R_CLOCK_TIME_NONE
369#if defined (R_OS_WIN32)
371typedef rpointer RIOHandle;
373#define R_IO_HANDLE_FMT "p"
376#define R_IO_HANDLE_INVALID ((RIOHandle) (rintptr) -1)
378#define RPOINTER_TO_IO_HANDLE(p) (p)
380#define RIO_HANDLE_TO_POINTER(h) (h)
381#else
382typedef int RIOHandle;
383#define R_IO_HANDLE_FMT "i"
384#define R_IO_HANDLE_INVALID -1
385#define RPOINTER_TO_IO_HANDLE(p) RPOINTER_TO_INT (p)
386#define RIO_HANDLE_TO_POINTER(h) RINT_TO_POINTER (h)
387#endif
401typedef void (*RDestroyNotify) (rpointer ptr);
403typedef void (*RFunc) (rpointer data, rpointer user);
411typedef void (*RKeyValueFunc) (rpointer key, rpointer value, rpointer user);
413typedef void (*RKeyValueConstFunc) (rconstpointer key, rconstpointer value, rpointer user);
415typedef void (*RStrKeyValueFunc) (const rchar * key, rpointer value, rpointer user);
419typedef rboolean (*RFuncReturn) (rpointer data, rpointer user);
429typedef void (*RFuncUniversal) ();
435R_END_DECLS
436
/* r_types group */
438
454#ifdef RLIB_DOXYGEN
455/* Doxygen-only mirror; the real macros are host-resolved in rconfig.h.
456 * R_OS_* / R_ARCH_* are #mesondefine'd (present only for the target);
457 * shown here as plain defines so they appear in the docs. */
458
462#define RLIB_HAVE_THREADS
463#define RLIB_HAVE_MODULES
464#define RLIB_HAVE_SIGNALS
465#define RLIB_HAVE_FILES
466#define RLIB_HAVE_SOCKETS
467#define RLIB_HAVE_ALLOCA_H
473#define R_ARCH_X86
474#define R_ARCH_X86_64
475#define R_ARCH_IA64
476#define R_ARCH_ARM
477#define R_ARCH_THUMB
478#define R_ARCH_AARCH64
479#define R_ARCH_SPARC
480#define R_ARCH_XTENSA
487#define R_OS_BARE_METAL
488#define R_OS_WIN32
489#define R_OS_UNIX
490#define R_OS_LINUX
491#define R_OS_BSD
492#define R_OS_DARWIN
493#define R_OS_RTEMS
498#define RLIB_SIZEOF_VOID_P 8
499#define RLIB_SIZEOF_INT 4
500#define RLIB_SIZEOF_LONG 8
501#define RLIB_SIZEOF_INTMAX 8
502#define RLIB_SIZEOF_SIZE_T 8
508#define R_AI_PASSIVE
509#define R_AI_CANONNAME
510#define R_AI_NUMERICHOST
511#define R_AI_V4MAPPED
512#define R_AI_ALL
513#define R_AI_ADDRCONFIG
515#endif /* RLIB_DOXYGEN */
/* r_config group */
517
518#include <rlib/types/rmemops.h>
520#include <rlib/types/rbitops.h>
521
522#endif /* __R_TYPES_H__ */
#define R_BEGIN_DECLS
Open an extern "C" block under C++ (no-op in C).
Definition rmacros.h:196
unsigned long rulong
Unsigned long.
Definition rtypes.h:155
rpointer(* RFuncUniversalReturn)()
Type-erased function pointer that returns an rpointer.
Definition rtypes.h:431
char rchar
Default character type (char).
Definition rtypes.h:137
float rfloat
Single-precision floating point.
Definition rtypes.h:67
signed short rint16
Signed 16-bit integer.
Definition rtypes.h:186
signed long rint64
Signed 64-bit integer.
Definition rtypes.h:188
unsigned long ruintmax
Widest unsigned integer the host supports.
Definition rtypes.h:194
rboolean(* REqualFunc)(rconstpointer a, rconstpointer b)
Equality predicate.
Definition rtypes.h:407
rint64 roffset
64-bit signed file / stream offset.
Definition rtypes.h:294
rboolean(* RKeyValueFuncReturn)(rpointer key, rpointer value, rpointer user)
Key-value iteration callback that can short-circuit.
Definition rtypes.h:421
double rdouble
Double-precision floating point.
Definition rtypes.h:69
void(* RKeyValueConstFunc)(rconstpointer key, rconstpointer value, rpointer user)
Const-visitor iteration callback over (key, value, user) triples.
Definition rtypes.h:413
int rboolean
Boolean type (typedef'd to int).
Definition rtypes.h:59
unsigned short rushort
Unsigned short.
Definition rtypes.h:153
short rshort
Default short type (short).
Definition rtypes.h:139
rint64 RClockTimeDiff
Signed clock-time difference.
Definition rtypes.h:355
signed long rintptr
Signed integer wide enough to hold a pointer (like intptr_t).
Definition rtypes.h:323
signed char rint8
Signed 8-bit integer.
Definition rtypes.h:185
void(* RFunc)(rpointer data, rpointer user)
Generic iteration callback over (data, user) pairs.
Definition rtypes.h:403
int(* RCmpFunc)(rconstpointer a, rconstpointer b)
Comparison callback returning <0 / 0 / >0 for a vs b.
Definition rtypes.h:405
void(* RFuncUniversal)()
Type-erased function pointer used as a "any callable" placeholder before downcasting to the actual si...
Definition rtypes.h:429
unsigned int ruint
Unsigned int.
Definition rtypes.h:157
unsigned long ruintptr
Unsigned integer wide enough to hold a pointer (like uintptr_t).
Definition rtypes.h:324
void(* RDestroyNotify)(rpointer ptr)
Destructor callback: free / release the value at ptr.
Definition rtypes.h:401
long rslong
Explicit-signed long.
Definition rtypes.h:147
int rsint
Explicit-signed int.
Definition rtypes.h:149
char rschar
Explicit-signed char (same as rchar on rlib's targets).
Definition rtypes.h:143
void(* RKeyValueFunc)(rpointer key, rpointer value, rpointer user)
Iteration callback over (key, value, user) triples.
Definition rtypes.h:411
signed long rintmax
Widest signed integer the host supports.
Definition rtypes.h:189
long rlong
Default long type (long).
Definition rtypes.h:141
unsigned int ruint32
Unsigned 32-bit integer.
Definition rtypes.h:192
void * rpointer
Generic pointer (alias for void *).
Definition rtypes.h:327
unsigned char ruint8
Unsigned 8-bit integer.
Definition rtypes.h:190
const void * rconstpointer
Generic const pointer (alias for const void *).
Definition rtypes.h:329
signed int rint32
Signed 32-bit integer.
Definition rtypes.h:187
unsigned long rsize
Unsigned pointer-sized size type (like size_t).
Definition rtypes.h:290
rsize(* RHashFunc)(rconstpointer key)
Hash function over an opaque key.
Definition rtypes.h:409
void(* RStrKeyValueFunc)(const rchar *key, rpointer value, rpointer user)
Iteration callback over (const char *key, value, user).
Definition rtypes.h:415
unsigned long ruint64
Unsigned 64-bit integer.
Definition rtypes.h:193
rboolean(* RFuncReturn)(rpointer data, rpointer user)
Iteration callback that can short-circuit by returning FALSE.
Definition rtypes.h:419
short rsshort
Explicit-signed short.
Definition rtypes.h:145
unsigned short ruint16
Unsigned 16-bit integer.
Definition rtypes.h:191
signed long rssize
Signed pointer-sized size type (like ssize_t).
Definition rtypes.h:291
unsigned char ruchar
Unsigned char.
Definition rtypes.h:151
ruint64 RClockTime
Unsigned 64-bit timestamp / duration, in nanoseconds.
Definition rtypes.h:353
Width-specific count-zeros / popcount / parity / shift / rotate macros.
Byte-order detection, byte swapping, and host/network integer conversion.
Compiler-portability macros and small utility macros.
Inline byte-buffer primitives (see Inline byte-buffer primitives).