BioCMAMC-ST
macros.hpp
1#ifndef __MC_MACRO_HPP__
2#define __MC_MACRO_HPP__
3
4#define CHECK_MODEL(name) \
5 static_assert(ModelType<name>, #name); \
6 static_assert(FloatingPointType<name::FloatType>, " floatl" #name);
7
8#define MODEL_CONSTANT static constexpr
9
10// Utility to get the index from an enum
11#define INDEX_FROM_ENUM(e) static_cast<std::size_t>((e))
12
13// Bounds checking macro using static_extent
14#define CHECK_BOUND(__index__, __array_name__) \
15 static_assert(INDEX_FROM_ENUM(__index__) < __array_name__.static_extent(1), \
16 "Index out of model bound");
17
18#define GET_PROPERTY_FROM_IDX(__index__, __array_name__, __idx__) \
19 __array_name__(__index__, __idx__)
20
21// Main macro that uses bounds checking and array access
22#define GET_PROPERTY_FROM(__index__, __array_name__, enum_name) \
23 GET_PROPERTY_FROM_IDX(__index__, __array_name__, INDEX_FROM_ENUM(enum_name))
24
25#define GET_PROPERTY(enum_name) GET_PROPERTY_FROM(idx, arr, enum_name)
26
27#define COPY_PROPERTY_TO(enum_name, __index__, __array_name__) \
28 GET_PROPERTY_FROM(__index__, __array_name__, enum_name) \
29 = GET_PROPERTY(enum_name);
30
31#define GET_INDEX(size) \
32 std::size_t idx = (team_handle.league_rank() * team_handle.team_size()) \
33 + team_handle.team_rank(); \
34 if (idx >= (size)) \
35 { \
36 return; \
37 }
38#endif