diff --git a/README.md b/README.md index 54995afc..f9594b6e 100644 --- a/README.md +++ b/README.md @@ -1949,9 +1949,17 @@ Clear the variant 'variant (aka destructor). Clean the variant 'variant and make it empty. +##### void name\_init_elementN(name\_t variant) + +Initialize the variant 'variant' to the type of 'element1' + +##### void name\_init\_set_elementN(name\_t variant, const typeN elementN) + +Initialize and set the variant 'variant' to the type and value of 'elementN'. + ##### void name\_set_elementN(name\_t variant, const typeN elementN) -Set the variant 'variant' to the type and value of 'element1'. +Set the variant 'variant' to the type and value of 'elementN'. ##### typeN * name\_get_elementN(name\_t variant) diff --git a/m-variant.h b/m-variant.h index 9bf86fb8..6dd61e35 100644 --- a/m-variant.h +++ b/m-variant.h @@ -40,6 +40,8 @@ VARIANTI_DEFINE_INIT_SET(name, __VA_ARGS__) \ VARIANTI_DEFINE_SET(name, __VA_ARGS__) \ VARIANTI_DEFINE_TEST_P(name, __VA_ARGS__) \ + VARIANTI_DEFINE_INITER(name, __VA_ARGS__) \ + VARIANTI_DEFINE_INIT_SETTER(name, __VA_ARGS__) \ VARIANTI_DEFINE_SETTER(name, __VA_ARGS__) \ VARIANTI_DEFINE_GETTER(name, __VA_ARGS__) \ VARIANTI_DEFINE_CLEAN_FUNC(name, __VA_ARGS__) \ @@ -177,7 +179,28 @@ } -#define VARIANTI_DEFINE_SETTER(name, ...) \ +#define VARIANTI_DEFINE_INITER(name, ...) \ + M_MAP2(VARIANTI_DEFINE_INITER_FUNC, name, __VA_ARGS__) +#define VARIANTI_DEFINE_INITER_FUNC(name, a) \ + static inline void M_C3(name, _init_, VARIANTI_GET_FIELD a)(M_C(name,_t) my) { \ + /* Reinit variable with the given value */ \ + my->type = M_C3(name, _, VARIANTI_GET_FIELD a); \ + VARIANTI_GET_INIT a(my -> value. VARIANTI_GET_FIELD a); \ + } + + +#define VARIANTI_DEFINE_INIT_SETTER(name, ...) \ + M_MAP2(VARIANTI_DEFINE_INIT_SETTER_FUNC, name, __VA_ARGS__) +#define VARIANTI_DEFINE_INIT_SETTER_FUNC(name, a) \ + static inline void M_C3(name, _init_set_, VARIANTI_GET_FIELD a)(M_C(name,_t) my, \ + VARIANTI_GET_TYPE a VARIANTI_GET_FIELD a ) { \ + my->type = M_C3(name, _, VARIANTI_GET_FIELD a); \ + VARIANTI_GET_INIT_SET a(my -> value. VARIANTI_GET_FIELD a, \ + VARIANTI_GET_FIELD a); \ + } + + +#define VARIANTI_DEFINE_SETTER(name, ...) \ M_MAP2(VARIANTI_DEFINE_SETTER_FUNC, name, __VA_ARGS__) #define VARIANTI_DEFINE_SETTER_FUNC(name, a) \ static inline void M_C3(name, _set_, VARIANTI_GET_FIELD a)(M_C(name,_t) my, \ @@ -194,7 +217,6 @@ } \ } - #define VARIANTI_DEFINE_GETTER(name, ...) \ M_MAP2(VARIANTI_DEFINE_GETTER_FUNC, name, __VA_ARGS__) #define VARIANTI_DEFINE_GETTER_FUNC(name, a) \ diff --git a/tests/test-mvariant.c b/tests/test-mvariant.c index c940b8b2..0a369949 100644 --- a/tests/test-mvariant.c +++ b/tests/test-mvariant.c @@ -134,6 +134,18 @@ static void test_pair(void) pair_clear(p2); pair_clear(p); + + pair_init_value(p); + assert(pair_value_p(p)); + f = pair_get_value(p); + assert (*f == 0.0); + pair_clear(p); + + pair_init_set_value(p, 17.0); + assert(pair_value_p(p)); + f = pair_get_value(p); + assert (*f == 17.0); + pair_clear(p); } VARIANT_DEF2(triple,