From d70d839188cc8435ac106d2d16f18a2f4100fc5b Mon Sep 17 00:00:00 2001 From: Jan Travnicek <Jan.Travnicek@fit.cvut.cz> Date: Fri, 20 Jul 2018 21:55:05 +0200 Subject: [PATCH] simplify variant --- alib2std/src/extensions/algorithm.hpp | 8 +++--- alib2std/src/extensions/variant.hpp | 40 ++++++++------------------- 2 files changed, 16 insertions(+), 32 deletions(-) diff --git a/alib2std/src/extensions/algorithm.hpp b/alib2std/src/extensions/algorithm.hpp index 251d98cc53..87dd17a41d 100644 --- a/alib2std/src/extensions/algorithm.hpp +++ b/alib2std/src/extensions/algorithm.hpp @@ -254,7 +254,7 @@ std::pair < Iterator, Iterator > find_range ( Iterator begin, Iterator end, cons * \return the value a */ template < typename T > -const T & max ( const T & a ) { +constexpr const T & max ( const T & a ) { return a; } @@ -272,7 +272,7 @@ const T & max ( const T & a ) { * \return the maximum from all values a, b, args ... */ template < typename T, typename ... Args > -const T & max ( const T & a, const T & b, const Args & ... args ) { +constexpr const T & max ( const T & a, const T & b, const Args & ... args ) { return max ( b < a ? a : b, args ... ); } @@ -286,7 +286,7 @@ const T & max ( const T & a, const T & b, const Args & ... args ) { * \return the value a */ template < typename T > -const T & min ( const T & a) { +constexpr const T & min ( const T & a) { return a; } @@ -304,7 +304,7 @@ const T & min ( const T & a) { * \return the minimum from all values a, b, args ... */ template < typename T, typename ... Args > -const T & min ( const T & a, const T & b, const Args & ... args) { +constexpr const T & min ( const T & a, const T & b, const Args & ... args) { return min ( b > a ? a : b, args ... ); } diff --git a/alib2std/src/extensions/variant.hpp b/alib2std/src/extensions/variant.hpp index d1be55e08e..d0c209b848 100644 --- a/alib2std/src/extensions/variant.hpp +++ b/alib2std/src/extensions/variant.hpp @@ -38,23 +38,10 @@ #include "utility.hpp" #include "type_traits.hpp" #include "typeindex.h" +#include "algorithm.hpp" namespace ext { -template <size_t arg1, size_t ... others> -struct static_max; - -template <size_t arg> -struct static_max<arg> { - static const size_t value = arg; -}; - -template <size_t arg1, size_t arg2, size_t ... others> -struct static_max<arg1, arg2, others...> { - static const size_t value = arg1 >= arg2 ? static_max<arg1, others...>::value : - static_max<arg2, others...>::value; -}; - template<typename... Ts> struct variant_helper; @@ -152,15 +139,12 @@ inline static std::string string(ext::type_index, const void *) { return ""; } inline static int compareHelper(ext::type_index, const void *, ext::type_index, const void *) { return 0; } }; -template<typename ST, typename AT, typename... Ts> +template<size_t ST, size_t AT, typename... Ts> class variant_base; -template<typename ST, typename AT> +template<size_t ST, size_t AT> class variant_base<ST, AT> { - static const size_t data_size = ST::value; - static const size_t data_align = AT::value; - - using data_t = typename std::aligned_storage<data_size, data_align>::type; + using data_t = typename std::aligned_storage < ST, AT>::type; protected: ext::type_index type_id; @@ -168,11 +152,11 @@ protected: variant_base( ext::type_index id ) : type_id ( id ) { // just to make the -Werror=maybe-uninitialized go away - std::memset( & data, 0, data_size ); + std::memset( & data, 0, ST ); } }; -template<typename ST, typename AT, typename F, typename... Ts> +template<size_t ST, size_t AT, typename F, typename... Ts> class variant_base<ST, AT, F, Ts...> : public variant_base<ST, AT, Ts...> { using variant_base<ST, AT, Ts...>::variant_base; @@ -186,7 +170,7 @@ public: variant_base() : variant_base<ST, AT, Ts ... >::variant_base ( ) { } }; -template<typename ST, typename AT, typename... Ts> +template<size_t ST, size_t AT, typename... Ts> class variant_base<ST, AT, void, Ts...> : public variant_base<ST, AT, Ts...> { using variant_base<ST, AT, Ts...>::variant_base; @@ -198,23 +182,23 @@ public: }; template<typename ... Ts> -class variant : public variant_base<static_max<SizeOf<Ts>::size...>, static_max<AlignOf<Ts>::align...>, Ts...> { +class variant : public variant_base < max ( SizeOf < Ts >::size ... ), max ( AlignOf < Ts >::align ... ), Ts...> { using helper_t = variant_helper<Ts...>; public: - using variant_base<static_max<SizeOf<Ts>::size...>, static_max<AlignOf<Ts>::align...>, Ts...>::variant_base; + using variant_base < max ( SizeOf < Ts >::size ... ), max ( AlignOf < Ts >::align ... ), Ts...>::variant_base; template < typename T = void, typename std::enable_if < ext::is_in<T, Ts...>::value >::type* = nullptr > - variant ( ) : variant_base<static_max<SizeOf<Ts>::size...>, static_max<AlignOf<Ts>::align...>, Ts...> ( ) { + variant ( ) : variant_base < max ( SizeOf < Ts >::size ... ), max ( AlignOf < Ts >::align ... ), Ts...> ( ) { } //copy consructor - variant(const variant<Ts...>& old) : variant_base<static_max<SizeOf<Ts>::size...>, static_max<AlignOf<Ts>::align...>, Ts...> ( old.type_id ) { + variant(const variant<Ts...>& old) : variant_base < max ( SizeOf < Ts >::size ... ), max ( AlignOf < Ts >::align ... ), Ts...> ( old.type_id ) { helper_t::copy(old.type_id, &old.data, &this->data); } //move constructor - variant(variant<Ts...>&& old) noexcept : variant_base<static_max<SizeOf<Ts>::size...>, static_max<AlignOf<Ts>::align...>, Ts...> ( old.type_id ) { + variant(variant<Ts...>&& old) noexcept : variant_base < max ( SizeOf < Ts >::size ... ), max ( AlignOf < Ts >::align ... ), Ts...> ( old.type_id ) { helper_t::move(old.type_id, &old.data, &this->data); } -- GitLab