]> git.proxmox.com Git - ceph.git/blob - ceph/src/boost/libs/pfr/test/run/for_each_field.cpp
update ceph source to reef 18.1.2
[ceph.git] / ceph / src / boost / libs / pfr / test / run / for_each_field.cpp
1 // Copyright (c) 2016-2022 Antony Polukhin
2 //
3 // Distributed under the Boost Software License, Version 1.0. (See accompanying
4 // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
5
6 #include <boost/pfr/core.hpp>
7 #include <boost/core/lightweight_test.hpp>
8 #include <sstream>
9
10 // Test case was inspired by Bruno Dutra. Thanks!
11
12 enum class color {
13 red,
14 green,
15 blue
16 };
17
18 std::ostream& operator <<(std::ostream& os, color c) {
19 switch(c) {
20 case color::red:
21 os << "red";
22 break;
23 case color::green:
24 os << "green";
25 break;
26 case color::blue:
27 os << "blue";
28 break;
29 };
30
31 return os;
32 }
33
34
35 struct my_constexpr {
36 constexpr my_constexpr() {}
37 };
38
39 std::ostream& operator <<(std::ostream& os, my_constexpr) {
40 return os << "{}";
41 }
42
43 struct reg {
44 const int a;
45 char b;
46 const my_constexpr d;
47 const color f;
48 const char* g;
49 };
50
51 struct simple {
52 int a;
53 char b;
54 short d;
55 };
56
57 struct empty{};
58
59
60 int main () {
61 std::size_t control = 0;
62
63 int v = {};
64 boost::pfr::for_each_field(v, [&control](auto&& val, std::size_t i) {
65 BOOST_TEST_EQ(i, control);
66 (void)val;
67 ++ control;
68 });
69 BOOST_TEST_EQ(control, 1);
70
71 control = 0;
72 int array[10] = {};
73 boost::pfr::for_each_field(array, [&control](auto&& val, std::size_t i) {
74 BOOST_TEST_EQ(i, control);
75 (void)val;
76 ++ control;
77 });
78 BOOST_TEST_EQ(control, 10);
79
80 std::stringstream ss;
81 boost::pfr::for_each_field(reg{42, 'a', {}, color::green, "hello world!"}, [&ss](auto&& val, std::size_t i) {
82 if (i) {
83 ss << ", ";
84 }
85 ss << val;
86 });
87 BOOST_TEST_EQ(std::string("42, a, {}, green, hello world!"), ss.str());
88 ss.str("");
89
90 control = 0;
91 boost::pfr::for_each_field(reg{42, 'a', {}, color::green, "hello world!"}, [&ss, &control](auto&& val, auto i) {
92 if (!!decltype(i)::value) {
93 ss << ", ";
94 }
95 BOOST_TEST_EQ(decltype(i)::value, control);
96 ++ control;
97 ss << val;
98 });
99 BOOST_TEST_EQ(std::string("42, a, {}, green, hello world!"), ss.str());
100 ss.str("");
101
102 boost::pfr::for_each_field(reg{42, 'a', {}, color::green, "hello world!"}, [&ss](auto&& val) {
103 ss << val << ' ';
104 });
105 BOOST_TEST_EQ(std::string("42 a {} green hello world! "), ss.str());
106 ss.str("");
107
108 std::cout << '\n';
109 boost::pfr::for_each_field(simple{42, 'a', 3}, [&ss](auto&& val) {
110 ss << val << ' ';
111 });
112 BOOST_TEST_EQ("42 a 3 ", ss.str());
113 ss.str("");
114
115 boost::pfr::for_each_field(empty{}, [&ss](auto&& val) {
116 ss << val << ' ';
117 });
118 BOOST_TEST_EQ("", ss.str());
119 ss.str("");
120
121 return boost::report_errors();
122 }