// Copyright 2020 Peter Dimov // Distributed under the Boost Software License, Version 1.0. // https://www.boost.org/LICENSE_1_0.txt #include #include #include #include struct X { }; BOOST_DESCRIBE_STRUCT(X, (), ()) class Y { public: int m1; int m2; private: int m3; int m4; BOOST_DESCRIBE_CLASS(Y, (), (m1, m2), (), (m3, m4)) public: Y( int m1, int m2, int m3, int m4 ): m1( m1 ), m2( m2 ), m3( m3 ), m4( m4 ) { } // using Pm = int Y::*; typedef int Y::* Pm; static Pm m3_pointer() BOOST_NOEXCEPT { return &Y::m3; } static Pm m4_pointer() BOOST_NOEXCEPT { return &Y::m4; } }; #if !defined(BOOST_DESCRIBE_CXX14) #include BOOST_PRAGMA_MESSAGE("Skipping test because C++14 is not available") int main() {} #else #include int main() { using namespace boost::describe; using namespace boost::mp11; { using L = describe_members; BOOST_TEST_EQ( mp_size::value, 0 ); } { using L = describe_members; BOOST_TEST_EQ( mp_size::value, 4 ); BOOST_TEST( (mp_at_c::pointer) == &Y::m1 ); BOOST_TEST_CSTR_EQ( (mp_at_c::name), "m1" ); BOOST_TEST_EQ( (mp_at_c::modifiers), mod_public ); BOOST_TEST( (mp_at_c::pointer) == &Y::m2 ); BOOST_TEST_CSTR_EQ( (mp_at_c::name), "m2" ); BOOST_TEST_EQ( (mp_at_c::modifiers), mod_public ); BOOST_TEST( (mp_at_c::pointer) == Y::m3_pointer() ); BOOST_TEST_CSTR_EQ( (mp_at_c::name), "m3" ); BOOST_TEST_EQ( (mp_at_c::modifiers), mod_private ); BOOST_TEST( (mp_at_c::pointer) == Y::m4_pointer() ); BOOST_TEST_CSTR_EQ( (mp_at_c::name), "m4" ); BOOST_TEST_EQ( (mp_at_c::modifiers), mod_private ); } { using L = describe_members; BOOST_TEST_EQ( mp_size::value, 2 ); BOOST_TEST( (mp_at_c::pointer) == &Y::m1 ); BOOST_TEST_CSTR_EQ( (mp_at_c::name), "m1" ); BOOST_TEST_EQ( (mp_at_c::modifiers), mod_public ); BOOST_TEST( (mp_at_c::pointer) == &Y::m2 ); BOOST_TEST_CSTR_EQ( (mp_at_c::name), "m2" ); BOOST_TEST_EQ( (mp_at_c::modifiers), mod_public ); } { using L = describe_members; BOOST_TEST_EQ( mp_size::value, 2 ); BOOST_TEST( (mp_at_c::pointer) == Y::m3_pointer() ); BOOST_TEST_CSTR_EQ( (mp_at_c::name), "m3" ); BOOST_TEST_EQ( (mp_at_c::modifiers), mod_private ); BOOST_TEST( (mp_at_c::pointer) == Y::m4_pointer() ); BOOST_TEST_CSTR_EQ( (mp_at_c::name), "m4" ); BOOST_TEST_EQ( (mp_at_c::modifiers), mod_private ); } { using L = describe_members; BOOST_TEST_EQ( mp_size::value, 0 ); } return boost::report_errors(); } #endif // !defined(BOOST_DESCRIBE_CXX14)