From fb04223e5e1c4da19a105ee3f26b07d0fc59ff6d Mon Sep 17 00:00:00 2001 From: Antony Polukhin Date: Wed, 28 Dec 2016 22:08:05 +0300 Subject: [PATCH] Separate folders for precise and flat functions --- example/examples.cpp | 4 +- include/boost/pfr.hpp | 12 +- include/boost/pfr/detail/core14.hpp | 2 +- include/boost/pfr/detail/core17.hpp | 171 +----------------- include/boost/pfr/flat.hpp | 17 ++ .../pfr/{flat_core.hpp => flat/core.hpp} | 0 .../functions_for.hpp} | 4 +- .../{flat_functors.hpp => flat/functors.hpp} | 2 +- .../global_ops.hpp} | 7 +- .../boost/pfr/{flat_ops.hpp => flat/ops.hpp} | 6 +- include/boost/pfr/precise.hpp | 14 ++ include/boost/pfr/precise/core17.hpp | 164 +++++++++++++++++ .../boost/pfr/{ => precise}/tuple_size.hpp | 8 +- test/bitfields.cpp | 2 +- test/flat_functions_for.cpp | 2 +- test/flat_ops.cpp | 2 +- test/global_flat_ops.cpp | 2 +- test/minimal.cpp | 2 +- test/non_aggregate1.cpp | 2 +- test/non_aggregate2.cpp | 2 +- test/only_fields_count.cpp | 2 +- test/std_interactions.cpp | 2 +- test/test_counts_on.hpp | 2 +- 23 files changed, 232 insertions(+), 199 deletions(-) create mode 100644 include/boost/pfr/flat.hpp rename include/boost/pfr/{flat_core.hpp => flat/core.hpp} (100%) rename include/boost/pfr/{flat_functions_for.hpp => flat/functions_for.hpp} (98%) rename include/boost/pfr/{flat_functors.hpp => flat/functors.hpp} (99%) rename include/boost/pfr/{global_flat_ops.hpp => flat/global_ops.hpp} (96%) rename include/boost/pfr/{flat_ops.hpp => flat/ops.hpp} (98%) create mode 100644 include/boost/pfr/precise.hpp create mode 100644 include/boost/pfr/precise/core17.hpp rename include/boost/pfr/{ => precise}/tuple_size.hpp (90%) diff --git a/example/examples.cpp b/example/examples.cpp index 91be655..3906fcf 100644 --- a/example/examples.cpp +++ b/example/examples.cpp @@ -12,7 +12,7 @@ Let's define some structure: */ -#include +#include struct foo { // defining structure int some_integer; @@ -31,7 +31,7 @@ auto& r2 = boost::pfr::flat_get<1>(f); // accessing field with index 1, returns /*` The following example shows how to count fields using [classref boost::pfr::flat_tuple_size]. */ -#include +#include struct foo2 { // defining structure int some_integer; diff --git a/include/boost/pfr.hpp b/include/boost/pfr.hpp index 218c0fb..da788b0 100644 --- a/include/boost/pfr.hpp +++ b/include/boost/pfr.hpp @@ -3,14 +3,14 @@ // 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) -#pragma once +#ifndef BOOST_PFR_HPP +#define BOOST_PFR_HPP /// \file boost/pfr.hpp /// Includes all the Boost.PFR headers, except \xmlonlyboost/pfr/global_flat_ops.hpp\endxmlonly -#include -#include -#include -#include -#include +#include +#include + +#endif // BOOST_PFR_HPP diff --git a/include/boost/pfr/detail/core14.hpp b/include/boost/pfr/detail/core14.hpp index 1188b5b..fa058ef 100644 --- a/include/boost/pfr/detail/core14.hpp +++ b/include/boost/pfr/detail/core14.hpp @@ -14,7 +14,7 @@ #include // metaprogramming stuff #include -#include +#include #ifdef __clang__ # pragma clang diagnostic push diff --git a/include/boost/pfr/detail/core17.hpp b/include/boost/pfr/detail/core17.hpp index e8e5643..366ef7b 100644 --- a/include/boost/pfr/detail/core17.hpp +++ b/include/boost/pfr/detail/core17.hpp @@ -4,172 +4,9 @@ // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -#ifndef BOOST_PFR_CORE17_HPP -#define BOOST_PFR_CORE17_HPP +#ifndef BOOST_PFR_DETAIL_CORE17_HPP +#define BOOST_PFR_DETAIL_CORE17_HPP -#pragma once +#include -#if __cplusplus >= 201606L /* Oulu meeting, not the exact value */ -# include -#else -namespace boost { namespace pfr { namespace detail { - template - constexpr auto as_tuple(T&& val) noexcept { - static_assert(!sizeof(val), "C++17 required for this function"); - return nullptr; - } - - template - using as_tuple_t = decltype( ::boost::pfr::detail::as_tuple(std::declval()) ); -}}} // namespace boost::pfr::detail -#endif - -namespace boost { namespace pfr { - -/// \brief Returns reference or const reference to a field with index `I` in aggregate T. -/// -/// \b Requires: C++17. -/// -/// \b Example: -/// \code -/// struct my_struct { int i, short s; }; -/// my_struct s {10, 11}; -/// assert(boost::pfr::get<0>(s) == 10); -/// boost::pfr::get<1>(s) = 0; -/// \endcode -template -constexpr decltype(auto) get(const T& val) noexcept { - return detail::sequence_tuple::get( detail::as_tuple(val) ); -} - - -/// \overload get -template -constexpr decltype(auto) get(T& val) noexcept { - return detail::sequence_tuple::get( detail::as_tuple(val) ); -} - - -/// \brief `tuple_element` has a `typedef type-of-a-field-with-index-I-in-aggregate-T type;` -/// -/// \b Requires: C++17. -/// -/// \b Example: -/// \code -/// std::vector< boost::pfr::tuple_element<0, my_structure>::type > v; -/// \endcode -template -using tuple_element = detail::teleport_extents< - T, - typename detail::sequence_tuple::tuple_element >::type - >; - - -/// \brief Type of a field with index `I` in aggregate `T`. -/// -/// \b Requires: C++17. -/// -/// \b Example: -/// \code -/// std::vector< boost::pfr::tuple_element_t<0, my_structure> > v; -/// \endcode -template -using tuple_element_t = typename tuple_element::type; - - -/// \brief Creates an `std::tuple` from an aggregate T. -/// -/// \b Requires: C++17. -/// -/// \b Example: -/// \code -/// struct my_struct { int i, short s; }; -/// my_struct s {10, 11}; -/// std::tuple t = make_tuple(s); -/// assert(get<0>(t) == 10); -/// \endcode -template -constexpr auto structure_to_tuple(const T& val) noexcept { - typedef detail::as_tuple_t internal_tuple_t; - - return detail::make_stdtuple_from_seqtuple( - detail::as_tuple(val), - std::make_index_sequence< internal_tuple_t::size_v >() - ); -} - - -/// \brief Creates an `std::tuple` with lvalue references to fields of an aggregate T. -/// -/// \b Requires: C++17. -/// -/// \b Example: -/// \code -/// struct my_struct { int i, short s; }; -/// my_struct s; -/// tie(s) = std::tuple{10, 11}; -/// assert(s.s == 11); -/// \endcode -template -constexpr auto structure_tie(T& val) noexcept { - typedef detail::as_tuple_t internal_tuple_t; - - return detail::tie_sequence_tuple_impl( - detail::as_tuple(val), - std::make_index_sequence< internal_tuple_t::size_v >() - ); -} - - -/// \brief Writes aggregate `value` to `out` -/// -/// \b Requires: C++17. -/// -/// \b Example: -/// \code -/// struct my_struct { int i, short s; }; -/// my_struct s{12, 13}; -/// write(std::cout, s); // outputs '{12, 13}' -/// \endcode -template -void write(std::basic_ostream& out, const T& value) { - out << '{'; - detail::sequence_tuple::print_impl<0, tuple_size_v >::print(out, detail::as_tuple(value)); - out << '}'; -} - -/// Reads aggregate `value` from stream `in` -/// -/// \b Requires: C++17. -/// -/// \b Example: -/// \code -/// struct my_struct { int i, short s; }; -/// my_struct s; -/// std::stringstream ss; -/// ss << "{ 12, 13 }"; -/// ss >> s; -/// assert(s.i == 12); -/// assert(s.i == 13); -/// \endcode -template -void read(std::basic_istream& in, T& value) { - const auto prev_exceptions = in.exceptions(); - in.exceptions( typename std::basic_istream::iostate(0) ); - const auto prev_flags = in.flags( typename std::basic_istream::fmtflags(0) ); - - char parenthis = {}; - in >> parenthis; - if (parenthis != '{') in.setstate(std::basic_istream::failbit); - detail::sequence_tuple::read_impl<0, tuple_size_v >::read(in, detail::as_tuple(value)); - - in >> parenthis; - if (parenthis != '}') in.setstate(std::basic_istream::failbit); - - in.flags(prev_flags); - in.exceptions(prev_exceptions); -} - -}} // namespace boost::pfr - -#endif // BOOST_PFR_CORE17_HPP +#endif // BOOST_PFR_DETAIL_CORE17_HPP diff --git a/include/boost/pfr/flat.hpp b/include/boost/pfr/flat.hpp new file mode 100644 index 0000000..f5dd566 --- /dev/null +++ b/include/boost/pfr/flat.hpp @@ -0,0 +1,17 @@ +// Copyright (c) 2016 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) + +#ifndef BOOST_PFR_FLAT_HPP +#define BOOST_PFR_FLAT_HPP + +/// \file boost/pfr/flat.hpp +/// Includes all the Boost.PFR headers that define `flat_*` functions, except \xmlonlyboost/pfr/flat/global_ops.hpp\endxmlonly + +#include +#include +#include +#include + +#endif // BOOST_PFR_FLAT_HPP diff --git a/include/boost/pfr/flat_core.hpp b/include/boost/pfr/flat/core.hpp similarity index 100% rename from include/boost/pfr/flat_core.hpp rename to include/boost/pfr/flat/core.hpp diff --git a/include/boost/pfr/flat_functions_for.hpp b/include/boost/pfr/flat/functions_for.hpp similarity index 98% rename from include/boost/pfr/flat_functions_for.hpp rename to include/boost/pfr/flat/functions_for.hpp index 0eb882b..e676096 100644 --- a/include/boost/pfr/flat_functions_for.hpp +++ b/include/boost/pfr/flat/functions_for.hpp @@ -9,7 +9,7 @@ # error C++14 is required for this header. #endif -#include +#include /// \def BOOST_PFR_FLAT_FUNCTIONS_FOR(T) /// Defines comparison operators and stream operators for T. @@ -17,7 +17,7 @@ /// /// \b Example: /// \code -/// #include +/// #include /// struct comparable_struct { // No operators defined for that structure /// int i; short s; char data[7]; bool bl; int a,b,c,d,e,f; /// }; diff --git a/include/boost/pfr/flat_functors.hpp b/include/boost/pfr/flat/functors.hpp similarity index 99% rename from include/boost/pfr/flat_functors.hpp rename to include/boost/pfr/flat/functors.hpp index a28f285..e9d901f 100644 --- a/include/boost/pfr/flat_functors.hpp +++ b/include/boost/pfr/flat/functors.hpp @@ -13,7 +13,7 @@ #endif #include -#include +#include /// \file boost/pfr/functors.hpp /// Contains functors that can work with PODs and are close to the Standard Library ones. diff --git a/include/boost/pfr/global_flat_ops.hpp b/include/boost/pfr/flat/global_ops.hpp similarity index 96% rename from include/boost/pfr/global_flat_ops.hpp rename to include/boost/pfr/flat/global_ops.hpp index a847726..b13a36c 100644 --- a/include/boost/pfr/global_flat_ops.hpp +++ b/include/boost/pfr/flat/global_ops.hpp @@ -3,13 +3,14 @@ // 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) -#pragma once +#ifndef BOOST_PFR_FLAT_GLOBAL_OPS_HPP +#define BOOST_PFR_FLAT_GLOBAL_OPS_HPP #if __cplusplus < 201402L # error C++14 is required for this header. #endif -#include +#include /// \file boost/pfr/global_flat_ops.hpp /// Contains comparison operators and stream operators for any POD types that do not have their own operators. @@ -108,3 +109,5 @@ namespace boost { namespace pfr { namespace detail { return ::boost::pfr::flat_hash{}(value); } #endif + +#endif // BOOST_PFR_FLAT_GLOBAL_OPS_HPP diff --git a/include/boost/pfr/flat_ops.hpp b/include/boost/pfr/flat/ops.hpp similarity index 98% rename from include/boost/pfr/flat_ops.hpp rename to include/boost/pfr/flat/ops.hpp index 5aabe47..cd056b0 100644 --- a/include/boost/pfr/flat_ops.hpp +++ b/include/boost/pfr/flat/ops.hpp @@ -9,9 +9,9 @@ # error C++14 is required for this header. #endif -#include +#include -/// \file boost/pfr/flat_ops.hpp +/// \file boost/pfr/flat/ops.hpp /// Contains comparison operators and stream operators for any POD types that do not have their own operators. /// If POD is comparable or streamable using it's own operator or it's conversion operator, then the original operator is used. /// @@ -19,7 +19,7 @@ /// /// \b Example: /// \code -/// #include +/// #include /// struct comparable_struct { // No operators defined for that structure /// int i; short s; char data[7]; bool bl; int a,b,c,d,e,f; /// }; diff --git a/include/boost/pfr/precise.hpp b/include/boost/pfr/precise.hpp new file mode 100644 index 0000000..c0f5107 --- /dev/null +++ b/include/boost/pfr/precise.hpp @@ -0,0 +1,14 @@ +// Copyright (c) 2016 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) + +#ifndef BOOST_PFR_PRECISE_HPP +#define BOOST_PFR_PRECISE_HPP + +/// \file boost/pfr/precise.hpp +/// Includes all the Boost.PFR headers that do not define `flat_*` functions, except \xmlonlyboost/pfr/precise/global_ops.hpp\endxmlonly + +#include + +#endif // BOOST_PFR_PRECISE_HPP diff --git a/include/boost/pfr/precise/core17.hpp b/include/boost/pfr/precise/core17.hpp new file mode 100644 index 0000000..d06fee1 --- /dev/null +++ b/include/boost/pfr/precise/core17.hpp @@ -0,0 +1,164 @@ +// Copyright (c) 2016 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) + + +#ifndef BOOST_PFR_PRECISE_CORE_HPP +#define BOOST_PFR_PRECISE_CORE_HPP + +#if __cplusplus >= 201606L /* Oulu meeting, not the exact value */ +# include +#else +# include +#endif + +namespace boost { namespace pfr { + +/// \brief Returns reference or const reference to a field with index `I` in aggregate T. +/// +/// \b Requires: C++17 or \simplepod{C++14 simple POD}. +/// +/// \b Example: +/// \code +/// struct my_struct { int i, short s; }; +/// my_struct s {10, 11}; +/// assert(boost::pfr::get<0>(s) == 10); +/// boost::pfr::get<1>(s) = 0; +/// \endcode +template +constexpr decltype(auto) get(const T& val) noexcept { + return detail::sequence_tuple::get( detail::as_tuple(val) ); +} + + +/// \overload get +template +constexpr decltype(auto) get(T& val) noexcept { + return detail::sequence_tuple::get( detail::as_tuple(val) ); +} + + +/// \brief `tuple_element` has a `typedef type-of-a-field-with-index-I-in-aggregate-T type;` +/// +/// \b Requires: C++17 or \simplepod{C++14 simple POD}. +/// +/// \b Example: +/// \code +/// std::vector< boost::pfr::tuple_element<0, my_structure>::type > v; +/// \endcode +template +using tuple_element = detail::teleport_extents< + T, + typename detail::sequence_tuple::tuple_element >::type + >; + + +/// \brief Type of a field with index `I` in aggregate `T`. +/// +/// \b Requires: C++17 or \simplepod{C++14 simple POD}. +/// +/// \b Example: +/// \code +/// std::vector< boost::pfr::tuple_element_t<0, my_structure> > v; +/// \endcode +template +using tuple_element_t = typename tuple_element::type; + + +/// \brief Creates an `std::tuple` from an aggregate T. +/// +/// \b Requires: C++17. +/// +/// \b Example: +/// \code +/// struct my_struct { int i, short s; }; +/// my_struct s {10, 11}; +/// std::tuple t = make_tuple(s); +/// assert(get<0>(t) == 10); +/// \endcode +template +constexpr auto structure_to_tuple(const T& val) noexcept { + typedef detail::as_tuple_t internal_tuple_t; + + return detail::make_stdtuple_from_seqtuple( + detail::as_tuple(val), + std::make_index_sequence< internal_tuple_t::size_v >() + ); +} + + +/// \brief Creates an `std::tuple` with lvalue references to fields of an aggregate T. +/// +/// \b Requires: C++17. +/// +/// \b Example: +/// \code +/// struct my_struct { int i, short s; }; +/// my_struct s; +/// tie(s) = std::tuple{10, 11}; +/// assert(s.s == 11); +/// \endcode +template +constexpr auto structure_tie(T& val) noexcept { + typedef detail::as_tuple_t internal_tuple_t; + + return detail::tie_sequence_tuple_impl( + detail::as_tuple(val), + std::make_index_sequence< internal_tuple_t::size_v >() + ); +} + + +/// \brief Writes aggregate `value` to `out` +/// +/// \b Requires: C++17. +/// +/// \b Example: +/// \code +/// struct my_struct { int i, short s; }; +/// my_struct s{12, 13}; +/// write(std::cout, s); // outputs '{12, 13}' +/// \endcode +template +void write(std::basic_ostream& out, const T& value) { + out << '{'; + detail::sequence_tuple::print_impl<0, tuple_size_v >::print(out, detail::as_tuple(value)); + out << '}'; +} + +/// Reads aggregate `value` from stream `in` +/// +/// \b Requires: C++17. +/// +/// \b Example: +/// \code +/// struct my_struct { int i, short s; }; +/// my_struct s; +/// std::stringstream ss; +/// ss << "{ 12, 13 }"; +/// ss >> s; +/// assert(s.i == 12); +/// assert(s.i == 13); +/// \endcode +template +void read(std::basic_istream& in, T& value) { + const auto prev_exceptions = in.exceptions(); + in.exceptions( typename std::basic_istream::iostate(0) ); + const auto prev_flags = in.flags( typename std::basic_istream::fmtflags(0) ); + + char parenthis = {}; + in >> parenthis; + if (parenthis != '{') in.setstate(std::basic_istream::failbit); + detail::sequence_tuple::read_impl<0, tuple_size_v >::read(in, detail::as_tuple(value)); + + in >> parenthis; + if (parenthis != '}') in.setstate(std::basic_istream::failbit); + + in.flags(prev_flags); + in.exceptions(prev_exceptions); +} + +}} // namespace boost::pfr + +#endif // BOOST_PFR_CORE17_HPP diff --git a/include/boost/pfr/tuple_size.hpp b/include/boost/pfr/precise/tuple_size.hpp similarity index 90% rename from include/boost/pfr/tuple_size.hpp rename to include/boost/pfr/precise/tuple_size.hpp index c653d77..ab847d7 100644 --- a/include/boost/pfr/tuple_size.hpp +++ b/include/boost/pfr/precise/tuple_size.hpp @@ -3,10 +3,8 @@ // 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) -#ifndef BOOST_PFR_TUPLE_SIZE_HPP -#define BOOST_PFR_TUPLE_SIZE_HPP - -#pragma once +#ifndef BOOST_PFR_PRECISE_TUPLE_SIZE_HPP +#define BOOST_PFR_PRECISE_TUPLE_SIZE_HPP #if __cplusplus < 201402L # error C++14 is required for this header. @@ -41,4 +39,4 @@ constexpr std::size_t tuple_size_v = tuple_size::value; }} // namespace boost::pfr -#endif // BOOST_PFR_TUPLE_SIZE_HPP +#endif // BOOST_PFR_PRECISE_TUPLE_SIZE_HPP diff --git a/test/bitfields.cpp b/test/bitfields.cpp index 9ec5049..508da47 100644 --- a/test/bitfields.cpp +++ b/test/bitfields.cpp @@ -3,7 +3,7 @@ // 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 struct bf { diff --git a/test/flat_functions_for.cpp b/test/flat_functions_for.cpp index 5938df8..ebe49e3 100644 --- a/test/flat_functions_for.cpp +++ b/test/flat_functions_for.cpp @@ -3,7 +3,7 @@ // 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 #include diff --git a/test/flat_ops.cpp b/test/flat_ops.cpp index 305848c..54f1c0c 100644 --- a/test/flat_ops.cpp +++ b/test/flat_ops.cpp @@ -3,7 +3,7 @@ // 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 #include diff --git a/test/global_flat_ops.cpp b/test/global_flat_ops.cpp index f06d04f..3109243 100644 --- a/test/global_flat_ops.cpp +++ b/test/global_flat_ops.cpp @@ -3,7 +3,7 @@ // 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 #include diff --git a/test/minimal.cpp b/test/minimal.cpp index f0b0e5e..9cc2978 100644 --- a/test/minimal.cpp +++ b/test/minimal.cpp @@ -3,7 +3,7 @@ // 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 int main() { struct foo { int i; char c;}; diff --git a/test/non_aggregate1.cpp b/test/non_aggregate1.cpp index fdfd16d..8a001f4 100644 --- a/test/non_aggregate1.cpp +++ b/test/non_aggregate1.cpp @@ -3,7 +3,7 @@ // 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 #include diff --git a/test/non_aggregate2.cpp b/test/non_aggregate2.cpp index 34890fa..75dd2ae 100644 --- a/test/non_aggregate2.cpp +++ b/test/non_aggregate2.cpp @@ -3,7 +3,7 @@ // 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 #include diff --git a/test/only_fields_count.cpp b/test/only_fields_count.cpp index 9293b23..968d936 100644 --- a/test/only_fields_count.cpp +++ b/test/only_fields_count.cpp @@ -3,7 +3,7 @@ // 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 int main() { struct nested { int i; char data[20]; }; diff --git a/test/std_interactions.cpp b/test/std_interactions.cpp index ce4d4f7..83d8a36 100644 --- a/test/std_interactions.cpp +++ b/test/std_interactions.cpp @@ -3,7 +3,7 @@ // 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 helper { diff --git a/test/test_counts_on.hpp b/test/test_counts_on.hpp index 841e9c9..356d6ab 100644 --- a/test/test_counts_on.hpp +++ b/test/test_counts_on.hpp @@ -6,7 +6,7 @@ #ifndef BOOST_PFR_TEST_TEST_COUNTS_ON_HPP #define BOOST_PFR_TEST_TEST_COUNTS_ON_HPP -#include +#include template void test_counts_on_multiple_chars_impl_1() {