mirror of
https://github.com/RIOT-OS/RIOT.git
synced 2024-12-29 04:50:03 +01:00
a0930a8ec0
Move C++ modules in a new menu tree and improve the description.
440 lines
11 KiB
C++
440 lines
11 KiB
C++
/*
|
|
* Copyright (C) 2019 Otto-von-Guericke-Universität Magdeburg
|
|
*
|
|
* This file is subject to the terms and conditions of the GNU Lesser
|
|
* General Public License v2.1. See the file LICENSE in the top level
|
|
* directory for more details.
|
|
*/
|
|
|
|
/**
|
|
* @defgroup sys_c11_atomics_cpp_compat C++ compatibility with C11 atomics
|
|
* @ingroup cpp
|
|
* @brief C++ compatibility of default C11 atomics types
|
|
*
|
|
* This module provides opaque `typedef`s for each standard C11 atomic type with
|
|
* the same size and alignment requirements. The contents of types are not
|
|
* accessible to C++ code, but this allows `struct`s to be defined with the
|
|
* same memory layout as the C version, so that they can be allocated from C++.
|
|
*
|
|
* @{
|
|
*
|
|
* @file
|
|
* @brief C++ compatibility of default C11 atomics types
|
|
*
|
|
* @author Marian Buschsieweke <marian.buschsieweke@ovgu.de>
|
|
*/
|
|
|
|
#pragma once
|
|
|
|
#include "c11_atomics_compat_cpu.hpp"
|
|
|
|
/**
|
|
* @brief Initialize an atomic variable
|
|
*
|
|
* Usage (same syntax as the real C11 atomic initializer):
|
|
* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
* atomic_int foo = ATOMIC_VAR_INIT(42);
|
|
* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
*/
|
|
#ifndef ATOMIC_VAR_INIT
|
|
#define ATOMIC_VAR_INIT(x) { x }
|
|
#endif
|
|
|
|
/**
|
|
* @brief Type with the same alignment and size as `atomic_bool`
|
|
*/
|
|
typedef struct {
|
|
/**
|
|
* @brief Opaque content placeholder
|
|
*
|
|
* Access only for initializing from C++
|
|
*/
|
|
ATOMIC_BOOL_SAME_SIZED_TYPE do_not_access_from_cpp;
|
|
} atomic_bool;
|
|
|
|
/**
|
|
* @brief Type with the same alignment and size as `atomic_char`
|
|
*/
|
|
typedef struct {
|
|
/**
|
|
* @brief Opaque content placeholder
|
|
*
|
|
* Access only for initializing from C++
|
|
*/
|
|
ATOMIC_CHAR_SAME_SIZED_TYPE do_not_access_from_cpp;
|
|
} atomic_char;
|
|
|
|
/**
|
|
* @brief Type with the same alignment and size as `atomic_schar`
|
|
*/
|
|
typedef struct {
|
|
/**
|
|
* @brief Opaque content placeholder
|
|
*
|
|
* Access only for initializing from C++
|
|
*/
|
|
ATOMIC_SCHAR_SAME_SIZED_TYPE do_not_access_from_cpp;
|
|
} atomic_schar;
|
|
|
|
/**
|
|
* @brief Type with the same alignment and size as `atomic_uchar`
|
|
*/
|
|
typedef struct {
|
|
/**
|
|
* @brief Opaque content placeholder
|
|
*
|
|
* Access only for initializing from C++
|
|
*/
|
|
ATOMIC_UCHAR_SAME_SIZED_TYPE do_not_access_from_cpp;
|
|
} atomic_uchar;
|
|
|
|
/**
|
|
* @brief Type with the same alignment and size as `atomic_short`
|
|
*/
|
|
typedef struct {
|
|
/**
|
|
* @brief Opaque content placeholder
|
|
*
|
|
* Access only for initializing from C++
|
|
*/
|
|
ATOMIC_SHORT_SAME_SIZED_TYPE do_not_access_from_cpp;
|
|
} atomic_short;
|
|
|
|
/**
|
|
* @brief Type with the same alignment and size as `atomic_ushort`
|
|
*/
|
|
typedef struct {
|
|
/**
|
|
* @brief Opaque content placeholder
|
|
*
|
|
* Access only for initializing from C++
|
|
*/
|
|
ATOMIC_USHORT_SAME_SIZED_TYPE do_not_access_from_cpp;
|
|
} atomic_ushort;
|
|
|
|
/**
|
|
* @brief Type with the same alignment and size as `atomic_int`
|
|
*/
|
|
typedef struct {
|
|
/**
|
|
* @brief Opaque content placeholder
|
|
*
|
|
* Access only for initializing from C++
|
|
*/
|
|
ATOMIC_INT_SAME_SIZED_TYPE do_not_access_from_cpp;
|
|
} atomic_int;
|
|
|
|
/**
|
|
* @brief Type with the same alignment and size as `atomic_uint`
|
|
*/
|
|
typedef struct {
|
|
/**
|
|
* @brief Opaque content placeholder
|
|
*
|
|
* Access only for initializing from C++
|
|
*/
|
|
ATOMIC_UINT_SAME_SIZED_TYPE do_not_access_from_cpp;
|
|
} atomic_uint;
|
|
|
|
/**
|
|
* @brief Type with the same alignment and size as `atomic_long`
|
|
*/
|
|
typedef struct {
|
|
/**
|
|
* @brief Opaque content placeholder
|
|
*
|
|
* Access only for initializing from C++
|
|
*/
|
|
ATOMIC_LONG_SAME_SIZED_TYPE do_not_access_from_cpp;
|
|
} atomic_long;
|
|
|
|
/**
|
|
* @brief Type with the same alignment and size as `atomic_ulong`
|
|
*/
|
|
typedef struct {
|
|
/**
|
|
* @brief Opaque content placeholder
|
|
*
|
|
* Access only for initializing from C++
|
|
*/
|
|
ATOMIC_ULONG_SAME_SIZED_TYPE do_not_access_from_cpp;
|
|
} atomic_ulong;
|
|
|
|
/**
|
|
* @brief Type with the same alignment and size as `atomic_llong`
|
|
*/
|
|
typedef struct {
|
|
/**
|
|
* @brief Opaque content placeholder
|
|
*
|
|
* Access only for initializing from C++
|
|
*/
|
|
ATOMIC_LLONG_SAME_SIZED_TYPE do_not_access_from_cpp;
|
|
} atomic_llong;
|
|
|
|
/**
|
|
* @brief Type with the same alignment and size as `atomic_ullong`
|
|
*/
|
|
typedef struct {
|
|
/**
|
|
* @brief Opaque content placeholder
|
|
*
|
|
* Access only for initializing from C++
|
|
*/
|
|
ATOMIC_ULLONG_SAME_SIZED_TYPE do_not_access_from_cpp;
|
|
} atomic_ullong;
|
|
|
|
/**
|
|
* @brief Type with the same alignment and size as `atomic_int_least8_t`
|
|
*/
|
|
typedef struct {
|
|
/**
|
|
* @brief Opaque content placeholder
|
|
*
|
|
* Access only for initializing from C++
|
|
*/
|
|
ATOMIC_INT_LEAST8_T_SAME_SIZED_TYPE do_not_access_from_cpp;
|
|
} atomic_int_least8_t;
|
|
|
|
/**
|
|
* @brief Type with the same alignment and size as `atomic_uint_least8_t`
|
|
*/
|
|
typedef struct {
|
|
/**
|
|
* @brief Opaque content placeholder
|
|
*
|
|
* Access only for initializing from C++
|
|
*/
|
|
ATOMIC_UINT_LEAST8_T_SAME_SIZED_TYPE do_not_access_from_cpp;
|
|
} atomic_uint_least8_t;
|
|
|
|
/**
|
|
* @brief Type with the same alignment and size as `atomic_int_least16_t`
|
|
*/
|
|
typedef struct {
|
|
/**
|
|
* @brief Opaque content placeholder
|
|
*
|
|
* Access only for initializing from C++
|
|
*/
|
|
ATOMIC_INT_LEAST16_T_SAME_SIZED_TYPE do_not_access_from_cpp;
|
|
} atomic_int_least16_t;
|
|
|
|
/**
|
|
* @brief Type with the same alignment and size as `atomic_uint_least16_t`
|
|
*/
|
|
typedef struct {
|
|
/**
|
|
* @brief Opaque content placeholder
|
|
*
|
|
* Access only for initializing from C++
|
|
*/
|
|
ATOMIC_UINT_LEAST16_T_SAME_SIZED_TYPE do_not_access_from_cpp;
|
|
} atomic_uint_least16_t;
|
|
|
|
/**
|
|
* @brief Type with the same alignment and size as `atomic_int_least32_t`
|
|
*/
|
|
typedef struct {
|
|
/**
|
|
* @brief Opaque content placeholder
|
|
*
|
|
* Access only for initializing from C++
|
|
*/
|
|
ATOMIC_INT_LEAST32_T_SAME_SIZED_TYPE do_not_access_from_cpp;
|
|
} atomic_int_least32_t;
|
|
|
|
/**
|
|
* @brief Type with the same alignment and size as `atomic_uint_least32_t`
|
|
*/
|
|
typedef struct {
|
|
/**
|
|
* @brief Opaque content placeholder
|
|
*
|
|
* Access only for initializing from C++
|
|
*/
|
|
ATOMIC_UINT_LEAST32_T_SAME_SIZED_TYPE do_not_access_from_cpp;
|
|
} atomic_uint_least32_t;
|
|
|
|
/**
|
|
* @brief Type with the same alignment and size as `atomic_int_least64_t`
|
|
*/
|
|
typedef struct {
|
|
/**
|
|
* @brief Opaque content placeholder
|
|
*
|
|
* Access only for initializing from C++
|
|
*/
|
|
ATOMIC_INT_LEAST64_T_SAME_SIZED_TYPE do_not_access_from_cpp;
|
|
} atomic_int_least64_t;
|
|
|
|
/**
|
|
* @brief Type with the same alignment and size as `atomic_uint_least64_t`
|
|
*/
|
|
typedef struct {
|
|
/**
|
|
* @brief Opaque content placeholder
|
|
*
|
|
* Access only for initializing from C++
|
|
*/
|
|
ATOMIC_UINT_LEAST64_T_SAME_SIZED_TYPE do_not_access_from_cpp;
|
|
} atomic_uint_least64_t;
|
|
|
|
/**
|
|
* @brief Type with the same alignment and size as `atomic_int_fast8_t`
|
|
*/
|
|
typedef struct {
|
|
/**
|
|
* @brief Opaque content placeholder
|
|
*
|
|
* Access only for initializing from C++
|
|
*/
|
|
ATOMIC_INT_FAST8_T_SAME_SIZED_TYPE do_not_access_from_cpp;
|
|
} atomic_int_fast8_t;
|
|
|
|
/**
|
|
* @brief Type with the same alignment and size as `atomic_uint_fast8_t`
|
|
*/
|
|
typedef struct {
|
|
/**
|
|
* @brief Opaque content placeholder
|
|
*
|
|
* Access only for initializing from C++
|
|
*/
|
|
ATOMIC_UINT_FAST8_T_SAME_SIZED_TYPE do_not_access_from_cpp;
|
|
} atomic_uint_fast8_t;
|
|
|
|
/**
|
|
* @brief Type with the same alignment and size as `atomic_int_fast16_t`
|
|
*/
|
|
typedef struct {
|
|
/**
|
|
* @brief Opaque content placeholder
|
|
*
|
|
* Access only for initializing from C++
|
|
*/
|
|
ATOMIC_INT_FAST16_T_SAME_SIZED_TYPE do_not_access_from_cpp;
|
|
} atomic_int_fast16_t;
|
|
|
|
/**
|
|
* @brief Type with the same alignment and size as `atomic_uint_fast16_t`
|
|
*/
|
|
typedef struct {
|
|
/**
|
|
* @brief Opaque content placeholder
|
|
*
|
|
* Access only for initializing from C++
|
|
*/
|
|
ATOMIC_UINT_FAST16_T_SAME_SIZED_TYPE do_not_access_from_cpp;
|
|
} atomic_uint_fast16_t;
|
|
|
|
/**
|
|
* @brief Type with the same alignment and size as `atomic_int_fast32_t`
|
|
*/
|
|
typedef struct {
|
|
/**
|
|
* @brief Opaque content placeholder
|
|
*
|
|
* Access only for initializing from C++
|
|
*/
|
|
ATOMIC_INT_FAST32_T_SAME_SIZED_TYPE do_not_access_from_cpp;
|
|
} atomic_int_fast32_t;
|
|
|
|
/**
|
|
* @brief Type with the same alignment and size as `atomic_uint_fast32_t`
|
|
*/
|
|
typedef struct {
|
|
/**
|
|
* @brief Opaque content placeholder
|
|
*
|
|
* Access only for initializing from C++
|
|
*/
|
|
ATOMIC_UINT_FAST32_T_SAME_SIZED_TYPE do_not_access_from_cpp;
|
|
} atomic_uint_fast32_t;
|
|
|
|
/**
|
|
* @brief Type with the same alignment and size as `atomic_int_fast64_t`
|
|
*/
|
|
typedef struct {
|
|
/**
|
|
* @brief Opaque content placeholder
|
|
*
|
|
* Access only for initializing from C++
|
|
*/
|
|
ATOMIC_INT_FAST64_T_SAME_SIZED_TYPE do_not_access_from_cpp;
|
|
} atomic_int_fast64_t;
|
|
|
|
/**
|
|
* @brief Type with the same alignment and size as `atomic_uint_fast64_t`
|
|
*/
|
|
typedef struct {
|
|
/**
|
|
* @brief Opaque content placeholder
|
|
*
|
|
* Access only for initializing from C++
|
|
*/
|
|
ATOMIC_UINT_FAST64_T_SAME_SIZED_TYPE do_not_access_from_cpp;
|
|
} atomic_uint_fast64_t;
|
|
|
|
/**
|
|
* @brief Type with the same alignment and size as `atomic_intptr_t`
|
|
*/
|
|
typedef struct {
|
|
/**
|
|
* @brief Opaque content placeholder
|
|
*
|
|
* Access only for initializing from C++
|
|
*/
|
|
ATOMIC_INTPTR_T_SAME_SIZED_TYPE do_not_access_from_cpp;
|
|
} atomic_intptr_t;
|
|
|
|
/**
|
|
* @brief Type with the same alignment and size as `atomic_uintptr_t`
|
|
*/
|
|
typedef struct {
|
|
/**
|
|
* @brief Opaque content placeholder
|
|
*
|
|
* Access only for initializing from C++
|
|
*/
|
|
ATOMIC_UINTPTR_T_SAME_SIZED_TYPE do_not_access_from_cpp;
|
|
} atomic_uintptr_t;
|
|
|
|
/**
|
|
* @brief Type with the same alignment and size as `atomic_size_t`
|
|
*/
|
|
typedef struct {
|
|
/**
|
|
* @brief Opaque content placeholder
|
|
*
|
|
* Access only for initializing from C++
|
|
*/
|
|
ATOMIC_SIZE_T_SAME_SIZED_TYPE do_not_access_from_cpp;
|
|
} atomic_size_t;
|
|
|
|
/**
|
|
* @brief Type with the same alignment and size as `atomic_intmax_t`
|
|
*/
|
|
typedef struct {
|
|
/**
|
|
* @brief Opaque content placeholder
|
|
*
|
|
* Access only for initializing from C++
|
|
*/
|
|
ATOMIC_INTMAX_T_SAME_SIZED_TYPE do_not_access_from_cpp;
|
|
} atomic_intmax_t;
|
|
|
|
/**
|
|
* @brief Type with the same alignment and size as `atomic_uintmax_t`
|
|
*/
|
|
typedef struct {
|
|
/**
|
|
* @brief Opaque content placeholder
|
|
*
|
|
* Access only for initializing from C++
|
|
*/
|
|
ATOMIC_UINTMAX_T_SAME_SIZED_TYPE do_not_access_from_cpp;
|
|
} atomic_uintmax_t;
|
|
|
|
/** @} */
|