update boost
This commit is contained in:
50
linx64/include/boost/describe/bases.hpp
Normal file
50
linx64/include/boost/describe/bases.hpp
Normal file
@@ -0,0 +1,50 @@
|
||||
#ifndef BOOST_DESCRIBE_BASES_HPP_INCLUDED
|
||||
#define BOOST_DESCRIBE_BASES_HPP_INCLUDED
|
||||
|
||||
// Copyright 2020, 2021 Peter Dimov
|
||||
// Distributed under the Boost Software License, Version 1.0.
|
||||
// https://www.boost.org/LICENSE_1_0.txt
|
||||
|
||||
#include <boost/describe/modifiers.hpp>
|
||||
#include <boost/describe/detail/void_t.hpp>
|
||||
#include <boost/describe/detail/config.hpp>
|
||||
|
||||
#if defined(BOOST_DESCRIBE_CXX11)
|
||||
|
||||
#include <boost/mp11/algorithm.hpp>
|
||||
#include <type_traits>
|
||||
|
||||
namespace boost
|
||||
{
|
||||
namespace describe
|
||||
{
|
||||
namespace detail
|
||||
{
|
||||
|
||||
template<class T> using _describe_bases = decltype( boost_base_descriptor_fn( static_cast<T**>(0) ) );
|
||||
|
||||
template<unsigned M> struct base_filter
|
||||
{
|
||||
template<class T> using fn = mp11::mp_bool< ( M & mod_any_access & T::modifiers ) != 0 >;
|
||||
};
|
||||
|
||||
template<class T, class En = void> struct has_describe_bases: std::false_type
|
||||
{
|
||||
};
|
||||
|
||||
template<class T> struct has_describe_bases<T, void_t<_describe_bases<T>>>: std::true_type
|
||||
{
|
||||
};
|
||||
|
||||
} // namespace detail
|
||||
|
||||
template<class T, unsigned M> using describe_bases = mp11::mp_copy_if_q<detail::_describe_bases<T>, detail::base_filter<M>>;
|
||||
|
||||
template<class T> using has_describe_bases = detail::has_describe_bases<T>;
|
||||
|
||||
} // namespace describe
|
||||
} // namespace boost
|
||||
|
||||
#endif // !defined(BOOST_DESCRIBE_CXX11)
|
||||
|
||||
#endif // #ifndef BOOST_DESCRIBE_BASES_HPP_INCLUDED
|
||||
76
linx64/include/boost/describe/class.hpp
Normal file
76
linx64/include/boost/describe/class.hpp
Normal file
@@ -0,0 +1,76 @@
|
||||
#ifndef BOOST_DESCRIBE_CLASS_HPP_INCLUDED
|
||||
#define BOOST_DESCRIBE_CLASS_HPP_INCLUDED
|
||||
|
||||
// Copyright 2020 Peter Dimov
|
||||
// Distributed under the Boost Software License, Version 1.0.
|
||||
// https://www.boost.org/LICENSE_1_0.txt
|
||||
|
||||
#include <boost/describe/detail/config.hpp>
|
||||
|
||||
#if !defined(BOOST_DESCRIBE_CXX14)
|
||||
|
||||
#define BOOST_DESCRIBE_CLASS(C, Bases, Public, Protected, Private)
|
||||
#define BOOST_DESCRIBE_STRUCT(C, Bases, Members)
|
||||
|
||||
#else
|
||||
|
||||
#include <boost/describe/detail/bases.hpp>
|
||||
#include <boost/describe/detail/members.hpp>
|
||||
#include <type_traits>
|
||||
|
||||
namespace boost
|
||||
{
|
||||
namespace describe
|
||||
{
|
||||
|
||||
#if defined(_MSC_VER) && !defined(__clang__)
|
||||
|
||||
#define BOOST_DESCRIBE_PP_UNPACK(...) __VA_ARGS__
|
||||
|
||||
#define BOOST_DESCRIBE_CLASS(C, Bases, Public, Protected, Private) \
|
||||
friend BOOST_DESCRIBE_BASES(C, BOOST_DESCRIBE_PP_UNPACK Bases) \
|
||||
friend BOOST_DESCRIBE_PUBLIC_MEMBERS(C, BOOST_DESCRIBE_PP_UNPACK Public) \
|
||||
friend BOOST_DESCRIBE_PROTECTED_MEMBERS(C, BOOST_DESCRIBE_PP_UNPACK Protected) \
|
||||
friend BOOST_DESCRIBE_PRIVATE_MEMBERS(C, BOOST_DESCRIBE_PP_UNPACK Private)
|
||||
|
||||
#define BOOST_DESCRIBE_STRUCT(C, Bases, Members) \
|
||||
static_assert(std::is_class<C>::value || std::is_union<C>::value, "BOOST_DESCRIBE_STRUCT should only be used with class types"); \
|
||||
BOOST_DESCRIBE_BASES(C, BOOST_DESCRIBE_PP_UNPACK Bases) \
|
||||
BOOST_DESCRIBE_PUBLIC_MEMBERS(C, BOOST_DESCRIBE_PP_UNPACK Members) \
|
||||
BOOST_DESCRIBE_PROTECTED_MEMBERS(C) \
|
||||
BOOST_DESCRIBE_PRIVATE_MEMBERS(C)
|
||||
|
||||
#else
|
||||
|
||||
#if defined(__GNUC__) && __GNUC__ >= 8
|
||||
# define BOOST_DESCRIBE_PP_UNPACK(...) __VA_OPT__(,) __VA_ARGS__
|
||||
#else
|
||||
# define BOOST_DESCRIBE_PP_UNPACK(...) , ##__VA_ARGS__
|
||||
#endif
|
||||
|
||||
#define BOOST_DESCRIBE_BASES_(...) BOOST_DESCRIBE_BASES(__VA_ARGS__)
|
||||
#define BOOST_DESCRIBE_PUBLIC_MEMBERS_(...) BOOST_DESCRIBE_PUBLIC_MEMBERS(__VA_ARGS__)
|
||||
#define BOOST_DESCRIBE_PROTECTED_MEMBERS_(...) BOOST_DESCRIBE_PROTECTED_MEMBERS(__VA_ARGS__)
|
||||
#define BOOST_DESCRIBE_PRIVATE_MEMBERS_(...) BOOST_DESCRIBE_PRIVATE_MEMBERS(__VA_ARGS__)
|
||||
|
||||
#define BOOST_DESCRIBE_CLASS(C, Bases, Public, Protected, Private) \
|
||||
BOOST_DESCRIBE_MAYBE_UNUSED friend BOOST_DESCRIBE_BASES_(C BOOST_DESCRIBE_PP_UNPACK Bases) \
|
||||
BOOST_DESCRIBE_MAYBE_UNUSED friend BOOST_DESCRIBE_PUBLIC_MEMBERS_(C BOOST_DESCRIBE_PP_UNPACK Public) \
|
||||
BOOST_DESCRIBE_MAYBE_UNUSED friend BOOST_DESCRIBE_PROTECTED_MEMBERS_(C BOOST_DESCRIBE_PP_UNPACK Protected) \
|
||||
BOOST_DESCRIBE_MAYBE_UNUSED friend BOOST_DESCRIBE_PRIVATE_MEMBERS_(C BOOST_DESCRIBE_PP_UNPACK Private)
|
||||
|
||||
#define BOOST_DESCRIBE_STRUCT(C, Bases, Members) \
|
||||
static_assert(std::is_class<C>::value || std::is_union<C>::value, "BOOST_DESCRIBE_STRUCT should only be used with class types"); \
|
||||
BOOST_DESCRIBE_MAYBE_UNUSED BOOST_DESCRIBE_BASES_(C BOOST_DESCRIBE_PP_UNPACK Bases) \
|
||||
BOOST_DESCRIBE_MAYBE_UNUSED BOOST_DESCRIBE_PUBLIC_MEMBERS_(C BOOST_DESCRIBE_PP_UNPACK Members) \
|
||||
BOOST_DESCRIBE_MAYBE_UNUSED BOOST_DESCRIBE_PROTECTED_MEMBERS_(C) \
|
||||
BOOST_DESCRIBE_MAYBE_UNUSED BOOST_DESCRIBE_PRIVATE_MEMBERS_(C)
|
||||
|
||||
#endif
|
||||
|
||||
} // namespace describe
|
||||
} // namespace boost
|
||||
|
||||
#endif // !defined(BOOST_DESCRIBE_CXX14)
|
||||
|
||||
#endif // #ifndef BOOST_DESCRIBE_CLASS_HPP_INCLUDED
|
||||
41
linx64/include/boost/describe/descriptor_by_name.hpp
Normal file
41
linx64/include/boost/describe/descriptor_by_name.hpp
Normal file
@@ -0,0 +1,41 @@
|
||||
#ifndef BOOST_DESCRIBE_DESCRIPTOR_BY_NAME_HPP_INCLUDED
|
||||
#define BOOST_DESCRIBE_DESCRIPTOR_BY_NAME_HPP_INCLUDED
|
||||
|
||||
// Copyright 2021 Peter Dimov
|
||||
// Distributed under the Boost Software License, Version 1.0.
|
||||
// https://www.boost.org/LICENSE_1_0.txt
|
||||
|
||||
#include <boost/describe/detail/cx_streq.hpp>
|
||||
#include <boost/describe/detail/config.hpp>
|
||||
|
||||
#if defined(BOOST_DESCRIBE_CXX14)
|
||||
|
||||
#include <boost/mp11/algorithm.hpp>
|
||||
#include <boost/mp11/bind.hpp>
|
||||
#include <boost/mp11/integral.hpp>
|
||||
|
||||
namespace boost
|
||||
{
|
||||
namespace describe
|
||||
{
|
||||
|
||||
namespace detail
|
||||
{
|
||||
|
||||
template<class D, class N> using match_by_name = mp11::mp_bool<cx_streq(N::name(), D::name)>;
|
||||
|
||||
#define BOOST_DESCRIBE_MAKE_NAME_IMPL2(s, k) struct _boost_name_##s##_##k { static constexpr char const * name() { return #s; } }
|
||||
#define BOOST_DESCRIBE_MAKE_NAME_IMPL(s, k) BOOST_DESCRIBE_MAKE_NAME_IMPL2(s, k)
|
||||
|
||||
} // namespace detail
|
||||
|
||||
#define BOOST_DESCRIBE_MAKE_NAME(s) BOOST_DESCRIBE_MAKE_NAME_IMPL(s, __LINE__)
|
||||
|
||||
template<class L, class N> using descriptor_by_name = mp11::mp_at<L, mp11::mp_find_if_q<L, mp11::mp_bind_back<detail::match_by_name, N>>>;
|
||||
|
||||
} // namespace describe
|
||||
} // namespace boost
|
||||
|
||||
#endif // defined(BOOST_DESCRIBE_CXX14)
|
||||
|
||||
#endif // #ifndef BOOST_DESCRIBE_DESCRIPTOR_BY_NAME_HPP_INCLUDED
|
||||
48
linx64/include/boost/describe/descriptor_by_pointer.hpp
Normal file
48
linx64/include/boost/describe/descriptor_by_pointer.hpp
Normal file
@@ -0,0 +1,48 @@
|
||||
#ifndef BOOST_DESCRIBE_DESCRIPTOR_BY_POINTER_HPP_INCLUDED
|
||||
#define BOOST_DESCRIBE_DESCRIPTOR_BY_POINTER_HPP_INCLUDED
|
||||
|
||||
// Copyright 2021 Peter Dimov
|
||||
// Distributed under the Boost Software License, Version 1.0.
|
||||
// https://www.boost.org/LICENSE_1_0.txt
|
||||
|
||||
#include <boost/describe/detail/config.hpp>
|
||||
|
||||
#if defined(__cpp_nontype_template_parameter_auto) && __cpp_nontype_template_parameter_auto >= 201606L
|
||||
|
||||
#include <boost/mp11/algorithm.hpp>
|
||||
#include <boost/mp11/bind.hpp>
|
||||
#include <boost/mp11/integral.hpp>
|
||||
|
||||
namespace boost
|
||||
{
|
||||
namespace describe
|
||||
{
|
||||
|
||||
namespace detail
|
||||
{
|
||||
|
||||
template<class Pm> constexpr bool cx_pmeq( Pm p1, Pm p2 )
|
||||
{
|
||||
return p1 == p2;
|
||||
}
|
||||
|
||||
template<class Pm1, class Pm2> constexpr bool cx_pmeq( Pm1, Pm2 )
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
template<auto Pm> struct match_by_pointer
|
||||
{
|
||||
template<class D> using fn = mp11::mp_bool< cx_pmeq( D::pointer, Pm ) >;
|
||||
};
|
||||
|
||||
} // namespace detail
|
||||
|
||||
template<class L, auto Pm> using descriptor_by_pointer = mp11::mp_at<L, mp11::mp_find_if_q<L, detail::match_by_pointer<Pm>>>;
|
||||
|
||||
} // namespace describe
|
||||
} // namespace boost
|
||||
|
||||
#endif // __cpp_nontype_template_parameter_auto
|
||||
|
||||
#endif // #ifndef BOOST_DESCRIBE_DESCRIPTOR_BY_POINTER_HPP_INCLUDED
|
||||
56
linx64/include/boost/describe/detail/bases.hpp
Normal file
56
linx64/include/boost/describe/detail/bases.hpp
Normal file
@@ -0,0 +1,56 @@
|
||||
#ifndef BOOST_DESCRIBE_DETAIL_BASES_HPP_INCLUDED
|
||||
#define BOOST_DESCRIBE_DETAIL_BASES_HPP_INCLUDED
|
||||
|
||||
// Copyright 2020 Peter Dimov
|
||||
// Distributed under the Boost Software License, Version 1.0.
|
||||
// https://www.boost.org/LICENSE_1_0.txt
|
||||
|
||||
#include <boost/describe/detail/compute_base_modifiers.hpp>
|
||||
#include <boost/describe/detail/pp_for_each.hpp>
|
||||
#include <boost/describe/detail/list.hpp>
|
||||
#include <type_traits>
|
||||
|
||||
namespace boost
|
||||
{
|
||||
namespace describe
|
||||
{
|
||||
namespace detail
|
||||
{
|
||||
|
||||
// base_descriptor
|
||||
template<class C, class B> struct base_descriptor
|
||||
{
|
||||
static_assert( std::is_base_of<B, C>::value, "A type listed as a base is not one" );
|
||||
|
||||
using type = B;
|
||||
static constexpr unsigned modifiers = compute_base_modifiers<C, B>();
|
||||
};
|
||||
|
||||
#ifndef __cpp_inline_variables
|
||||
template<class C, class B> constexpr unsigned base_descriptor<C, B>::modifiers;
|
||||
#endif
|
||||
|
||||
template<class... T> auto base_descriptor_fn_impl( int, T... )
|
||||
{
|
||||
return list<T...>();
|
||||
}
|
||||
|
||||
#define BOOST_DESCRIBE_BASE_IMPL(C, B) , boost::describe::detail::base_descriptor<C, B>()
|
||||
|
||||
#if defined(_MSC_VER) && !defined(__clang__)
|
||||
|
||||
#define BOOST_DESCRIBE_BASES(C, ...) inline auto boost_base_descriptor_fn( C** ) \
|
||||
{ return boost::describe::detail::base_descriptor_fn_impl( 0 BOOST_DESCRIBE_PP_FOR_EACH(BOOST_DESCRIBE_BASE_IMPL, C, __VA_ARGS__) ); }
|
||||
|
||||
#else
|
||||
|
||||
#define BOOST_DESCRIBE_BASES(C, ...) inline auto boost_base_descriptor_fn( C** ) \
|
||||
{ return boost::describe::detail::base_descriptor_fn_impl( 0 BOOST_DESCRIBE_PP_FOR_EACH(BOOST_DESCRIBE_BASE_IMPL, C, ##__VA_ARGS__) ); }
|
||||
|
||||
#endif
|
||||
|
||||
} // namespace detail
|
||||
} // namespace describe
|
||||
} // namespace boost
|
||||
|
||||
#endif // #ifndef BOOST_DESCRIBE_DETAIL_BASES_HPP_INCLUDED
|
||||
@@ -0,0 +1,73 @@
|
||||
#ifndef BOOST_DESCRIBE_DETAIL_COMPUTE_BASE_MODIFIERS_HPP_INCLUDED
|
||||
#define BOOST_DESCRIBE_DETAIL_COMPUTE_BASE_MODIFIERS_HPP_INCLUDED
|
||||
|
||||
// Copyright 2020, 2021 Peter Dimov
|
||||
// Distributed under the Boost Software License, Version 1.0.
|
||||
// https://www.boost.org/LICENSE_1_0.txt
|
||||
|
||||
#include <boost/describe/modifiers.hpp>
|
||||
#include <type_traits>
|
||||
|
||||
namespace boost
|
||||
{
|
||||
namespace describe
|
||||
{
|
||||
namespace detail
|
||||
{
|
||||
|
||||
#if defined(_MSC_VER)
|
||||
# pragma warning(push)
|
||||
# pragma warning(disable: 4594) // can never be instantiated - indirect virtual base class is inaccessible
|
||||
# pragma warning(disable: 4624) // destructor was implicitly defined as deleted
|
||||
#endif
|
||||
|
||||
// is_public_base_of
|
||||
|
||||
template<class T, class U> using is_public_base_of = std::is_convertible<U*, T*>;
|
||||
|
||||
// is_protected_base_of
|
||||
|
||||
struct ipb_final
|
||||
{
|
||||
template<class T, class U> using fn = std::false_type;
|
||||
};
|
||||
|
||||
struct ipb_non_final
|
||||
{
|
||||
template<class T, class U> struct fn: U
|
||||
{
|
||||
static std::true_type f( T* );
|
||||
|
||||
template<class X> static auto g( X x ) -> decltype( f(x) );
|
||||
static std::false_type g( ... );
|
||||
|
||||
using type = decltype( g((U*)0) );
|
||||
};
|
||||
};
|
||||
|
||||
template<class T, class U> using is_protected_base_of =
|
||||
typename std::conditional<std::is_final<U>::value || std::is_union<U>::value, ipb_final, ipb_non_final>::type::template fn<T, U>::type;
|
||||
|
||||
// is_virtual_base_of
|
||||
|
||||
template<class T, class U, class = void> struct can_cast: std::false_type {};
|
||||
template<class T, class U> struct can_cast<T, U, decltype((void)(U*)(T*)0)>: std::true_type {};
|
||||
|
||||
template<class T, class U> using is_virtual_base_of =
|
||||
std::integral_constant<bool, can_cast<U, T>::value && !can_cast<T, U>::value>;
|
||||
|
||||
// compute_base_modifiers
|
||||
template<class C, class B> constexpr unsigned compute_base_modifiers() noexcept
|
||||
{
|
||||
return (is_public_base_of<B, C>::value? mod_public: (is_protected_base_of<B, C>::value? mod_protected: mod_private)) | (is_virtual_base_of<B, C>::value? mod_virtual: 0);
|
||||
}
|
||||
|
||||
#if defined(_MSC_VER)
|
||||
# pragma warning(pop)
|
||||
#endif
|
||||
|
||||
} // namespace detail
|
||||
} // namespace describe
|
||||
} // namespace boost
|
||||
|
||||
#endif // #ifndef BOOST_DESCRIBE_DETAIL_COMPUTE_BASE_MODIFIERS_HPP_INCLUDED
|
||||
40
linx64/include/boost/describe/detail/config.hpp
Normal file
40
linx64/include/boost/describe/detail/config.hpp
Normal file
@@ -0,0 +1,40 @@
|
||||
#ifndef BOOST_DESCRIBE_DETAIL_CONFIG_HPP_INCLUDED
|
||||
#define BOOST_DESCRIBE_DETAIL_CONFIG_HPP_INCLUDED
|
||||
|
||||
// Copyright 2021 Peter Dimov
|
||||
// Distributed under the Boost Software License, Version 1.0.
|
||||
// https://www.boost.org/LICENSE_1_0.txt
|
||||
|
||||
#if __cplusplus >= 201402L
|
||||
|
||||
# define BOOST_DESCRIBE_CXX14
|
||||
# define BOOST_DESCRIBE_CXX11
|
||||
|
||||
#elif defined(_MSC_VER) && _MSC_VER >= 1900
|
||||
|
||||
# define BOOST_DESCRIBE_CXX14
|
||||
# define BOOST_DESCRIBE_CXX11
|
||||
|
||||
#elif __cplusplus >= 201103L
|
||||
|
||||
# define BOOST_DESCRIBE_CXX11
|
||||
|
||||
# if defined(__GNUC__) && __GNUC__ == 4 && __GNUC_MINOR__ == 7
|
||||
# undef BOOST_DESCRIBE_CXX11
|
||||
# endif
|
||||
|
||||
#endif
|
||||
|
||||
#if defined(BOOST_DESCRIBE_CXX11)
|
||||
# define BOOST_DESCRIBE_CONSTEXPR_OR_CONST constexpr
|
||||
#else
|
||||
# define BOOST_DESCRIBE_CONSTEXPR_OR_CONST const
|
||||
#endif
|
||||
|
||||
#if defined(__clang__)
|
||||
# define BOOST_DESCRIBE_MAYBE_UNUSED __attribute__((unused))
|
||||
#else
|
||||
# define BOOST_DESCRIBE_MAYBE_UNUSED
|
||||
#endif
|
||||
|
||||
#endif // #ifndef BOOST_DESCRIBE_DETAIL_CONFIG_HPP_INCLUDED
|
||||
30
linx64/include/boost/describe/detail/cx_streq.hpp
Normal file
30
linx64/include/boost/describe/detail/cx_streq.hpp
Normal file
@@ -0,0 +1,30 @@
|
||||
#ifndef BOOST_DESCRIBE_DETAIL_CX_STREQ_HPP_INCLUDED
|
||||
#define BOOST_DESCRIBE_DETAIL_CX_STREQ_HPP_INCLUDED
|
||||
|
||||
// Copyright 2021 Peter Dimov
|
||||
// Distributed under the Boost Software License, Version 1.0.
|
||||
// https://www.boost.org/LICENSE_1_0.txt
|
||||
|
||||
#include <boost/describe/detail/config.hpp>
|
||||
|
||||
#if defined(BOOST_DESCRIBE_CXX11)
|
||||
|
||||
namespace boost
|
||||
{
|
||||
namespace describe
|
||||
{
|
||||
namespace detail
|
||||
{
|
||||
|
||||
constexpr bool cx_streq( char const * s1, char const * s2 )
|
||||
{
|
||||
return s1[0] == s2[0] && ( s1[0] == 0 || cx_streq( s1 + 1, s2 + 1 ) );
|
||||
}
|
||||
|
||||
} // namespace detail
|
||||
} // namespace describe
|
||||
} // namespace boost
|
||||
|
||||
#endif // defined(BOOST_DESCRIBE_CXX11)
|
||||
|
||||
#endif // #ifndef BOOST_DESCRIBE_DETAIL_CX_STREQ_HPP_INCLUDED
|
||||
27
linx64/include/boost/describe/detail/list.hpp
Normal file
27
linx64/include/boost/describe/detail/list.hpp
Normal file
@@ -0,0 +1,27 @@
|
||||
#ifndef BOOST_DESCRIBE_DETAIL_LIST_HPP_INCLUDED
|
||||
#define BOOST_DESCRIBE_DETAIL_LIST_HPP_INCLUDED
|
||||
|
||||
// Copyright 2020 Peter Dimov
|
||||
// Distributed under the Boost Software License, Version 1.0.
|
||||
// https://www.boost.org/LICENSE_1_0.txt
|
||||
|
||||
#include <boost/describe/detail/config.hpp>
|
||||
|
||||
#if defined(BOOST_DESCRIBE_CXX11)
|
||||
|
||||
namespace boost
|
||||
{
|
||||
namespace describe
|
||||
{
|
||||
namespace detail
|
||||
{
|
||||
|
||||
template<class... T> struct list {};
|
||||
|
||||
} // namespace detail
|
||||
} // namespace describe
|
||||
} // namespace boost
|
||||
|
||||
#endif // defined(BOOST_DESCRIBE_CXX11)
|
||||
|
||||
#endif // #ifndef BOOST_DESCRIBE_DETAIL_LIST_HPP_INCLUDED
|
||||
84
linx64/include/boost/describe/detail/members.hpp
Normal file
84
linx64/include/boost/describe/detail/members.hpp
Normal file
@@ -0,0 +1,84 @@
|
||||
#ifndef BOOST_DESCRIBE_DETAIL_MEMBERS_HPP_INCLUDED
|
||||
#define BOOST_DESCRIBE_DETAIL_MEMBERS_HPP_INCLUDED
|
||||
|
||||
// Copyright 2020 Peter Dimov
|
||||
// Distributed under the Boost Software License, Version 1.0.
|
||||
// https://www.boost.org/LICENSE_1_0.txt
|
||||
|
||||
#include <boost/describe/modifiers.hpp>
|
||||
#include <boost/describe/detail/pp_for_each.hpp>
|
||||
#include <boost/describe/detail/pp_utilities.hpp>
|
||||
#include <boost/describe/detail/list.hpp>
|
||||
#include <type_traits>
|
||||
|
||||
namespace boost
|
||||
{
|
||||
namespace describe
|
||||
{
|
||||
namespace detail
|
||||
{
|
||||
|
||||
template<class Pm> constexpr unsigned add_static_modifier( Pm )
|
||||
{
|
||||
return std::is_member_pointer<Pm>::value? 0: mod_static;
|
||||
}
|
||||
|
||||
template<class Pm> constexpr unsigned add_function_modifier( Pm )
|
||||
{
|
||||
return std::is_member_function_pointer<Pm>::value || std::is_function< std::remove_pointer_t<Pm> >::value? mod_function: 0;
|
||||
}
|
||||
|
||||
template<class D, unsigned M> struct member_descriptor
|
||||
{
|
||||
static constexpr decltype(D::pointer()) pointer = D::pointer();
|
||||
static constexpr decltype(D::name()) name = D::name();
|
||||
static constexpr unsigned modifiers = M | add_static_modifier( D::pointer() ) | add_function_modifier( D::pointer() );
|
||||
};
|
||||
|
||||
#ifndef __cpp_inline_variables
|
||||
template<class D, unsigned M> constexpr decltype(D::pointer()) member_descriptor<D, M>::pointer;
|
||||
template<class D, unsigned M> constexpr decltype(D::name()) member_descriptor<D, M>::name;
|
||||
template<class D, unsigned M> constexpr unsigned member_descriptor<D, M>::modifiers;
|
||||
#endif
|
||||
|
||||
template<unsigned M, class... T> auto member_descriptor_fn_impl( int, T... )
|
||||
{
|
||||
return list<member_descriptor<T, M>...>();
|
||||
}
|
||||
|
||||
template<class C, class F> constexpr auto mfn( F C::* p ) { return p; }
|
||||
template<class C, class F> constexpr auto mfn( F * p ) { return p; }
|
||||
|
||||
#define BOOST_DESCRIBE_MEMBER_IMPL(C, m) , []{ struct _boost_desc { \
|
||||
static constexpr auto pointer() noexcept { return BOOST_DESCRIBE_PP_POINTER(C, m); } \
|
||||
static constexpr auto name() noexcept { return BOOST_DESCRIBE_PP_NAME(m); } }; return _boost_desc(); }()
|
||||
|
||||
#if defined(_MSC_VER) && !defined(__clang__)
|
||||
|
||||
#define BOOST_DESCRIBE_PUBLIC_MEMBERS(C, ...) inline auto boost_public_member_descriptor_fn( C** ) \
|
||||
{ return boost::describe::detail::member_descriptor_fn_impl<boost::describe::mod_public>( 0 BOOST_DESCRIBE_PP_FOR_EACH(BOOST_DESCRIBE_MEMBER_IMPL, C, __VA_ARGS__) ); }
|
||||
|
||||
#define BOOST_DESCRIBE_PROTECTED_MEMBERS(C, ...) inline auto boost_protected_member_descriptor_fn( C** ) \
|
||||
{ return boost::describe::detail::member_descriptor_fn_impl<boost::describe::mod_protected>( 0 BOOST_DESCRIBE_PP_FOR_EACH(BOOST_DESCRIBE_MEMBER_IMPL, C, __VA_ARGS__) ); }
|
||||
|
||||
#define BOOST_DESCRIBE_PRIVATE_MEMBERS(C, ...) inline auto boost_private_member_descriptor_fn( C** ) \
|
||||
{ return boost::describe::detail::member_descriptor_fn_impl<boost::describe::mod_private>( 0 BOOST_DESCRIBE_PP_FOR_EACH(BOOST_DESCRIBE_MEMBER_IMPL, C, __VA_ARGS__) ); }
|
||||
|
||||
#else
|
||||
|
||||
#define BOOST_DESCRIBE_PUBLIC_MEMBERS(C, ...) inline auto boost_public_member_descriptor_fn( C** ) \
|
||||
{ return boost::describe::detail::member_descriptor_fn_impl<boost::describe::mod_public>( 0 BOOST_DESCRIBE_PP_FOR_EACH(BOOST_DESCRIBE_MEMBER_IMPL, C, ##__VA_ARGS__) ); }
|
||||
|
||||
#define BOOST_DESCRIBE_PROTECTED_MEMBERS(C, ...) inline auto boost_protected_member_descriptor_fn( C** ) \
|
||||
{ return boost::describe::detail::member_descriptor_fn_impl<boost::describe::mod_protected>( 0 BOOST_DESCRIBE_PP_FOR_EACH(BOOST_DESCRIBE_MEMBER_IMPL, C, ##__VA_ARGS__) ); }
|
||||
|
||||
#define BOOST_DESCRIBE_PRIVATE_MEMBERS(C, ...) inline auto boost_private_member_descriptor_fn( C** ) \
|
||||
{ return boost::describe::detail::member_descriptor_fn_impl<boost::describe::mod_private>( 0 BOOST_DESCRIBE_PP_FOR_EACH(BOOST_DESCRIBE_MEMBER_IMPL, C, ##__VA_ARGS__) ); }
|
||||
|
||||
#endif
|
||||
|
||||
} // namespace detail
|
||||
} // namespace describe
|
||||
} // namespace boost
|
||||
|
||||
#endif // #ifndef BOOST_DESCRIBE_DETAIL_MEMBERS_HPP_INCLUDED
|
||||
122
linx64/include/boost/describe/detail/pp_for_each.hpp
Normal file
122
linx64/include/boost/describe/detail/pp_for_each.hpp
Normal file
@@ -0,0 +1,122 @@
|
||||
#ifndef BOOST_DESCRIBE_DETAIL_PP_FOR_EACH_HPP_INCLUDED
|
||||
#define BOOST_DESCRIBE_DETAIL_PP_FOR_EACH_HPP_INCLUDED
|
||||
|
||||
// Copyright 2020 Peter Dimov
|
||||
// Distributed under the Boost Software License, Version 1.0.
|
||||
// https://www.boost.org/LICENSE_1_0.txt
|
||||
|
||||
#include <boost/describe/detail/pp_utilities.hpp>
|
||||
|
||||
#define BOOST_DESCRIBE_PP_FOR_EACH_0(F, a)
|
||||
#define BOOST_DESCRIBE_PP_FOR_EACH_1(F, a, x) BOOST_DESCRIBE_PP_CALL(F, a, x)
|
||||
#define BOOST_DESCRIBE_PP_FOR_EACH_2(F, a, x, ...) BOOST_DESCRIBE_PP_EXPAND(BOOST_DESCRIBE_PP_CALL(F, a, x) BOOST_DESCRIBE_PP_FOR_EACH_1(F, a, __VA_ARGS__))
|
||||
#define BOOST_DESCRIBE_PP_FOR_EACH_3(F, a, x, ...) BOOST_DESCRIBE_PP_EXPAND(BOOST_DESCRIBE_PP_CALL(F, a, x) BOOST_DESCRIBE_PP_FOR_EACH_2(F, a, __VA_ARGS__))
|
||||
#define BOOST_DESCRIBE_PP_FOR_EACH_4(F, a, x, ...) BOOST_DESCRIBE_PP_EXPAND(BOOST_DESCRIBE_PP_CALL(F, a, x) BOOST_DESCRIBE_PP_FOR_EACH_3(F, a, __VA_ARGS__))
|
||||
#define BOOST_DESCRIBE_PP_FOR_EACH_5(F, a, x, ...) BOOST_DESCRIBE_PP_EXPAND(BOOST_DESCRIBE_PP_CALL(F, a, x) BOOST_DESCRIBE_PP_FOR_EACH_4(F, a, __VA_ARGS__))
|
||||
#define BOOST_DESCRIBE_PP_FOR_EACH_6(F, a, x, ...) BOOST_DESCRIBE_PP_EXPAND(BOOST_DESCRIBE_PP_CALL(F, a, x) BOOST_DESCRIBE_PP_FOR_EACH_5(F, a, __VA_ARGS__))
|
||||
#define BOOST_DESCRIBE_PP_FOR_EACH_7(F, a, x, ...) BOOST_DESCRIBE_PP_EXPAND(BOOST_DESCRIBE_PP_CALL(F, a, x) BOOST_DESCRIBE_PP_FOR_EACH_6(F, a, __VA_ARGS__))
|
||||
#define BOOST_DESCRIBE_PP_FOR_EACH_8(F, a, x, ...) BOOST_DESCRIBE_PP_EXPAND(BOOST_DESCRIBE_PP_CALL(F, a, x) BOOST_DESCRIBE_PP_FOR_EACH_7(F, a, __VA_ARGS__))
|
||||
#define BOOST_DESCRIBE_PP_FOR_EACH_9(F, a, x, ...) BOOST_DESCRIBE_PP_EXPAND(BOOST_DESCRIBE_PP_CALL(F, a, x) BOOST_DESCRIBE_PP_FOR_EACH_8(F, a, __VA_ARGS__))
|
||||
#define BOOST_DESCRIBE_PP_FOR_EACH_10(F, a, x, ...) BOOST_DESCRIBE_PP_EXPAND(BOOST_DESCRIBE_PP_CALL(F, a, x) BOOST_DESCRIBE_PP_FOR_EACH_9(F, a, __VA_ARGS__))
|
||||
#define BOOST_DESCRIBE_PP_FOR_EACH_11(F, a, x, ...) BOOST_DESCRIBE_PP_EXPAND(BOOST_DESCRIBE_PP_CALL(F, a, x) BOOST_DESCRIBE_PP_FOR_EACH_10(F, a, __VA_ARGS__))
|
||||
#define BOOST_DESCRIBE_PP_FOR_EACH_12(F, a, x, ...) BOOST_DESCRIBE_PP_EXPAND(BOOST_DESCRIBE_PP_CALL(F, a, x) BOOST_DESCRIBE_PP_FOR_EACH_11(F, a, __VA_ARGS__))
|
||||
#define BOOST_DESCRIBE_PP_FOR_EACH_13(F, a, x, ...) BOOST_DESCRIBE_PP_EXPAND(BOOST_DESCRIBE_PP_CALL(F, a, x) BOOST_DESCRIBE_PP_FOR_EACH_12(F, a, __VA_ARGS__))
|
||||
#define BOOST_DESCRIBE_PP_FOR_EACH_14(F, a, x, ...) BOOST_DESCRIBE_PP_EXPAND(BOOST_DESCRIBE_PP_CALL(F, a, x) BOOST_DESCRIBE_PP_FOR_EACH_13(F, a, __VA_ARGS__))
|
||||
#define BOOST_DESCRIBE_PP_FOR_EACH_15(F, a, x, ...) BOOST_DESCRIBE_PP_EXPAND(BOOST_DESCRIBE_PP_CALL(F, a, x) BOOST_DESCRIBE_PP_FOR_EACH_14(F, a, __VA_ARGS__))
|
||||
#define BOOST_DESCRIBE_PP_FOR_EACH_16(F, a, x, ...) BOOST_DESCRIBE_PP_EXPAND(BOOST_DESCRIBE_PP_CALL(F, a, x) BOOST_DESCRIBE_PP_FOR_EACH_15(F, a, __VA_ARGS__))
|
||||
#define BOOST_DESCRIBE_PP_FOR_EACH_17(F, a, x, ...) BOOST_DESCRIBE_PP_EXPAND(BOOST_DESCRIBE_PP_CALL(F, a, x) BOOST_DESCRIBE_PP_FOR_EACH_16(F, a, __VA_ARGS__))
|
||||
#define BOOST_DESCRIBE_PP_FOR_EACH_18(F, a, x, ...) BOOST_DESCRIBE_PP_EXPAND(BOOST_DESCRIBE_PP_CALL(F, a, x) BOOST_DESCRIBE_PP_FOR_EACH_17(F, a, __VA_ARGS__))
|
||||
#define BOOST_DESCRIBE_PP_FOR_EACH_19(F, a, x, ...) BOOST_DESCRIBE_PP_EXPAND(BOOST_DESCRIBE_PP_CALL(F, a, x) BOOST_DESCRIBE_PP_FOR_EACH_18(F, a, __VA_ARGS__))
|
||||
#define BOOST_DESCRIBE_PP_FOR_EACH_20(F, a, x, ...) BOOST_DESCRIBE_PP_EXPAND(BOOST_DESCRIBE_PP_CALL(F, a, x) BOOST_DESCRIBE_PP_FOR_EACH_19(F, a, __VA_ARGS__))
|
||||
#define BOOST_DESCRIBE_PP_FOR_EACH_21(F, a, x, ...) BOOST_DESCRIBE_PP_EXPAND(BOOST_DESCRIBE_PP_CALL(F, a, x) BOOST_DESCRIBE_PP_FOR_EACH_20(F, a, __VA_ARGS__))
|
||||
#define BOOST_DESCRIBE_PP_FOR_EACH_22(F, a, x, ...) BOOST_DESCRIBE_PP_EXPAND(BOOST_DESCRIBE_PP_CALL(F, a, x) BOOST_DESCRIBE_PP_FOR_EACH_21(F, a, __VA_ARGS__))
|
||||
#define BOOST_DESCRIBE_PP_FOR_EACH_23(F, a, x, ...) BOOST_DESCRIBE_PP_EXPAND(BOOST_DESCRIBE_PP_CALL(F, a, x) BOOST_DESCRIBE_PP_FOR_EACH_22(F, a, __VA_ARGS__))
|
||||
#define BOOST_DESCRIBE_PP_FOR_EACH_24(F, a, x, ...) BOOST_DESCRIBE_PP_EXPAND(BOOST_DESCRIBE_PP_CALL(F, a, x) BOOST_DESCRIBE_PP_FOR_EACH_23(F, a, __VA_ARGS__))
|
||||
#define BOOST_DESCRIBE_PP_FOR_EACH_25(F, a, x, ...) BOOST_DESCRIBE_PP_EXPAND(BOOST_DESCRIBE_PP_CALL(F, a, x) BOOST_DESCRIBE_PP_FOR_EACH_24(F, a, __VA_ARGS__))
|
||||
#define BOOST_DESCRIBE_PP_FOR_EACH_26(F, a, x, ...) BOOST_DESCRIBE_PP_EXPAND(BOOST_DESCRIBE_PP_CALL(F, a, x) BOOST_DESCRIBE_PP_FOR_EACH_25(F, a, __VA_ARGS__))
|
||||
#define BOOST_DESCRIBE_PP_FOR_EACH_27(F, a, x, ...) BOOST_DESCRIBE_PP_EXPAND(BOOST_DESCRIBE_PP_CALL(F, a, x) BOOST_DESCRIBE_PP_FOR_EACH_26(F, a, __VA_ARGS__))
|
||||
#define BOOST_DESCRIBE_PP_FOR_EACH_28(F, a, x, ...) BOOST_DESCRIBE_PP_EXPAND(BOOST_DESCRIBE_PP_CALL(F, a, x) BOOST_DESCRIBE_PP_FOR_EACH_27(F, a, __VA_ARGS__))
|
||||
#define BOOST_DESCRIBE_PP_FOR_EACH_29(F, a, x, ...) BOOST_DESCRIBE_PP_EXPAND(BOOST_DESCRIBE_PP_CALL(F, a, x) BOOST_DESCRIBE_PP_FOR_EACH_28(F, a, __VA_ARGS__))
|
||||
#define BOOST_DESCRIBE_PP_FOR_EACH_30(F, a, x, ...) BOOST_DESCRIBE_PP_EXPAND(BOOST_DESCRIBE_PP_CALL(F, a, x) BOOST_DESCRIBE_PP_FOR_EACH_29(F, a, __VA_ARGS__))
|
||||
#define BOOST_DESCRIBE_PP_FOR_EACH_31(F, a, x, ...) BOOST_DESCRIBE_PP_EXPAND(BOOST_DESCRIBE_PP_CALL(F, a, x) BOOST_DESCRIBE_PP_FOR_EACH_30(F, a, __VA_ARGS__))
|
||||
#define BOOST_DESCRIBE_PP_FOR_EACH_32(F, a, x, ...) BOOST_DESCRIBE_PP_EXPAND(BOOST_DESCRIBE_PP_CALL(F, a, x) BOOST_DESCRIBE_PP_FOR_EACH_31(F, a, __VA_ARGS__))
|
||||
#define BOOST_DESCRIBE_PP_FOR_EACH_33(F, a, x, ...) BOOST_DESCRIBE_PP_EXPAND(BOOST_DESCRIBE_PP_CALL(F, a, x) BOOST_DESCRIBE_PP_FOR_EACH_32(F, a, __VA_ARGS__))
|
||||
#define BOOST_DESCRIBE_PP_FOR_EACH_34(F, a, x, ...) BOOST_DESCRIBE_PP_EXPAND(BOOST_DESCRIBE_PP_CALL(F, a, x) BOOST_DESCRIBE_PP_FOR_EACH_33(F, a, __VA_ARGS__))
|
||||
#define BOOST_DESCRIBE_PP_FOR_EACH_35(F, a, x, ...) BOOST_DESCRIBE_PP_EXPAND(BOOST_DESCRIBE_PP_CALL(F, a, x) BOOST_DESCRIBE_PP_FOR_EACH_34(F, a, __VA_ARGS__))
|
||||
#define BOOST_DESCRIBE_PP_FOR_EACH_36(F, a, x, ...) BOOST_DESCRIBE_PP_EXPAND(BOOST_DESCRIBE_PP_CALL(F, a, x) BOOST_DESCRIBE_PP_FOR_EACH_35(F, a, __VA_ARGS__))
|
||||
#define BOOST_DESCRIBE_PP_FOR_EACH_37(F, a, x, ...) BOOST_DESCRIBE_PP_EXPAND(BOOST_DESCRIBE_PP_CALL(F, a, x) BOOST_DESCRIBE_PP_FOR_EACH_36(F, a, __VA_ARGS__))
|
||||
#define BOOST_DESCRIBE_PP_FOR_EACH_38(F, a, x, ...) BOOST_DESCRIBE_PP_EXPAND(BOOST_DESCRIBE_PP_CALL(F, a, x) BOOST_DESCRIBE_PP_FOR_EACH_37(F, a, __VA_ARGS__))
|
||||
#define BOOST_DESCRIBE_PP_FOR_EACH_39(F, a, x, ...) BOOST_DESCRIBE_PP_EXPAND(BOOST_DESCRIBE_PP_CALL(F, a, x) BOOST_DESCRIBE_PP_FOR_EACH_38(F, a, __VA_ARGS__))
|
||||
#define BOOST_DESCRIBE_PP_FOR_EACH_40(F, a, x, ...) BOOST_DESCRIBE_PP_EXPAND(BOOST_DESCRIBE_PP_CALL(F, a, x) BOOST_DESCRIBE_PP_FOR_EACH_39(F, a, __VA_ARGS__))
|
||||
#define BOOST_DESCRIBE_PP_FOR_EACH_41(F, a, x, ...) BOOST_DESCRIBE_PP_EXPAND(BOOST_DESCRIBE_PP_CALL(F, a, x) BOOST_DESCRIBE_PP_FOR_EACH_40(F, a, __VA_ARGS__))
|
||||
#define BOOST_DESCRIBE_PP_FOR_EACH_42(F, a, x, ...) BOOST_DESCRIBE_PP_EXPAND(BOOST_DESCRIBE_PP_CALL(F, a, x) BOOST_DESCRIBE_PP_FOR_EACH_41(F, a, __VA_ARGS__))
|
||||
#define BOOST_DESCRIBE_PP_FOR_EACH_43(F, a, x, ...) BOOST_DESCRIBE_PP_EXPAND(BOOST_DESCRIBE_PP_CALL(F, a, x) BOOST_DESCRIBE_PP_FOR_EACH_42(F, a, __VA_ARGS__))
|
||||
#define BOOST_DESCRIBE_PP_FOR_EACH_44(F, a, x, ...) BOOST_DESCRIBE_PP_EXPAND(BOOST_DESCRIBE_PP_CALL(F, a, x) BOOST_DESCRIBE_PP_FOR_EACH_43(F, a, __VA_ARGS__))
|
||||
#define BOOST_DESCRIBE_PP_FOR_EACH_45(F, a, x, ...) BOOST_DESCRIBE_PP_EXPAND(BOOST_DESCRIBE_PP_CALL(F, a, x) BOOST_DESCRIBE_PP_FOR_EACH_44(F, a, __VA_ARGS__))
|
||||
#define BOOST_DESCRIBE_PP_FOR_EACH_46(F, a, x, ...) BOOST_DESCRIBE_PP_EXPAND(BOOST_DESCRIBE_PP_CALL(F, a, x) BOOST_DESCRIBE_PP_FOR_EACH_45(F, a, __VA_ARGS__))
|
||||
#define BOOST_DESCRIBE_PP_FOR_EACH_47(F, a, x, ...) BOOST_DESCRIBE_PP_EXPAND(BOOST_DESCRIBE_PP_CALL(F, a, x) BOOST_DESCRIBE_PP_FOR_EACH_46(F, a, __VA_ARGS__))
|
||||
#define BOOST_DESCRIBE_PP_FOR_EACH_48(F, a, x, ...) BOOST_DESCRIBE_PP_EXPAND(BOOST_DESCRIBE_PP_CALL(F, a, x) BOOST_DESCRIBE_PP_FOR_EACH_47(F, a, __VA_ARGS__))
|
||||
#define BOOST_DESCRIBE_PP_FOR_EACH_49(F, a, x, ...) BOOST_DESCRIBE_PP_EXPAND(BOOST_DESCRIBE_PP_CALL(F, a, x) BOOST_DESCRIBE_PP_FOR_EACH_48(F, a, __VA_ARGS__))
|
||||
#define BOOST_DESCRIBE_PP_FOR_EACH_50(F, a, x, ...) BOOST_DESCRIBE_PP_EXPAND(BOOST_DESCRIBE_PP_CALL(F, a, x) BOOST_DESCRIBE_PP_FOR_EACH_49(F, a, __VA_ARGS__))
|
||||
#define BOOST_DESCRIBE_PP_FOR_EACH_51(F, a, x, ...) BOOST_DESCRIBE_PP_EXPAND(BOOST_DESCRIBE_PP_CALL(F, a, x) BOOST_DESCRIBE_PP_FOR_EACH_50(F, a, __VA_ARGS__))
|
||||
#define BOOST_DESCRIBE_PP_FOR_EACH_52(F, a, x, ...) BOOST_DESCRIBE_PP_EXPAND(BOOST_DESCRIBE_PP_CALL(F, a, x) BOOST_DESCRIBE_PP_FOR_EACH_51(F, a, __VA_ARGS__))
|
||||
|
||||
#define BOOST_DESCRIBE_PP_FE_EXTRACT(_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, V, ...) V
|
||||
|
||||
#define BOOST_DESCRIBE_PP_FOR_EACH(F, ...) \
|
||||
BOOST_DESCRIBE_PP_EXPAND(BOOST_DESCRIBE_PP_EXPAND(BOOST_DESCRIBE_PP_FE_EXTRACT(__VA_ARGS__, \
|
||||
BOOST_DESCRIBE_PP_FOR_EACH_52, \
|
||||
BOOST_DESCRIBE_PP_FOR_EACH_51, \
|
||||
BOOST_DESCRIBE_PP_FOR_EACH_50, \
|
||||
BOOST_DESCRIBE_PP_FOR_EACH_49, \
|
||||
BOOST_DESCRIBE_PP_FOR_EACH_48, \
|
||||
BOOST_DESCRIBE_PP_FOR_EACH_47, \
|
||||
BOOST_DESCRIBE_PP_FOR_EACH_46, \
|
||||
BOOST_DESCRIBE_PP_FOR_EACH_45, \
|
||||
BOOST_DESCRIBE_PP_FOR_EACH_44, \
|
||||
BOOST_DESCRIBE_PP_FOR_EACH_43, \
|
||||
BOOST_DESCRIBE_PP_FOR_EACH_42, \
|
||||
BOOST_DESCRIBE_PP_FOR_EACH_41, \
|
||||
BOOST_DESCRIBE_PP_FOR_EACH_40, \
|
||||
BOOST_DESCRIBE_PP_FOR_EACH_39, \
|
||||
BOOST_DESCRIBE_PP_FOR_EACH_38, \
|
||||
BOOST_DESCRIBE_PP_FOR_EACH_37, \
|
||||
BOOST_DESCRIBE_PP_FOR_EACH_36, \
|
||||
BOOST_DESCRIBE_PP_FOR_EACH_35, \
|
||||
BOOST_DESCRIBE_PP_FOR_EACH_34, \
|
||||
BOOST_DESCRIBE_PP_FOR_EACH_33, \
|
||||
BOOST_DESCRIBE_PP_FOR_EACH_32, \
|
||||
BOOST_DESCRIBE_PP_FOR_EACH_31, \
|
||||
BOOST_DESCRIBE_PP_FOR_EACH_30, \
|
||||
BOOST_DESCRIBE_PP_FOR_EACH_29, \
|
||||
BOOST_DESCRIBE_PP_FOR_EACH_28, \
|
||||
BOOST_DESCRIBE_PP_FOR_EACH_27, \
|
||||
BOOST_DESCRIBE_PP_FOR_EACH_26, \
|
||||
BOOST_DESCRIBE_PP_FOR_EACH_25, \
|
||||
BOOST_DESCRIBE_PP_FOR_EACH_24, \
|
||||
BOOST_DESCRIBE_PP_FOR_EACH_23, \
|
||||
BOOST_DESCRIBE_PP_FOR_EACH_22, \
|
||||
BOOST_DESCRIBE_PP_FOR_EACH_21, \
|
||||
BOOST_DESCRIBE_PP_FOR_EACH_20, \
|
||||
BOOST_DESCRIBE_PP_FOR_EACH_19, \
|
||||
BOOST_DESCRIBE_PP_FOR_EACH_18, \
|
||||
BOOST_DESCRIBE_PP_FOR_EACH_17, \
|
||||
BOOST_DESCRIBE_PP_FOR_EACH_16, \
|
||||
BOOST_DESCRIBE_PP_FOR_EACH_15, \
|
||||
BOOST_DESCRIBE_PP_FOR_EACH_14, \
|
||||
BOOST_DESCRIBE_PP_FOR_EACH_13, \
|
||||
BOOST_DESCRIBE_PP_FOR_EACH_12, \
|
||||
BOOST_DESCRIBE_PP_FOR_EACH_11, \
|
||||
BOOST_DESCRIBE_PP_FOR_EACH_10, \
|
||||
BOOST_DESCRIBE_PP_FOR_EACH_9, \
|
||||
BOOST_DESCRIBE_PP_FOR_EACH_8, \
|
||||
BOOST_DESCRIBE_PP_FOR_EACH_7, \
|
||||
BOOST_DESCRIBE_PP_FOR_EACH_6, \
|
||||
BOOST_DESCRIBE_PP_FOR_EACH_5, \
|
||||
BOOST_DESCRIBE_PP_FOR_EACH_4, \
|
||||
BOOST_DESCRIBE_PP_FOR_EACH_3, \
|
||||
BOOST_DESCRIBE_PP_FOR_EACH_2, \
|
||||
BOOST_DESCRIBE_PP_FOR_EACH_1, \
|
||||
BOOST_DESCRIBE_PP_FOR_EACH_0))(F, __VA_ARGS__))
|
||||
|
||||
#endif // #ifndef BOOST_DESCRIBE_DETAIL_PP_FOR_EACH_HPP_INCLUDED
|
||||
92
linx64/include/boost/describe/detail/pp_utilities.hpp
Normal file
92
linx64/include/boost/describe/detail/pp_utilities.hpp
Normal file
@@ -0,0 +1,92 @@
|
||||
#ifndef BOOST_DESCRIBE_DETAIL_PP_UTILITIES_HPP_INCLUDED
|
||||
#define BOOST_DESCRIBE_DETAIL_PP_UTILITIES_HPP_INCLUDED
|
||||
|
||||
// Copyright 2021 Peter Dimov
|
||||
// Distributed under the Boost Software License, Version 1.0.
|
||||
// https://www.boost.org/LICENSE_1_0.txt
|
||||
|
||||
#define BOOST_DESCRIBE_PP_EXPAND(x) x
|
||||
|
||||
#define BOOST_DESCRIBE_PP_CAT(x, y) BOOST_DESCRIBE_PP_CAT_I(x, y)
|
||||
#define BOOST_DESCRIBE_PP_CAT_I(x, ...) x ## __VA_ARGS__
|
||||
|
||||
#if defined(_MSC_VER) && !defined(__clang__)
|
||||
|
||||
#define BOOST_DESCRIBE_PP_FIRST(x) BOOST_DESCRIBE_PP_FIRST_I((x))
|
||||
#define BOOST_DESCRIBE_PP_FIRST_I(x) BOOST_DESCRIBE_PP_FIRST_II x
|
||||
#define BOOST_DESCRIBE_PP_FIRST_II(x, ...) x
|
||||
|
||||
#else
|
||||
|
||||
#define BOOST_DESCRIBE_PP_FIRST(x) BOOST_DESCRIBE_PP_FIRST_I(x)
|
||||
#define BOOST_DESCRIBE_PP_FIRST_I(x, ...) x
|
||||
|
||||
#endif
|
||||
|
||||
#define BOOST_DESCRIBE_PP_IS_PAREN_I(x) BOOST_DESCRIBE_PP_CAT(BOOST_DESCRIBE_PP_IS_PAREN_I_, BOOST_DESCRIBE_PP_IS_PAREN_II x)
|
||||
#define BOOST_DESCRIBE_PP_IS_PAREN_II(...) 0
|
||||
#define BOOST_DESCRIBE_PP_IS_PAREN_I_0 1,
|
||||
#define BOOST_DESCRIBE_PP_IS_PAREN_I_BOOST_DESCRIBE_PP_IS_PAREN_II 0,
|
||||
|
||||
#define BOOST_DESCRIBE_PP_IS_PAREN(x) BOOST_DESCRIBE_PP_FIRST(BOOST_DESCRIBE_PP_IS_PAREN_I(x))
|
||||
|
||||
#define BOOST_DESCRIBE_PP_EMPTY
|
||||
|
||||
#define BOOST_DESCRIBE_PP_IS_EMPTY(x) BOOST_DESCRIBE_PP_IS_EMPTY_I(BOOST_DESCRIBE_PP_IS_PAREN(x), BOOST_DESCRIBE_PP_IS_PAREN(x BOOST_DESCRIBE_PP_EMPTY ()))
|
||||
#define BOOST_DESCRIBE_PP_IS_EMPTY_I(x, y) BOOST_DESCRIBE_PP_IS_EMPTY_II(x, y)
|
||||
#define BOOST_DESCRIBE_PP_IS_EMPTY_II(x, y) BOOST_DESCRIBE_PP_IS_EMPTY_III(x, y)
|
||||
#define BOOST_DESCRIBE_PP_IS_EMPTY_III(x, y) BOOST_DESCRIBE_PP_IS_EMPTY_III_ ## x ## y
|
||||
#define BOOST_DESCRIBE_PP_IS_EMPTY_III_00 0
|
||||
#define BOOST_DESCRIBE_PP_IS_EMPTY_III_01 1
|
||||
#define BOOST_DESCRIBE_PP_IS_EMPTY_III_10 0
|
||||
#define BOOST_DESCRIBE_PP_IS_EMPTY_III_11 0
|
||||
|
||||
#define BOOST_DESCRIBE_PP_CALL(F, a, x) BOOST_DESCRIBE_PP_CAT(BOOST_DESCRIBE_PP_CALL_I_, BOOST_DESCRIBE_PP_IS_EMPTY(x))(F, a, x)
|
||||
#define BOOST_DESCRIBE_PP_CALL_I_0(F, a, x) F(a, x)
|
||||
#define BOOST_DESCRIBE_PP_CALL_I_1(F, a, x)
|
||||
|
||||
#define BOOST_DESCRIBE_PP_PARSE(x) BOOST_DESCRIBE_PP_CAT(BOOST_DESCRIBE_PP_PARSE_I_, BOOST_DESCRIBE_PP_PARSE_II x)
|
||||
#define BOOST_DESCRIBE_PP_PARSE_II(...) 0, (__VA_ARGS__),
|
||||
#define BOOST_DESCRIBE_PP_PARSE_I_BOOST_DESCRIBE_PP_PARSE_II 0, ~,
|
||||
#define BOOST_DESCRIBE_PP_PARSE_I_0 1
|
||||
|
||||
#if defined(_MSC_VER) && !defined(__clang__)
|
||||
|
||||
#define BOOST_DESCRIBE_PP_NAME(x) BOOST_DESCRIBE_PP_NAME_I(BOOST_DESCRIBE_PP_PARSE(x))
|
||||
#define BOOST_DESCRIBE_PP_NAME_I(x) BOOST_DESCRIBE_PP_NAME_II((x))
|
||||
#define BOOST_DESCRIBE_PP_NAME_II(x) BOOST_DESCRIBE_PP_NAME_III x
|
||||
#define BOOST_DESCRIBE_PP_NAME_III(x, y, z) #z
|
||||
|
||||
#else
|
||||
|
||||
#define BOOST_DESCRIBE_PP_NAME(x) BOOST_DESCRIBE_PP_NAME_I(BOOST_DESCRIBE_PP_PARSE(x))
|
||||
#define BOOST_DESCRIBE_PP_NAME_I(x) BOOST_DESCRIBE_PP_NAME_II(x)
|
||||
#define BOOST_DESCRIBE_PP_NAME_II(x, y, z) #z
|
||||
|
||||
#endif
|
||||
|
||||
// template<class C, class F> constexpr auto mfn( F C::* p ) { return p; }
|
||||
// template<class C, class F> constexpr auto mfn( F * p ) { return p; }
|
||||
|
||||
#define BOOST_DESCRIBE_PP_POINTER(C, x) BOOST_DESCRIBE_PP_POINTER_I(C, BOOST_DESCRIBE_PP_PARSE(x))
|
||||
|
||||
#define BOOST_DESCRIBE_PP_EXPAND_V(...) __VA_ARGS__
|
||||
|
||||
#if defined(_MSC_VER) && !defined(__clang__)
|
||||
|
||||
#define BOOST_DESCRIBE_PP_POINTER_I(C, x) BOOST_DESCRIBE_PP_POINTER_II((C, x))
|
||||
#define BOOST_DESCRIBE_PP_POINTER_II(x) BOOST_DESCRIBE_PP_POINTER_III x
|
||||
#define BOOST_DESCRIBE_PP_POINTER_III(C, x, y, z) BOOST_DESCRIBE_PP_POINTER_III_##x(C, y, z)
|
||||
#define BOOST_DESCRIBE_PP_POINTER_III_0(C, y, z) &C::z
|
||||
#define BOOST_DESCRIBE_PP_POINTER_III_1(C, y, z) ::boost::describe::detail::mfn<C, BOOST_DESCRIBE_PP_EXPAND_V y>(&C::z)
|
||||
|
||||
#else
|
||||
|
||||
#define BOOST_DESCRIBE_PP_POINTER_I(C, x) BOOST_DESCRIBE_PP_POINTER_II(C, x)
|
||||
#define BOOST_DESCRIBE_PP_POINTER_II(C, x, y, z) BOOST_DESCRIBE_PP_POINTER_III_##x(C, y, z)
|
||||
#define BOOST_DESCRIBE_PP_POINTER_III_0(C, y, z) &C::z
|
||||
#define BOOST_DESCRIBE_PP_POINTER_III_1(C, y, z) ::boost::describe::detail::mfn<C, BOOST_DESCRIBE_PP_EXPAND_V y>(&C::z)
|
||||
|
||||
#endif
|
||||
|
||||
#endif // #ifndef BOOST_DESCRIBE_DETAIL_PP_UTILITIES_HPP_INCLUDED
|
||||
32
linx64/include/boost/describe/detail/void_t.hpp
Normal file
32
linx64/include/boost/describe/detail/void_t.hpp
Normal file
@@ -0,0 +1,32 @@
|
||||
#ifndef BOOST_DESCRIBE_DETAIL_VOID_T_HPP_INCLUDED
|
||||
#define BOOST_DESCRIBE_DETAIL_VOID_T_HPP_INCLUDED
|
||||
|
||||
// Copyright 2021 Peter Dimov
|
||||
// Distributed under the Boost Software License, Version 1.0.
|
||||
// https://www.boost.org/LICENSE_1_0.txt
|
||||
|
||||
#include <boost/describe/detail/config.hpp>
|
||||
|
||||
#if defined(BOOST_DESCRIBE_CXX11)
|
||||
|
||||
namespace boost
|
||||
{
|
||||
namespace describe
|
||||
{
|
||||
namespace detail
|
||||
{
|
||||
|
||||
template<class...> struct make_void
|
||||
{
|
||||
using type = void;
|
||||
};
|
||||
|
||||
template<class... T> using void_t = typename make_void<T...>::type;
|
||||
|
||||
} // namespace detail
|
||||
} // namespace describe
|
||||
} // namespace boost
|
||||
|
||||
#endif // defined(BOOST_DESCRIBE_CXX11)
|
||||
|
||||
#endif // #ifndef BOOST_DESCRIBE_DETAIL_VOID_T_HPP_INCLUDED
|
||||
113
linx64/include/boost/describe/enum.hpp
Normal file
113
linx64/include/boost/describe/enum.hpp
Normal file
@@ -0,0 +1,113 @@
|
||||
#ifndef BOOST_DESCRIBE_ENUM_HPP_INCLUDED
|
||||
#define BOOST_DESCRIBE_ENUM_HPP_INCLUDED
|
||||
|
||||
// Copyright 2020 Peter Dimov
|
||||
// Distributed under the Boost Software License, Version 1.0.
|
||||
// https://www.boost.org/LICENSE_1_0.txt
|
||||
|
||||
#include <boost/describe/detail/config.hpp>
|
||||
|
||||
#if !defined(BOOST_DESCRIBE_CXX14)
|
||||
|
||||
#define BOOST_DESCRIBE_ENUM(E, ...)
|
||||
#define BOOST_DESCRIBE_NESTED_ENUM(E, ...)
|
||||
|
||||
#else
|
||||
|
||||
#include <boost/describe/detail/pp_for_each.hpp>
|
||||
#include <boost/describe/detail/list.hpp>
|
||||
#include <type_traits>
|
||||
|
||||
namespace boost
|
||||
{
|
||||
namespace describe
|
||||
{
|
||||
namespace detail
|
||||
{
|
||||
|
||||
template<class D> struct enum_descriptor
|
||||
{
|
||||
// can't use auto here because of the need to supply the definitions below
|
||||
static constexpr decltype(D::value()) value = D::value();
|
||||
static constexpr decltype(D::name()) name = D::name();
|
||||
};
|
||||
|
||||
#ifndef __cpp_inline_variables
|
||||
// GCC requires these definitions
|
||||
template<class D> constexpr decltype(D::value()) enum_descriptor<D>::value;
|
||||
template<class D> constexpr decltype(D::name()) enum_descriptor<D>::name;
|
||||
#endif
|
||||
|
||||
template<class... T> auto enum_descriptor_fn_impl( int, T... )
|
||||
{
|
||||
return list<enum_descriptor<T>...>();
|
||||
}
|
||||
|
||||
#define BOOST_DESCRIBE_ENUM_BEGIN(E) \
|
||||
inline auto boost_enum_descriptor_fn( E** ) \
|
||||
{ return boost::describe::detail::enum_descriptor_fn_impl( 0
|
||||
|
||||
#define BOOST_DESCRIBE_ENUM_ENTRY(E, e) , []{ struct _boost_desc { \
|
||||
static constexpr auto value() noexcept { return E::e; } \
|
||||
static constexpr auto name() noexcept { return #e; } }; return _boost_desc(); }()
|
||||
|
||||
#define BOOST_DESCRIBE_ENUM_END(E) ); }
|
||||
|
||||
} // namespace detail
|
||||
|
||||
#if defined(_MSC_VER) && !defined(__clang__)
|
||||
|
||||
#define BOOST_DESCRIBE_ENUM(E, ...) \
|
||||
namespace should_use_BOOST_DESCRIBE_NESTED_ENUM {} \
|
||||
static_assert(std::is_enum<E>::value, "BOOST_DESCRIBE_ENUM should only be used with enums"); \
|
||||
BOOST_DESCRIBE_ENUM_BEGIN(E) \
|
||||
BOOST_DESCRIBE_PP_FOR_EACH(BOOST_DESCRIBE_ENUM_ENTRY, E, __VA_ARGS__) \
|
||||
BOOST_DESCRIBE_ENUM_END(E)
|
||||
|
||||
#define BOOST_DESCRIBE_NESTED_ENUM(E, ...) \
|
||||
static_assert(std::is_enum<E>::value, "BOOST_DESCRIBE_NESTED_ENUM should only be used with enums"); \
|
||||
friend BOOST_DESCRIBE_ENUM_BEGIN(E) \
|
||||
BOOST_DESCRIBE_PP_FOR_EACH(BOOST_DESCRIBE_ENUM_ENTRY, E, __VA_ARGS__) \
|
||||
BOOST_DESCRIBE_ENUM_END(E)
|
||||
|
||||
#else
|
||||
|
||||
#define BOOST_DESCRIBE_ENUM(E, ...) \
|
||||
namespace should_use_BOOST_DESCRIBE_NESTED_ENUM {} \
|
||||
static_assert(std::is_enum<E>::value, "BOOST_DESCRIBE_ENUM should only be used with enums"); \
|
||||
BOOST_DESCRIBE_MAYBE_UNUSED BOOST_DESCRIBE_ENUM_BEGIN(E) \
|
||||
BOOST_DESCRIBE_PP_FOR_EACH(BOOST_DESCRIBE_ENUM_ENTRY, E, ##__VA_ARGS__) \
|
||||
BOOST_DESCRIBE_ENUM_END(E)
|
||||
|
||||
#define BOOST_DESCRIBE_NESTED_ENUM(E, ...) \
|
||||
static_assert(std::is_enum<E>::value, "BOOST_DESCRIBE_NESTED_ENUM should only be used with enums"); \
|
||||
BOOST_DESCRIBE_MAYBE_UNUSED friend BOOST_DESCRIBE_ENUM_BEGIN(E) \
|
||||
BOOST_DESCRIBE_PP_FOR_EACH(BOOST_DESCRIBE_ENUM_ENTRY, E, ##__VA_ARGS__) \
|
||||
BOOST_DESCRIBE_ENUM_END(E)
|
||||
|
||||
#endif
|
||||
|
||||
} // namespace describe
|
||||
} // namespace boost
|
||||
|
||||
#endif // defined(BOOST_DESCRIBE_CXX14)
|
||||
|
||||
#if defined(_MSC_VER) && !defined(__clang__)
|
||||
|
||||
#define BOOST_DEFINE_ENUM(E, ...) enum E { __VA_ARGS__ }; BOOST_DESCRIBE_ENUM(E, __VA_ARGS__)
|
||||
#define BOOST_DEFINE_ENUM_CLASS(E, ...) enum class E { __VA_ARGS__ }; BOOST_DESCRIBE_ENUM(E, __VA_ARGS__)
|
||||
|
||||
#define BOOST_DEFINE_FIXED_ENUM(E, Base, ...) enum E: Base { __VA_ARGS__ }; BOOST_DESCRIBE_ENUM(E, __VA_ARGS__)
|
||||
#define BOOST_DEFINE_FIXED_ENUM_CLASS(E, Base, ...) enum class E: Base { __VA_ARGS__ }; BOOST_DESCRIBE_ENUM(E, __VA_ARGS__)
|
||||
|
||||
#else
|
||||
|
||||
#define BOOST_DEFINE_ENUM(E, ...) enum E { __VA_ARGS__ }; BOOST_DESCRIBE_ENUM(E, ##__VA_ARGS__)
|
||||
#define BOOST_DEFINE_ENUM_CLASS(E, ...) enum class E { __VA_ARGS__ }; BOOST_DESCRIBE_ENUM(E, ##__VA_ARGS__)
|
||||
|
||||
#define BOOST_DEFINE_FIXED_ENUM(E, Base, ...) enum E: Base { __VA_ARGS__ }; BOOST_DESCRIBE_ENUM(E, ##__VA_ARGS__)
|
||||
#define BOOST_DEFINE_FIXED_ENUM_CLASS(E, Base, ...) enum class E: Base { __VA_ARGS__ }; BOOST_DESCRIBE_ENUM(E, ##__VA_ARGS__)
|
||||
|
||||
#endif
|
||||
|
||||
#endif // #ifndef BOOST_DESCRIBE_ENUM_HPP_INCLUDED
|
||||
53
linx64/include/boost/describe/enum_from_string.hpp
Normal file
53
linx64/include/boost/describe/enum_from_string.hpp
Normal file
@@ -0,0 +1,53 @@
|
||||
#ifndef BOOST_DESCRIBE_ENUM_FROM_STRING_HPP_INCLUDED
|
||||
#define BOOST_DESCRIBE_ENUM_FROM_STRING_HPP_INCLUDED
|
||||
|
||||
// Copyright 2020, 2021 Peter Dimov
|
||||
// Distributed under the Boost Software License, Version 1.0.
|
||||
// https://www.boost.org/LICENSE_1_0.txt
|
||||
|
||||
#include <boost/describe/detail/config.hpp>
|
||||
|
||||
#if defined(BOOST_DESCRIBE_CXX14)
|
||||
|
||||
#include <boost/describe/enumerators.hpp>
|
||||
#include <boost/mp11/algorithm.hpp>
|
||||
#include <cstring>
|
||||
|
||||
#if defined(_MSC_VER) && _MSC_VER == 1900
|
||||
# pragma warning(push)
|
||||
# pragma warning(disable: 4100) // unreferenced formal parameter
|
||||
#endif
|
||||
|
||||
namespace boost
|
||||
{
|
||||
namespace describe
|
||||
{
|
||||
|
||||
template<class E, class De = describe_enumerators<E>>
|
||||
bool enum_from_string( char const* name, E& e ) noexcept
|
||||
{
|
||||
bool found = false;
|
||||
|
||||
mp11::mp_for_each<De>([&](auto D){
|
||||
|
||||
if( !found && std::strcmp( D.name, name ) == 0 )
|
||||
{
|
||||
found = true;
|
||||
e = D.value;
|
||||
}
|
||||
|
||||
});
|
||||
|
||||
return found;
|
||||
}
|
||||
|
||||
} // namespace describe
|
||||
} // namespace boost
|
||||
|
||||
#if defined(_MSC_VER) && _MSC_VER == 1900
|
||||
# pragma warning(pop)
|
||||
#endif
|
||||
|
||||
#endif // defined(BOOST_DESCRIBE_CXX14)
|
||||
|
||||
#endif // #ifndef BOOST_DESCRIBE_ENUM_FROM_STRING_HPP_INCLUDED
|
||||
48
linx64/include/boost/describe/enum_to_string.hpp
Normal file
48
linx64/include/boost/describe/enum_to_string.hpp
Normal file
@@ -0,0 +1,48 @@
|
||||
#ifndef BOOST_DESCRIBE_ENUM_TO_STRING_HPP_INCLUDED
|
||||
#define BOOST_DESCRIBE_ENUM_TO_STRING_HPP_INCLUDED
|
||||
|
||||
// Copyright 2020, 2021 Peter Dimov
|
||||
// Distributed under the Boost Software License, Version 1.0.
|
||||
// https://www.boost.org/LICENSE_1_0.txt
|
||||
|
||||
#include <boost/describe/detail/config.hpp>
|
||||
|
||||
#if defined(BOOST_DESCRIBE_CXX14)
|
||||
|
||||
#include <boost/describe/enumerators.hpp>
|
||||
#include <boost/mp11/algorithm.hpp>
|
||||
|
||||
#if defined(_MSC_VER) && _MSC_VER == 1900
|
||||
# pragma warning(push)
|
||||
# pragma warning(disable: 4100) // unreferenced formal parameter
|
||||
#endif
|
||||
|
||||
namespace boost
|
||||
{
|
||||
namespace describe
|
||||
{
|
||||
|
||||
template<class E, class De = describe_enumerators<E>>
|
||||
char const * enum_to_string( E e, char const* def ) noexcept
|
||||
{
|
||||
char const * r = def;
|
||||
|
||||
mp11::mp_for_each<De>([&](auto D){
|
||||
|
||||
if( e == D.value ) r = D.name;
|
||||
|
||||
});
|
||||
|
||||
return r;
|
||||
}
|
||||
|
||||
} // namespace describe
|
||||
} // namespace boost
|
||||
|
||||
#if defined(_MSC_VER) && _MSC_VER == 1900
|
||||
# pragma warning(pop)
|
||||
#endif
|
||||
|
||||
#endif // defined(BOOST_DESCRIBE_CXX14)
|
||||
|
||||
#endif // #ifndef BOOST_DESCRIBE_ENUM_TO_STRING_HPP_INCLUDED
|
||||
46
linx64/include/boost/describe/enumerators.hpp
Normal file
46
linx64/include/boost/describe/enumerators.hpp
Normal file
@@ -0,0 +1,46 @@
|
||||
#ifndef BOOST_DESCRIBE_ENUMERATORS_HPP_INCLUDED
|
||||
#define BOOST_DESCRIBE_ENUMERATORS_HPP_INCLUDED
|
||||
|
||||
// Copyright 2020, 2021 Peter Dimov
|
||||
// Distributed under the Boost Software License, Version 1.0.
|
||||
// https://www.boost.org/LICENSE_1_0.txt
|
||||
|
||||
#include <boost/describe/detail/void_t.hpp>
|
||||
#include <boost/describe/detail/config.hpp>
|
||||
|
||||
#if defined(BOOST_DESCRIBE_CXX11)
|
||||
|
||||
#include <type_traits>
|
||||
|
||||
namespace boost
|
||||
{
|
||||
namespace describe
|
||||
{
|
||||
|
||||
// describe_enumerators<E>
|
||||
|
||||
template<class E> using describe_enumerators = decltype( boost_enum_descriptor_fn( static_cast<E**>(0) ) );
|
||||
|
||||
// has_describe_enumerators<E>
|
||||
|
||||
namespace detail
|
||||
{
|
||||
|
||||
template<class E, class En = void> struct has_describe_enumerators: std::false_type
|
||||
{
|
||||
};
|
||||
|
||||
template<class E> struct has_describe_enumerators<E, void_t<describe_enumerators<E>>>: std::true_type
|
||||
{
|
||||
};
|
||||
|
||||
} // namespace detail
|
||||
|
||||
template<class E> using has_describe_enumerators = detail::has_describe_enumerators<E>;
|
||||
|
||||
} // namespace describe
|
||||
} // namespace boost
|
||||
|
||||
#endif // defined(BOOST_DESCRIBE_CXX11)
|
||||
|
||||
#endif // #ifndef BOOST_DESCRIBE_ENUMERATORS_HPP_INCLUDED
|
||||
161
linx64/include/boost/describe/members.hpp
Normal file
161
linx64/include/boost/describe/members.hpp
Normal file
@@ -0,0 +1,161 @@
|
||||
#ifndef BOOST_DESCRIBE_DATA_MEMBERS_HPP_INCLUDED
|
||||
#define BOOST_DESCRIBE_DATA_MEMBERS_HPP_INCLUDED
|
||||
|
||||
// Copyright 2020 Peter Dimov
|
||||
// Distributed under the Boost Software License, Version 1.0.
|
||||
// https://www.boost.org/LICENSE_1_0.txt
|
||||
|
||||
#include <boost/describe/modifiers.hpp>
|
||||
#include <boost/describe/bases.hpp>
|
||||
#include <boost/describe/detail/void_t.hpp>
|
||||
#include <boost/describe/detail/cx_streq.hpp>
|
||||
#include <boost/describe/detail/config.hpp>
|
||||
|
||||
#if defined(BOOST_DESCRIBE_CXX11)
|
||||
|
||||
#include <boost/mp11/algorithm.hpp>
|
||||
#include <boost/mp11/utility.hpp>
|
||||
#include <boost/mp11/integral.hpp>
|
||||
#include <boost/mp11/list.hpp>
|
||||
#include <boost/mp11/bind.hpp>
|
||||
#include <type_traits>
|
||||
|
||||
namespace boost
|
||||
{
|
||||
namespace describe
|
||||
{
|
||||
namespace detail
|
||||
{
|
||||
|
||||
// _describe_members<T>
|
||||
|
||||
template<class T> using _describe_public_members = decltype( boost_public_member_descriptor_fn( static_cast<T**>(0) ) );
|
||||
template<class T> using _describe_protected_members = decltype( boost_protected_member_descriptor_fn( static_cast<T**>(0) ) );
|
||||
template<class T> using _describe_private_members = decltype( boost_private_member_descriptor_fn( static_cast<T**>(0) ) );
|
||||
|
||||
template<class T> using _describe_members = mp11::mp_append<_describe_public_members<T>, _describe_protected_members<T>, _describe_private_members<T>>;
|
||||
|
||||
// describe_inherited_members<T>
|
||||
|
||||
// T: type
|
||||
// V: list of virtual bases visited so far
|
||||
template<class T, class V> struct describe_inherited_members_impl;
|
||||
template<class T, class V> using describe_inherited_members = typename describe_inherited_members_impl<T, V>::type;
|
||||
|
||||
// L: list of base class descriptors
|
||||
// T: derived type
|
||||
// V: list of virtual bases visited so far
|
||||
template<class L, class T, class V> struct describe_inherited_members2_impl;
|
||||
template<class L, class T, class V> using describe_inherited_members2 = typename describe_inherited_members2_impl<L, T, V>::type;
|
||||
|
||||
template<class T, class V> struct describe_inherited_members_impl
|
||||
{
|
||||
using R1 = describe_inherited_members2<describe_bases<T, mod_any_access>, T, V>;
|
||||
using R2 = _describe_members<T>;
|
||||
|
||||
using type = mp11::mp_append<R1, R2>;
|
||||
};
|
||||
|
||||
template<template<class...> class L, class T, class V> struct describe_inherited_members2_impl<L<>, T, V>
|
||||
{
|
||||
using type = L<>;
|
||||
};
|
||||
|
||||
template<class D1, class D2> using name_matches = mp11::mp_bool< cx_streq( D1::name, D2::name ) >;
|
||||
|
||||
template<class D, class L> using name_is_hidden = mp11::mp_any_of_q<L, mp11::mp_bind_front<name_matches, D>>;
|
||||
|
||||
constexpr unsigned cx_max( unsigned m1, unsigned m2 )
|
||||
{
|
||||
return m1 > m2? m1: m2;
|
||||
}
|
||||
|
||||
template<class T, unsigned Bm> struct update_modifiers
|
||||
{
|
||||
template<class D> struct fn
|
||||
{
|
||||
using L = _describe_members<T>;
|
||||
static constexpr unsigned hidden = name_is_hidden<D, L>::value? mod_hidden: 0;
|
||||
|
||||
static constexpr unsigned mods = D::modifiers;
|
||||
static constexpr unsigned access = cx_max( mods & mod_any_access, Bm & mod_any_access );
|
||||
|
||||
static constexpr decltype(D::pointer) pointer = D::pointer;
|
||||
static constexpr decltype(D::name) name = D::name;
|
||||
static constexpr unsigned modifiers = ( mods & ~mod_any_access ) | access | mod_inherited | hidden;
|
||||
};
|
||||
};
|
||||
|
||||
#ifndef __cpp_inline_variables
|
||||
template<class T, unsigned Bm> template<class D> constexpr decltype(D::pointer) update_modifiers<T, Bm>::fn<D>::pointer;
|
||||
template<class T, unsigned Bm> template<class D> constexpr decltype(D::name) update_modifiers<T, Bm>::fn<D>::name;
|
||||
template<class T, unsigned Bm> template<class D> constexpr unsigned update_modifiers<T, Bm>::fn<D>::modifiers;
|
||||
#endif
|
||||
|
||||
template<class D> struct gather_virtual_bases_impl;
|
||||
template<class D> using gather_virtual_bases = typename gather_virtual_bases_impl<D>::type;
|
||||
|
||||
template<class D> struct gather_virtual_bases_impl
|
||||
{
|
||||
using B = typename D::type;
|
||||
static constexpr unsigned M = D::modifiers;
|
||||
|
||||
using R1 = mp11::mp_transform<gather_virtual_bases, describe_bases<B, mod_any_access>>;
|
||||
using R2 = mp11::mp_apply<mp11::mp_append, R1>;
|
||||
|
||||
using type = mp11::mp_if_c<(M & mod_virtual) != 0, mp11::mp_push_front<R2, B>, R2>;
|
||||
};
|
||||
|
||||
template<template<class...> class L, class D1, class... D, class T, class V> struct describe_inherited_members2_impl<L<D1, D...>, T, V>
|
||||
{
|
||||
using B = typename D1::type;
|
||||
static constexpr unsigned M = D1::modifiers;
|
||||
|
||||
using R1 = mp11::mp_if_c<(M & mod_virtual) && mp11::mp_contains<V, B>::value, L<>, describe_inherited_members<B, V>>;
|
||||
|
||||
using R2 = mp11::mp_transform_q<update_modifiers<T, M>, R1>;
|
||||
|
||||
using V2 = mp11::mp_append<V, gather_virtual_bases<D1>>;
|
||||
using R3 = describe_inherited_members2<L<D...>, T, V2>;
|
||||
|
||||
using type = mp11::mp_append<R2, R3>;
|
||||
};
|
||||
|
||||
// describe_members<T, M>
|
||||
|
||||
template<class T, unsigned M> using describe_members = mp11::mp_eval_if_c<(M & mod_inherited) == 0, _describe_members<T>, describe_inherited_members, T, mp11::mp_list<>>;
|
||||
|
||||
// member_filter
|
||||
|
||||
template<unsigned M> struct member_filter
|
||||
{
|
||||
template<class T> using fn = mp11::mp_bool<
|
||||
(M & mod_any_access & T::modifiers) != 0 &&
|
||||
( (M & mod_any_member) != 0 || (M & mod_static) == (T::modifiers & mod_static) ) &&
|
||||
( (M & mod_any_member) != 0 || (M & mod_function) == (T::modifiers & mod_function) ) &&
|
||||
(M & mod_hidden) >= (T::modifiers & mod_hidden)
|
||||
>;
|
||||
};
|
||||
|
||||
// has_describe_members
|
||||
|
||||
template<class T, class En = void> struct has_describe_members: std::false_type
|
||||
{
|
||||
};
|
||||
|
||||
template<class T> struct has_describe_members<T, void_t<_describe_members<T>>>: std::true_type
|
||||
{
|
||||
};
|
||||
|
||||
} // namespace detail
|
||||
|
||||
template<class T, unsigned M> using describe_members = mp11::mp_copy_if_q<detail::describe_members<T, M>, detail::member_filter<M>>;
|
||||
|
||||
template<class T> using has_describe_members = detail::has_describe_members<T>;
|
||||
|
||||
} // namespace describe
|
||||
} // namespace boost
|
||||
|
||||
#endif // !defined(BOOST_DESCRIBE_CXX11)
|
||||
|
||||
#endif // #ifndef BOOST_DESCRIBE_DATA_MEMBERS_HPP_INCLUDED
|
||||
30
linx64/include/boost/describe/modifier_description.hpp
Normal file
30
linx64/include/boost/describe/modifier_description.hpp
Normal file
@@ -0,0 +1,30 @@
|
||||
#ifndef BOOST_DESCRIBE_MODIFIER_DESCRIPTION_HPP_INCLUDED
|
||||
#define BOOST_DESCRIBE_MODIFIER_DESCRIPTION_HPP_INCLUDED
|
||||
|
||||
// Copyright 2020, 2022 Peter Dimov
|
||||
// Distributed under the Boost Software License, Version 1.0.
|
||||
// https://www.boost.org/LICENSE_1_0.txt
|
||||
|
||||
#include <boost/describe/modifiers.hpp>
|
||||
#include <boost/describe/enum.hpp>
|
||||
|
||||
namespace boost
|
||||
{
|
||||
namespace describe
|
||||
{
|
||||
|
||||
BOOST_DESCRIBE_ENUM(modifiers,
|
||||
mod_public,
|
||||
mod_protected,
|
||||
mod_private,
|
||||
mod_virtual,
|
||||
mod_static,
|
||||
mod_function,
|
||||
mod_any_member,
|
||||
mod_inherited,
|
||||
mod_hidden)
|
||||
|
||||
} // namespace describe
|
||||
} // namespace boost
|
||||
|
||||
#endif // #ifndef BOOST_DESCRIBE_MODIFIER_DESCRIPTION_HPP_INCLUDED
|
||||
33
linx64/include/boost/describe/modifiers.hpp
Normal file
33
linx64/include/boost/describe/modifiers.hpp
Normal file
@@ -0,0 +1,33 @@
|
||||
#ifndef BOOST_DESCRIBE_MODIFIERS_HPP_INCLUDED
|
||||
#define BOOST_DESCRIBE_MODIFIERS_HPP_INCLUDED
|
||||
|
||||
// Copyright 2020 Peter Dimov
|
||||
// Distributed under the Boost Software License, Version 1.0.
|
||||
// https://www.boost.org/LICENSE_1_0.txt
|
||||
|
||||
#include <boost/describe/detail/config.hpp>
|
||||
|
||||
namespace boost
|
||||
{
|
||||
namespace describe
|
||||
{
|
||||
|
||||
enum modifiers
|
||||
{
|
||||
mod_public = 1,
|
||||
mod_protected = 2,
|
||||
mod_private = 4,
|
||||
mod_virtual = 8,
|
||||
mod_static = 16,
|
||||
mod_function = 32,
|
||||
mod_any_member = 64,
|
||||
mod_inherited = 128,
|
||||
mod_hidden = 256
|
||||
};
|
||||
|
||||
BOOST_DESCRIBE_CONSTEXPR_OR_CONST modifiers mod_any_access = static_cast<modifiers>( mod_public | mod_protected | mod_private );
|
||||
|
||||
} // namespace describe
|
||||
} // namespace boost
|
||||
|
||||
#endif // #ifndef BOOST_DESCRIBE_MODIFIERS_HPP_INCLUDED
|
||||
179
linx64/include/boost/describe/operators.hpp
Normal file
179
linx64/include/boost/describe/operators.hpp
Normal file
@@ -0,0 +1,179 @@
|
||||
#ifndef BOOST_DESCRIBE_OPERATORS_HPP_INCLUDED
|
||||
#define BOOST_DESCRIBE_OPERATORS_HPP_INCLUDED
|
||||
|
||||
// Copyright 2020, 2021 Peter Dimov
|
||||
// Distributed under the Boost Software License, Version 1.0.
|
||||
// https://www.boost.org/LICENSE_1_0.txt
|
||||
|
||||
#include <boost/describe/detail/config.hpp>
|
||||
|
||||
#if defined(BOOST_DESCRIBE_CXX14)
|
||||
|
||||
#include <boost/describe/bases.hpp>
|
||||
#include <boost/describe/members.hpp>
|
||||
#include <boost/describe/modifiers.hpp>
|
||||
#include <boost/mp11/algorithm.hpp>
|
||||
#include <type_traits>
|
||||
#include <iosfwd>
|
||||
|
||||
#if defined(_MSC_VER) && _MSC_VER == 1900
|
||||
# pragma warning(push)
|
||||
# pragma warning(disable: 4100) // unreferenced formal parameter
|
||||
#endif
|
||||
|
||||
namespace boost
|
||||
{
|
||||
namespace describe
|
||||
{
|
||||
|
||||
namespace detail
|
||||
{
|
||||
|
||||
template<class T,
|
||||
class Bd = describe::describe_bases<T, mod_any_access>,
|
||||
class Md = describe::describe_members<T, mod_any_access>>
|
||||
bool eq( T const& t1, T const& t2 )
|
||||
{
|
||||
bool r = true;
|
||||
|
||||
mp11::mp_for_each<Bd>([&](auto D){
|
||||
|
||||
using B = typename decltype(D)::type;
|
||||
r = r && (B const&)t1 == (B const&)t2;
|
||||
|
||||
});
|
||||
|
||||
mp11::mp_for_each<Md>([&](auto D){
|
||||
|
||||
r = r && t1.*D.pointer == t2.*D.pointer;
|
||||
|
||||
});
|
||||
|
||||
return r;
|
||||
}
|
||||
|
||||
template<class T,
|
||||
class Bd = describe::describe_bases<T, mod_any_access>,
|
||||
class Md = describe::describe_members<T, mod_any_access>>
|
||||
bool lt( T const& t1, T const& t2 )
|
||||
{
|
||||
int r = 0;
|
||||
|
||||
mp11::mp_for_each<Bd>([&](auto D){
|
||||
|
||||
using B = typename decltype(D)::type;
|
||||
if( r == 0 && (B const&)t1 < (B const&)t2 ) r = -1;
|
||||
if( r == 0 && (B const&)t2 < (B const&)t1 ) r = +1;
|
||||
|
||||
});
|
||||
|
||||
mp11::mp_for_each<Md>([&](auto D){
|
||||
|
||||
if( r == 0 && t1.*D.pointer < t2.*D.pointer ) r = -1;
|
||||
if( r == 0 && t2.*D.pointer < t1.*D.pointer ) r = +1;
|
||||
|
||||
});
|
||||
|
||||
return r < 0;
|
||||
}
|
||||
|
||||
template<class Os, class T,
|
||||
class Bd = describe::describe_bases<T, mod_any_access>,
|
||||
class Md = describe::describe_members<T, mod_any_access>>
|
||||
void print( Os& os, T const& t )
|
||||
{
|
||||
os << "{";
|
||||
|
||||
bool first = true;
|
||||
|
||||
mp11::mp_for_each<Bd>([&](auto D){
|
||||
|
||||
if( !first ) { os << ", "; }
|
||||
first = false;
|
||||
|
||||
using B = typename decltype(D)::type;
|
||||
os << (B const&)t;
|
||||
|
||||
});
|
||||
|
||||
mp11::mp_for_each<Md>([&](auto D){
|
||||
|
||||
if( !first ) { os << ", "; }
|
||||
first = false;
|
||||
|
||||
os << "." << D.name << " = " << t.*D.pointer;
|
||||
|
||||
});
|
||||
|
||||
os << "}";
|
||||
}
|
||||
|
||||
} // namespace detail
|
||||
|
||||
namespace operators
|
||||
{
|
||||
|
||||
template<class T> std::enable_if_t<
|
||||
has_describe_bases<T>::value && has_describe_members<T>::value && !std::is_union<T>::value, bool>
|
||||
operator==( T const& t1, T const& t2 )
|
||||
{
|
||||
return detail::eq( t1, t2 );
|
||||
}
|
||||
|
||||
template<class T> std::enable_if_t<
|
||||
has_describe_bases<T>::value && has_describe_members<T>::value && !std::is_union<T>::value, bool>
|
||||
operator!=( T const& t1, T const& t2 )
|
||||
{
|
||||
return !detail::eq( t1, t2 );
|
||||
}
|
||||
|
||||
template<class T> std::enable_if_t<
|
||||
has_describe_bases<T>::value && has_describe_members<T>::value && !std::is_union<T>::value, bool>
|
||||
operator<( T const& t1, T const& t2 )
|
||||
{
|
||||
return detail::lt( t1, t2 );
|
||||
}
|
||||
|
||||
template<class T> std::enable_if_t<
|
||||
has_describe_bases<T>::value && has_describe_members<T>::value && !std::is_union<T>::value, bool>
|
||||
operator>=( T const& t1, T const& t2 )
|
||||
{
|
||||
return !detail::lt( t1, t2 );
|
||||
}
|
||||
|
||||
template<class T> std::enable_if_t<
|
||||
has_describe_bases<T>::value && has_describe_members<T>::value && !std::is_union<T>::value, bool>
|
||||
operator>( T const& t1, T const& t2 )
|
||||
{
|
||||
return detail::lt( t2, t1 );
|
||||
}
|
||||
|
||||
template<class T> std::enable_if_t<
|
||||
has_describe_bases<T>::value && has_describe_members<T>::value && !std::is_union<T>::value, bool>
|
||||
operator<=( T const& t1, T const& t2 )
|
||||
{
|
||||
return !detail::lt( t2, t1 );
|
||||
}
|
||||
|
||||
template<class T, class Ch, class Tr> std::enable_if_t<
|
||||
has_describe_bases<T>::value && has_describe_members<T>::value && !std::is_union<T>::value,
|
||||
std::basic_ostream<Ch, Tr>&>
|
||||
operator<<( std::basic_ostream<Ch, Tr>& os, T const& t )
|
||||
{
|
||||
os.width( 0 );
|
||||
detail::print( os, t );
|
||||
return os;
|
||||
}
|
||||
|
||||
} // namespace operators
|
||||
|
||||
} // namespace describe
|
||||
} // namespace boost
|
||||
|
||||
#if defined(_MSC_VER) && _MSC_VER == 1900
|
||||
# pragma warning(pop)
|
||||
#endif
|
||||
|
||||
#endif // defined(BOOST_DESCRIBE_CXX14)
|
||||
|
||||
#endif // #ifndef BOOST_DESCRIBE_OPERATORS_HPP_INCLUDED
|
||||
Reference in New Issue
Block a user