From e127ef73f5896f4a0323e77fe158d52d045b994a Mon Sep 17 00:00:00 2001 From: John Wellbelove Date: Mon, 15 May 2023 17:03:03 +0100 Subject: [PATCH] Added const overloads of accept_visitor & accept_functor. Marked all overloads od accept_visitor & accept_functor as deprecated. Added new universal accept member function. --- include/etl/private/variant_variadic.h | 98 ++++++++++++++++++++------ test/test_variant_variadic.cpp | 52 +++++++++----- 2 files changed, 113 insertions(+), 37 deletions(-) diff --git a/include/etl/private/variant_variadic.h b/include/etl/private/variant_variadic.h index 63607985..a6720a7c 100644 --- a/include/etl/private/variant_variadic.h +++ b/include/etl/private/variant_variadic.h @@ -67,7 +67,7 @@ namespace etl { //*************************************************************************** // This is a copy of the normal etl::parameter_pack, but without the static_assert - // so that the C++11 versions of do_accept() & do_operator() do not throw a compile time error. + // so that the C++11 versions of do_visitor() & do_operator() do not throw a compile time error. //*************************************************************************** template class parameter_pack @@ -536,7 +536,7 @@ namespace etl #include "etl/private/diagnostic_pop.h" //*************************************************************************** - /// Constructor from a value. + /// Construct from a value. //*************************************************************************** #include "etl/private/diagnostic_uninitialized_push.h" template , variant>::value, int> = 0> @@ -822,29 +822,21 @@ namespace etl rhs = etl::move(temp); } - //*************************************************************************** - /// Accept an etl::visitor. - //*************************************************************************** - template - void accept_visitor(TVisitor& v) + void accept(etl::visitor& v) { #if ETL_USING_CPP17 && !defined(ETL_VARIANT_FORCE_CPP11) - do_accept(v, etl::make_index_sequence{}); + do_visitor(v, etl::make_index_sequence{}); #else - do_accept(v); + do_visitor(v); #endif } - //*************************************************************************** - /// Accept an etl::visitor. - //*************************************************************************** - template - void accept_visitor(TVisitor& v) const + void accept(etl::visitor& v) const { #if ETL_USING_CPP17 && !defined(ETL_VARIANT_FORCE_CPP11) - do_accept(v, etl::make_index_sequence{}); + do_visitor(v, etl::make_index_sequence{}); #else - do_accept(v); + do_visitor(v); #endif } @@ -852,6 +844,69 @@ namespace etl /// Accept a generic functor. //*************************************************************************** template + etl::enable_if_t, TVisitor>::value, void> + accept(TVisitor& v) + { +#if ETL_USING_CPP17 && !defined(ETL_VARIANT_FORCE_CPP11) + do_operator(v, etl::make_index_sequence{}); +#else + do_operator(v); +#endif + } + + //*************************************************************************** + /// Accept a generic functor. + //*************************************************************************** + template + etl::enable_if_t, TVisitor>::value, void> + accept(TVisitor& v) const + { +#if ETL_USING_CPP17 && !defined(ETL_VARIANT_FORCE_CPP11) + do_operator(v, etl::make_index_sequence{}); +#else + do_operator(v); +#endif + } + + //*************************************************************************** + /// Accept an etl::visitor. + //*************************************************************************** + template +#if !defined(ETL_IN_UNIT_TEST) + ETL_DEPRECATED_REASON("Replace with accept()") +#endif + void accept_visitor(TVisitor& v) + { +#if ETL_USING_CPP17 && !defined(ETL_VARIANT_FORCE_CPP11) + do_visitor(v, etl::make_index_sequence{}); +#else + do_visitor(v); +#endif + } + + //*************************************************************************** + /// Accept an etl::visitor. + //*************************************************************************** + template +#if !defined(ETL_IN_UNIT_TEST) + ETL_DEPRECATED_REASON("Replace with accept()") +#endif + void accept_visitor(TVisitor& v) const + { +#if ETL_USING_CPP17 && !defined(ETL_VARIANT_FORCE_CPP11) + do_visitor(v, etl::make_index_sequence{}); +#else + do_visitor(v); +#endif + } + + //*************************************************************************** + /// Accept a generic functor. + //*************************************************************************** + template +#if !defined(ETL_IN_UNIT_TEST) + ETL_DEPRECATED_REASON("Replace with accept()") +#endif void accept_functor(TVisitor& v) { #if ETL_USING_CPP17 && !defined(ETL_VARIANT_FORCE_CPP11) @@ -865,6 +920,9 @@ namespace etl /// Accept a generic functor. //*************************************************************************** template +#if !defined(ETL_IN_UNIT_TEST) + ETL_DEPRECATED_REASON("Replace with accept()") +#endif void accept_functor(TVisitor& v) const { #if ETL_USING_CPP17 && !defined(ETL_VARIANT_FORCE_CPP11) @@ -928,7 +986,7 @@ namespace etl /// Call the relevent visitor by attempting each one. //*************************************************************************** template - void do_accept(TVisitor& visitor, etl::index_sequence) + void do_visitor(TVisitor& visitor, etl::index_sequence) { (attempt_visitor(visitor) || ...); } @@ -937,7 +995,7 @@ namespace etl /// Call the relevent visitor by attempting each one. //*************************************************************************** template - void do_accept(TVisitor& visitor, etl::index_sequence) const + void do_visitor(TVisitor& visitor, etl::index_sequence) const { (attempt_visitor(visitor) || ...); } @@ -946,7 +1004,7 @@ namespace etl /// /// Call the relevent visitor. //*************************************************************************** template - void do_accept(TVisitor& visitor) + void do_visitor(TVisitor& visitor) { switch (index()) { @@ -996,7 +1054,7 @@ namespace etl /// /// Call the relevent visitor. //*************************************************************************** template - void do_accept(TVisitor& visitor) const + void do_visitor(TVisitor& visitor) const { switch (index()) { diff --git a/test/test_variant_variadic.cpp b/test/test_variant_variadic.cpp index 7c8c4b22..8ceb50bc 100644 --- a/test/test_variant_variadic.cpp +++ b/test/test_variant_variadic.cpp @@ -806,15 +806,18 @@ namespace test_variant_etl_3 variant_etl; variant_etl = char(1); - variant_etl.accept_visitor(visitor); + //variant_etl.accept_visitor(visitor); + variant_etl.accept(visitor); CHECK_EQUAL(1, visitor.result_c); variant_etl = int(2); - variant_etl.accept_visitor(visitor); + //variant_etl.accept_visitor(visitor); + variant_etl.accept(visitor); CHECK_EQUAL(2, visitor.result_i); variant_etl = std::string("3"); - variant_etl.accept_visitor(visitor); + //variant_etl.accept_visitor(visitor); + variant_etl.accept(visitor); CHECK_EQUAL("3", visitor.result_s); } @@ -857,16 +860,19 @@ namespace variant_etl = char(1); const test_variant_etl_3 const_variant_etl1(variant_etl); const_variant_etl1.accept_visitor(visitor); + //const_variant_etl1.accept(visitor); CHECK_EQUAL(1, visitor.result_c); variant_etl = int(2); const test_variant_etl_3 const_variant_etl2(variant_etl); - const_variant_etl2.accept_visitor(visitor); + //const_variant_etl2.accept_visitor(visitor); + const_variant_etl2.accept(visitor); CHECK_EQUAL(2, visitor.result_i); variant_etl = std::string("3"); const test_variant_etl_3 const_variant_etl3(variant_etl); - const_variant_etl3.accept_visitor(visitor); + //const_variant_etl3.accept_visitor(visitor); + const_variant_etl3.accept(visitor); CHECK_EQUAL("3", visitor.result_s); } @@ -907,15 +913,18 @@ namespace test_variant_etl_3 variant_etl; variant_etl = char(1); - variant_etl.accept_functor(visitor); + //variant_etl.accept_functor(visitor); + variant_etl.accept(visitor); CHECK_EQUAL(1, visitor.result_c); variant_etl = int(2); - variant_etl.accept_functor(visitor); + //variant_etl.accept_functor(visitor); + variant_etl.accept(visitor); CHECK_EQUAL(2, visitor.result_i); variant_etl = std::string("3"); - variant_etl.accept_functor(visitor); + //variant_etl.accept_functor(visitor); + variant_etl.accept(visitor); CHECK_EQUAL("3", visitor.result_s); } @@ -957,17 +966,20 @@ namespace variant_etl = char(1); const test_variant_etl_3 const_variant_etl1(variant_etl); - const_variant_etl1.accept_functor(visitor); + //const_variant_etl1.accept_functor(visitor); + const_variant_etl1.accept(visitor); CHECK_EQUAL(1, visitor.result_c); variant_etl = int(2); const test_variant_etl_3 const_variant_etl2(variant_etl); - const_variant_etl2.accept_functor(visitor); + //const_variant_etl2.accept_functor(visitor); + const_variant_etl2.accept(visitor); CHECK_EQUAL(2, visitor.result_i); variant_etl = std::string("3"); const test_variant_etl_3 const_variant_etl3(variant_etl); - const_variant_etl3.accept_functor(visitor); + //const_variant_etl3.accept_functor(visitor); + const_variant_etl3.accept(visitor); CHECK_EQUAL("3", visitor.result_s); } @@ -985,15 +997,18 @@ namespace test_variant_etl_3 variant_etl; variant_etl = char(1); - variant_etl.accept_functor(visitor); + //variant_etl.accept_functor(visitor); + variant_etl.accept(visitor); CHECK_EQUAL(1, result_c); variant_etl = int(2); - variant_etl.accept_functor(visitor); + //variant_etl.accept_functor(visitor); + variant_etl.accept(visitor); CHECK_EQUAL(2, result_i); variant_etl = std::string("3"); - variant_etl.accept_functor(visitor); + //variant_etl.accept_functor(visitor); + variant_etl.accept(visitor); CHECK_EQUAL("3", result_s); } @@ -1012,17 +1027,20 @@ namespace variant_etl = char(1); const test_variant_etl_3 const_variant_etl1(variant_etl); - const_variant_etl1.accept_functor(visitor); + //const_variant_etl1.accept_functor(visitor); + const_variant_etl1.accept(visitor); CHECK_EQUAL(1, result_c); variant_etl = int(2); const test_variant_etl_3 const_variant_etl2(variant_etl); - const_variant_etl2.accept_functor(visitor); + //const_variant_etl2.accept_functor(visitor); + const_variant_etl2.accept(visitor); CHECK_EQUAL(2, result_i); variant_etl = std::string("3"); const test_variant_etl_3 const_variant_etl3(variant_etl); - const_variant_etl3.accept_functor(visitor); + //const_variant_etl3.accept_functor(visitor); + const_variant_etl3.accept(visitor); CHECK_EQUAL("3", result_s); }