// // Copyright 2012-2019 Antony Polukhin. // // Distributed under the Boost Software License, Version 1.0. (See // accompanying file LICENSE_1_0.txt or copy at // http://www.boost.org/LICENSE_1_0.txt) #include #include #include namespace my_namespace1 { class my_class{}; } namespace my_namespace2 { class my_class{}; } void names_matches_type_id() { using namespace boost::typeindex; BOOST_TEST_EQ(type_id().pretty_name(), "int"); BOOST_TEST_EQ(type_id().pretty_name(), "double"); BOOST_TEST_EQ(type_id().name(), type_id().name()); BOOST_TEST_NE(type_id().name(), type_id().name()); BOOST_TEST_NE(type_id().name(), type_id().name()); BOOST_TEST_EQ(type_id().name(), type_id().name()); } void default_construction() { using namespace boost::typeindex; type_index ti1, ti2; BOOST_TEST_EQ(ti1, ti2); BOOST_TEST_EQ(type_id(), ti1); BOOST_TEST_EQ(type_id().name(), ti1.name()); BOOST_TEST_NE(type_id(), ti1); } void copy_construction() { using namespace boost::typeindex; type_index ti1, ti2 = type_id(); BOOST_TEST_NE(ti1, ti2); ti1 = ti2; BOOST_TEST_EQ(ti2, ti1); const type_index ti3(ti1); BOOST_TEST_EQ(ti3, ti1); } void comparators_type_id() { using namespace boost::typeindex; type_index t_int = type_id(); type_index t_double = type_id(); BOOST_TEST_EQ(t_int, t_int); BOOST_TEST_LE(t_int, t_int); BOOST_TEST_GE(t_int, t_int); BOOST_TEST_NE(t_int, t_double); BOOST_TEST_LE(t_double, t_double); BOOST_TEST_GE(t_double, t_double); BOOST_TEST_NE(t_double, t_int); BOOST_TEST(t_double < t_int || t_int < t_double); BOOST_TEST(t_double > t_int || t_int > t_double); } void hash_code_type_id() { using namespace boost::typeindex; std::size_t t_int1 = type_id().hash_code(); std::size_t t_double1 = type_id().hash_code(); std::size_t t_int2 = type_id().hash_code(); std::size_t t_double2 = type_id().hash_code(); BOOST_TEST_EQ(t_int1, t_int2); BOOST_TEST_NE(t_int1, t_double2); BOOST_TEST_LE(t_double1, t_double2); } template static void test_with_modofiers() { using namespace boost::typeindex; type_index t1 = type_id_with_cvr(); type_index t2 = type_id_with_cvr(); BOOST_TEST_NE(t2, t1); BOOST_TEST(t2 != t1.type_info()); BOOST_TEST(t2.type_info() != t1); BOOST_TEST(t1 < t2 || t2 < t1); BOOST_TEST(t1 > t2 || t2 > t1); BOOST_TEST(t1.type_info() < t2 || t2.type_info() < t1); BOOST_TEST(t1.type_info() > t2 || t2.type_info() > t1); BOOST_TEST(t1 < t2.type_info() || t2 < t1.type_info()); BOOST_TEST(t1 > t2.type_info() || t2 > t1.type_info()); // Chaecking that comparison operators overloads compile BOOST_TEST(t1 <= t2 || t2 <= t1); BOOST_TEST(t1 >= t2 || t2 >= t1); BOOST_TEST(t1.type_info() <= t2 || t2.type_info() <= t1); BOOST_TEST(t1.type_info() >= t2 || t2.type_info() >= t1); BOOST_TEST(t1 <= t2.type_info() || t2 <= t1.type_info()); BOOST_TEST(t1 >= t2.type_info() || t2 >= t1.type_info()); BOOST_TEST_EQ(t1, type_id_with_cvr()); BOOST_TEST_EQ(t2, type_id_with_cvr()); BOOST_TEST(t1 == type_id_with_cvr().type_info()); BOOST_TEST(t2 == type_id_with_cvr().type_info()); BOOST_TEST(t1.type_info() == type_id_with_cvr()); BOOST_TEST(t2.type_info() == type_id_with_cvr()); BOOST_TEST_EQ(t1.hash_code(), type_id_with_cvr().hash_code()); BOOST_TEST_EQ(t2.hash_code(), type_id_with_cvr().hash_code()); BOOST_TEST_NE(t1.hash_code(), type_id_with_cvr().hash_code()); BOOST_TEST_NE(t2.hash_code(), type_id_with_cvr().hash_code()); } void type_id_storing_modifiers() { test_with_modofiers(); test_with_modofiers(); test_with_modofiers(); test_with_modofiers(); test_with_modofiers(); test_with_modofiers(); test_with_modofiers(); test_with_modofiers(); test_with_modofiers(); test_with_modofiers(); test_with_modofiers(); test_with_modofiers(); test_with_modofiers(); test_with_modofiers(); test_with_modofiers(); test_with_modofiers(); test_with_modofiers(); test_with_modofiers(); test_with_modofiers(); test_with_modofiers(); test_with_modofiers(); test_with_modofiers(); test_with_modofiers(); test_with_modofiers(); test_with_modofiers(); test_with_modofiers(); test_with_modofiers(); test_with_modofiers(); #ifndef BOOST_NO_CXX11_RVALUE_REFERENCES test_with_modofiers(); test_with_modofiers(); test_with_modofiers(); test_with_modofiers(); test_with_modofiers(); test_with_modofiers(); test_with_modofiers(); test_with_modofiers(); test_with_modofiers(); test_with_modofiers(); #endif } template static void test_storing_nonstoring_modifiers_templ() { using namespace boost::typeindex; type_index t1 = type_id_with_cvr(); type_index t2 = type_id(); BOOST_TEST_EQ(t2, t1); BOOST_TEST_EQ(t1, t2); BOOST_TEST(t1 <= t2); BOOST_TEST(t1 >= t2); BOOST_TEST(t2 <= t1); BOOST_TEST(t2 >= t1); BOOST_TEST_EQ(t2.pretty_name(), t1.pretty_name()); } void type_id_storing_modifiers_vs_nonstoring() { test_storing_nonstoring_modifiers_templ(); test_storing_nonstoring_modifiers_templ(); test_storing_nonstoring_modifiers_templ(); boost::typeindex::type_index t1 = boost::typeindex::type_id_with_cvr(); boost::typeindex::type_index t2 = boost::typeindex::type_id(); BOOST_TEST_NE(t2, t1); BOOST_TEST(t1.pretty_name() == "const int" || t1.pretty_name() == "int const"); } void type_index_stream_operator_via_lexical_cast_testing() { using namespace boost::typeindex; std::string s_int2 = boost::lexical_cast(type_id()); BOOST_TEST_EQ(s_int2, "int"); std::string s_double2 = boost::lexical_cast(type_id()); BOOST_TEST_EQ(s_double2, "double"); } void type_index_stripping_cvr_test() { using namespace boost::typeindex; BOOST_TEST_EQ(type_id(), type_id()); BOOST_TEST_EQ(type_id(), type_id()); BOOST_TEST_EQ(type_id(), type_id()); BOOST_TEST_EQ(type_id(), type_id()); BOOST_TEST_EQ(type_id(), type_id()); BOOST_TEST_EQ(type_id(), type_id()); BOOST_TEST_EQ(type_id(), type_id()); BOOST_TEST_EQ(type_id(), type_id()); BOOST_TEST_EQ(type_id(), type_id()); BOOST_TEST_EQ(type_id(), type_id()); BOOST_TEST_EQ(type_id(), type_id()); BOOST_TEST_EQ(type_id(), type_id()); } void type_index_user_defined_class_test() { using namespace boost::typeindex; BOOST_TEST_EQ(type_id(), type_id()); BOOST_TEST_EQ(type_id(), type_id()); #ifndef BOOST_NO_RTTI BOOST_TEST(type_id() == typeid(my_namespace1::my_class)); BOOST_TEST(type_id() == typeid(my_namespace2::my_class)); BOOST_TEST(typeid(my_namespace1::my_class) == type_id()); BOOST_TEST(typeid(my_namespace2::my_class) == type_id()); #endif BOOST_TEST_NE(type_id(), type_id()); BOOST_TEST_NE( type_id().pretty_name().find("my_namespace1::my_class"), std::string::npos); } struct A { public: BOOST_TYPE_INDEX_REGISTER_CLASS virtual ~A(){} }; struct B: public A { BOOST_TYPE_INDEX_REGISTER_CLASS }; struct C: public B { BOOST_TYPE_INDEX_REGISTER_CLASS }; void comparators_type_id_runtime() { C c1; B b1; A* pc1 = &c1; A& rc1 = c1; A* pb1 = &b1; A& rb1 = b1; #ifndef BOOST_NO_RTTI BOOST_TEST(typeid(rc1) == typeid(*pc1)); BOOST_TEST(typeid(rb1) == typeid(*pb1)); BOOST_TEST(typeid(rc1) != typeid(*pb1)); BOOST_TEST(typeid(rb1) != typeid(*pc1)); BOOST_TEST(typeid(&rc1) == typeid(pb1)); BOOST_TEST(typeid(&rb1) == typeid(pc1)); #else BOOST_TEST(boost::typeindex::type_index(pc1->boost_type_index_type_id_runtime_()).raw_name()); #endif BOOST_TEST_EQ(boost::typeindex::type_id_runtime(rc1), boost::typeindex::type_id_runtime(*pc1)); BOOST_TEST_EQ(boost::typeindex::type_id(), boost::typeindex::type_id_runtime(*pc1)); BOOST_TEST_EQ(boost::typeindex::type_id_runtime(rb1), boost::typeindex::type_id_runtime(*pb1)); BOOST_TEST_EQ(boost::typeindex::type_id(), boost::typeindex::type_id_runtime(*pb1)); BOOST_TEST_NE(boost::typeindex::type_id_runtime(rc1), boost::typeindex::type_id_runtime(*pb1)); BOOST_TEST_NE(boost::typeindex::type_id_runtime(rb1), boost::typeindex::type_id_runtime(*pc1)); #ifndef BOOST_NO_RTTI BOOST_TEST_EQ(boost::typeindex::type_id_runtime(&rc1), boost::typeindex::type_id_runtime(pb1)); BOOST_TEST_EQ(boost::typeindex::type_id_runtime(&rb1), boost::typeindex::type_id_runtime(pc1)); BOOST_TEST(boost::typeindex::type_id_runtime(rc1) == typeid(*pc1)); BOOST_TEST(boost::typeindex::type_id_runtime(rb1) == typeid(*pb1)); BOOST_TEST(boost::typeindex::type_id_runtime(rc1) != typeid(*pb1)); BOOST_TEST(boost::typeindex::type_id_runtime(rb1) != typeid(*pc1)); BOOST_TEST(boost::typeindex::type_id_runtime(&rc1) == typeid(pb1)); BOOST_TEST(boost::typeindex::type_id_runtime(&rb1) == typeid(pc1)); #endif } #ifndef BOOST_NO_RTTI void comparators_type_id_vs_type_info() { using namespace boost::typeindex; type_index t_int = type_id(); BOOST_TEST(t_int == typeid(int)); BOOST_TEST(typeid(int) == t_int); BOOST_TEST(t_int <= typeid(int)); BOOST_TEST(typeid(int) <= t_int); BOOST_TEST(t_int >= typeid(int)); BOOST_TEST(typeid(int) >= t_int); type_index t_double = type_id(); BOOST_TEST(t_double == typeid(double)); BOOST_TEST(typeid(double) == t_double); BOOST_TEST(t_double <= typeid(double)); BOOST_TEST(typeid(double) <= t_double); BOOST_TEST(t_double >= typeid(double)); BOOST_TEST(typeid(double) >= t_double); if (t_double < t_int) { BOOST_TEST(t_double < typeid(int)); BOOST_TEST(typeid(double) < t_int); BOOST_TEST(typeid(int) > t_double); BOOST_TEST(t_int > typeid(double)); BOOST_TEST(t_double <= typeid(int)); BOOST_TEST(typeid(double) <= t_int); BOOST_TEST(typeid(int) >= t_double); BOOST_TEST(t_int >= typeid(double)); } else { BOOST_TEST(t_double > typeid(int)); BOOST_TEST(typeid(double) > t_int); BOOST_TEST(typeid(int) < t_double); BOOST_TEST(t_int < typeid(double)); BOOST_TEST(t_double >= typeid(int)); BOOST_TEST(typeid(double) >= t_int); BOOST_TEST(typeid(int) <= t_double); BOOST_TEST(t_int <= typeid(double)); } } #endif // BOOST_NO_RTTI int main() { names_matches_type_id(); default_construction(); copy_construction(); comparators_type_id(); hash_code_type_id(); type_id_storing_modifiers(); type_id_storing_modifiers_vs_nonstoring(); type_index_stream_operator_via_lexical_cast_testing(); type_index_stripping_cvr_test(); type_index_user_defined_class_test(); comparators_type_id_runtime(); #ifndef BOOST_NO_RTTI comparators_type_id_vs_type_info(); #endif return boost::report_errors(); }