Open Model Railroad Network (OpenMRN)
Loading...
Searching...
No Matches
constants.hxx
Go to the documentation of this file.
1
34#ifndef _UTILS_CONSTANTS_HXX_
35#define _UTILS_CONSTANTS_HXX_
36
37#include <stddef.h>
38
39#ifdef __cplusplus
40#define EXTERNC extern "C" {
41#define EXTERNCEND }
42#else
44#define EXTERNC
46#define EXTERNCEND
47#endif
48
49#if defined (__EMSCRIPTEN__) || defined (__MACH__) || defined(__linux__) || defined(__PIC32MX__)
50#define NEED_SIMPLE_CONST
51#endif
52
53#ifdef NEED_SIMPLE_CONST
54
60#define DECLARE_CONST(name) \
61 EXTERNC extern const int _sym_##name; \
62 EXTERNCEND \
63 static inline int config_##name(void) \
64 { \
65 return _sym_##name; \
66 } \
67 \
68 typedef unsigned char \
69 _do_not_add_declare_and_default_const_to_the_same_file_for_##name;
70
77#define DEFAULT_CONST(name, value) DEFAULT_CONST_(name, value)
78
79#define DEFAULT_CONST_(name, value) \
80 EXTERNC extern const int __attribute__((__weak__)) _sym_##name = value; \
81 EXTERNCEND \
82 \
83 typedef signed char \
84 _do_not_add_declare_and_default_const_to_the_same_file_for_##name;
85
91#define OVERRIDE_CONST(name, value) OVERRIDE_CONST_(name, value)
92
93#define OVERRIDE_CONST_(name, value) \
94 EXTERNC extern const int _sym_##name; \
95 const int _sym_##name = value; \
96 EXTERNCEND
97
98#ifdef GTEST
99
108#define TEST_CONST(name, start_value) \
109 EXTERNC extern const int _sym_##name; \
110 const int __attribute__((section(".data"))) _sym_##name = start_value; \
111 EXTERNCEND \
112 int *config##name##override() \
113 { \
114 return (int *)&_sym_##name; \
115 }
116
122#define TEST_OVERRIDE_CONST(name, new_value) \
123 ScopedOverride ov##name{config##name##override(), new_value}
124
125#endif // GTEST
126
127#else // not simple const, but rather use direct asm / linking statements
128
129#define DECLARE_CONST(name) \
130 EXTERNC extern char _sym_##name; \
131 EXTERNCEND typedef unsigned char \
132 _do_not_add_declare_and_default_const_to_the_same_file_for_##name; \
133 static inline ptrdiff_t config_##name(void) \
134 { \
135 return (ptrdiff_t)(&_sym_##name); \
136 }
137
138#define DEFAULT_CONST(name, value) DEFAULT_CONST_(name, value)
139
140#define DEFAULT_CONST_(name, value) \
141 typedef signed char \
142 _do_not_add_declare_and_default_const_to_the_same_file_for_##name; \
143 asm(".global _sym_" #name " \n"); \
144 asm(".weak _sym_" #name " \n"); \
145 asm(".set _sym_" #name ", " #value " \n");
146
147#define OVERRIDE_CONST(name, value) OVERRIDE_CONST_(name, value)
148
149#define OVERRIDE_CONST_(name, value) \
150 asm(".global _sym_" #name " \n"); \
151 asm(".set _sym_" #name ", " #value " \n");
152
153#endif // native C
154
157#define CONSTANT_TRUE 1
160#define CONSTANT_FALSE 2
161
164#define DEFAULT_CONST_TRUE(name) DEFAULT_CONST(name, 1)
167#define DEFAULT_CONST_FALSE(name) DEFAULT_CONST(name, 2)
168
171#define OVERRIDE_CONST_TRUE(name) OVERRIDE_CONST(name, 1)
174#define OVERRIDE_CONST_FALSE(name) OVERRIDE_CONST(name, 2)
175
176#endif // _UTILS_CONSTANTS_HXX_