Derive-C
Loading...
Searching...
No Matches
require.h
Go to the documentation of this file.
1#pragma once
3
4#if defined __cplusplus
5 #include <type_traits> // NOLINT(misc-include-cleaner)
6 #define REQUIRE_METHOD_EXPR(ret, obj, name, args) \
7 std::is_same_v<decltype(&NS(obj, name)), ret(*) args>
8 #define REQUIRE_CONSTANT_TYPE_EXPR(obj, name, Type) \
9 std::is_same_v<std::remove_cv_t<std::remove_reference_t<decltype(NS(obj, name))>>, Type>
10#else
11 #define REQUIRE_METHOD_EXPR(ret, obj, name, args) \
12 _Generic(&NS(obj, name), ret(*) args: 1, default: 0)
13 #define REQUIRE_CONSTANT_TYPE_EXPR(obj, name, Type) \
14 _Generic((NS(obj, name)), Type: 1, default: 0)
15#endif
16
17#define REQUIRE_METHOD(ret, obj, name, args) \
18 STATIC_ASSERT(REQUIRE_METHOD_EXPR(ret, obj, name, args), \
19 "Method " #obj "." #name " must exist with type " #ret " (*)" #args)
20
21#define REQUIRE_TYPE(obj, name) \
22 STATIC_ASSERT(sizeof(NS(obj, name)), "Type " #obj "." #name " must exist")
23
24#define REQUIRE_CONSTANT_TYPE(obj, name, type) \
25 STATIC_ASSERT(REQUIRE_CONSTANT_TYPE_EXPR(obj, name, type), \
26 "Method " #obj "." #name " must exist and be of type " #type)
27
28#define REQUIRE_CONSTANT(obj, name) \
29 STATIC_ASSERT(sizeof(NS(obj, name)), "Constant " #obj "." #name " must exist")