| 318 | 1 #ifndef TOML11_MACROS_HPP | 
|  | 2 #define TOML11_MACROS_HPP | 
|  | 3 | 
|  | 4 #define TOML11_STRINGIZE_AUX(x) #x | 
|  | 5 #define TOML11_STRINGIZE(x)     TOML11_STRINGIZE_AUX(x) | 
|  | 6 | 
|  | 7 #define TOML11_CONCATENATE_AUX(x, y) x##y | 
|  | 8 #define TOML11_CONCATENATE(x, y)     TOML11_CONCATENATE_AUX(x, y) | 
|  | 9 | 
|  | 10 // ============================================================================ | 
|  | 11 // TOML11_DEFINE_CONVERSION_NON_INTRUSIVE | 
|  | 12 | 
|  | 13 #ifndef TOML11_WITHOUT_DEFINE_NON_INTRUSIVE | 
|  | 14 | 
|  | 15 // ---------------------------------------------------------------------------- | 
|  | 16 // TOML11_ARGS_SIZE | 
|  | 17 | 
|  | 18 #define TOML11_INDEX_RSEQ() \ | 
|  | 19     32, 31, 30, 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, 17, \ | 
|  | 20     16, 15, 14, 13, 12, 11, 10,  9,  8,  7,  6,  5,  4,  3,  2,  1, 0 | 
|  | 21 #define TOML11_ARGS_SIZE_IMPL(\ | 
|  | 22     ARG1,  ARG2,  ARG3,  ARG4,  ARG5,  ARG6,  ARG7,  ARG8,  ARG9,  ARG10, \ | 
|  | 23     ARG11, ARG12, ARG13, ARG14, ARG15, ARG16, ARG17, ARG18, ARG19, ARG20, \ | 
|  | 24     ARG21, ARG22, ARG23, ARG24, ARG25, ARG26, ARG27, ARG28, ARG29, ARG30, \ | 
|  | 25     ARG31, ARG32, N, ...) N | 
|  | 26 #define TOML11_ARGS_SIZE_AUX(...) TOML11_ARGS_SIZE_IMPL(__VA_ARGS__) | 
|  | 27 #define TOML11_ARGS_SIZE(...) TOML11_ARGS_SIZE_AUX(__VA_ARGS__, TOML11_INDEX_RSEQ()) | 
|  | 28 | 
|  | 29 // ---------------------------------------------------------------------------- | 
|  | 30 // TOML11_FOR_EACH_VA_ARGS | 
|  | 31 | 
|  | 32 #define TOML11_FOR_EACH_VA_ARGS_AUX_1( FUNCTOR, ARG1     ) FUNCTOR(ARG1) | 
|  | 33 #define TOML11_FOR_EACH_VA_ARGS_AUX_2( FUNCTOR, ARG1, ...) FUNCTOR(ARG1) TOML11_FOR_EACH_VA_ARGS_AUX_1( FUNCTOR, __VA_ARGS__) | 
|  | 34 #define TOML11_FOR_EACH_VA_ARGS_AUX_3( FUNCTOR, ARG1, ...) FUNCTOR(ARG1) TOML11_FOR_EACH_VA_ARGS_AUX_2( FUNCTOR, __VA_ARGS__) | 
|  | 35 #define TOML11_FOR_EACH_VA_ARGS_AUX_4( FUNCTOR, ARG1, ...) FUNCTOR(ARG1) TOML11_FOR_EACH_VA_ARGS_AUX_3( FUNCTOR, __VA_ARGS__) | 
|  | 36 #define TOML11_FOR_EACH_VA_ARGS_AUX_5( FUNCTOR, ARG1, ...) FUNCTOR(ARG1) TOML11_FOR_EACH_VA_ARGS_AUX_4( FUNCTOR, __VA_ARGS__) | 
|  | 37 #define TOML11_FOR_EACH_VA_ARGS_AUX_6( FUNCTOR, ARG1, ...) FUNCTOR(ARG1) TOML11_FOR_EACH_VA_ARGS_AUX_5( FUNCTOR, __VA_ARGS__) | 
|  | 38 #define TOML11_FOR_EACH_VA_ARGS_AUX_7( FUNCTOR, ARG1, ...) FUNCTOR(ARG1) TOML11_FOR_EACH_VA_ARGS_AUX_6( FUNCTOR, __VA_ARGS__) | 
|  | 39 #define TOML11_FOR_EACH_VA_ARGS_AUX_8( FUNCTOR, ARG1, ...) FUNCTOR(ARG1) TOML11_FOR_EACH_VA_ARGS_AUX_7( FUNCTOR, __VA_ARGS__) | 
|  | 40 #define TOML11_FOR_EACH_VA_ARGS_AUX_9( FUNCTOR, ARG1, ...) FUNCTOR(ARG1) TOML11_FOR_EACH_VA_ARGS_AUX_8( FUNCTOR, __VA_ARGS__) | 
|  | 41 #define TOML11_FOR_EACH_VA_ARGS_AUX_10(FUNCTOR, ARG1, ...) FUNCTOR(ARG1) TOML11_FOR_EACH_VA_ARGS_AUX_9( FUNCTOR, __VA_ARGS__) | 
|  | 42 #define TOML11_FOR_EACH_VA_ARGS_AUX_11(FUNCTOR, ARG1, ...) FUNCTOR(ARG1) TOML11_FOR_EACH_VA_ARGS_AUX_10(FUNCTOR, __VA_ARGS__) | 
|  | 43 #define TOML11_FOR_EACH_VA_ARGS_AUX_12(FUNCTOR, ARG1, ...) FUNCTOR(ARG1) TOML11_FOR_EACH_VA_ARGS_AUX_11(FUNCTOR, __VA_ARGS__) | 
|  | 44 #define TOML11_FOR_EACH_VA_ARGS_AUX_13(FUNCTOR, ARG1, ...) FUNCTOR(ARG1) TOML11_FOR_EACH_VA_ARGS_AUX_12(FUNCTOR, __VA_ARGS__) | 
|  | 45 #define TOML11_FOR_EACH_VA_ARGS_AUX_14(FUNCTOR, ARG1, ...) FUNCTOR(ARG1) TOML11_FOR_EACH_VA_ARGS_AUX_13(FUNCTOR, __VA_ARGS__) | 
|  | 46 #define TOML11_FOR_EACH_VA_ARGS_AUX_15(FUNCTOR, ARG1, ...) FUNCTOR(ARG1) TOML11_FOR_EACH_VA_ARGS_AUX_14(FUNCTOR, __VA_ARGS__) | 
|  | 47 #define TOML11_FOR_EACH_VA_ARGS_AUX_16(FUNCTOR, ARG1, ...) FUNCTOR(ARG1) TOML11_FOR_EACH_VA_ARGS_AUX_15(FUNCTOR, __VA_ARGS__) | 
|  | 48 #define TOML11_FOR_EACH_VA_ARGS_AUX_17(FUNCTOR, ARG1, ...) FUNCTOR(ARG1) TOML11_FOR_EACH_VA_ARGS_AUX_16(FUNCTOR, __VA_ARGS__) | 
|  | 49 #define TOML11_FOR_EACH_VA_ARGS_AUX_18(FUNCTOR, ARG1, ...) FUNCTOR(ARG1) TOML11_FOR_EACH_VA_ARGS_AUX_17(FUNCTOR, __VA_ARGS__) | 
|  | 50 #define TOML11_FOR_EACH_VA_ARGS_AUX_19(FUNCTOR, ARG1, ...) FUNCTOR(ARG1) TOML11_FOR_EACH_VA_ARGS_AUX_18(FUNCTOR, __VA_ARGS__) | 
|  | 51 #define TOML11_FOR_EACH_VA_ARGS_AUX_20(FUNCTOR, ARG1, ...) FUNCTOR(ARG1) TOML11_FOR_EACH_VA_ARGS_AUX_19(FUNCTOR, __VA_ARGS__) | 
|  | 52 #define TOML11_FOR_EACH_VA_ARGS_AUX_21(FUNCTOR, ARG1, ...) FUNCTOR(ARG1) TOML11_FOR_EACH_VA_ARGS_AUX_20(FUNCTOR, __VA_ARGS__) | 
|  | 53 #define TOML11_FOR_EACH_VA_ARGS_AUX_22(FUNCTOR, ARG1, ...) FUNCTOR(ARG1) TOML11_FOR_EACH_VA_ARGS_AUX_21(FUNCTOR, __VA_ARGS__) | 
|  | 54 #define TOML11_FOR_EACH_VA_ARGS_AUX_23(FUNCTOR, ARG1, ...) FUNCTOR(ARG1) TOML11_FOR_EACH_VA_ARGS_AUX_22(FUNCTOR, __VA_ARGS__) | 
|  | 55 #define TOML11_FOR_EACH_VA_ARGS_AUX_24(FUNCTOR, ARG1, ...) FUNCTOR(ARG1) TOML11_FOR_EACH_VA_ARGS_AUX_23(FUNCTOR, __VA_ARGS__) | 
|  | 56 #define TOML11_FOR_EACH_VA_ARGS_AUX_25(FUNCTOR, ARG1, ...) FUNCTOR(ARG1) TOML11_FOR_EACH_VA_ARGS_AUX_24(FUNCTOR, __VA_ARGS__) | 
|  | 57 #define TOML11_FOR_EACH_VA_ARGS_AUX_26(FUNCTOR, ARG1, ...) FUNCTOR(ARG1) TOML11_FOR_EACH_VA_ARGS_AUX_25(FUNCTOR, __VA_ARGS__) | 
|  | 58 #define TOML11_FOR_EACH_VA_ARGS_AUX_27(FUNCTOR, ARG1, ...) FUNCTOR(ARG1) TOML11_FOR_EACH_VA_ARGS_AUX_26(FUNCTOR, __VA_ARGS__) | 
|  | 59 #define TOML11_FOR_EACH_VA_ARGS_AUX_28(FUNCTOR, ARG1, ...) FUNCTOR(ARG1) TOML11_FOR_EACH_VA_ARGS_AUX_27(FUNCTOR, __VA_ARGS__) | 
|  | 60 #define TOML11_FOR_EACH_VA_ARGS_AUX_29(FUNCTOR, ARG1, ...) FUNCTOR(ARG1) TOML11_FOR_EACH_VA_ARGS_AUX_28(FUNCTOR, __VA_ARGS__) | 
|  | 61 #define TOML11_FOR_EACH_VA_ARGS_AUX_30(FUNCTOR, ARG1, ...) FUNCTOR(ARG1) TOML11_FOR_EACH_VA_ARGS_AUX_29(FUNCTOR, __VA_ARGS__) | 
|  | 62 #define TOML11_FOR_EACH_VA_ARGS_AUX_31(FUNCTOR, ARG1, ...) FUNCTOR(ARG1) TOML11_FOR_EACH_VA_ARGS_AUX_30(FUNCTOR, __VA_ARGS__) | 
|  | 63 #define TOML11_FOR_EACH_VA_ARGS_AUX_32(FUNCTOR, ARG1, ...) FUNCTOR(ARG1) TOML11_FOR_EACH_VA_ARGS_AUX_31(FUNCTOR, __VA_ARGS__) | 
|  | 64 | 
|  | 65 #define TOML11_FOR_EACH_VA_ARGS(FUNCTOR, ...)\ | 
|  | 66     TOML11_CONCATENATE(TOML11_FOR_EACH_VA_ARGS_AUX_, TOML11_ARGS_SIZE(__VA_ARGS__))(FUNCTOR, __VA_ARGS__) | 
|  | 67 | 
|  | 68 // ---------------------------------------------------------------------------- | 
|  | 69 // TOML11_DEFINE_CONVERSION_NON_INTRUSIVE | 
|  | 70 | 
|  | 71 // use it in the following way. | 
|  | 72 // ```cpp | 
|  | 73 // namespace foo | 
|  | 74 // { | 
|  | 75 // struct Foo | 
|  | 76 // { | 
|  | 77 //     std::string s; | 
|  | 78 //     double      d; | 
|  | 79 //     int         i; | 
|  | 80 // }; | 
|  | 81 // } // foo | 
|  | 82 // | 
|  | 83 // TOML11_DEFINE_CONVERSION_NON_INTRUSIVE(foo::Foo, s, d, i) | 
|  | 84 // ``` | 
|  | 85 // And then you can use `toml::find<foo::Foo>(file, "foo");` | 
|  | 86 // | 
|  | 87 #define TOML11_FIND_MEMBER_VARIABLE_FROM_VALUE(VAR_NAME)\ | 
|  | 88     obj.VAR_NAME = toml::find<decltype(obj.VAR_NAME)>(v, TOML11_STRINGIZE(VAR_NAME)); | 
|  | 89 | 
|  | 90 #define TOML11_ASSIGN_MEMBER_VARIABLE_TO_VALUE(VAR_NAME)\ | 
|  | 91     v[TOML11_STRINGIZE(VAR_NAME)] = obj.VAR_NAME; | 
|  | 92 | 
|  | 93 #define TOML11_DEFINE_CONVERSION_NON_INTRUSIVE(NAME, ...)\ | 
|  | 94     namespace toml {                                                                     \ | 
|  | 95     template<>                                                                           \ | 
|  | 96     struct from<NAME>                                                                    \ | 
|  | 97     {                                                                                    \ | 
|  | 98         template<typename C, template<typename ...> class T,                             \ | 
|  | 99                  template<typename ...> class A>                                         \ | 
|  | 100         static NAME from_toml(const basic_value<C, T, A>& v)                             \ | 
|  | 101         {                                                                                \ | 
|  | 102             NAME obj;                                                                    \ | 
|  | 103             TOML11_FOR_EACH_VA_ARGS(TOML11_FIND_MEMBER_VARIABLE_FROM_VALUE, __VA_ARGS__) \ | 
|  | 104             return obj;                                                                  \ | 
|  | 105         }                                                                                \ | 
|  | 106     };                                                                                   \ | 
|  | 107     template<>                                                                           \ | 
|  | 108     struct into<NAME>                                                                    \ | 
|  | 109     {                                                                                    \ | 
|  | 110         static value into_toml(const NAME& obj)                                          \ | 
|  | 111         {                                                                                \ | 
|  | 112             ::toml::value v = ::toml::table{};                                           \ | 
|  | 113             TOML11_FOR_EACH_VA_ARGS(TOML11_ASSIGN_MEMBER_VARIABLE_TO_VALUE, __VA_ARGS__) \ | 
|  | 114             return v;                                                                    \ | 
|  | 115         }                                                                                \ | 
|  | 116     };                                                                                   \ | 
|  | 117     } /* toml */ | 
|  | 118 | 
|  | 119 #endif// TOML11_WITHOUT_DEFINE_NON_INTRUSIVE | 
|  | 120 | 
|  | 121 #endif// TOML11_MACROS_HPP |