#pragma once #include #include #include #include #include #include #include #include #include #include #include #include namespace friendly_fusion { namespace traits { template struct is_sequence : public boost::fusion::traits::is_sequence { static_assert(NoCheck || boost::fusion::traits::is_sequence::value, "Template parameter: T, is not a fusion adapted struct."); }; template struct is_fusion_iterator : public boost::fusion::is_fusion_iterator { static_assert(NoCheck || boost::fusion::is_fusion_iterator::value, "Template parameter: T. Is not a fusion iterator."); }; template struct is_view : public boost::fusion::traits::is_view { static_assert(NoCheck || boost::fusion::traits::is_view::value, "Template parameter: T, is not a fusion view"); }; template struct is_sequence_or_view : public boost::mpl::or_, typename boost::fusion::traits::is_view> { static_assert(NoCheck || (boost::fusion::traits::is_sequence::value || boost::fusion::traits::is_view::value), "Template parameter: T, is not a fusion sequence or a view"); }; } template typename std::enable_if::value, typename boost::fusion::result_of::deref::type>::type deref(T const& x) { return boost::fusion::deref(x); } template typename std::enable_if::value, typename boost::fusion::result_of::advance_c::type>::type advance_c(T const& x) { return boost::fusion::advance_c(x); } template typename std::enable_if::value, typename boost::fusion::result_of::begin::type>::type const begin(T& x) { return boost::fusion::begin(x); } template typename std::enable_if::value, typename boost::fusion::result_of::begin::type>::type const begin(T const& x) { return boost::fusion::begin(x); } template typename std::enable_if::value, typename boost::fusion::result_of::end::type>::type const end(T& x) { return boost::fusion::end(x); } template typename std::enable_if::value, typename boost::fusion::result_of::end::type>::type const end(T const& x) { return boost::fusion::end(x); } namespace result_of { template struct size : private traits::is_sequence_or_view, public boost::fusion::result_of::size { using typename boost::fusion::result_of::size::type; }; template struct begin : private traits::is_sequence_or_view, public boost::fusion::result_of::begin { using typename boost::fusion::result_of::begin::type; }; template struct end : private traits::is_sequence_or_view, public boost::fusion::result_of::end { using typename boost::fusion::result_of::end::type; }; template struct advance_c : private traits::is_fusion_iterator, public boost::fusion::result_of::advance_c { using typename boost::fusion::result_of::advance_c::type; }; template struct deref : private traits::is_fusion_iterator, public boost::fusion::result_of::deref { using typename boost::fusion::result_of::deref::type; }; } namespace extension { template struct struct_member_name : private traits::is_sequence, public boost::fusion::extension::struct_member_name {}; } }