19 #define MACRO_CONCAT(a, ...) PRIMITIVE_CONCAT(a, __VA_ARGS__) 20 #define PRIMITIVE_CONCAT(a, ...) a ## __VA_ARGS__ 21 #define MACRO_IDENT(x) x 25 #define STATIC_VARIABLE_DECLARE(type, name, value) \ 26 static type & s_##name() { \ 27 static type __##name = (value); \ 32 #define STATIC_VARIABLE_DECLARE_BLANK(type, name) \ 33 static type & s_##name() { \ 34 static type __##name; \ 39 #define STATIC_CONST_VARIABLE_DECLARE(type, name, value) \ 40 static const type & s_##name() { \ 41 static const type __##name = (value); \ 48 #define STATIC_VARIABLE_DECLARE_COLLECTION(type, name, ...) \ 49 static type & s_##name() { \ 50 static type __##name = { __VA_ARGS__ }; \ 55 #define STATIC_VARIABLE_DECLARE_COLLECTION_EMPTY(type, name) \ 56 static type & s_##name() { \ 57 static type __##name; \ 61 #define STATIC_VARIABLE_DECLARE_MAP_EMPTY(maptype, keytype, valuetype, name) \ 62 static maptype < keytype , valuetype > & s_##name() { \ 63 static maptype < keytype , valuetype > __##name; \ 68 #define STATIC_CONST_VARIABLE_DECLARE_COLLECTION(type, name, ...) \ 69 static const type & s_##name() { \ 70 static const type __##name { __VA_ARGS__ }; \ 75 #define STATIC_VARIABLE(name) \ 79 #define STATIC_VARIABLE_NAMESPACE(namespacename, name) \ 80 (namespacename::s_##name())