From e3745b20727e73b4b4575f9efadd53eadc4d0969 Mon Sep 17 00:00:00 2001 From: Glen Fernandes Date: Sat, 6 Aug 2022 18:53:40 -0400 Subject: [PATCH] Add constexpr support to empty_value --- include/boost/core/empty_value.hpp | 32 +++++++------- test/Jamfile.v2 | 1 + test/empty_value_constexpr_test.cpp | 65 +++++++++++++++++++++++++++++ 3 files changed, 82 insertions(+), 16 deletions(-) create mode 100644 test/empty_value_constexpr_test.cpp diff --git a/include/boost/core/empty_value.hpp b/include/boost/core/empty_value.hpp index 9dfd442..d8ffa30 100644 --- a/include/boost/core/empty_value.hpp +++ b/include/boost/core/empty_value.hpp @@ -56,37 +56,37 @@ public: #if !defined(BOOST_NO_CXX11_DEFAULTED_FUNCTIONS) empty_value() = default; #else - empty_value() { } + BOOST_CONSTEXPR empty_value() { } #endif - empty_value(boost::empty_init_t) + BOOST_CONSTEXPR empty_value(boost::empty_init_t) : value_() { } #if !defined(BOOST_NO_CXX11_RVALUE_REFERENCES) #if !defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES) template - empty_value(boost::empty_init_t, U&& value, Args&&... args) + BOOST_CONSTEXPR empty_value(boost::empty_init_t, U&& value, Args&&... args) : value_(std::forward(value), std::forward(args)...) { } #else template - empty_value(boost::empty_init_t, U&& value) + BOOST_CONSTEXPR empty_value(boost::empty_init_t, U&& value) : value_(std::forward(value)) { } #endif #else template - empty_value(boost::empty_init_t, const U& value) + BOOST_CONSTEXPR empty_value(boost::empty_init_t, const U& value) : value_(value) { } template - empty_value(boost::empty_init_t, U& value) + BOOST_CONSTEXPR empty_value(boost::empty_init_t, U& value) : value_(value) { } #endif - const T& get() const BOOST_NOEXCEPT { + BOOST_CONSTEXPR const T& get() const BOOST_NOEXCEPT { return value_; } - T& get() BOOST_NOEXCEPT { + BOOST_CXX14_CONSTEXPR T& get() BOOST_NOEXCEPT { return value_; } @@ -104,37 +104,37 @@ public: #if !defined(BOOST_NO_CXX11_DEFAULTED_FUNCTIONS) empty_value() = default; #else - empty_value() { } + BOOST_CONSTEXPR empty_value() { } #endif - empty_value(boost::empty_init_t) + BOOST_CONSTEXPR empty_value(boost::empty_init_t) : T() { } #if !defined(BOOST_NO_CXX11_RVALUE_REFERENCES) #if !defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES) template - empty_value(boost::empty_init_t, U&& value, Args&&... args) + BOOST_CONSTEXPR empty_value(boost::empty_init_t, U&& value, Args&&... args) : T(std::forward(value), std::forward(args)...) { } #else template - empty_value(boost::empty_init_t, U&& value) + BOOST_CONSTEXPR empty_value(boost::empty_init_t, U&& value) : T(std::forward(value)) { } #endif #else template - empty_value(boost::empty_init_t, const U& value) + BOOST_CONSTEXPR empty_value(boost::empty_init_t, const U& value) : T(value) { } template - empty_value(boost::empty_init_t, U& value) + BOOST_CONSTEXPR empty_value(boost::empty_init_t, U& value) : T(value) { } #endif - const T& get() const BOOST_NOEXCEPT { + BOOST_CONSTEXPR const T& get() const BOOST_NOEXCEPT { return *this; } - T& get() BOOST_NOEXCEPT { + BOOST_CXX14_CONSTEXPR T& get() BOOST_NOEXCEPT { return *this; } }; diff --git a/test/Jamfile.v2 b/test/Jamfile.v2 index 373be22..3ce6b00 100644 --- a/test/Jamfile.v2 +++ b/test/Jamfile.v2 @@ -203,6 +203,7 @@ compile first_scalar_constexpr_test.cpp ; run empty_value_test.cpp ; run empty_value_size_test.cpp ; run empty_value_final_test.cpp ; +run empty_value_constexpr_test.cpp ; run quick_exit_test.cpp ; run-fail quick_exit_fail.cpp ; diff --git a/test/empty_value_constexpr_test.cpp b/test/empty_value_constexpr_test.cpp new file mode 100644 index 0000000..f05e314 --- /dev/null +++ b/test/empty_value_constexpr_test.cpp @@ -0,0 +1,65 @@ +/* +Copyright 2022 Glen Joseph Fernandes +(glenjofe@gmail.com) + +Distributed under the Boost Software License, Version 1.0. +(http://www.boost.org/LICENSE_1_0.txt) +*/ +#include +#if !defined(BOOST_NO_CXX11_CONSTEXPR) +#include +#include + +struct empty { + constexpr int value() const { + return 1; + } +}; + +class type { +public: + explicit constexpr type(int count) + : value_(count) { } + + constexpr int value() const { + return value_; + } + +private: + int value_; +}; + +void test_int() +{ + constexpr boost::empty_value v(boost::empty_init_t(), 4); + constexpr int c = v.get(); + BOOST_TEST_EQ(c, 4); +} + +void test_empty() +{ + constexpr boost::empty_value v = boost::empty_init_t(); + constexpr int c = v.get().value(); + BOOST_TEST_EQ(c, 1); +} + +void test_type() +{ + constexpr boost::empty_value v(boost::empty_init_t(), 2); + constexpr int c = v.get().value(); + BOOST_TEST_EQ(c, 2); +} + +int main() +{ + test_int(); + test_empty(); + test_type(); + return boost::report_errors(); +} +#else +int main() +{ + return 0; +} +#endif