mirror of
https://github.com/boostorg/fusion.git
synced 2025-07-17 06:12:18 +02:00
Add support for BOOST_FUSION_ADAPT_ADT to either deduce types or use specified ones.
This commit is contained in:
@ -2,6 +2,7 @@
|
|||||||
Copyright (c) 2001-2009 Joel de Guzman
|
Copyright (c) 2001-2009 Joel de Guzman
|
||||||
Copyright (c) 2009-2010 Hartmut Kaiser
|
Copyright (c) 2009-2010 Hartmut Kaiser
|
||||||
Copyright (c) 2010-2011 Christopher Schmidt
|
Copyright (c) 2010-2011 Christopher Schmidt
|
||||||
|
Copyright (c) 2013-2014 Damien Buhl
|
||||||
|
|
||||||
Distributed under the Boost Software License, Version 1.0. (See accompanying
|
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)
|
file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
||||||
@ -13,7 +14,9 @@
|
|||||||
#include <boost/fusion/support/config.hpp>
|
#include <boost/fusion/support/config.hpp>
|
||||||
#include <boost/preprocessor/cat.hpp>
|
#include <boost/preprocessor/cat.hpp>
|
||||||
#include <boost/preprocessor/empty.hpp>
|
#include <boost/preprocessor/empty.hpp>
|
||||||
#include <boost/preprocessor/logical/bool.hpp>
|
#include <boost/preprocessor/control/if.hpp>
|
||||||
|
#include <boost/preprocessor/comparison/equal.hpp>
|
||||||
|
#include <boost/preprocessor/comparison/less.hpp>
|
||||||
#include <boost/type_traits/add_reference.hpp>
|
#include <boost/type_traits/add_reference.hpp>
|
||||||
#include <boost/type_traits/is_const.hpp>
|
#include <boost/type_traits/is_const.hpp>
|
||||||
#include <boost/type_traits/add_const.hpp>
|
#include <boost/type_traits/add_const.hpp>
|
||||||
@ -33,13 +36,7 @@
|
|||||||
#include <boost/fusion/adapted/struct/detail/deref_impl.hpp>
|
#include <boost/fusion/adapted/struct/detail/deref_impl.hpp>
|
||||||
#include <boost/fusion/adapted/adt/detail/extension.hpp>
|
#include <boost/fusion/adapted/adt/detail/extension.hpp>
|
||||||
#include <boost/fusion/adapted/adt/detail/adapt_base.hpp>
|
#include <boost/fusion/adapted/adt/detail/adapt_base.hpp>
|
||||||
|
#include <boost/fusion/adapted/adt/detail/adapt_base_attr_filler.hpp>
|
||||||
#define BOOST_FUSION_ADAPT_ADT_FILLER_0(A, B, C, D)\
|
|
||||||
((A, B, C, D)) BOOST_FUSION_ADAPT_ADT_FILLER_1
|
|
||||||
#define BOOST_FUSION_ADAPT_ADT_FILLER_1(A, B, C, D)\
|
|
||||||
((A, B, C, D)) BOOST_FUSION_ADAPT_ADT_FILLER_0
|
|
||||||
#define BOOST_FUSION_ADAPT_ADT_FILLER_0_END
|
|
||||||
#define BOOST_FUSION_ADAPT_ADT_FILLER_1_END
|
|
||||||
|
|
||||||
#define BOOST_FUSION_ADAPT_ADT_C( \
|
#define BOOST_FUSION_ADAPT_ADT_C( \
|
||||||
TEMPLATE_PARAMS_SEQ, NAME_SEQ, IS_VIEW, I, ATTRIBUTE) \
|
TEMPLATE_PARAMS_SEQ, NAME_SEQ, IS_VIEW, I, ATTRIBUTE) \
|
||||||
@ -47,9 +44,12 @@
|
|||||||
TEMPLATE_PARAMS_SEQ, \
|
TEMPLATE_PARAMS_SEQ, \
|
||||||
NAME_SEQ, \
|
NAME_SEQ, \
|
||||||
I, \
|
I, \
|
||||||
ATTRIBUTE, \
|
BOOST_FUSION_ADAPT_ADT_WRAPPEDATTR(ATTRIBUTE), \
|
||||||
4, \
|
BOOST_FUSION_ADAPT_ADT_WRAPPEDATTR_SIZE(ATTRIBUTE), \
|
||||||
BOOST_PP_BOOL(0))
|
BOOST_PP_IF( \
|
||||||
|
BOOST_PP_LESS( \
|
||||||
|
BOOST_FUSION_ADAPT_ADT_WRAPPEDATTR_SIZE(ATTRIBUTE), 4) \
|
||||||
|
, 1, 0))
|
||||||
|
|
||||||
#define BOOST_FUSION_ADAPT_TPL_ADT(TEMPLATE_PARAMS_SEQ, NAME_SEQ , ATTRIBUTES) \
|
#define BOOST_FUSION_ADAPT_TPL_ADT(TEMPLATE_PARAMS_SEQ, NAME_SEQ , ATTRIBUTES) \
|
||||||
BOOST_FUSION_ADAPT_STRUCT_BASE( \
|
BOOST_FUSION_ADAPT_STRUCT_BASE( \
|
||||||
|
@ -11,6 +11,8 @@
|
|||||||
#define BOOST_FUSION_ADAPTED_ADT_DETAIL_ADAPT_BASE_HPP
|
#define BOOST_FUSION_ADAPTED_ADT_DETAIL_ADAPT_BASE_HPP
|
||||||
|
|
||||||
#include <boost/fusion/support/config.hpp>
|
#include <boost/fusion/support/config.hpp>
|
||||||
|
#include <boost/fusion/adapted/struct/detail/adapt_auto.hpp>
|
||||||
|
|
||||||
#include <boost/preprocessor/control/if.hpp>
|
#include <boost/preprocessor/control/if.hpp>
|
||||||
#include <boost/preprocessor/seq/seq.hpp>
|
#include <boost/preprocessor/seq/seq.hpp>
|
||||||
#include <boost/preprocessor/seq/elem.hpp>
|
#include <boost/preprocessor/seq/elem.hpp>
|
||||||
@ -19,6 +21,8 @@
|
|||||||
#include <boost/type_traits/add_const.hpp>
|
#include <boost/type_traits/add_const.hpp>
|
||||||
#include <boost/type_traits/remove_const.hpp>
|
#include <boost/type_traits/remove_const.hpp>
|
||||||
|
|
||||||
|
#include <boost/typeof/typeof.hpp>
|
||||||
|
|
||||||
#define BOOST_FUSION_ADAPT_ADT_GET_IDENTITY_TEMPLATE_IMPL(TEMPLATE_PARAMS_SEQ) \
|
#define BOOST_FUSION_ADAPT_ADT_GET_IDENTITY_TEMPLATE_IMPL(TEMPLATE_PARAMS_SEQ) \
|
||||||
typename detail::get_identity< \
|
typename detail::get_identity< \
|
||||||
lvalue \
|
lvalue \
|
||||||
@ -30,13 +34,24 @@
|
|||||||
\
|
\
|
||||||
boost::remove_const<boost::remove_reference<lvalue>::type>::type
|
boost::remove_const<boost::remove_reference<lvalue>::type>::type
|
||||||
|
|
||||||
|
#define BOOST_FUSION_ADAPT_ADT_ATTRIBUTE_GETEXPR(ATTRIBUTE, \
|
||||||
|
ATTRIBUTE_TUPEL_SIZE, DEDUCE_TYPE) \
|
||||||
|
BOOST_PP_TUPLE_ELEM(ATTRIBUTE_TUPEL_SIZE, \
|
||||||
|
BOOST_PP_IF(DEDUCE_TYPE, 0, 2), ATTRIBUTE)
|
||||||
|
|
||||||
|
#define BOOST_FUSION_ADAPT_ADT_ATTRIBUTE_SETEXPR(ATTRIBUTE, \
|
||||||
|
ATTRIBUTE_TUPEL_SIZE, DEDUCE_TYPE) \
|
||||||
|
BOOST_PP_TUPLE_ELEM(ATTRIBUTE_TUPEL_SIZE, \
|
||||||
|
BOOST_PP_IF(DEDUCE_TYPE, 1, 3), ATTRIBUTE)
|
||||||
|
|
||||||
#define BOOST_FUSION_ADT_ATTRIBUTE_TYPEOF( \
|
#define BOOST_FUSION_ADT_ATTRIBUTE_TYPEOF( \
|
||||||
NAME_SEQ, ATTRIBUTE, ATTRIBUTE_TUPEL_SIZE) \
|
NAME_SEQ, ATTRIBUTE, ATTRIBUTE_TUPEL_SIZE) \
|
||||||
\
|
\
|
||||||
struct deduced_attr_type { \
|
struct deduced_attr_type { \
|
||||||
const BOOST_FUSION_ADAPT_STRUCT_UNPACK_NAME(NAME_SEQ)& obj; \
|
const BOOST_FUSION_ADAPT_STRUCT_UNPACK_NAME(NAME_SEQ)& obj; \
|
||||||
typedef BOOST_TYPEOF( \
|
typedef BOOST_TYPEOF( \
|
||||||
BOOST_PP_TUPLE_ELEM(ATTRIBUTE_TUPEL_SIZE, 2, ATTRIBUTE)) type; \
|
BOOST_FUSION_ADAPT_ADT_ATTRIBUTE_GETEXPR( \
|
||||||
|
ATTRIBUTE, ATTRIBUTE_TUPEL_SIZE, 1)) type; \
|
||||||
}; \
|
}; \
|
||||||
\
|
\
|
||||||
typedef remove_const<deduced_attr_type::type>::type type; \
|
typedef remove_const<deduced_attr_type::type>::type type; \
|
||||||
@ -64,7 +79,7 @@
|
|||||||
BOOST_PP_IF(DEDUCE_TYPE, \
|
BOOST_PP_IF(DEDUCE_TYPE, \
|
||||||
BOOST_FUSION_ADT_ATTRIBUTE_TYPEOF, \
|
BOOST_FUSION_ADT_ATTRIBUTE_TYPEOF, \
|
||||||
BOOST_FUSION_ADT_ATTRIBUTE_GIVENTYPE \
|
BOOST_FUSION_ADT_ATTRIBUTE_GIVENTYPE \
|
||||||
)(NAME_SEQ, ATTRIBUTE, ATTRIBUTE_TUPEL_SIZE) /* XXX: Check PREFIX */\
|
)(NAME_SEQ, ATTRIBUTE, ATTRIBUTE_TUPEL_SIZE) /* XXX: Check PROXY PREFIX */\
|
||||||
\
|
\
|
||||||
template<class Val> \
|
template<class Val> \
|
||||||
BOOST_FUSION_GPU_ENABLED \
|
BOOST_FUSION_GPU_ENABLED \
|
||||||
@ -73,7 +88,8 @@
|
|||||||
BOOST_FUSION_ADAPT_STRUCT_UNPACK_NAME(NAME_SEQ)& obj, \
|
BOOST_FUSION_ADAPT_STRUCT_UNPACK_NAME(NAME_SEQ)& obj, \
|
||||||
Val const& val) \
|
Val const& val) \
|
||||||
{ \
|
{ \
|
||||||
BOOST_PP_TUPLE_ELEM(ATTRIBUTE_TUPEL_SIZE, 3, ATTRIBUTE); \
|
BOOST_FUSION_ADAPT_ADT_ATTRIBUTE_SETEXPR(ATTRIBUTE, \
|
||||||
|
ATTRIBUTE_TUPEL_SIZE, DEDUCE_TYPE); \
|
||||||
} \
|
} \
|
||||||
\
|
\
|
||||||
BOOST_FUSION_GPU_ENABLED \
|
BOOST_FUSION_GPU_ENABLED \
|
||||||
@ -81,7 +97,8 @@
|
|||||||
boost_fusion_adapt_adt_impl_get( \
|
boost_fusion_adapt_adt_impl_get( \
|
||||||
BOOST_FUSION_ADAPT_STRUCT_UNPACK_NAME(NAME_SEQ)& obj) \
|
BOOST_FUSION_ADAPT_STRUCT_UNPACK_NAME(NAME_SEQ)& obj) \
|
||||||
{ \
|
{ \
|
||||||
return BOOST_PP_TUPLE_ELEM(ATTRIBUTE_TUPEL_SIZE, 2, ATTRIBUTE); \
|
return BOOST_FUSION_ADAPT_ADT_ATTRIBUTE_GETEXPR(ATTRIBUTE, \
|
||||||
|
ATTRIBUTE_TUPEL_SIZE, DEDUCE_TYPE); \
|
||||||
} \
|
} \
|
||||||
\
|
\
|
||||||
BOOST_FUSION_GPU_ENABLED \
|
BOOST_FUSION_GPU_ENABLED \
|
||||||
@ -89,7 +106,8 @@
|
|||||||
boost_fusion_adapt_adt_impl_get( \
|
boost_fusion_adapt_adt_impl_get( \
|
||||||
BOOST_FUSION_ADAPT_STRUCT_UNPACK_NAME(NAME_SEQ) const& obj) \
|
BOOST_FUSION_ADAPT_STRUCT_UNPACK_NAME(NAME_SEQ) const& obj) \
|
||||||
{ \
|
{ \
|
||||||
return BOOST_PP_TUPLE_ELEM(ATTRIBUTE_TUPEL_SIZE, 2, ATTRIBUTE); \
|
return BOOST_FUSION_ADAPT_ADT_ATTRIBUTE_GETEXPR(ATTRIBUTE, \
|
||||||
|
ATTRIBUTE_TUPEL_SIZE, DEDUCE_TYPE); \
|
||||||
} \
|
} \
|
||||||
}; \
|
}; \
|
||||||
\
|
\
|
||||||
|
@ -48,7 +48,7 @@
|
|||||||
BOOST_FUSION_ADAPT_STRUCT_WRAPPEDATTR_SIZE(ATTRIBUTE), \
|
BOOST_FUSION_ADAPT_STRUCT_WRAPPEDATTR_SIZE(ATTRIBUTE), \
|
||||||
BOOST_PP_IF( \
|
BOOST_PP_IF( \
|
||||||
BOOST_PP_LESS( \
|
BOOST_PP_LESS( \
|
||||||
BOOST_FUSION_ADAPT_STRUCT_WRAPPEDATTR_SIZE(ATTRIBUTE),2) \
|
BOOST_FUSION_ADAPT_STRUCT_WRAPPEDATTR_SIZE(ATTRIBUTE), 2) \
|
||||||
, 1, 0))
|
, 1, 0))
|
||||||
|
|
||||||
|
|
||||||
|
15
include/boost/fusion/adapted/struct/detail/adapt_auto.hpp
Normal file
15
include/boost/fusion/adapted/struct/detail/adapt_auto.hpp
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
/*=============================================================================
|
||||||
|
Copyright (c) 2013-2014 Damien Buhl
|
||||||
|
|
||||||
|
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_FUSION_ADAPTED_STRUCT_DETAIL_ADAPT_AUTO_HPP
|
||||||
|
#define BOOST_FUSION_ADAPTED_STRUCT_DETAIL_ADAPT_AUTO_HPP
|
||||||
|
|
||||||
|
#include <boost/preprocessor/empty.hpp>
|
||||||
|
|
||||||
|
#define BOOST_FUSION_ADAPT_AUTO BOOST_PP_EMPTY()
|
||||||
|
|
||||||
|
#endif
|
@ -14,6 +14,7 @@
|
|||||||
#include <boost/fusion/support/config.hpp>
|
#include <boost/fusion/support/config.hpp>
|
||||||
#include <boost/config.hpp>
|
#include <boost/config.hpp>
|
||||||
#include <boost/fusion/support/tag_of_fwd.hpp>
|
#include <boost/fusion/support/tag_of_fwd.hpp>
|
||||||
|
#include <boost/fusion/adapted/struct/detail/adapt_auto.hpp>
|
||||||
|
|
||||||
#include <boost/preprocessor/empty.hpp>
|
#include <boost/preprocessor/empty.hpp>
|
||||||
#include <boost/preprocessor/stringize.hpp>
|
#include <boost/preprocessor/stringize.hpp>
|
||||||
@ -35,7 +36,6 @@
|
|||||||
|
|
||||||
#include <boost/typeof/typeof.hpp>
|
#include <boost/typeof/typeof.hpp>
|
||||||
|
|
||||||
#define BOOST_FUSION_ADAPT_AUTO BOOST_PP_EMPTY()
|
|
||||||
|
|
||||||
#define BOOST_FUSION_ADAPT_STRUCT_UNPACK_NAME_TEMPLATE_PARAMS(SEQ) \
|
#define BOOST_FUSION_ADAPT_STRUCT_UNPACK_NAME_TEMPLATE_PARAMS(SEQ) \
|
||||||
BOOST_PP_SEQ_HEAD(SEQ)<BOOST_PP_SEQ_ENUM(BOOST_PP_SEQ_TAIL(SEQ))> \
|
BOOST_PP_SEQ_HEAD(SEQ)<BOOST_PP_SEQ_ENUM(BOOST_PP_SEQ_TAIL(SEQ))> \
|
||||||
|
@ -93,8 +93,8 @@ namespace ns
|
|||||||
|
|
||||||
BOOST_FUSION_ADAPT_ADT(
|
BOOST_FUSION_ADAPT_ADT(
|
||||||
ns::point,
|
ns::point,
|
||||||
(int, int, obj.get_x(), obj.set_x(val))
|
(obj.get_x(), obj.set_x(val))
|
||||||
(int, int, obj.get_y(), obj.set_y(val))
|
(obj.get_y(), obj.set_y(val))
|
||||||
)
|
)
|
||||||
|
|
||||||
#if !BOOST_WORKAROUND(__GNUC__,<4)
|
#if !BOOST_WORKAROUND(__GNUC__,<4)
|
||||||
|
Reference in New Issue
Block a user