1 // Copyright (c) 2019 Ilya Kiselev 2 // Copyright (c) 2019-2021 Antony Polukhin 3 // 4 // Distributed under the Boost Software License, Version 1.0. (See accompanying 5 // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) 6 7 #include <boost/pfr/detail/offset_based_getter.hpp> 8 #include <boost/pfr/detail/sequence_tuple.hpp> 9 10 #include <boost/core/lightweight_test.hpp> 11 12 struct user_type { 13 char c; 14 double d; 15 }; 16 main()17int main() { 18 using pfr_tuple = boost::pfr::detail::sequence_tuple::tuple<char, double>; 19 using getter = boost::pfr::detail::offset_based_getter<user_type, pfr_tuple>; 20 using boost::pfr::detail::size_t_; 21 using boost::pfr::detail::sequence_tuple::get; 22 23 user_type value{}; 24 auto begin = reinterpret_cast<char*>(&value); 25 auto native_offset = reinterpret_cast<char*>(&value.d) - begin; 26 27 auto getter_offset = reinterpret_cast<char*>(&getter{}.get(value, size_t_<1>{})) - begin; 28 BOOST_TEST_EQ(native_offset, getter_offset); 29 30 pfr_tuple pfr_value{}; 31 auto pfr_tuple_offset = ( 32 reinterpret_cast<char*>(&get<1>(pfr_value)) - reinterpret_cast<char*>(&get<0>(pfr_value)) 33 ); 34 BOOST_TEST_EQ(native_offset, pfr_tuple_offset); 35 36 return boost::report_errors(); 37 } 38