reactor-c 1.0
C Runtime for Lingua Franca
Loading...
Searching...
No Matches
generics.h
Go to the documentation of this file.
1
11
12#ifndef GENERICS_H
13#define GENERICS_H
14
15// If buitin are not available on target toolchain we may not be able to support generics
16#if defined __has_builtin
17// Auto-Deduce variable type based on assigned value
18#define var __auto_type
19
28#define lf_is_same_type(a, b) __builtin_types_compatible_p(__typeof__(a), __typeof__(b))
29
38#define lf_is_same(typename, b) __builtin_types_compatible_p(typename, __typeof__(b))
39
48#define lf_is_type_equal(typename_a, typename_b) __builtin_types_compatible_p(typename_a, typename_b)
49
57#define lf_is_pointer_or_array(p) (__builtin_classify_type(p) == 5)
58
66#define lf_decay(p) (&*__builtin_choose_expr(lf_is_pointer_or_array(p), p, NULL))
67
75#define lf_is_pointer(p) lf_is_same_type(p, lf_decay(p))
76
84#define lf_get_pointer(p) __builtin_choose_expr(lf_is_pointer(p), p, &p)
85
94#define lf_to_left_type(left, right) \
95 __builtin_choose_expr(lf_is_pointer_or_array(left), \
96 __builtin_choose_expr(lf_is_pointer_or_array(right), (right), &(right)), \
97 __builtin_choose_expr(lf_is_pointer_or_array(right), *(right), (right)))
98
99#else // buitin are not available
100
101#define var
102#define lf_is_same_type(a, b)
103#define lf_is_same(typename, b)
104#define lf_is_pointer_or_array(p)
105#define lf_decay(p)
106#define lf_is_pointer(p)
107#define lf_get_pointer(p)
108#define lf_to_left_type(left, right)
109
110#endif // __has_builtin
111
112#endif // GENERICS_H