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