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 3
84
86#define UCX_VERSION_MINOR 1
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_attr_fallthrough __attribute__((__fallthrough__))
137
141#define cx_attr_nonnull __attribute__((__nonnull__))
142
146#define cx_attr_nonnull_arg(...) __attribute__((__nonnull__(__VA_ARGS__)))
147
151#define cx_attr_returns_nonnull __attribute__((__returns_nonnull__))
152
156#define cx_attr_malloc __attribute__((__malloc__))
157
158#if !defined(__clang__) && __GNUC__ >= 11
166#define cx_attr_dealloc(freefunc, freefunc_arg) \
167 __attribute__((__malloc__(freefunc, freefunc_arg)))
168#else
172#define cx_attr_dealloc(...)
173#endif // __clang__
174
178#define cx_attr_dealloc_ucx cx_attr_dealloc(cxFree, 2)
179
183#define cx_attr_allocsize(...) __attribute__((__alloc_size__(__VA_ARGS__)))
184
185
186#ifdef __clang__
190#define cx_attr_cstr_arg(idx)
194#define cx_attr_access(mode, ...)
195#else
196#if __GNUC__ < 10
200#define cx_attr_access(mode, ...)
201#else
205#define cx_attr_access(mode, ...) __attribute__((__access__(mode, __VA_ARGS__)))
206#endif // __GNUC__ < 10
207#if __GNUC__ < 14
211#define cx_attr_cstr_arg(idx)
212#else
218#define cx_attr_cstr_arg(idx) \
219 __attribute__((__null_terminated_string_arg__(idx)))
220#endif // __GNUC__ < 14
221#endif // __clang__
222
223
230#define cx_attr_access_r(...) cx_attr_access(__read_only__, __VA_ARGS__)
231
238#define cx_attr_access_rw(...) cx_attr_access(__read_write__, __VA_ARGS__)
239
246#define cx_attr_access_w(...) cx_attr_access(__write_only__, __VA_ARGS__)
247
251#define cx_attr_unused __attribute__((__unused__))
252
256#define cx_attr_nodiscard __attribute__((__warn_unused_result__))
257
258
259// ---------------------------------------------------------------------------
260// MSVC specifics
261// ---------------------------------------------------------------------------
262
263#ifdef _MSC_VER
264// fix missing _Thread_local support
265#define _Thread_local __declspec(thread)
266#endif // _MSC_VER
267
268// ---------------------------------------------------------------------------
269// Exported and inlined functions
270// ---------------------------------------------------------------------------
271
272#if defined(CX_WINDLL_EXPORT)
273#define CX_EXPORT __declspec(dllexport)
274#elif defined(CX_WINDLL)
275#define CX_EXPORT __declspec(dllimport)
276#else
278#define CX_EXPORT
279#endif // CX_WINDLL / CX_WINDLL_EXPORT
280
281#ifdef __GNUC__
285#define CX_INLINE __attribute__((always_inline)) static inline
286#else
290#define CX_INLINE static inline
291#endif
295#define CX_CPPDECL static inline
296
297// ---------------------------------------------------------------------------
298// Useful function pointers
299// ---------------------------------------------------------------------------
300
304typedef size_t (*cx_write_func)(const void*, size_t, size_t, void*);
305
309typedef size_t (*cx_read_func)(void*, size_t, size_t, void*);
310
311// ---------------------------------------------------------------------------
312// Utility macros
313// ---------------------------------------------------------------------------
314
324#define cx_nmemb(arr) (sizeof(arr)/sizeof((arr)[0]))
325
326// ---------------------------------------------------------------------------
327// szmul implementation
328// ---------------------------------------------------------------------------
329
330#if (__GNUC__ >= 5 || defined(__clang__)) && !defined(CX_NO_SZMUL_BUILTIN)
331#define CX_SZMUL_BUILTIN
332#define cx_szmul(a, b, result) __builtin_mul_overflow(a, b, result)
333#else // no GNUC or clang bultin
344#define cx_szmul(a, b, result) cx_szmul_impl(a, b, result)
345
358#if __cplusplus
359extern "C"
360#endif
361CX_EXPORT int cx_szmul_impl(size_t a, size_t b, size_t *result);
362#endif // cx_szmul
363
364#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:304
size_t(* cx_read_func)(void *, size_t, size_t, void *)
Function pointer compatible with fread-like functions.
Definition common.h:309
#define CX_EXPORT
Only used for building Windows DLLs.
Definition common.h:278
int cx_szmul_impl(size_t a, size_t b, size_t *result)
Implementation of cx_szmul() when no compiler builtin is available.