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_
src
utils
constants.hxx
Generated on Sun Feb 2 2025 21:18:14 for Open Model Railroad Network (OpenMRN) by
1.9.8