From 439d61cd0fd948dac89adfc079ddc5aa9a931207 Mon Sep 17 00:00:00 2001 From: Jim Porter Date: Mon, 12 Aug 2024 14:30:33 -0700 Subject: [PATCH] Rename `forward_if` to `forward_like` and make it more like the standard --- include/mettle/detail/forward_if.hpp | 25 ------------------- include/mettle/detail/forward_like.hpp | 22 ++++++++++++++++ include/mettle/suite/compiled_suite.hpp | 17 +++++++------ include/mettle/suite/make_suite.hpp | 2 +- ...t_forward_if.cpp => test_forward_like.cpp} | 12 ++++----- 5 files changed, 38 insertions(+), 40 deletions(-) delete mode 100644 include/mettle/detail/forward_if.hpp create mode 100644 include/mettle/detail/forward_like.hpp rename test/{test_forward_if.cpp => test_forward_like.cpp} (58%) diff --git a/include/mettle/detail/forward_if.hpp b/include/mettle/detail/forward_if.hpp deleted file mode 100644 index b8839267..00000000 --- a/include/mettle/detail/forward_if.hpp +++ /dev/null @@ -1,25 +0,0 @@ -#ifndef INC_METTLE_DETAIL_MOVE_IF_HPP -#define INC_METTLE_DETAIL_MOVE_IF_HPP - -#include - -namespace mettle::detail { - - template - struct ref_if { - using type = typename std::conditional< - std::is_lvalue_reference::value, - typename std::remove_reference::type &, - typename std::remove_reference::type && - >::type; - }; - - template - inline decltype(auto) - forward_if(Element &&value) { - return static_cast::type>(value); - } - -} // namespace mettle::detail - -#endif diff --git a/include/mettle/detail/forward_like.hpp b/include/mettle/detail/forward_like.hpp new file mode 100644 index 00000000..b8f27e2b --- /dev/null +++ b/include/mettle/detail/forward_like.hpp @@ -0,0 +1,22 @@ +#ifndef INC_METTLE_DETAIL_FORWARD_LIKE_HPP +#define INC_METTLE_DETAIL_FORWARD_LIKE_HPP + +#include +#include + +namespace mettle::detail { + // TODO: Remove this once we require C++23. + template + inline auto && forward_like(U &&value) { + using Value = std::remove_reference_t; + using Ref = std::conditional_t< + std::is_lvalue_reference_v, Value &, Value && + >; + using CRef = std::conditional_t< + std::is_const_v>, const Ref, Ref + >; + return static_cast(value); + } +} // namespace mettle::detail + +#endif diff --git a/include/mettle/suite/compiled_suite.hpp b/include/mettle/suite/compiled_suite.hpp index 018af419..df322741 100644 --- a/include/mettle/suite/compiled_suite.hpp +++ b/include/mettle/suite/compiled_suite.hpp @@ -7,7 +7,7 @@ #include "attributes.hpp" #include "../test_uid.hpp" -#include "../detail/forward_if.hpp" +#include "../detail/forward_like.hpp" namespace mettle { @@ -44,17 +44,18 @@ namespace mettle { String &&name, Tests &&tests, Subsuites &&subsuites, const attributes &attrs, Compile &&compile ) : name_(std::forward(name)) { - using detail::forward_if; - for(auto &&test : tests) { tests_.emplace_back( - forward_if(test.name), - compile(forward_if(test.function)), - unite(forward_if(test.attrs), attrs) + detail::forward_like(test.name), + compile(detail::forward_like(test.function)), + unite(detail::forward_like(test.attrs), attrs) + ); + } + for(auto &&ss : subsuites) { + subsuites_.emplace_back( + detail::forward_like(ss), attrs, compile ); } - for(auto &&ss : subsuites) - subsuites_.emplace_back(forward_if(ss), attrs, compile); } template diff --git a/include/mettle/suite/make_suite.hpp b/include/mettle/suite/make_suite.hpp index 59a634a9..bd41b95e 100644 --- a/include/mettle/suite/make_suite.hpp +++ b/include/mettle/suite/make_suite.hpp @@ -261,7 +261,7 @@ namespace mettle { template void subsuite(Subsuites &&subsuites) { for(auto &&i : subsuites) - subsuites_.push_back(detail::forward_if(i)); + subsuites_.push_back(detail::forward_like(i)); } template diff --git a/test/test_forward_if.cpp b/test/test_forward_like.cpp similarity index 58% rename from test/test_forward_if.cpp rename to test/test_forward_like.cpp index 74c4af2b..f1482434 100644 --- a/test/test_forward_if.cpp +++ b/test/test_forward_like.cpp @@ -3,22 +3,22 @@ using namespace mettle; #include "copy_counter.hpp" -suite<> test_forward_if("forward_if()", [](auto &_) { - subsuite(_, "forward_if", type_only, [](auto &_) { +suite<> test_forward_like("forward_like()", [](auto &_) { + subsuite(_, "forward_like", type_only, [](auto &_) { using Fixture = fixture_type_t; - _.test("forward_if(moveable)", []() { + _.test("forward_like(moveable)", []() { bool should_move = !std::is_lvalue_reference::value; moveable_type from; - auto to = detail::forward_if(from); + auto to = detail::forward_like(from); expect("number of copies", to.copies, equal_to(should_move ? 0 : 1)); expect("number of moves", to.moves, equal_to(should_move ? 1 : 0)); }); - _.test("forward_if(copyable)", []() { + _.test("forward_like(copyable)", []() { copyable_type from; - auto to = detail::forward_if(from); + auto to = detail::forward_like(from); expect("number of copies", to.copies, equal_to(1)); });