2
0
mirror of https://github.com/boostorg/pfr.git synced 2026-01-20 16:52:13 +00:00

Compare commits

...

63 Commits

Author SHA1 Message Date
Antony Polukhin
442928eeb4 fixes 2023-02-14 09:23:15 +03:00
Antony Polukhin
d4095b3fbd update the generation script 2023-02-12 19:46:27 +03:00
Antony Polukhin
19d5a1d0e6 test fixes 2023-02-12 19:39:49 +03:00
Antony Polukhin
e002e42910 make the result type of boost::pfr::get exactly match std::get 2023-02-11 21:52:40 +03:00
Antony Polukhin
ed28602c2c Merge pull request #121 from caozhanhao/missing-pragma
add missing #pragma once
2023-01-31 11:38:58 +03:00
caozhanhao
dbc78d7dd9 add missing #pragma once 2023-01-20 13:00:37 +08:00
Antony Polukhin
551174b58c Update copyright years 2023-01-19 10:03:04 +03:00
Antony Polukhin
79b0d65d4f Merge remote-tracking branch 'denzor200/typo_fix' into develop 2023-01-18 19:05:08 +03:00
Antony Polukhin
2116be9285 Merge pull request #117 from markus-oberhumer-forks/fix-Wzero-as-null-pointer-constant
Avoid -Wzero-as-null-pointer-constant warnings.
2023-01-17 15:14:44 +03:00
Markus F.X.J. Oberhumer
a9a295e4aa Avoid -Wzero-as-null-pointer-constant warnings. 2023-01-11 13:11:45 +01:00
Antony Polukhin
2775d19f34 Merge pull request #119 from denzor200/fix/broken_structured_binding2
Workaround for broken C++17 stuctured binding in old compilers
2023-01-10 20:13:44 +03:00
denzor200
633c4bc985 'add_cv_like<T>(arg)' -> 'detail::add_cv_like<T>(arg)' 2023-01-10 00:26:58 +06:00
denzor200
b1af355a49 Workaround for broken C++17 stuctured binding in old compilers 2023-01-09 23:30:41 +06:00
Antony Polukhin
ef505f10c3 Merge pull request #118 from denzor200/fix/config_for_old_stdcpp
Fix for using config.hpp in old standards
2023-01-07 18:37:50 +03:00
denzor200
1be5e116f4 add cxx14 check 2023-01-07 17:02:01 +06:00
denzor200
bca51da20f Add old MSVC CI stage 2023-01-07 16:43:20 +06:00
denzor200
47c6413530 disable cxx14 restriction for config's test 2023-01-07 02:28:03 +06:00
denzor200
52a5a489ba split tests into two projects 2023-01-07 01:48:39 +06:00
Antony Polukhin
fd584a405d Merge pull request #114 from denzor200/patch-2
Fix warning missing terminating character
2022-12-30 16:34:10 +03:00
Denis Mikhailov
b6a960757b Update config.hpp 2022-12-30 11:21:24 +04:00
Antony Polukhin
dac40b2153 Merge pull request #86 from denzor200/feature/85-boost_no_pfr_macro
Implemented BOOST_PFR_ENABLED macro
2022-12-18 22:51:01 +03:00
denzor200
58ce59cf38 missed BOOST_PFR_ENABLED in error message 2022-12-18 22:01:57 +04:00
denzor200
5010309967 permissions 2022-12-18 21:54:58 +04:00
denzor200
bf5bd10b36 review discussions 2022-12-18 21:52:40 +04:00
denzor200
3279a7b610 Merge remote-tracking branch 'origin/develop' into feature/85-boost_no_pfr_macro
Conflicts:
	doc/pfr.qbk
	include/boost/pfr/detail/config.hpp
	test/print_config.cpp
2022-12-18 20:54:40 +04:00
Antony Polukhin
d7db07e98d Merge pull request #111 from denzor200/is_implicitly_reflectable
Add is_implicitly_reflectable trait
2022-12-18 19:11:27 +03:00
denzor200
6a38a07285 Add test 'boost_no_pfr_macro' 2022-12-17 00:35:56 +04:00
denzor200
69a06b98da review discussions 2022-12-17 00:33:44 +04:00
denzor200
578b5b2ac2 tests for new traits 2022-12-16 23:37:19 +04:00
denzor200
f12f35ac1a resolve review discussions 2022-12-16 23:20:37 +04:00
denzor200
2b4e2922ae fix for sfinae-friendliness issue 2022-12-16 19:57:12 +04:00
denzor200
b2acaacaaf Ability to disable implicitly reflection using the macro 2022-12-02 18:05:52 +04:00
Denis Mikhaylov
ff6c2b87c0 Remake BOOST_NO_PFR, now it can be overridden by the user 2022-12-01 20:43:36 +06:00
Denis Mikhaylov
2a3ddbfc17 Merge remote-tracking branch 'origin/develop' into feature/85-boost_no_pfr_macro 2022-12-01 19:47:53 +06:00
Denis Mikhaylov
5374f9aebc Revert "Implemented BOOST_NO_PFR macro"
This reverts commit 14185d614f.
2022-12-01 19:47:29 +06:00
Denis Mikhaylov
968d692c5e permissions restored 2022-12-01 17:42:09 +06:00
Denis Mikhaylov
5c13668343 Fix strip_boost_namespace's issues 2022-12-01 17:27:13 +06:00
Denis Mikhaylov
6f853dad2c Fixed inspect issues 2022-12-01 17:13:06 +06:00
Denis Mikhaylov
aa5abd8d76 Fixed C++14 build 2022-12-01 17:05:00 +06:00
Denis Mikhaylov
ba40d86097 Add static test to detect ability to integrate PFR as fallback into the Fusion 2022-12-01 14:09:37 +06:00
denzor200
7a3a419c35 identations in Motivating Example 2022-11-27 19:52:57 +04:00
denzor200
a70d02103a Add is_implicitly_reflectable trait 2022-11-27 19:48:32 +04:00
denzor200
d59b6f9520 permissions restored 2022-11-27 15:17:00 +04:00
Antony Polukhin
69c5692cd6 Merge pull request #109 from alexiprof/sequence_tuple-nolint
feat sequence_tuple: add nolint in functions
2022-09-24 11:25:15 +03:00
Alexander Malkov
8f325567eb feat sequence_tuple: add nolint in functions
add nolint in get_impl functions
2022-09-23 14:36:42 +03:00
Denis Mikhaylov
b10c0c66ed fix 2022-09-15 10:59:42 +06:00
Denis Mikhaylov
1bb4ced005 Fixed a lot of typos 2022-09-14 20:01:44 +06:00
Antony Polukhin
58dcb40a49 disable MSVC tests for now 2022-09-10 16:28:00 +03:00
Antony Polukhin
b7d839b851 do not test in C++14 mode on modern MSVC 2022-09-09 18:44:02 +03:00
Antony Polukhin
3396cdca9e Merge branch 'develop' of github.com:boostorg/pfr into develop 2022-09-03 08:17:18 +03:00
Antony Polukhin
fbafd21118 Update Windows version in CI. Remove MacOS run from CI as it almost always hits CI limits 2022-09-03 08:17:07 +03:00
Antony Polukhin
b0aae28eb0 Merge pull request #97 from denzor200/patch-1
Fixed `is_constexpr_aggregate_initializable`
2022-09-01 11:50:08 +03:00
Antony Polukhin
9388c4e4c0 Force CI run 2022-08-31 21:34:59 +03:00
Antony Polukhin
4e84a5b159 Merge pull request #96 from jcelerier/patch-1
for_each_field_impl: use fold expressions if possible
2022-08-31 21:17:01 +03:00
Antony Polukhin
7837449ca7 Force CI run 2022-08-31 18:31:06 +03:00
Antony Polukhin
9bb809d2a5 Merge pull request #104 from alexiprof/patch-1
feat sequence_tuple: add nolint in return value
2022-08-31 18:27:47 +03:00
Alexander Malkov
2a1fd53724 feat sequence_tuple: add nolint in return value
add nolint in return value

Tests: clang-tidy
2022-08-31 12:28:03 +03:00
Denis Mikhailov
cae0eaad61 Fix compilation error with array 2022-07-28 00:10:16 +04:00
Denis Mikhailov
ba10f9bc94 Update core14_classic.hpp 2022-07-20 15:27:28 +06:00
Antony Polukhin
8a8b5bc8d3 update copyright years 2022-01-30 14:55:36 +03:00
Jean-Michaël Celerier
a73f25d3ff for_each_field_impl: use fold expressions if possible
This makes empty structs work with MSVC in that case.
2021-11-12 21:55:01 +01:00
Antony Polukhin
a24717a4a1 fix samples in the README.md (fixes #94) 2021-10-09 11:08:12 +03:00
denzor200
14185d614f Implemented BOOST_NO_PFR macro 2021-06-20 16:32:07 +04:00
102 changed files with 3236 additions and 662 deletions

View File

@@ -35,11 +35,12 @@ jobs:
os: ubuntu-20.04
cxxflags: "cxxflags=-fsanitize=address,undefined,integer -fno-sanitize-recover=undefined"
linkflags: "linkflags=-fsanitize=address,undefined,integer"
- toolset: clang
cxxstd: "03,11,14,17,2a"
os: macos-10.15
cxxflags: "cxxflags=-fsanitize=address,undefined -fno-sanitize-recover=undefined"
linkflags: "linkflags=-fsanitize=address,undefined"
# To low quota to use
#- toolset: clang
# cxxstd: "03,11,14,17,2a"
# os: macos-10.15
# cxxflags: "cxxflags=-fsanitize=address,undefined -fno-sanitize-recover=undefined"
# linkflags: "linkflags=-fsanitize=address,undefined"
runs-on: ${{matrix.os}}
@@ -123,10 +124,11 @@ jobs:
fail-fast: false
matrix:
include:
- toolset: msvc-14.1
cxxstd: "14,17,latest"
addrmd: 32,64
os: windows-2016
# TODO: fails the loophole tests
#- toolset: msvc
# cxxstd: "14,17,latest"
# addrmd: 32,64
# os: windows-2022
# TODO: fails the loophole tests
#- toolset: msvc-14.2
# cxxstd: "14,17,latest"

View File

@@ -49,7 +49,7 @@ Edgar Allan Poe was born in 1809
### Motivating Example #1
```c++
#include <iostream>
#include "boost/pfr/precise.hpp"
#include "boost/pfr.hpp"
struct my_struct { // no ostream operator defined!
int i;
@@ -74,7 +74,7 @@ my_struct has 3 fields: {100, H, 3.14159}
```c++
#include <iostream>
#include "boost/pfr/precise.hpp"
#include "boost/pfr.hpp"
struct my_struct { // no ostream operator defined!
std::string s;
@@ -94,6 +94,58 @@ Outputs:
my_struct has 2 fields: {"Das ist fantastisch!", 100}
```
### Motivating Example #3
```c++
#include <iostream>
#include <string>
#include <boost/config/warning_disable.hpp>
#include <boost/spirit/home/x3.hpp>
#include <boost/fusion/include/adapt_boost_pfr.hpp>
#include "boost/pfr/io.hpp"
namespace x3 = boost::spirit::x3;
struct ast_employee { // No BOOST_FUSION_ADAPT_STRUCT defined
int age;
std::string forename;
std::string surname;
double salary;
};
auto const quoted_string = x3::lexeme['"' >> +(x3::ascii::char_ - '"') >> '"'];
x3::rule<class employee, ast_employee> const employee = "employee";
auto const employee_def =
x3::lit("employee")
>> '{'
>> x3::int_ >> ','
>> quoted_string >> ','
>> quoted_string >> ','
>> x3::double_
>> '}'
;
BOOST_SPIRIT_DEFINE(employee);
int main() {
std::string str = R"(employee{34, "Chip", "Douglas", 2500.00})";
ast_employee emp;
x3::phrase_parse(str.begin(),
str.end(),
employee,
x3::ascii::space,
emp);
std::cout << boost::pfr::io(emp) << std::endl;
}
```
Outputs:
```
(34 Chip Douglas 2500)
```
### Requirements and Limitations

View File

@@ -1,7 +1,7 @@
[library Boost.PFR
[quickbook 1.6]
[version 2.0]
[copyright 2016-2021 Antony Polukhin]
[copyright 2016-2023 Antony Polukhin]
[category Language Features Emulation]
[license
Distributed under the Boost Software License, Version 1.0.
@@ -168,6 +168,7 @@ Boost.PFR adds the following out-of-the-box functionality for aggregate initiali
* member type retrieval
* methods for cooperation with `std::tuple`
* methods to visit each field of the structure
* trait to detect potential ability to reflect type, and ability to override trait's decision in user-side code
Boost.PFR is a header only library that does not depend on Boost. You can just copy the content of the "include" folder [@https://github.com/boostorg/pfr from the Boost.PFR github] into your project, and the library will work fine. For a version of the library without `boost::` namespace see [@https://github.com/apolukhin/pfr_non_boost PFR].
@@ -467,6 +468,8 @@ By default Boost.PFR [*auto-detects your compiler abilities] and automatically d
[[*BOOST_PFR_USE_LOOPHOLE*] [Define to `1` if you wish to override Boost.PFR choice and exploit [@http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#2118 CWG 2118] for reflection. Define to `0` to override Boost.PFR choice and disable CWG 2118 usage.]]
[[*BOOST_PFR_USE_STD_MAKE_INTEGRAL_SEQUENCE*] [Define to `0` if you are hit by the template instantiation depth issues with `std::make_integer_sequence` and wish to use Boost.PFR version of that metafunction. Define to `1` to override Boost.PFR detection logic. ]]
[[*BOOST_PFR_HAS_GUARANTEED_COPY_ELISION*] [Define to `0` if your compiler does not implement C++17 guaranteed copy elision properly and fails to reflect aggregates with non-movable fields. Define to `1` to override Boost.PFR detection logic. ]]
[[*BOOST_PFR_ENABLE_IMPLICIT_REFLECTION*] [Define to `0` if you are hit by lots of non-effective choices made by implicitly reflection. Define to `1` to override Boost.PFR detection logic. ]]
[[*BOOST_PFR_ENABLED*] [On platforms where Boost.PFR is not supported, the `boost/pfr/config.hpp` header defines the BOOST_PFR_ENABLED macro equal to 0. Defining this macro as 0 before including the header disables the Boost.PFR library. ]]
]
@@ -475,8 +478,8 @@ By default Boost.PFR [*auto-detects your compiler abilities] and automatically d
The Boost.PFRs reflection has some limitations that depend on a C++ Standard and compiler capabilities:
* Static variables are ignored
* T must be aggregate initializable without empty base classes
* if T contains C arrays or it is inherited from non-empty type then the result of reflection may differ depending on the C++ version and library configuration
* T must be aggregate initializable without base classes
* if T contains C arrays then the result of reflection may differ depending on the C++ version and library configuration
* Additional limitations if [*BOOST_PFR_USE_CPP17 == 0]:
* Non of the member fields should have a template constructor from one parameter.
* Additional limitations if [*BOOST_PFR_USE_LOOPHOLE == 0]:
@@ -518,7 +521,7 @@ Description of the [*BOOST_PFR_USE_LOOPHOLE == 1] technique by its inventor Alex
[section Acknowledgements]
Many thanks to Bruno Dutra for showing the technique to precisely reflect aggregate initializable type in C++14 [@https://github.com/apolukhin/magic_get/issues/5 Manual type registering/structured bindings might be unnecessary].
Many thanks to Bruno Dutra for showing the technique to precisely reflect aggregate initializable type in C++14 [@https://github.com/boostorg/pfr/issues/5 Manual type registering/structured bindings might be unnecessary].
Many thanks to Alexandr Poltavsky for initial implementation the [*BOOST_PFR_USE_LOOPHOLE == 1] technique and for describing it [@http://alexpolt.github.io/type-loophole.html in his blog].

View File

@@ -1,4 +1,4 @@
// Copyright 2016-2021 Antony Polukhin
// Copyright 2016-2023 Antony Polukhin
// Distributed under the Boost Software License, Version 1.0.
// (See the accompanying file LICENSE_1_0.txt

View File

@@ -1,4 +1,4 @@
// Copyright (c) 2016-2021 Antony Polukhin
// Copyright (c) 2016-2023 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)

View File

@@ -1,4 +1,4 @@
// Copyright 2016-2021 Antony Polukhin
// Copyright 2016-2023 Antony Polukhin
// Distributed under the Boost Software License, Version 1.0.
// (See the accompanying file LICENSE_1_0.txt

View File

@@ -1,4 +1,4 @@
// Copyright 2016-2021 Antony Polukhin
// Copyright 2016-2023 Antony Polukhin
// Distributed under the Boost Software License, Version 1.0.
// (See the accompanying file LICENSE_1_0.txt

View File

@@ -1,4 +1,4 @@
// Copyright (c) 2016-2021 Antony Polukhin
// Copyright (c) 2016-2023 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)
@@ -9,6 +9,7 @@
/// \file boost/pfr.hpp
/// Includes all the Boost.PFR headers
#include <boost/pfr/config.hpp>
#include <boost/pfr/core.hpp>
#include <boost/pfr/functions_for.hpp>
#include <boost/pfr/functors.hpp>
@@ -17,5 +18,7 @@
#include <boost/pfr/ops.hpp>
#include <boost/pfr/ops_fields.hpp>
#include <boost/pfr/tuple_size.hpp>
#include <boost/pfr/traits_fwd.hpp>
#include <boost/pfr/traits.hpp>
#endif // BOOST_PFR_HPP

View File

@@ -0,0 +1,121 @@
// Copyright (c) 2016-2023 Antony Polukhin
// Copyright (c) 2022 Denis Mikhailov
//
// 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_CONFIG_HPP
#define BOOST_PFR_CONFIG_HPP
#pragma once
#if __cplusplus >= 201402L || (defined(_MSC_VER) && defined(_MSVC_LANG) && _MSC_VER > 1900)
#include <type_traits> // to get non standard platform macro definitions (__GLIBCXX__ for example)
#endif
/// \file boost/pfr/config.hpp
/// Contains all the macros that describe Boost.PFR configuration, like BOOST_PFR_ENABLED
///
/// \note This header file doesn't require C++14 Standard and supports all C++ compilers, even pre C++14 compilers (C++11, C++03...).
// Reminder:
// * MSVC++ 14.2 _MSC_VER == 1927 <- Loophole is known to work (Visual Studio ????)
// * MSVC++ 14.1 _MSC_VER == 1916 <- Loophole is known to NOT work (Visual Studio 2017)
// * MSVC++ 14.0 _MSC_VER == 1900 (Visual Studio 2015)
// * MSVC++ 12.0 _MSC_VER == 1800 (Visual Studio 2013)
#ifdef BOOST_PFR_NOT_SUPPORTED
# error Please, do not set BOOST_PFR_NOT_SUPPORTED value manually, use '-DBOOST_PFR_ENABLED=0' instead of it
#endif
#if defined(_MSC_VER)
# if !defined(_MSVC_LANG) || _MSC_VER <= 1900
# define BOOST_PFR_NOT_SUPPORTED 1
# endif
#elif __cplusplus < 201402L
# define BOOST_PFR_NOT_SUPPORTED 1
#endif
#ifndef BOOST_PFR_USE_LOOPHOLE
# if defined(_MSC_VER)
# if _MSC_VER >= 1927
# define BOOST_PFR_USE_LOOPHOLE 1
# else
# define BOOST_PFR_USE_LOOPHOLE 0
# endif
# elif defined(__clang_major__) && __clang_major__ >= 8
# define BOOST_PFR_USE_LOOPHOLE 0
# else
# define BOOST_PFR_USE_LOOPHOLE 1
# endif
#endif
#ifndef BOOST_PFR_USE_CPP17
# ifdef __cpp_structured_bindings
# define BOOST_PFR_USE_CPP17 1
# elif defined(_MSVC_LANG)
# if _MSVC_LANG >= 201703L
# define BOOST_PFR_USE_CPP17 1
# else
# define BOOST_PFR_USE_CPP17 0
# endif
# else
# define BOOST_PFR_USE_CPP17 0
# endif
#endif
#if (!BOOST_PFR_USE_CPP17 && !BOOST_PFR_USE_LOOPHOLE)
# if (defined(_MSC_VER) && _MSC_VER < 1916) ///< in Visual Studio 2017 v15.9 PFR library with classic engine normally works
# define BOOST_PFR_NOT_SUPPORTED 1
# endif
#endif
#ifndef BOOST_PFR_USE_STD_MAKE_INTEGRAL_SEQUENCE
// Assume that libstdc++ since GCC-7.3 does not have linear instantiation depth in std::make_integral_sequence
# if defined( __GLIBCXX__) && __GLIBCXX__ >= 20180101
# define BOOST_PFR_USE_STD_MAKE_INTEGRAL_SEQUENCE 1
# elif defined(_MSC_VER)
# define BOOST_PFR_USE_STD_MAKE_INTEGRAL_SEQUENCE 1
//# elif other known working lib
# else
# define BOOST_PFR_USE_STD_MAKE_INTEGRAL_SEQUENCE 0
# endif
#endif
#ifndef BOOST_PFR_HAS_GUARANTEED_COPY_ELISION
# if defined(__cpp_guaranteed_copy_elision) && (!defined(_MSC_VER) || _MSC_VER > 1928)
# define BOOST_PFR_HAS_GUARANTEED_COPY_ELISION 1
# else
# define BOOST_PFR_HAS_GUARANTEED_COPY_ELISION 0
# endif
#endif
#ifndef BOOST_PFR_ENABLE_IMPLICIT_REFLECTION
# if defined(__cpp_lib_is_aggregate)
# define BOOST_PFR_ENABLE_IMPLICIT_REFLECTION 1
# else
// There is no way to detect potential ability to be reflectable without std::is_aggregare
# define BOOST_PFR_ENABLE_IMPLICIT_REFLECTION 0
# endif
#endif
#if defined(__has_cpp_attribute)
# if __has_cpp_attribute(maybe_unused)
# define BOOST_PFR_MAYBE_UNUSED [[maybe_unused]]
# endif
#endif
#ifndef BOOST_PFR_MAYBE_UNUSED
# define BOOST_PFR_MAYBE_UNUSED
#endif
#ifndef BOOST_PFR_ENABLED
# ifdef BOOST_PFR_NOT_SUPPORTED
# define BOOST_PFR_ENABLED 0
# else
# define BOOST_PFR_ENABLED 1
# endif
#endif
#undef BOOST_PFR_NOT_SUPPORTED
#endif // BOOST_PFR_CONFIG_HPP

View File

@@ -1,4 +1,4 @@
// Copyright (c) 2016-2021 Antony Polukhin
// Copyright (c) 2016-2023 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)
@@ -66,8 +66,8 @@ constexpr auto get(T&, std::enable_if_t<!std::is_assignable<T, T>::value>* = nul
/// \overload get
template <std::size_t I, class T>
constexpr auto get(T&& val, std::enable_if_t< std::is_rvalue_reference<T&&>::value>* = 0) noexcept {
return std::move(detail::sequence_tuple::get<I>( detail::tie_as_tuple(val) ));
constexpr decltype(auto) get(T&& val, std::enable_if_t< std::is_rvalue_reference<T&&>::value>* = nullptr) noexcept {
return detail::sequence_tuple::get<I>( detail::tie_as_tuple(std::forward<T>(val)) );
}
@@ -97,7 +97,7 @@ using tuple_element_t = typename tuple_element<I, T>::type;
/// \code
/// struct my_struct { int i, short s; };
/// my_struct s {10, 11};
/// std::tuple<int, short> t = make_tuple(s);
/// std::tuple<int, short> t = boost::pfr::structure_to_tuple(s);
/// assert(get<0>(t) == 10);
/// \endcode
template <class T>
@@ -119,10 +119,10 @@ constexpr auto structure_to_tuple(const T& val) noexcept {
/// struct my_struct { int i, short s; };
///
/// const my_struct const_s{1, 2};
/// std::apply(foo, structure_tie(const_s));
/// std::apply(foo, boost::pfr::structure_tie(const_s));
///
/// my_struct s;
/// structure_tie(s) = std::tuple<int, short>{10, 11};
/// boost::pfr::structure_tie(s) = std::tuple<int, short>{10, 11};
/// assert(s.s == 11);
/// \endcode
template <class T>
@@ -159,7 +159,7 @@ constexpr auto structure_tie(T&, std::enable_if_t<!std::is_assignable<T, T>::val
/// \overload structure_tie
template <class T>
constexpr auto structure_tie(T&&, std::enable_if_t< std::is_rvalue_reference<T&&>::value>* = 0) noexcept {
constexpr auto structure_tie(T&&, std::enable_if_t< std::is_rvalue_reference<T&&>::value>* = nullptr) noexcept {
static_assert(sizeof(T) && false, "====================> Boost.PFR: Calling boost::pfr::structure_tie on rvalue references is forbidden");
return 0;
}
@@ -177,7 +177,7 @@ constexpr auto structure_tie(T&&, std::enable_if_t< std::is_rvalue_reference<T&&
/// \code
/// struct my_struct { int i, short s; };
/// int sum = 0;
/// for_each_field(my_struct{20, 22}, [&sum](const auto& field) { sum += field; });
/// boost::pfr::for_each_field(my_struct{20, 22}, [&sum](const auto& field) { sum += field; });
/// assert(sum == 42);
/// \endcode
template <class T, class F>
@@ -214,7 +214,7 @@ void for_each_field(T&& value, F&& func) {
/// return res;
/// }
/// auto [p, s] = f();
/// tie_from_structure(p, s) = f();
/// boost::pfr::tie_from_structure(p, s) = f();
/// \endcode
template <typename... Elements>
constexpr detail::tie_from_structure_tuple<Elements...> tie_from_structure(Elements&... args) noexcept {

View File

@@ -1,4 +1,4 @@
// Copyright (c) 2016-2021 Antony Polukhin
// Copyright (c) 2016-2023 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)

View File

@@ -1,4 +1,5 @@
// Copyright (c) 2016-2021 Antony Polukhin
// Copyright (c) 2016-2023 Antony Polukhin
// Copyright (c) 2022 Denis Mikhailov
//
// 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)
@@ -7,85 +8,19 @@
#define BOOST_PFR_DETAIL_CONFIG_HPP
#pragma once
#include <type_traits> // to get non standard platform macro definitions (__GLIBCXX__ for example)
#include <boost/pfr/config.hpp>
// Reminder:
// * MSVC++ 14.2 _MSC_VER == 1927 <- Loophole is known to work (Visual Studio ????)
// * MSVC++ 14.1 _MSC_VER == 1916 <- Loophole is known to NOT work (Visual Studio 2017)
// * MSVC++ 14.0 _MSC_VER == 1900 (Visual Studio 2015)
// * MSVC++ 12.0 _MSC_VER == 1800 (Visual Studio 2013)
#if !BOOST_PFR_ENABLED
#if defined(_MSC_VER)
# if !defined(_MSVC_LANG) || _MSC_VER <= 1900
# error Boost.PFR library requires more modern MSVC compiler.
# endif
#elif __cplusplus < 201402L
# error Boost.PFR library requires at least C++14.
#endif
#ifndef BOOST_PFR_USE_LOOPHOLE
# if defined(_MSC_VER)
# if _MSC_VER >= 1927
# define BOOST_PFR_USE_LOOPHOLE 1
# else
# define BOOST_PFR_USE_LOOPHOLE 0
# endif
# elif defined(__clang_major__) && __clang_major__ >= 8
# define BOOST_PFR_USE_LOOPHOLE 0
# else
# define BOOST_PFR_USE_LOOPHOLE 1
# endif
#endif
#ifndef BOOST_PFR_USE_CPP17
# ifdef __cpp_structured_bindings
# define BOOST_PFR_USE_CPP17 1
# elif defined(_MSVC_LANG)
# if _MSVC_LANG >= 201703L
# define BOOST_PFR_USE_CPP17 1
# else
# define BOOST_PFR_USE_CPP17 0
# endif
# else
# define BOOST_PFR_USE_CPP17 0
# endif
#endif
#if (!BOOST_PFR_USE_CPP17 && !BOOST_PFR_USE_LOOPHOLE)
# if (defined(_MSC_VER) && _MSC_VER < 1916) ///< in Visual Studio 2017 v15.9 PFR library with classic engine normally works
# error Boost.PFR requires /std:c++latest or /std:c++17 flags on your compiler.
# endif
#endif
#ifndef BOOST_PFR_USE_STD_MAKE_INTEGRAL_SEQUENCE
// Assume that libstdc++ since GCC-7.3 does not have linear instantiation depth in std::make_integral_sequence
# if defined( __GLIBCXX__) && __GLIBCXX__ >= 20180101
# define BOOST_PFR_USE_STD_MAKE_INTEGRAL_SEQUENCE 1
# elif defined(_MSC_VER)
# define BOOST_PFR_USE_STD_MAKE_INTEGRAL_SEQUENCE 1
//# elif other known working lib
# else
# define BOOST_PFR_USE_STD_MAKE_INTEGRAL_SEQUENCE 0
# endif
#endif
#ifndef BOOST_PFR_HAS_GUARANTEED_COPY_ELISION
# if defined(__cpp_guaranteed_copy_elision) && (!defined(_MSC_VER) || _MSC_VER > 1928)
# define BOOST_PFR_HAS_GUARANTEED_COPY_ELISION 1
# else
# define BOOST_PFR_HAS_GUARANTEED_COPY_ELISION 0
# endif
#endif
#if defined(__has_cpp_attribute)
# if __has_cpp_attribute(maybe_unused)
# define BOOST_PFR_MAYBE_UNUSED [[maybe_unused]]
# endif
#endif
#ifndef BOOST_PFR_MAYBE_UNUSED
# define BOOST_PFR_MAYBE_UNUSED
#endif
#error Boost.PFR library is not supported in your environment. \
Try one of the possible solutions: \
1. try to take away an '-DBOOST_PFR_ENABLED=0', if it exists \
2. enable C++14; \
3. enable C++17; \
4. update your compiler; \
or disable this error by '-DBOOST_PFR_ENABLED=1' if you really know what are you doing.
#endif // !BOOST_PFR_ENABLED
#endif // BOOST_PFR_DETAIL_CONFIG_HPP

View File

@@ -1,4 +1,4 @@
// Copyright (c) 2016-2021 Antony Polukhin
// Copyright (c) 2016-2023 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)

View File

@@ -1,4 +1,4 @@
// Copyright (c) 2016-2021 Antony Polukhin
// Copyright (c) 2016-2023 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)
@@ -118,16 +118,16 @@ template <class Type> constexpr std::size_t type_to_id(identity<const Type*>) no
template <class Type> constexpr std::size_t type_to_id(identity<const volatile Type*>) noexcept;
template <class Type> constexpr std::size_t type_to_id(identity<volatile Type*>) noexcept;
template <class Type> constexpr std::size_t type_to_id(identity<Type&>) noexcept;
template <class Type> constexpr std::size_t type_to_id(identity<Type>, std::enable_if_t<std::is_enum<Type>::value>* = 0) noexcept;
template <class Type> constexpr std::size_t type_to_id(identity<Type>, std::enable_if_t<std::is_empty<Type>::value>* = 0) noexcept;
template <class Type> constexpr std::size_t type_to_id(identity<Type>, std::enable_if_t<std::is_union<Type>::value>* = 0) noexcept;
template <class Type> constexpr std::size_t type_to_id(identity<Type>, std::enable_if_t<std::is_enum<Type>::value>* = nullptr) noexcept;
template <class Type> constexpr std::size_t type_to_id(identity<Type>, std::enable_if_t<std::is_empty<Type>::value>* = nullptr) noexcept;
template <class Type> constexpr std::size_t type_to_id(identity<Type>, std::enable_if_t<std::is_union<Type>::value>* = nullptr) noexcept;
template <class Type> constexpr size_array<sizeof(Type) * 3> type_to_id(identity<Type>, std::enable_if_t<!std::is_enum<Type>::value && !std::is_empty<Type>::value && !std::is_union<Type>::value>* = 0) noexcept;
template <std::size_t Index> constexpr auto id_to_type(size_t_<Index >, if_extension<Index, native_const_ptr_type> = 0) noexcept;
template <std::size_t Index> constexpr auto id_to_type(size_t_<Index >, if_extension<Index, native_ptr_type> = 0) noexcept;
template <std::size_t Index> constexpr auto id_to_type(size_t_<Index >, if_extension<Index, native_const_volatile_ptr_type> = 0) noexcept;
template <std::size_t Index> constexpr auto id_to_type(size_t_<Index >, if_extension<Index, native_volatile_ptr_type> = 0) noexcept;
template <std::size_t Index> constexpr auto id_to_type(size_t_<Index >, if_extension<Index, native_ref_type> = 0) noexcept;
template <std::size_t Index> constexpr auto id_to_type(size_t_<Index >, if_extension<Index, native_const_ptr_type> = nullptr) noexcept;
template <std::size_t Index> constexpr auto id_to_type(size_t_<Index >, if_extension<Index, native_ptr_type> = nullptr) noexcept;
template <std::size_t Index> constexpr auto id_to_type(size_t_<Index >, if_extension<Index, native_const_volatile_ptr_type> = nullptr) noexcept;
template <std::size_t Index> constexpr auto id_to_type(size_t_<Index >, if_extension<Index, native_volatile_ptr_type> = nullptr) noexcept;
template <std::size_t Index> constexpr auto id_to_type(size_t_<Index >, if_extension<Index, native_ref_type> = nullptr) noexcept;
///////////////////// Definitions of type_to_id and id_to_type for fundamental types
@@ -599,13 +599,20 @@ struct ubiq_constructor_constexpr_copy {
/////////////////////
template <class T, std::size_t... I>
struct is_constexpr_aggregate_initializable { // TODO: try to fix it
template <T = T{ ubiq_constructor_constexpr_copy{I}... } >
struct is_constexpr_aggregate_initializable {
template<class T2, std::size_t... I2>
static constexpr void* constexpr_aggregate_initializer() noexcept {
T2 tmp{ ubiq_constructor_constexpr_copy{I2}... };
(void)tmp;
return nullptr;
}
template <void* = constexpr_aggregate_initializer<T, I...>() >
static std::true_type test(long) noexcept;
static std::false_type test(...) noexcept;
static constexpr decltype( test(0) ) value{};
static constexpr bool value = decltype(test(0)){};
};
@@ -676,16 +683,7 @@ void for_each_field_dispatcher(T& t, F&& f, std::index_sequence<I...>) {
!std::is_union<T>::value,
"====================> Boost.PFR: For safety reasons it is forbidden to reflect unions. See `Reflection of unions` section in the docs for more info."
);
/// Compile time error at this point means that you have called `for_each_field` or some other non-flat function or operator for a
/// type that is not constexpr aggregate initializable.
///
/// Make sure that all the fields of your type have constexpr default construtors and trivial destructors.
/// Or compile in C++17 mode.
constexpr T tmp{ ubiq_constructor_constexpr_copy{I}... };
(void)tmp;
//static_assert(is_constexpr_aggregate_initializable<T, I...>::value, "====================> Boost.PFR: T must be a constexpr initializable type");
static_assert(is_constexpr_aggregate_initializable<T, I...>::value, "====================> Boost.PFR: T must be a constexpr initializable type");
constexpr bool is_flat_refelectable_val = detail::is_flat_refelectable<T>( std::index_sequence<I...>{} );
detail::for_each_field_dispatcher_1(

View File

@@ -1,5 +1,5 @@
// Copyright (c) 2017-2018 Alexandr Poltavsky, Antony Polukhin.
// Copyright (c) 2019-2021 Antony Polukhin.
// Copyright (c) 2019-2023 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)
@@ -20,6 +20,7 @@
#ifndef BOOST_PFR_DETAIL_CORE14_LOOPHOLE_HPP
#define BOOST_PFR_DETAIL_CORE14_LOOPHOLE_HPP
#pragma once
#include <boost/pfr/detail/config.hpp>

View File

@@ -1,4 +1,4 @@
// Copyright (c) 2016-2021 Antony Polukhin
// Copyright (c) 2016-2023 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)
@@ -6,6 +6,7 @@
#ifndef BOOST_PFR_DETAIL_CORE17_HPP
#define BOOST_PFR_DETAIL_CORE17_HPP
#pragma once
#include <boost/pfr/detail/core17_generated.hpp>
#include <boost/pfr/detail/fields_count.hpp>
@@ -22,7 +23,7 @@ struct do_not_define_std_tuple_size_for_me {
template <class T>
constexpr bool do_structured_bindings_work() noexcept { // ******************************************* IN CASE OF ERROR READ THE FOLLOWING LINES IN boost/pfr/detail/core17.hpp FILE:
T val{};
const auto& [a] = val; // ******************************************* IN CASE OF ERROR READ THE FOLLOWING LINES IN boost/pfr/detail/core17.hpp FILE:
auto& [a] = val; // ******************************************* IN CASE OF ERROR READ THE FOLLOWING LINES IN boost/pfr/detail/core17.hpp FILE:
/****************************************************************************
*
@@ -51,10 +52,20 @@ constexpr auto tie_as_tuple(T& val) noexcept {
!std::is_union<T>::value,
"====================> Boost.PFR: For safety reasons it is forbidden to reflect unions. See `Reflection of unions` section in the docs for more info."
);
typedef size_t_<boost::pfr::detail::fields_count<T>()> fields_count_tag;
typedef size_t_<boost::pfr::detail::fields_count< T >()> fields_count_tag;
return boost::pfr::detail::tie_as_tuple(val, fields_count_tag{});
}
template <class T>
constexpr auto tie_as_tuple(T&& val) noexcept {
static_assert(
!std::is_union<T>::value,
"====================> Boost.PFR: For safety reasons it is forbidden to reflect unions. See `Reflection of unions` section in the docs for more info."
);
typedef size_t_<boost::pfr::detail::fields_count< T >()> fields_count_tag;
return boost::pfr::detail::tie_as_tuple(std::forward<T>(val), fields_count_tag{});
}
template <class T, class F, std::size_t... I>
void for_each_field_dispatcher(T& t, F&& f, std::index_sequence<I...>) {
static_assert(

File diff suppressed because it is too large Load Diff

View File

@@ -1,4 +1,4 @@
// Copyright (c) 2016-2021 Antony Polukhin
// Copyright (c) 2016-2023 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)

View File

@@ -1,4 +1,4 @@
// Copyright (c) 2016-2021 Antony Polukhin
// Copyright (c) 2016-2023 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)

View File

@@ -1,4 +1,4 @@
// Copyright (c) 2016-2021 Antony Polukhin
// Copyright (c) 2016-2023 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)
@@ -29,6 +29,7 @@ void for_each_field_impl_apply(T&& v, F&& f, I /*i*/, int) {
std::forward<F>(f)(std::forward<T>(v));
}
#if !defined(__cpp_fold_expressions) || __cpp_fold_expressions < 201603
template <class T, class F, std::size_t... I>
void for_each_field_impl(T& t, F&& f, std::index_sequence<I...>, std::false_type /*move_values*/) {
const int v[] = {0, (
@@ -47,6 +48,17 @@ void for_each_field_impl(T& t, F&& f, std::index_sequence<I...>, std::true_type
)...};
(void)v;
}
#else
template <class T, class F, std::size_t... I>
void for_each_field_impl(T& t, F&& f, std::index_sequence<I...>, std::false_type /*move_values*/) {
(detail::for_each_field_impl_apply(sequence_tuple::get<I>(t), std::forward<F>(f), size_t_<I>{}, 1L), ...);
}
template <class T, class F, std::size_t... I>
void for_each_field_impl(T& t, F&& f, std::index_sequence<I...>, std::true_type /*move_values*/) {
(detail::for_each_field_impl_apply(sequence_tuple::get<I>(std::move(t)), std::forward<F>(f), size_t_<I>{}, 1L), ...);
}
#endif
}}} // namespace boost::pfr::detail

View File

@@ -1,4 +1,4 @@
// Copyright (c) 2016-2021 Antony Polukhin
// Copyright (c) 2016-2023 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)

View File

@@ -1,4 +1,4 @@
// Copyright (c) 2016-2021 Antony Polukhin
// Copyright (c) 2016-2023 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)

View File

@@ -1,4 +1,4 @@
// Copyright (c) 2016-2021 Antony Polukhin
// Copyright (c) 2016-2023 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)

View File

@@ -1,5 +1,5 @@
// Copyright (c) 2018 Sergei Fedorov
// Copyright (c) 2019-2021 Antony Polukhin
// Copyright (c) 2019-2023 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)

View File

@@ -1,5 +1,5 @@
// Copyright (c) 2017-2018 Chris Beck
// Copyright (c) 2019-2021 Antony Polukhin
// Copyright (c) 2019-2023 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)

View File

@@ -0,0 +1,37 @@
// Copyright (c) 2022 Denis Mikhailov
//
// 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_DETAIL_POSSIBLE_REFLECTABLE_HPP
#define BOOST_PFR_DETAIL_POSSIBLE_REFLECTABLE_HPP
#pragma once
#include <boost/pfr/detail/config.hpp>
#include <boost/pfr/traits_fwd.hpp>
#include <type_traits> // for std::is_aggregate
namespace boost { namespace pfr { namespace detail {
///////////////////// Returns false when the type exactly wasn't be reflectable
template <class T, class WhatFor>
constexpr decltype(is_reflectable<T, WhatFor>::value) possible_reflectable(long) noexcept {
return is_reflectable<T, WhatFor>::value;
}
template <class T, class WhatFor>
constexpr bool possible_reflectable(int) noexcept {
# if defined(__cpp_lib_is_aggregate)
using type = std::remove_cv_t<T>;
return std::is_aggregate<type>();
# else
return true;
# endif
}
}}} // namespace boost::pfr::detail
#endif // BOOST_PFR_DETAIL_POSSIBLE_REFLECTABLE_HPP

View File

@@ -1,4 +1,4 @@
// Copyright (c) 2016-2021 Antony Polukhin
// Copyright (c) 2016-2023 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)

View File

@@ -1,4 +1,4 @@
// Copyright (c) 2016-2021 Antony Polukhin
// Copyright (c) 2016-2023 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)
@@ -39,7 +39,7 @@ struct tuple_base< std::index_sequence<I...>, Tail... >
constexpr tuple_base(const tuple_base&) = default;
constexpr tuple_base(Tail... v) noexcept
: base_from_member<I, Tail>{ v }...
: base_from_member<I, Tail>{ static_cast<Tail>(v) }...
{}
};
@@ -50,26 +50,37 @@ struct tuple_base<std::index_sequence<> > {
template <std::size_t N, class T>
constexpr T& get_impl(base_from_member<N, T>& t) noexcept {
// NOLINTNEXTLINE(clang-analyzer-core.uninitialized.UndefReturn)
return t.value;
}
template <std::size_t N, class T>
constexpr const T& get_impl(const base_from_member<N, T>& t) noexcept {
// NOLINTNEXTLINE(clang-analyzer-core.uninitialized.UndefReturn)
return t.value;
}
template <std::size_t N, class T>
constexpr volatile T& get_impl(volatile base_from_member<N, T>& t) noexcept {
// NOLINTNEXTLINE(clang-analyzer-core.uninitialized.UndefReturn)
return t.value;
}
template <std::size_t N, class T>
constexpr const volatile T& get_impl(const volatile base_from_member<N, T>& t) noexcept {
// NOLINTNEXTLINE(clang-analyzer-core.uninitialized.UndefReturn)
return t.value;
}
template <std::size_t N, class T>
constexpr T&& get_impl(base_from_member<N, T>&& t) noexcept {
// NOLINTNEXTLINE(clang-analyzer-core.uninitialized.UndefReturn)
return std::forward<T>(t.value);
}
template <std::size_t N, class T>
constexpr const T&& get_impl(const base_from_member<N, T>&& t) noexcept {
// NOLINTNEXTLINE(clang-analyzer-core.uninitialized.UndefReturn)
return std::forward<T>(t.value);
}

View File

@@ -1,4 +1,4 @@
// Copyright (c) 2016-2021 Antony Polukhin
// Copyright (c) 2016-2023 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)

View File

@@ -1,4 +1,4 @@
// Copyright (c) 2016-2021 Antony Polukhin
// Copyright (c) 2016-2023 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)

View File

@@ -1,4 +1,4 @@
// Copyright (c) 2016-2021 Antony Polukhin
// Copyright (c) 2016-2023 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)

View File

@@ -1,5 +1,5 @@
// Copyright (c) 2018 Adam Butcher, Antony Polukhin
// Copyright (c) 2019-2021 Antony Polukhin
// Copyright (c) 2019-2023 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)

View File

@@ -1,10 +1,11 @@
// Copyright (c) 2019-2021 Antony Polukhin.
// Copyright (c) 2019-2023 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_DETAIL_UNSAFE_DECLVAL_HPP
#define BOOST_PFR_DETAIL_UNSAFE_DECLVAL_HPP
#pragma once
#include <boost/pfr/detail/config.hpp>
@@ -24,7 +25,7 @@ template <class T>
constexpr T unsafe_declval() noexcept {
report_if_you_see_link_error_with_this_function();
typename std::remove_reference<T>::type* ptr = 0;
typename std::remove_reference<T>::type* ptr = nullptr;
ptr += 42; // suppresses 'null pointer dereference' warnings
return static_cast<T>(*ptr);
}

View File

@@ -1,4 +1,4 @@
// Copyright (c) 2016-2021 Antony Polukhin
// Copyright (c) 2016-2023 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)

View File

@@ -1,4 +1,4 @@
// Copyright (c) 2016-2021 Antony Polukhin
// Copyright (c) 2016-2023 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)

View File

@@ -1,4 +1,4 @@
// Copyright (c) 2016-2021 Antony Polukhin
// Copyright (c) 2016-2023 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)
@@ -89,17 +89,17 @@ enable_istreamable_t<std::basic_istream<Char, Traits>, T> operator>>(std::basic_
} // namespace detail
/// IO manupulator to read/write \aggregate `value` using its IO stream operators or using \forcedlink{io_fields} if operators are not awailable.
/// IO manipulator to read/write \aggregate `value` using its IO stream operators or using \forcedlink{io_fields} if operators are not available.
///
/// \b Example:
/// \code
/// struct my_struct { int i; short s; };
/// my_struct s;
/// my_struct x;
/// std::stringstream ss;
/// ss << "{ 12, 13 }";
/// ss >> boost::pfr::io(s);
/// assert(s.i == 12);
/// assert(s.i == 13);
/// ss >> boost::pfr::io(x);
/// assert(x.i == 12);
/// assert(x.s == 13);
/// \endcode
///
/// \customio

View File

@@ -1,4 +1,4 @@
// Copyright (c) 2016-2021 Antony Polukhin
// Copyright (c) 2016-2023 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)
@@ -21,7 +21,7 @@
#include <boost/pfr/tuple_size.hpp>
/// \file boost/pfr/io_fields.hpp
/// Contains IO manupulator \forcedlink{io_fields} to read/write \aggregate `value` field-by-field.
/// Contains IO manipulator \forcedlink{io_fields} to read/write any \aggregate field-by-field.
///
/// \b Example:
/// \code
@@ -132,7 +132,7 @@ std::basic_istream<Char, Traits>& operator>>(std::basic_istream<Char, Traits>& i
} // namespace detail
/// IO manupulator to read/write \aggregate `value` field-by-field.
/// IO manipulator to read/write \aggregate `value` field-by-field.
///
/// \b Example:
/// \code

View File

@@ -1,4 +1,4 @@
// Copyright (c) 2016-2021 Antony Polukhin
// Copyright (c) 2016-2023 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)

View File

@@ -1,4 +1,4 @@
// Copyright (c) 2016-2021 Antony Polukhin
// Copyright (c) 2016-2023 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)

View File

@@ -0,0 +1,64 @@
// Copyright (c) 2022 Denis Mikhailov
//
// 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_TRAITS_HPP
#define BOOST_PFR_TRAITS_HPP
#pragma once
#include <boost/pfr/detail/config.hpp>
#include <boost/pfr/detail/possible_reflectable.hpp>
#include <type_traits>
/// \file boost/pfr/traits.hpp
/// Contains traits \forcedlink{is_reflectable} and \forcedlink{is_implicitly_reflectable} for detecting an ability to reflect type.
///
/// \b Synopsis:
namespace boost { namespace pfr {
/// Has a static const member variable `value` when it known that type T can or can't be reflected using Boost.PFR; otherwise, there is no member variable.
/// Every user may(and in some difficult cases - should) specialize is_reflectable on his own.
///
/// \b Example:
/// \code
/// namespace boost { namespace pfr {
/// template<class All> struct is_reflectable<A, All> : std::false_type {}; // 'A' won't be interpreted as reflectable everywhere
/// template<> struct is_reflectable<B, boost_fusion_tag> : std::false_type {}; // 'B' won't be interpreted as reflectable in only Boost Fusion
/// }}
/// \endcode
/// \note is_reflectable affects is_implicitly_reflectable, the decision made by is_reflectable has more priority than is_implicitly_reflectable,
/// because is_reflectable is more sharp than is_implicitly_reflectable
///
template<class T, class WhatFor>
struct is_reflectable { /* do not has 'value' because value is unknown */ };
// these specs can't be inherited from 'std::integral_constant< bool, boost::pfr::is_reflectable<T, WhatFor>::value >',
// because it will break the sfinae-friendliness
template<class T, class WhatFor>
struct is_reflectable<const T, WhatFor> : boost::pfr::is_reflectable<T, WhatFor> {};
template<class T, class WhatFor>
struct is_reflectable<volatile T, WhatFor> : boost::pfr::is_reflectable<T, WhatFor> {};
template<class T, class WhatFor>
struct is_reflectable<const volatile T, WhatFor> : boost::pfr::is_reflectable<T, WhatFor> {};
#if BOOST_PFR_ENABLE_IMPLICIT_REFLECTION
/// Checks the input type for the potential to be reflected.
/// Specialize is_reflectable if you are disagree with is_implicitly_reflectable's default decision.
template<class T, class WhatFor>
using is_implicitly_reflectable = std::integral_constant< bool, boost::pfr::detail::possible_reflectable<T, WhatFor>(1L) >;
/// Checks the input type for the potential to be reflected.
/// Specialize is_reflectable if you are disagree with is_implicitly_reflectable_v's default decision.
template<class T, class WhatFor>
constexpr bool is_implicitly_reflectable_v = is_implicitly_reflectable<T, WhatFor>::value;
#endif
}} // namespace boost::pfr
#endif // BOOST_PFR_TRAITS_HPP

View File

@@ -0,0 +1,21 @@
// Copyright (c) 2022 Denis Mikhailov
//
// 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_DETAIL_TRAITS_FWD_HPP
#define BOOST_PFR_DETAIL_TRAITS_FWD_HPP
#pragma once
#include <boost/pfr/detail/config.hpp>
namespace boost { namespace pfr {
template<class T, class WhatFor>
struct is_reflectable;
}} // namespace boost::pfr
#endif // BOOST_PFR_DETAIL_TRAITS_FWD_HPP

View File

@@ -1,4 +1,4 @@
// Copyright (c) 2016-2021 Antony Polukhin
// Copyright (c) 2016-2023 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)
@@ -23,7 +23,7 @@
namespace boost { namespace pfr {
/// Has a static const member variable `value` that contains fields count in a T.
/// Works for any T that supports aggregate initialization.
/// Works for any T that satisfies \aggregate.
///
/// \b Example:
/// \code
@@ -34,7 +34,7 @@ using tuple_size = detail::size_t_< boost::pfr::detail::fields_count<T>() >;
/// `tuple_size_v` is a template variable that contains fields count in a T and
/// works for any T that supports aggregate initialization.
/// works for any T that satisfies \aggregate.
///
/// \b Example:
/// \code

View File

@@ -1,6 +1,6 @@
<!DOCTYPE html>
<!--
Copyright (c) 2014-2021 Antony Polukhin
Copyright (c) 2014-2023 Antony Polukhin
antoshkka at gmail dot com
Distributed under the Boost Software License,
@@ -29,7 +29,7 @@
<a href="https://www.boost.org/doc/libs/master/doc/html/boost_pfr.html">https://www.boost.org/doc/libs/master/doc/html/boost_pfr.html</a>
</p>
<p>
&copy; 2014-2021 Antony Polukhin
&copy; 2014-2023 Antony Polukhin
</p>
</body>
</html>

View File

@@ -1,6 +1,7 @@
#!/usr/bin/python
# Copyright (c) 2016-2021 Antony Polukhin
# Copyright (c) 2016-2023 Antony Polukhin
# Copyright (c) 2023 Denis Mikhailov
#
# 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)
@@ -12,8 +13,10 @@ import string
# Skipping some letters that may produce keywords or are hard to read, or shadow template parameters
ascii_letters = string.ascii_letters.replace("o", "").replace("O", "").replace("i", "").replace("I", "").replace("T", "")
WORKAROUND_CAST_EXPRESSIONS_LIMIT_PER_LINE = 3
PROLOGUE = """// Copyright (c) 2016-2020 Antony Polukhin
PROLOGUE = """// Copyright (c) 2016-2023 Antony Polukhin
// Copyright (c) 2023 Denis Mikhailov
//
// 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)
@@ -35,29 +38,72 @@ PROLOGUE = """// Copyright (c) 2016-2020 Antony Polukhin
#include <boost/pfr/detail/sequence_tuple.hpp>
#include <boost/pfr/detail/size_t_.hpp>
#include <type_traits> // for std::conditional_t, std::is_reference
namespace boost { namespace pfr { namespace detail {
template <class... Args>
constexpr auto make_tuple_of_references(Args&&... args) noexcept {
return sequence_tuple::tuple<Args&...>{ args... };
return sequence_tuple::tuple<Args&&...>{ static_cast<Args&&>(args)... };
}
template<typename T, typename Arg>
constexpr decltype(auto) add_cv_like(Arg& arg) noexcept {
if constexpr (std::is_rvalue_reference<T&&>::value) {
if constexpr (std::is_const<T>::value && std::is_volatile<T>::value) {
return const_cast<const volatile Arg&&>(arg);
}
else if constexpr (std::is_const<T>::value) {
return const_cast<const Arg&&>(arg);
}
else if constexpr (std::is_volatile<T>::value) {
return const_cast<volatile Arg&&>(arg);
}
else {
return const_cast<Arg&&>(arg);
}
} else {
if constexpr (std::is_const<T>::value && std::is_volatile<T>::value) {
return const_cast<const volatile Arg&>(arg);
}
else if constexpr (std::is_const<T>::value) {
return const_cast<const Arg&>(arg);
}
else if constexpr (std::is_volatile<T>::value) {
return const_cast<volatile Arg&>(arg);
}
else {
return const_cast<Arg&>(arg);
}
}
}
// https://gcc.gnu.org/bugzilla/show_bug.cgi?id=78939
template<typename T, typename Sb, typename Arg>
constexpr decltype(auto) workaround_cast(Arg& arg) noexcept {
using output_arg_t = std::conditional_t<
!std::is_reference<Sb>(),
decltype(detail::add_cv_like<T>(arg)),
std::conditional_t<std::is_rvalue_reference<T&&>::value, Sb&&, Sb&>
>;
return const_cast<output_arg_t>(arg);
}
template <class T>
constexpr auto tie_as_tuple(T& /*val*/, size_t_<0>) noexcept {
constexpr auto tie_as_tuple(const T& /*val*/, size_t_<0>) noexcept {
return sequence_tuple::tuple<>{};
}
template <class T>
constexpr auto tie_as_tuple(T& val, size_t_<1>, std::enable_if_t<std::is_class< std::remove_cv_t<T> >::value>* = 0) noexcept {
auto& [a] = val; // ====================> Boost.PFR: User-provided type is not a SimpleAggregate.
return ::boost::pfr::detail::make_tuple_of_references(a);
constexpr auto tie_as_tuple(T&& val, size_t_<1>, std::enable_if_t<std::is_class< std::remove_cv_t<T> >::value>* = nullptr) noexcept {
auto&& [a] = const_cast<std::remove_cv_t<T>&>(val); // ====================> Boost.PFR: User-provided type is not a SimpleAggregate.
return ::boost::pfr::detail::make_tuple_of_references(detail::workaround_cast<T, decltype(a)>(a));
}
template <class T>
constexpr auto tie_as_tuple(T& val, size_t_<1>, std::enable_if_t<!std::is_class< std::remove_cv_t<T> >::value>* = 0) noexcept {
return ::boost::pfr::detail::make_tuple_of_references( val );
constexpr auto tie_as_tuple(T&& val, size_t_<1>, std::enable_if_t<!std::is_class< std::remove_cv_t<T> >::value>* = nullptr) noexcept {
return ::boost::pfr::detail::make_tuple_of_references( std::forward<T>(val) );
}
"""
@@ -65,7 +111,7 @@ constexpr auto tie_as_tuple(T& val, size_t_<1>, std::enable_if_t<!std::is_class<
############################################################################################################################
EPILOGUE = """
template <class T, std::size_t I>
constexpr void tie_as_tuple(T& /*val*/, size_t_<I>) noexcept {
constexpr void tie_as_tuple(T&& /*val*/, size_t_<I>) noexcept {
static_assert(sizeof(T) && false,
"====================> Boost.PFR: Too many fields in a structure T. Regenerate include/boost/pfr/detail/core17_generated.hpp file for appropriate count of fields. For example: `python ./misc/generate_cpp17.py 300 > include/boost/pfr/detail/core17_generated.hpp`");
}
@@ -77,6 +123,33 @@ constexpr void tie_as_tuple(T& /*val*/, size_t_<I>) noexcept {
############################################################################################################################
def fold_workaround_cast(indexes, divider):
WORKAROUND_CAST_TEMPLATE = """
detail::workaround_cast<T, decltype({arg})>({arg})
"""
lines = []
div = ''
tokens = [x.strip() for x in indexes.split(',')]
casts = [WORKAROUND_CAST_TEMPLATE.strip().format(arg=tok)
for tok in tokens]
for i in range(0, len(casts)):
if i%WORKAROUND_CAST_EXPRESSIONS_LIMIT_PER_LINE==0:
div = ''
lines.append('')
lines[-1] += div + casts[i]
div = ','
return divider.join(lines)
def calc_indexes_count(indexes):
tokens = [x.strip() for x in indexes.split(',')]
return len(tokens)
class EmptyLinePrinter:
def print_once(self):
if not self.printed:
print("")
self.printed = True
printed = False
indexes = " a"
print(PROLOGUE)
@@ -92,18 +165,26 @@ for i in range(1, funcs_count):
indexes += ascii_letters[i // max_args_on_a_line - 1]
indexes += ascii_letters[i % max_args_on_a_line]
printed_casts = fold_workaround_cast(indexes.strip(), ",\n ")
indexes_count = calc_indexes_count(indexes.strip())
empty_printer = EmptyLinePrinter()
print("template <class T>")
print("constexpr auto tie_as_tuple(T& val, size_t_<" + str(i + 1) + ">) noexcept {")
print("constexpr auto tie_as_tuple(T&& val, size_t_<" + str(i + 1) + ">) noexcept {")
if i < max_args_on_a_line:
print(" auto& [" + indexes.strip() + "] = val; // ====================> Boost.PFR: User-provided type is not a SimpleAggregate.")
print(" return ::boost::pfr::detail::make_tuple_of_references(" + indexes.strip() + ");")
print(" auto&& [" + indexes.strip() + "] = const_cast<std::remove_cv_t<T>&>(val); // ====================> Boost.PFR: User-provided type is not a SimpleAggregate.")
else:
print(" auto& [")
print(" auto&& [")
print(indexes)
print(" ] = val; // ====================> Boost.PFR: User-provided type is not a SimpleAggregate.")
print("")
print(" ] = const_cast<std::remove_cv_t<T>&>(val); // ====================> Boost.PFR: User-provided type is not a SimpleAggregate.")
empty_printer.print_once()
if indexes_count < WORKAROUND_CAST_EXPRESSIONS_LIMIT_PER_LINE:
print(" return ::boost::pfr::detail::make_tuple_of_references(" + printed_casts + ");")
else:
empty_printer.print_once()
print(" return ::boost::pfr::detail::make_tuple_of_references(")
print(indexes)
print(" " + printed_casts)
print(" );")
print("}\n")

9
test/Jamfile Normal file
View File

@@ -0,0 +1,9 @@
# Copyright (C) 2023 Denis Mikhailov
#
# Use, modification and distribution is subject to 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)
#
build-project config ;
build-project core ;

View File

@@ -32,6 +32,10 @@ skip_tags: true
environment:
matrix:
- APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2015
TOOLSET: msvc-9.0
ADDRMD: 32
CXXSTD: latest # fake
# - APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2019
# TOOLSET: msvc # TODO: clang-win ???
# ADDRMD: 32,64

22
test/config/Jamfile.v2 Normal file
View File

@@ -0,0 +1,22 @@
# Copyright (C) 2023 Denis Mikhailov
#
# Use, modification and distribution is subject to 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)
#
import python ;
import testing ;
import ../../config/checks/config : requires ;
project
: source-location .
: requirements
<define>BOOST_PFR_DETAIL_STRICT_RVALUE_TESTING=1
;
test-suite pfr_tests
:
[ run print_config.cpp : : : <test-info>always_show_run_output : auto_engine_config ]
;

View File

@@ -1,9 +1,9 @@
// Copyright (c) 2016-2021 Antony Polukhin
// Copyright (c) 2016-2023 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)
#include <boost/pfr/core.hpp>
#include <boost/pfr/config.hpp> // inclusion of an another PFR header may fail when BOOST_PFR_ENABLED=0
#include <iostream>
@@ -13,6 +13,8 @@ int main() {
<< "BOOST_PFR_USE_LOOPHOLE == " << BOOST_PFR_USE_LOOPHOLE << '\n'
<< "BOOST_PFR_USE_STD_MAKE_INTEGRAL_SEQUENCE == " << BOOST_PFR_USE_STD_MAKE_INTEGRAL_SEQUENCE << '\n'
<< "BOOST_PFR_HAS_GUARANTEED_COPY_ELISION == " << BOOST_PFR_HAS_GUARANTEED_COPY_ELISION << '\n'
<< "BOOST_PFR_ENABLE_IMPLICIT_REFLECTION == " << BOOST_PFR_ENABLE_IMPLICIT_REFLECTION << '\n'
<< "BOOST_PFR_ENABLED == " << BOOST_PFR_ENABLED << '\n'
<< "__cplusplus == " << __cplusplus << '\n'
#ifdef __cpp_structured_bindings
<< "__cpp_structured_bindings == " << __cpp_structured_bindings << '\n'

View File

@@ -1,4 +1,4 @@
# Copyright (C) 2016-2021 Antony Polukhin.
# Copyright (C) 2016-2023 Antony Polukhin.
#
# Use, modification and distribution is subject to the Boost Software License,
# Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
@@ -40,7 +40,7 @@ explicit compiler_supports_loophole ;
local DISABLE_ON_MSVC = ; #<toolset>msvc:<build>no ;
local REQUIRE_LOOPHOLE =
[ check-target-builds ../test//compiler_supports_loophole : : <build>no ]
[ check-target-builds ../core//compiler_supports_loophole : : <build>no ]
;
local STRUCTURED_BINDING_ENGINE = <define>BOOST_PFR_USE_LOOPHOLE=0 <define>BOOST_PFR_USE_CPP17=1 [ requires cxx17_structured_bindings ] ;
@@ -49,10 +49,10 @@ local CLASSIC_ENGINE = <define>BOOST_PFR_USE_LOOPHOLE=0 <define>BOOST_PFR_USE_CP
test-suite pfr_tests
:
[ run print_config.cpp : : : <test-info>always_show_run_output : auto_engine_config ]
[ run offset_based_getter.cpp ]
[ run can_be_as_fallback_in_the_fusion.cpp ]
[ run test_tuple_sizes_on.cpp : : : <define>BOOST_PFR_RUN_TEST_ON=char : test_tuple_sizes_on_chars ]
[ run test_tuple_sizes_on.cpp : : : <define>BOOST_PFR_RUN_TEST_ON=int : test_tuple_sizes_on_ints ]
[ run test_tuple_sizes_on.cpp : : : <define>BOOST_PFR_RUN_TEST_ON=short : test_tuple_sizes_on_shorts ]
@@ -60,9 +60,9 @@ test-suite pfr_tests
[ run test_tuple_sizes_on.cpp : : : <define>BOOST_PFR_RUN_TEST_ON="std::size_t" : test_tuple_sizes_on_size_ts ]
[ run run/motivating_example.cpp : : : : auto_engine_motivating ]
[ run ../example/sample_printing.cpp : : : : auto_engine_sample_printing ]
[ run ../example/get.cpp : : : : auto_engine_get ]
[ run ../example/quick_examples.cpp : : : : auto_engine_quick ]
[ run ../../example/sample_printing.cpp : : : : auto_engine_sample_printing ]
[ run ../../example/get.cpp : : : : auto_engine_get ]
[ run ../../example/quick_examples.cpp : : : : auto_engine_quick ]
;
local BLACKLIST_TESTS_FOR_LOOPHOLE =
@@ -95,7 +95,7 @@ local BLACKLIST_TESTS_FOR_CLASSIC =
tie_anonymous_const_field
;
for local source_file in [ glob ./run/*.cpp ] [ glob ../example/*.cpp ]
for local source_file in [ glob ./run/*.cpp ] [ glob ../../example/*.cpp ]
{
local target_name = $(source_file[1]:B) ;
pfr_tests += [ run $(source_file) : : : $(STRUCTURED_BINDING_ENGINE) : $(target_name)_sb ] ;
@@ -129,5 +129,5 @@ for local source_file in [ glob ./compile-fail/*.cpp ]
if [ python.configured ]
{
testing.make-test run-pyd : ../misc/generate_cpp17.py ;
testing.make-test run-pyd : ../../misc/generate_cpp17.py ;
}

View File

@@ -0,0 +1,37 @@
// Copyright (c) 2022 Denis Mikhailov
//
// 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 <type_traits>
struct Aggregate {};
using NonAggregate = int;
template<class T>
struct is_implicitly_reflectable : std::false_type
{};
template<>
struct is_implicitly_reflectable<Aggregate> : std::true_type
{};
template<class T, class E=void>
struct tag_of_fallback {
using type = int; // unknown
};
template<class T>
struct tag_of_fallback<T, std::enable_if_t<std::is_same<T,T>::value>>
{
using type = std::conditional_t<
is_implicitly_reflectable<T>::value
, std::true_type
, std::false_type
>;
};
static_assert(tag_of_fallback<Aggregate>::type::value == true, "");
static_assert(tag_of_fallback<NonAggregate>::type::value == false, "");
int main() { }

View File

@@ -0,0 +1,10 @@
// Copyright (c) 2022 Denis Mikhailov
//
// 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)
#define BOOST_PFR_ENABLED 0
#include <boost/pfr/core.hpp>
int main() { }

View File

@@ -1,4 +1,4 @@
// Copyright (c) 2018-2021 Antony Polukhin
// Copyright (c) 2018-2023 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)

View File

@@ -1,4 +1,4 @@
// Copyright (c) 2018-2021 Antony Polukhin
// Copyright (c) 2018-2023 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)

View File

@@ -1,4 +1,4 @@
// Copyright (c) 2016-2021 Antony Polukhin
// Copyright (c) 2016-2023 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)

View File

@@ -1,4 +1,4 @@
// Copyright (c) 2018-2021 Antony Polukhin
// Copyright (c) 2018-2023 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)

View File

@@ -1,4 +1,4 @@
// Copyright (c) 2018-2021 Antony Polukhin
// Copyright (c) 2018-2023 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)

View File

@@ -1,4 +1,4 @@
// Copyright (c) 2018-2021 Antony Polukhin
// Copyright (c) 2018-2023 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)

View File

@@ -1,4 +1,4 @@
// Copyright (c) 2020-2021 Antony Polukhin
// Copyright (c) 2020-2023 Antony Polukhin
// Copyright (c) 2020 Richard Hodges
//
// Distributed under the Boost Software License, Version 1.0. (See accompanying

View File

@@ -1,4 +1,4 @@
// Copyright (c) 2018-2021 Antony Polukhin
// Copyright (c) 2018-2023 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)

View File

@@ -1,4 +1,4 @@
// Copyright (c) 2018-2021 Antony Polukhin
// Copyright (c) 2018-2023 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)

View File

@@ -1,4 +1,4 @@
// Copyright (c) 2020-2021 Antony Polukhin
// Copyright (c) 2020-2023 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)

View File

@@ -1,4 +1,4 @@
// Copyright (c) 2018-2021 Antony Polukhin
// Copyright (c) 2018-2023 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)

View File

@@ -1,4 +1,4 @@
// Copyright (c) 2020-2021 Antony Polukhin
// Copyright (c) 2020-2023 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)

View File

@@ -1,5 +1,5 @@
// Copyright (c) 2019 Ilya Kiselev
// Copyright (c) 2019-2021 Antony Polukhin
// Copyright (c) 2019-2023 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)

View File

@@ -1,4 +1,4 @@
// Copyright (c) 2016-2021 Antony Polukhin
// Copyright (c) 2016-2023 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)

View File

@@ -1,4 +1,4 @@
// Copyright (c) 2016-2021 Antony Polukhin
// Copyright (c) 2016-2023 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)

View File

@@ -0,0 +1,125 @@
// Copyright (c) 2023 Denis Mikhailov
//
// 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 <boost/pfr/core.hpp>
#include <type_traits> // for std::is_same
struct A {
const volatile int cv_value = 0;
volatile int v_value = 0;
const int c_value = 0;
int value = 0;
const volatile int& cv_ref;
volatile int& v_ref;
const int& c_ref;
int& ref;
const volatile int&& cv_rref;
volatile int&& v_rref;
const int&& c_rref;
int&& rref;
};
int main() {
#if BOOST_PFR_USE_CPP17
const volatile int cv_value = 0;
volatile int v_value = 0;
const int c_value = 0;
int value = 0;
typedef boost::pfr::detail::size_t_<12> fields_count_tag;
{
A a {cv_value, v_value, c_value, value,
cv_value, v_value, c_value, value,
std::move(cv_value), std::move(v_value), std::move(c_value), std::move(value)};
const auto t = boost::pfr::detail::tie_as_tuple(a, fields_count_tag{});
static_assert(std::is_same<decltype(boost::pfr::detail::sequence_tuple::get<0>(t)), int const volatile&>());
static_assert(std::is_same<decltype(boost::pfr::detail::sequence_tuple::get<1>(t)), int volatile&>());
static_assert(std::is_same<decltype(boost::pfr::detail::sequence_tuple::get<2>(t)), int const&>());
static_assert(std::is_same<decltype(boost::pfr::detail::sequence_tuple::get<3>(t)), int&>());
static_assert(std::is_same<decltype(boost::pfr::detail::sequence_tuple::get<4>(t)), int const volatile&>());
static_assert(std::is_same<decltype(boost::pfr::detail::sequence_tuple::get<5>(t)), int volatile&>());
static_assert(std::is_same<decltype(boost::pfr::detail::sequence_tuple::get<6>(t)), int const&>());
static_assert(std::is_same<decltype(boost::pfr::detail::sequence_tuple::get<7>(t)), int&>());
// FIXME implement rvalue references as a field support
// static_assert(std::is_same<decltype(boost::pfr::detail::sequence_tuple::get<8>(t)), int const volatile&&>());
// static_assert(std::is_same<decltype(boost::pfr::detail::sequence_tuple::get<9>(t)), int volatile&&>());
// static_assert(std::is_same<decltype(boost::pfr::detail::sequence_tuple::get<10>(t)), int const&&>());
// static_assert(std::is_same<decltype(boost::pfr::detail::sequence_tuple::get<11>(t)), int&&>());
}
{
const A a {cv_value, v_value, c_value, value,
cv_value, v_value, c_value, value,
std::move(cv_value), std::move(v_value), std::move(c_value), std::move(value)};
const auto t = boost::pfr::detail::tie_as_tuple(a, fields_count_tag{});
static_assert(std::is_same<decltype(boost::pfr::detail::sequence_tuple::get<0>(t)), int const volatile&>());
static_assert(std::is_same<decltype(boost::pfr::detail::sequence_tuple::get<1>(t)), int const volatile&>());
static_assert(std::is_same<decltype(boost::pfr::detail::sequence_tuple::get<2>(t)), int const&>());
static_assert(std::is_same<decltype(boost::pfr::detail::sequence_tuple::get<3>(t)), int const&>());
static_assert(std::is_same<decltype(boost::pfr::detail::sequence_tuple::get<4>(t)), int const volatile&>());
static_assert(std::is_same<decltype(boost::pfr::detail::sequence_tuple::get<5>(t)), int volatile&>());
static_assert(std::is_same<decltype(boost::pfr::detail::sequence_tuple::get<6>(t)), int const&>());
static_assert(std::is_same<decltype(boost::pfr::detail::sequence_tuple::get<7>(t)), int&>());
// FIXME implement rvalue references as a field support
// static_assert(std::is_same<decltype(boost::pfr::detail::sequence_tuple::get<8>(t)), int const volatile&&>());
// static_assert(std::is_same<decltype(boost::pfr::detail::sequence_tuple::get<9>(t)), int volatile&&>());
// static_assert(std::is_same<decltype(boost::pfr::detail::sequence_tuple::get<10>(t)), int const&&>());
// static_assert(std::is_same<decltype(boost::pfr::detail::sequence_tuple::get<11>(t)), int&&>());
}
{
volatile A a {cv_value, v_value, c_value, value,
cv_value, v_value, c_value, value,
std::move(cv_value), std::move(v_value), std::move(c_value), std::move(value)};
const auto t = boost::pfr::detail::tie_as_tuple(a, fields_count_tag{});
static_assert(std::is_same<decltype(boost::pfr::detail::sequence_tuple::get<0>(t)), int const volatile&>());
static_assert(std::is_same<decltype(boost::pfr::detail::sequence_tuple::get<1>(t)), int volatile&>());
static_assert(std::is_same<decltype(boost::pfr::detail::sequence_tuple::get<2>(t)), int const volatile&>());
static_assert(std::is_same<decltype(boost::pfr::detail::sequence_tuple::get<3>(t)), int volatile&>());
static_assert(std::is_same<decltype(boost::pfr::detail::sequence_tuple::get<4>(t)), int const volatile&>());
static_assert(std::is_same<decltype(boost::pfr::detail::sequence_tuple::get<5>(t)), int volatile&>());
static_assert(std::is_same<decltype(boost::pfr::detail::sequence_tuple::get<6>(t)), int const&>());
static_assert(std::is_same<decltype(boost::pfr::detail::sequence_tuple::get<7>(t)), int&>());
// FIXME implement rvalue references as a field support
// static_assert(std::is_same<decltype(boost::pfr::detail::sequence_tuple::get<8>(t)), int const volatile&&>());
// static_assert(std::is_same<decltype(boost::pfr::detail::sequence_tuple::get<9>(t)), int volatile&&>());
// static_assert(std::is_same<decltype(boost::pfr::detail::sequence_tuple::get<10>(t)), int const&&>());
// static_assert(std::is_same<decltype(boost::pfr::detail::sequence_tuple::get<11>(t)), int&&>());
}
{
const volatile A a {cv_value, v_value, c_value, value,
cv_value, v_value, c_value, value,
std::move(cv_value), std::move(v_value), std::move(c_value), std::move(value)};
const auto t = boost::pfr::detail::tie_as_tuple(a, fields_count_tag{});
static_assert(std::is_same<decltype(boost::pfr::detail::sequence_tuple::get<0>(t)), int const volatile&>());
static_assert(std::is_same<decltype(boost::pfr::detail::sequence_tuple::get<1>(t)), int const volatile&>());
static_assert(std::is_same<decltype(boost::pfr::detail::sequence_tuple::get<2>(t)), int const volatile&>());
static_assert(std::is_same<decltype(boost::pfr::detail::sequence_tuple::get<3>(t)), int const volatile&>());
static_assert(std::is_same<decltype(boost::pfr::detail::sequence_tuple::get<4>(t)), int const volatile&>());
static_assert(std::is_same<decltype(boost::pfr::detail::sequence_tuple::get<5>(t)), int volatile&>());
static_assert(std::is_same<decltype(boost::pfr::detail::sequence_tuple::get<6>(t)), int const&>());
static_assert(std::is_same<decltype(boost::pfr::detail::sequence_tuple::get<7>(t)), int&>());
// FIXME implement rvalue references as a field support
// static_assert(std::is_same<decltype(boost::pfr::detail::sequence_tuple::get<8>(t)), int const volatile&&>());
// static_assert(std::is_same<decltype(boost::pfr::detail::sequence_tuple::get<9>(t)), int volatile&&>());
// static_assert(std::is_same<decltype(boost::pfr::detail::sequence_tuple::get<10>(t)), int const&&>());
// static_assert(std::is_same<decltype(boost::pfr::detail::sequence_tuple::get<11>(t)), int&&>());
}
#endif
}

View File

@@ -1,5 +1,5 @@
// Copyright (c) 2018 Adam Butcher, Antony Polukhin
// Copyright (c) 2019-2021 Antony Polukhin
// Copyright (c) 2019-2023 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)

View File

@@ -1,9 +1,9 @@
// Copyright (c) 2018-2021 Antony Polukhin
// Copyright (c) 2018-2023 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)
// Example from https://github.com/apolukhin/magic_get/issues/21
// Example from https://github.com/boostorg/pfr/issues/21
// boost::pfr::for_each_field crashes when sizeof(MyConfig) > 248 (probably >= 256)

View File

@@ -1,4 +1,4 @@
// Copyright (c) 2018-2021 Antony Polukhin
// Copyright (c) 2018-2023 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)

View File

@@ -1,4 +1,4 @@
// Copyright (c) 2016-2021 Antony Polukhin
// Copyright (c) 2016-2023 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)

View File

@@ -1,4 +1,4 @@
// Copyright (c) 2016-2021 Antony Polukhin
// Copyright (c) 2016-2023 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)

View File

@@ -1,4 +1,4 @@
// Copyright (c) 2020-2021 Antony Polukhin
// Copyright (c) 2020-2023 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)

View File

@@ -1,4 +1,4 @@
// Copyright (c) 2020-2021 Antony Polukhin
// Copyright (c) 2020-2023 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)

View File

@@ -0,0 +1,83 @@
// Copyright (c) 2022 Denis Mikhailov
//
// 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 <iostream>
#include <boost/pfr/traits.hpp>
#include <type_traits> // for std::true_type, std::false_type and std::is_aggregate
namespace boost { namespace pfr {
struct boost_fusion_tag;
struct boost_json_tag;
}}
struct Aggregate {};
using Nonaggregate = int;
#if defined(__cpp_lib_is_aggregate)
static_assert(std::is_aggregate<Aggregate>::value && !std::is_aggregate<Nonaggregate>::value, "");
#endif
using Reflectable = short;
struct Nonrefrectable {};
using ReflectableBoostFusion = short;
struct NonrefrectableBoostFusion {};
using ReflectableBoostJson = short;
struct NonrefrectableBoostJson {};
namespace boost { namespace pfr {
template<class All> struct is_reflectable<Reflectable, All> : std::true_type {};
template<class All> struct is_reflectable<Nonrefrectable, All> : std::false_type {};
template<> struct is_reflectable<ReflectableBoostFusion, boost_fusion_tag> : std::true_type {};
template<> struct is_reflectable<NonrefrectableBoostFusion, boost_fusion_tag> : std::false_type {};
template<> struct is_reflectable<ReflectableBoostJson, boost_json_tag> : std::true_type {};
template<> struct is_reflectable<NonrefrectableBoostJson, boost_json_tag> : std::false_type {};
}}
#if BOOST_PFR_ENABLE_IMPLICIT_REFLECTION
template<class T, class Tag>
void assert_reflectable() {
static_assert(boost::pfr::is_implicitly_reflectable_v<T, Tag>, "");
static_assert(boost::pfr::is_implicitly_reflectable_v<const T, Tag>, "");
static_assert(boost::pfr::is_implicitly_reflectable_v<volatile T, Tag>, "");
static_assert(boost::pfr::is_implicitly_reflectable_v<const volatile T, Tag>, "");
}
template<class T, class Tag>
void assert_non_reflectable() {
static_assert(!boost::pfr::is_implicitly_reflectable_v<T, Tag>, "");
static_assert(!boost::pfr::is_implicitly_reflectable_v<const T, Tag>, "");
static_assert(!boost::pfr::is_implicitly_reflectable_v<volatile T, Tag>, "");
static_assert(!boost::pfr::is_implicitly_reflectable_v<const volatile T, Tag>, "");
}
#endif // #if BOOST_PFR_ENABLE_IMPLICIT_REFLECTION
int main() {
#if BOOST_PFR_ENABLE_IMPLICIT_REFLECTION
std::cout << "Implicit reflection is available in this platform.." << std::endl;
{
using tag = boost::pfr::boost_json_tag;
assert_reflectable<Aggregate, tag>();
assert_non_reflectable<Nonaggregate, tag>();
assert_reflectable<Reflectable, tag>();
assert_non_reflectable<Nonrefrectable, tag>();
assert_reflectable<ReflectableBoostJson, tag>();
assert_non_reflectable<NonrefrectableBoostJson, tag>();
}
{
using tag = boost::pfr::boost_fusion_tag;
assert_reflectable<Aggregate, tag>();
assert_non_reflectable<Nonaggregate, tag>();
assert_reflectable<Reflectable, tag>();
assert_non_reflectable<Nonrefrectable, tag>();
assert_reflectable<ReflectableBoostFusion, tag>();
assert_non_reflectable<NonrefrectableBoostFusion, tag>();
}
#endif // #if BOOST_PFR_ENABLE_IMPLICIT_REFLECTION
}

View File

@@ -0,0 +1,112 @@
// Copyright (c) 2022 Denis Mikhailov
//
// 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 <boost/pfr/traits.hpp>
#include <type_traits> // for std::true_type, std::false_type
namespace boost { namespace pfr {
struct boost_fusion_tag;
struct boost_json_tag;
}}
struct Reflectable {};
struct Nonrefrectable {};
struct Unknown {};
struct ReflectableBoostFusion {};
struct NonrefrectableBoostFusion {};
struct ReflectableBoostJson {};
struct NonrefrectableBoostJson {};
namespace boost { namespace pfr {
template<class All> struct is_reflectable<Reflectable, All> : std::true_type {};
template<class All> struct is_reflectable<Nonrefrectable, All> : std::false_type {};
template<> struct is_reflectable<ReflectableBoostFusion, boost_fusion_tag> : std::true_type {};
template<> struct is_reflectable<NonrefrectableBoostFusion, boost_fusion_tag> : std::false_type {};
template<> struct is_reflectable<ReflectableBoostJson, boost_json_tag> : std::true_type {};
template<> struct is_reflectable<NonrefrectableBoostJson, boost_json_tag> : std::false_type {};
}}
namespace helpers {
template <class T, class Tag>
constexpr decltype(boost::pfr::is_reflectable<T, Tag>::value) is_reflectability_known(long) {
return true;
}
template <class T, class Tag>
constexpr bool is_reflectability_known(int) {
return false;
}
}
template<class T, class Tag>
void assert_reflectable_impl() {
static_assert(helpers::is_reflectability_known<T, Tag>(1L), "");
static_assert(boost::pfr::is_reflectable<T, Tag>::value, "");
}
template<class T, class Tag>
void assert_non_reflectable_impl() {
static_assert(helpers::is_reflectability_known<T, Tag>(1L), "");
static_assert(!boost::pfr::is_reflectable<T, Tag>::value, "");
}
template<class T, class Tag>
void assert_unknown_impl() {
static_assert(!helpers::is_reflectability_known<T, Tag>(1L), "");
}
template<class T, class Tag>
void assert_reflectable() {
assert_reflectable_impl<T, Tag>();
assert_reflectable_impl<const T, Tag>();
assert_reflectable_impl<volatile T, Tag>();
assert_reflectable_impl<const volatile T, Tag>();
}
template<class T, class Tag>
void assert_non_reflectable() {
assert_non_reflectable_impl<T, Tag>();
assert_non_reflectable_impl<const T, Tag>();
assert_non_reflectable_impl<volatile T, Tag>();
assert_non_reflectable_impl<const volatile T, Tag>();
}
template<class T, class Tag>
void assert_unknown() {
assert_unknown_impl<T, Tag>();
assert_unknown_impl<const T, Tag>();
assert_unknown_impl<volatile T, Tag>();
assert_unknown_impl<const volatile T, Tag>();
}
int main() {
{
using tag = boost::pfr::boost_json_tag;
assert_reflectable<Reflectable, tag>();
assert_non_reflectable<Nonrefrectable, tag>();
assert_unknown<Unknown, tag>();
assert_unknown<ReflectableBoostFusion, tag>();
assert_unknown<NonrefrectableBoostFusion, tag>();
assert_reflectable<ReflectableBoostJson, tag>();
assert_non_reflectable<NonrefrectableBoostJson, tag>();
}
{
using tag = boost::pfr::boost_fusion_tag;
assert_reflectable<Reflectable, tag>();
assert_non_reflectable<Nonrefrectable, tag>();
assert_unknown<Unknown, tag>();
assert_reflectable<ReflectableBoostFusion, tag>();
assert_non_reflectable<NonrefrectableBoostFusion, tag>();
assert_unknown<ReflectableBoostJson, tag>();
assert_unknown<NonrefrectableBoostJson, tag>();
}
}

View File

@@ -1,9 +1,9 @@
// Copyright (c) 2018-2021 Antony Polukhin
// Copyright (c) 2018-2023 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)
// Test case for https://github.com/apolukhin/magic_get/issues/30
// Test case for https://github.com/boostorg/pfr/issues/30
#include <memory>
#include <boost/pfr.hpp>

View File

@@ -1,9 +1,9 @@
// Copyright (c) 2018-2021 Antony Polukhin
// Copyright (c) 2018-2023 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)
// Test case for https://github.com/apolukhin/magic_get/issues/33
// Test case for https://github.com/boostorg/pfr/issues/33
#include <iostream>
#include <vector>

View File

@@ -1,4 +1,4 @@
// Copyright (c) 2016-2021 Antony Polukhin
// Copyright (c) 2016-2023 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)

View File

@@ -1,4 +1,4 @@
// Copyright (c) 2016-2021 Antony Polukhin
// Copyright (c) 2016-2023 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)

View File

@@ -1,4 +1,4 @@
// Copyright (c) 2018-2021 Antony Polukhin
// Copyright (c) 2018-2023 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)

View File

@@ -1,4 +1,4 @@
// Copyright (c) 2018-2021 Antony Polukhin
// Copyright (c) 2018-2023 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)

View File

@@ -1,4 +1,4 @@
// Copyright (c) 2018-2021 Antony Polukhin
// Copyright (c) 2018-2023 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)

View File

@@ -1,4 +1,4 @@
// Copyright (c) 2018-2021 Antony Polukhin
// Copyright (c) 2018-2023 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)

View File

@@ -1,4 +1,4 @@
// Copyright (c) 2018-2021 Antony Polukhin
// Copyright (c) 2018-2023 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)

View File

@@ -1,4 +1,4 @@
// Copyright (c) 2016-2021 Antony Polukhin
// Copyright (c) 2016-2023 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)

View File

@@ -1,4 +1,4 @@
// Copyright (c) 2020-2021 Antony Polukhin
// Copyright (c) 2020-2023 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)

View File

@@ -1,4 +1,4 @@
// Copyright (c) 2016-2021 Antony Polukhin
// Copyright (c) 2016-2023 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)

View File

@@ -1,4 +1,4 @@
// Copyright (c) 2016-2021 Antony Polukhin
// Copyright (c) 2016-2023 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)

View File

@@ -1,4 +1,4 @@
// Copyright (c) 2016-2021 Antony Polukhin
// Copyright (c) 2016-2023 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)

View File

@@ -1,4 +1,4 @@
// Copyright (c) 2019-2021 Antony Polukhin.
// Copyright (c) 2019-2023 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)

View File

@@ -1,4 +1,4 @@
// Copyright (c) 2019-2021 Antony Polukhin
// Copyright (c) 2019-2023 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)

View File

@@ -1,4 +1,4 @@
// Copyright (c) 2019-2021 Antony Polukhin
// Copyright (c) 2019-2023 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)

View File

@@ -1,4 +1,4 @@
// Copyright (c) 2020-2021 Antony Polukhin
// Copyright (c) 2020-2023 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)

View File

@@ -1,4 +1,4 @@
// Copyright (c) 2020-2021 Antony Polukhin
// Copyright (c) 2020-2023 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)

View File

@@ -1,4 +1,4 @@
// Copyright (c) 2016-2021 Antony Polukhin
// Copyright (c) 2016-2023 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)

Some files were not shown because too many files have changed in this diff Show More