ucx
UAP Common Extensions
Loading...
Searching...
No Matches
common.h
Go to the documentation of this file.
1/*
2 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
3 *
4 * Copyright 2021 Mike Becker, Olaf Wintermann All rights reserved.
5 *
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions are met:
8 *
9 * 1. Redistributions of source code must retain the above copyright
10 * notice, this list of conditions and the following disclaimer.
11 *
12 * 2. Redistributions in binary form must reproduce the above copyright
13 * notice, this list of conditions and the following disclaimer in the
14 * documentation and/or other materials provided with the distribution.
15 *
16 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
17 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
20 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
21 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
22 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
23 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
24 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
25 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
26 * POSSIBILITY OF SUCH DAMAGE.
27 */
28
78
79#ifndef UCX_COMMON_H
80#define UCX_COMMON_H
81
83#define UCX_VERSION_MAJOR 4
84
86#define UCX_VERSION_MINOR 0
87
89#define UCX_VERSION (((UCX_VERSION_MAJOR)<<16)|UCX_VERSION_MINOR)
90
91// ---------------------------------------------------------------------------
92// Common includes
93// ---------------------------------------------------------------------------
94
95#include <stdlib.h>
96#include <stddef.h>
97#include <stdbool.h>
98#include <stdint.h>
99#include <sys/types.h>
100
101// ---------------------------------------------------------------------------
102// Architecture Detection
103// ---------------------------------------------------------------------------
104
105#ifndef INTPTR_MAX
106#error Missing INTPTR_MAX definition
107#endif
108#if INTPTR_MAX == INT64_MAX
112#define CX_WORDSIZE 64
113#elif INTPTR_MAX == INT32_MAX
117#define CX_WORDSIZE 32
118#else
119#error Unknown pointer size or missing size macros!
120#endif
121
122// ---------------------------------------------------------------------------
123// Attribute definitions
124// ---------------------------------------------------------------------------
125
126#ifndef __GNUC__
130#define __attribute__(x)
131#endif
132
136#define CX_FALLTHROUGH __attribute__((__fallthrough__))
137
141#define CX_NONNULL __attribute__((__nonnull__))
142
146#define CX_NONNULL_ARG(...) __attribute__((__nonnull__(__VA_ARGS__)))
147
151#define CX_RETURNS_NONNULL __attribute__((__returns_nonnull__))
152
156#define CX_MALLOC __attribute__((__malloc__))
157
158#if !defined(__clang__) && __GNUC__ >= 11
166#define CX_DEALLOC(freefunc, freefunc_arg) \
167 __attribute__((__malloc__(freefunc, freefunc_arg)))
168#else
172#define CX_DEALLOC(...)
173#endif // __clang__
174
178#define CX_DEALLOC_UCX CX_DEALLOC(cxFree, 2)
179
183#define CX_ALLOCSIZE(...) __attribute__((__alloc_size__(__VA_ARGS__)))
184
185
186#ifdef __clang__
190#define CX_CSTR_ARG(idx)
194#define CX_ACCESS(mode, ...)
195#else
196#if __GNUC__ < 10
200#define CX_ACCESS(mode, ...)
201#else
205#define CX_ACCESS(mode, ...) __attribute__((__access__(mode, __VA_ARGS__)))
206#endif // __GNUC__ < 10
207#if __GNUC__ < 14
211#define CX_CSTR_ARG(idx)
212#else
218#define CX_CSTR_ARG(idx) \
219 __attribute__((__null_terminated_string_arg__(idx)))
220#endif // __GNUC__ < 14
221#endif // __clang__
222
223
230#define CX_ACCESS_R(...) CX_ACCESS(__read_only__, __VA_ARGS__)
231
238#define CX_ACCESS_RW(...) CX_ACCESS(__read_write__, __VA_ARGS__)
239
246#define CX_ACCESS_W(...) CX_ACCESS(__write_only__, __VA_ARGS__)
247
251#define CX_UNUSED __attribute__((__unused__))
252
256#define CX_NODISCARD __attribute__((__warn_unused_result__))
257
258
259// ---------------------------------------------------------------------------
260// Support for thread_local
261// ---------------------------------------------------------------------------
262
263#ifdef __cplusplus
264#define cx_thread_local thread_local
265#else // ! __cplusplus
266#ifdef _MSC_VER
267#define cx_thread_local __declspec(thread)
268#else // ! _MSC_VER
269#if !defined __STDC_VERSION__ || __STDC_VERSION__ < 202300L
271#define cx_thread_local _Thread_local
272#else // C23 or newer
274#define cx_thread_local thread_local
275#endif // C23
276#endif // _MSC_VER
277#endif // __cplusplus
278
279// ---------------------------------------------------------------------------
280// Exported and inlined functions
281// ---------------------------------------------------------------------------
282
283#if defined(CX_WINDLL_EXPORT)
284#define CX_EXPORT __declspec(dllexport)
285#elif defined(CX_WINDLL)
286#define CX_EXPORT __declspec(dllimport)
287#else
289#define CX_EXPORT
290#endif // CX_WINDLL / CX_WINDLL_EXPORT
291
292#ifdef __cplusplus
293#define CX_EXTERN extern "C" CX_EXPORT
294#define CX_FPTR extern "C" typedef
295#else
297#define CX_EXTERN CX_EXPORT
299#define CX_FPTR typedef
300#endif
301
302#ifdef __GNUC__
306#define CX_INLINE __attribute__((always_inline)) static inline
307#else
311#define CX_INLINE static inline
312#endif
316#define CX_CPPDECL static inline
317
318// ---------------------------------------------------------------------------
319// Useful function pointers
320// ---------------------------------------------------------------------------
321
325typedef size_t (*cx_write_func)(const void*, size_t, size_t, void*);
326
330typedef size_t (*cx_read_func)(void*, size_t, size_t, void*);
331
332// ---------------------------------------------------------------------------
333// Utility macros
334// ---------------------------------------------------------------------------
335
345#define cx_nmemb(arr) (sizeof(arr)/sizeof((arr)[0]))
346
347// ---------------------------------------------------------------------------
348// szmul implementation
349// ---------------------------------------------------------------------------
350
351#if (__GNUC__ >= 5 || defined(__clang__)) && !defined(CX_NO_SZMUL_BUILTIN)
352#define CX_SZMUL_BUILTIN
353#define cx_szmul(a, b, result) __builtin_mul_overflow(a, b, result)
354#else // no GNUC or clang bultin
365#define cx_szmul(a, b, result) cx_szmul_impl(a, b, result)
366
380int cx_szmul_impl(size_t a, size_t b, size_t *result);
381#endif // cx_szmul
382
383#endif // UCX_COMMON_H
size_t(* cx_write_func)(const void *, size_t, size_t, void *)
Function pointer compatible with fwrite-like functions.
Definition common.h:325
size_t(* cx_read_func)(void *, size_t, size_t, void *)
Function pointer compatible with fread-like functions.
Definition common.h:330
int cx_szmul_impl(size_t a, size_t b, size_t *result)
Implementation of cx_szmul() when no compiler builtin is available.
#define CX_EXTERN
Declares a function with external linkage.
Definition common.h:297