// Copyright 2016-2020 Antony Polukhin // Distributed under the Boost Software License, Version 1.0. // (See the accompanying file LICENSE_1_0.txt // or a copy at .) #include #include #include #include #include #include //[pfr_quick_examples_structures struct foo { int integer; double real; void operator +=(int v) { integer += v * 10; real += v * 100; } }; struct bar { char character; foo f; }; bar var{'A', {777, 3.141593}}; //] inline std::ostream& operator<<(std::ostream& os, const bar& b) { return os << '{' << b.character << ", {" << b.f.integer << ", " << b.f.real << "}}"; } void test_examples() { { bar var{'A', {777, 3.141593}}; //[pfr_quick_examples_flat_functors_uset // no `std::hash` or `bar::operator==(const bar&)` defined std::unordered_set< bar, boost::pfr::flat_hash, boost::pfr::flat_equal_to<>> my_uset; my_uset.insert(var); //] } { bar var{'A', {777, 3.141593}}; //[pfr_quick_examples_flat_functors_set // no `bar::operator<(const bar&)` defined std::set> my_set; my_set.insert(var); //] } { //[pfr_quick_examples_flat_ops using namespace boost::pfr::flat_ops; // Defines comparisons assert((var < bar{'Z', {}} && var.f == foo{777, 3.141593})); //] std::cout << "boost::pfr::flat_structure_tie(var) :\n" << var << '\n'; } #if BOOST_PFR_USE_CPP17 { //[pfr_quick_examples_ops struct test { std::string f1; std::string_view f2; }; using namespace boost::pfr::ops; // Defines comparisons assert((test{"abc", ""} > test{"aaa", "zomg"})); //] } #endif { bar var{'A', {777, 3.141593}}; //[pfr_quick_examples_flat_for_each // incrementing each field on 1: boost::pfr::flat_for_each_field(var, [](auto& field) { field += 1; }); //] std::cout << "flat_for_each_field outputs:\n" << var << '\n'; } { bar var{'A', {777, 3.141593}}; //[pfr_quick_examples_for_each // increments first field on 1, calls foo::operator+= for second field boost::pfr::for_each_field(var, [](auto& field) { field += 1; }); //] std::cout << "flat_for_each_field outputs:\n" << var << '\n'; } { bar var{'A', {777, 3.141593}}; //[pfr_quick_examples_flat_for_each_idx boost::pfr::flat_for_each_field(var, [](auto& field, std::size_t idx) { std::cout << idx << ": " << boost::typeindex::type_id_runtime(field) << '\n'; }); //] } { bar var{'A', {777, 3.141593}}; //[pfr_quick_examples_for_each_idx boost::pfr::for_each_field(var, [](auto& field, std::size_t idx) { std::cout << idx << ": " << boost::typeindex::type_id_runtime(field) << '\n'; }); //] } { //[pfr_quick_examples_tuple_size std::cout << "tuple_size: " << boost::pfr::tuple_size::value << '\n'; //] } { //[pfr_quick_examples_flat_tuple_size std::cout << "flat_tuple_size: " << boost::pfr::flat_tuple_size::value << '\n'; //] } #if BOOST_PFR_USE_CPP17 || BOOST_PFR_USE_LOOPHOLE { bar var{'A', {777, 3.141593}}; //[pfr_quick_examples_get_1 boost::pfr::get<1>(var) = foo{1, 2}; // C++17 is required //] std::cout << "boost::pfr::get<1>(var) outputs:\n" << var << '\n'; } #endif { bar var{'A', {777, 3.141593}}; //[pfr_quick_examples_flat_get_1 boost::pfr::flat_get<1>(var) = 1; //] std::cout << "boost::pfr::flat_get<1>(var) outputs:\n" << var << '\n'; } { bar var{'A', {777, 3.141593}}; //[pfr_quick_examples_get_2 boost::pfr::get<1>(var.f) = 42.01; //] std::cout << "boost::pfr::get<1>(var.f) outputs:\n" << var << '\n'; } { bar var{'A', {777, 3.141593}}; //[pfr_quick_examples_flat_get_2 boost::pfr::flat_get<1>(var.f) = 42.01; //] std::cout << "boost::pfr::flat_get<1>(var.f) outputs:\n" << var << '\n'; } #if BOOST_PFR_USE_CPP17 || BOOST_PFR_USE_LOOPHOLE { bar var{'A', {777, 3.141593}}; //[pfr_quick_examples_structure_to_tuple // C++17 is required std::tuple t = boost::pfr::structure_to_tuple(var); std::get<1>(t) = foo{1, 2}; //] std::cout << "boost::pfr::structure_to_tuple(var) :\n" << var << '\n'; } #endif { bar var{'A', {777, 3.141593}}; //[pfr_quick_examples_flat_structure_to_tuple std::tuple t = boost::pfr::flat_structure_to_tuple(var); std::get<0>(t) = 'C'; //] std::cout << "boost::pfr::flat_structure_to_tuple(var) :\n" << var << '\n'; } #if BOOST_PFR_USE_CPP17 || BOOST_PFR_USE_LOOPHOLE { bar var{'A', {777, 3.141593}}; //[pfr_quick_examples_structure_tie // C++17 is required std::tuple t = boost::pfr::structure_tie(var); std::get<1>(t) = foo{1, 2}; //] std::cout << "boost::pfr::structure_tie(var) :\n" << var << '\n'; } #endif { bar var{'A', {777, 3.141593}}; //[pfr_quick_examples_flat_structure_tie std::tuple t = boost::pfr::flat_structure_tie(var); std::get<0>(t) = 'C'; //] std::cout << "boost::pfr::flat_structure_tie(var) :\n" << var << '\n'; } } // void test_examples() { int main() { test_examples(); }