mirror of https://github.com/Qortal/Brooklyn
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
43 lines
1.5 KiB
43 lines
1.5 KiB
/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ |
|
#include <linux/compiler_types.h> |
|
|
|
#ifndef __always_inline |
|
#define __always_inline inline |
|
#endif |
|
|
|
/** |
|
* __struct_group() - Create a mirrored named and anonyomous struct |
|
* |
|
* @TAG: The tag name for the named sub-struct (usually empty) |
|
* @NAME: The identifier name of the mirrored sub-struct |
|
* @ATTRS: Any struct attributes (usually empty) |
|
* @MEMBERS: The member declarations for the mirrored structs |
|
* |
|
* Used to create an anonymous union of two structs with identical layout |
|
* and size: one anonymous and one named. The former's members can be used |
|
* normally without sub-struct naming, and the latter can be used to |
|
* reason about the start, end, and size of the group of struct members. |
|
* The named struct can also be explicitly tagged for layer reuse, as well |
|
* as both having struct attributes appended. |
|
*/ |
|
#define __struct_group(TAG, NAME, ATTRS, MEMBERS...) \ |
|
union { \ |
|
struct { MEMBERS } ATTRS; \ |
|
struct TAG { MEMBERS } ATTRS NAME; \ |
|
} |
|
|
|
/** |
|
* __DECLARE_FLEX_ARRAY() - Declare a flexible array usable in a union |
|
* |
|
* @TYPE: The type of each flexible array element |
|
* @NAME: The name of the flexible array member |
|
* |
|
* In order to have a flexible array member in a union or alone in a |
|
* struct, it needs to be wrapped in an anonymous struct with at least 1 |
|
* named member, but that member can be empty. |
|
*/ |
|
#define __DECLARE_FLEX_ARRAY(TYPE, NAME) \ |
|
struct { \ |
|
struct { } __empty_ ## NAME; \ |
|
TYPE NAME[]; \ |
|
}
|
|
|