From 0970580f7318d662260f7864d4da0ab76544ce52 Mon Sep 17 00:00:00 2001
From: Jan Travnicek <Jan.Travnicek@fit.cvut.cz>
Date: Thu, 3 Aug 2017 15:57:50 +0200
Subject: [PATCH] drop inherently wrong is_base_of_any trait

---
 alib2std/src/extensions/type_traits.hpp       | 22 -------------------
 alib2std/src/extensions/variant.hpp           | 14 ++++++------
 .../test-src/extensions/TypeTraitsTest.cpp    |  7 ------
 alib2std/test-src/extensions/TypeTraitsTest.h |  2 --
 4 files changed, 7 insertions(+), 38 deletions(-)

diff --git a/alib2std/src/extensions/type_traits.hpp b/alib2std/src/extensions/type_traits.hpp
index 248894d231..6467d35c8f 100644
--- a/alib2std/src/extensions/type_traits.hpp
+++ b/alib2std/src/extensions/type_traits.hpp
@@ -35,28 +35,6 @@ namespace std {
 		static const bool value = sizeof(Yes) == sizeof(has_normalize::test((typename std::remove_reference<T>::type*)0));
 	};
 
-// ----------------------------------------------------------------------------------------------------
-
-	template <typename T>
-	struct is_base_of<T, T> {
-		static const bool value = true;
-	};
-
-	template <typename T, typename... Ts>
-	struct is_base_of_any;
-
-	template <typename T, typename F>
-	struct is_base_of_any<T, F>
-	{
-		static const bool value = is_base_of<T, F>::value;
-	};
-
-	template <typename T, typename F, typename... Ts>
-	struct is_base_of_any<T, F, Ts...>
-	{
-		static const bool value = is_base_of<T, F>::value || is_base_of_any<T, Ts...>::value;
-	};
-
 // ----------------------------------------------------------------------------------------------------
 
 	template < size_t N, typename ... T >
diff --git a/alib2std/src/extensions/variant.hpp b/alib2std/src/extensions/variant.hpp
index 4527ec7a6c..545dcad15f 100644
--- a/alib2std/src/extensions/variant.hpp
+++ b/alib2std/src/extensions/variant.hpp
@@ -238,7 +238,7 @@ class variant : public variant_base<static_max<SizeOf<Ts>::size...>, static_max<
 public:
 	using variant_base<static_max<SizeOf<Ts>::size...>, static_max<AlignOf<Ts>::align...>, Ts...>::variant_base;
 
-	template < typename = std::enable_if < std::is_base_of_any<void, Ts...>::value > >
+	template < typename = std::enable_if < std::is_in<void, Ts...>::value > >
 	variant ( ) : variant_base<static_max<SizeOf<Ts>::size...>, static_max<AlignOf<Ts>::align...>, Ts...> ( ) {
 	}
 
@@ -296,32 +296,32 @@ public:
 		return helper_t::compareHelper(this->type_id, &this->data, other.type_id, &other.data);
 	}
 
-	template<typename T, typename = std::enable_if < std::is_base_of_any<T, Ts...>::value > >
+	template<typename T, typename = std::enable_if < std::is_in<T, Ts...>::value > >
 	bool is() const {
 		return (this->type_id == typeid(T).hash_code());
 	}
 
-	template<typename = std::enable_if < std::is_base_of_any<void, Ts...>::value > >
+	template<typename = std::enable_if < std::is_in<void, Ts...>::value > >
 	void set ( ) {
 		helper_t::destroy(this->type_id, &this->data);
 		this->type_id = typeid(void).hash_code();
 	}
 
-	template<typename T, typename = std::enable_if < std::is_base_of_any<T, Ts...>::value && ! std::is_same < void, T >::value > >
+	template<typename T, typename = std::enable_if < std::is_in<T, Ts...>::value && ! std::is_same < void, T >::value > >
 	void set(T&& value) {
 		helper_t::destroy(this->type_id, &this->data);
 		new (&this->data) T(value);
 		this->type_id = typeid(T).hash_code();
 	}
 
-	template<typename T, typename = std::enable_if < std::is_base_of_any<T, Ts...>::value && ! std::is_same < void, T >::value > >
+	template<typename T, typename = std::enable_if < std::is_in<T, Ts...>::value && ! std::is_same < void, T >::value > >
 	void set(const T& value) {
 		helper_t::destroy(this->type_id, &this->data);
 		new (&this->data) T(std::move(value));
 		this->type_id = typeid(T).hash_code();
 	}
 
-	template<typename T, typename = std::enable_if < std::is_base_of_any<T, Ts...>::value && ! std::is_same < void, T >::value > >
+	template<typename T, typename = std::enable_if < std::is_in<T, Ts...>::value && ! std::is_same < void, T >::value > >
 	T& get() {
 		// It is a dynamic_cast-like behaviour
 		if (this->type_id == typeid(T).hash_code())
@@ -330,7 +330,7 @@ public:
 			throw std::bad_cast();
 	}
 
-	template<typename T, typename = std::enable_if < std::is_base_of_any<T, Ts...>::value && ! std::is_same < void, T >::value > >
+	template<typename T, typename = std::enable_if < std::is_in<T, Ts...>::value && ! std::is_same < void, T >::value > >
 	const T& get() const {
 		// It is a dynamic_cast-like behaviour
 		if (this->type_id == typeid(T).hash_code())
diff --git a/alib2std/test-src/extensions/TypeTraitsTest.cpp b/alib2std/test-src/extensions/TypeTraitsTest.cpp
index 5790deafa8..52c905dcc0 100644
--- a/alib2std/test-src/extensions/TypeTraitsTest.cpp
+++ b/alib2std/test-src/extensions/TypeTraitsTest.cpp
@@ -10,13 +10,6 @@ void TypeTraitsTest::setUp() {
 void TypeTraitsTest::tearDown() {
 }
 
-void TypeTraitsTest::testIsBaseOf() {
-	CPPUNIT_ASSERT( ( std::is_base_of_any<int, int, std::string, TypeTraitsTest::test>::value ) == true );
-	CPPUNIT_ASSERT( ( std::is_base_of<int, int>::value ) == true );
-	CPPUNIT_ASSERT( ( std::is_base_of<int, std::string>::value ) == false );
-	CPPUNIT_ASSERT( ( std::is_base_of<int, TypeTraitsTest::test>::value ) == false );
-}
-
 void TypeTraitsTest::testAccessPackElement() {
 	CPPUNIT_ASSERT( ( std::is_same< std::get_type_pack_element < 0, int, double >::type, int >::value ) == true );
 }
diff --git a/alib2std/test-src/extensions/TypeTraitsTest.h b/alib2std/test-src/extensions/TypeTraitsTest.h
index cf968249c1..84a41ae0e7 100644
--- a/alib2std/test-src/extensions/TypeTraitsTest.h
+++ b/alib2std/test-src/extensions/TypeTraitsTest.h
@@ -6,7 +6,6 @@
 class TypeTraitsTest : public CppUnit::TestFixture
 {
   CPPUNIT_TEST_SUITE( TypeTraitsTest );
-  CPPUNIT_TEST( testIsBaseOf );
   CPPUNIT_TEST( testAccessPackElement );
   CPPUNIT_TEST( testTypeInPack );
   CPPUNIT_TEST_SUITE_END();
@@ -64,7 +63,6 @@ public:
   void setUp();
   void tearDown();
 
-  void testIsBaseOf();
   void testAccessPackElement();
   void testTypeInPack();
 };
-- 
GitLab