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