Merge pull request #85 from Flast/feature/no_bounds_sequence

Feature/no bounds sequence
This commit is contained in:
Joel de Guzman
2015-06-25 23:09:18 +08:00
10 changed files with 161 additions and 13 deletions

View File

@ -10,12 +10,13 @@
#include <boost/fusion/support/config.hpp>
#include <boost/mpl/int.hpp>
#include <boost/mpl/if.hpp>
#include <boost/mpl/or.hpp>
#include <boost/mpl/less.hpp>
#include <boost/mpl/empty_base.hpp>
#include <boost/type_traits/is_const.hpp>
#include <boost/fusion/sequence/intrinsic_fwd.hpp>
#include <boost/fusion/support/tag_of.hpp>
#include <boost/fusion/support/detail/access.hpp>
#include <boost/fusion/support/category_of.hpp>
namespace boost { namespace fusion
{
@ -64,7 +65,10 @@ namespace boost { namespace fusion
template <typename Sequence, typename N, typename Tag>
struct at_impl
: mpl::if_<
mpl::less<N, typename extension::size_impl<Tag>::template apply<Sequence>::type>
mpl::or_<
mpl::less<N, typename extension::size_impl<Tag>::template apply<Sequence>::type>
, traits::is_unbounded<Sequence>
>
, typename extension::at_impl<Tag>::template apply<Sequence, N>
, mpl::empty_base
>::type

View File

@ -11,10 +11,15 @@
#include <boost/fusion/support/config.hpp>
#include <boost/type_traits/is_const.hpp>
#include <boost/fusion/sequence/intrinsic_fwd.hpp>
#include <boost/fusion/sequence/intrinsic/has_key.hpp>
#include <boost/fusion/algorithm/query/find.hpp>
#include <boost/fusion/iterator/deref_data.hpp>
#include <boost/fusion/support/tag_of.hpp>
#include <boost/fusion/support/category_of.hpp>
#include <boost/fusion/support/detail/access.hpp>
#include <boost/mpl/empty_base.hpp>
#include <boost/mpl/if.hpp>
#include <boost/mpl/or.hpp>
namespace boost { namespace fusion
{
@ -64,12 +69,26 @@ namespace boost { namespace fusion
struct at_key_impl<std_pair_tag>;
}
namespace detail
{
template <typename Sequence, typename Key, typename Tag>
struct at_key_impl
: mpl::if_<
mpl::or_<
typename extension::has_key_impl<Tag>::template apply<Sequence, Key>
, traits::is_unbounded<Sequence>
>
, typename extension::at_key_impl<Tag>::template apply<Sequence, Key>
, mpl::empty_base
>::type
{};
}
namespace result_of
{
template <typename Sequence, typename Key>
struct at_key
: extension::at_key_impl<typename detail::tag_of<Sequence>::type>::
template apply<Sequence, Key>
: detail::at_key_impl<Sequence, Key, typename detail::tag_of<Sequence>::type>
{};
}

View File

@ -9,8 +9,13 @@
#include <boost/fusion/support/config.hpp>
#include <boost/mpl/int.hpp>
#include <boost/mpl/if.hpp>
#include <boost/mpl/or.hpp>
#include <boost/mpl/less.hpp>
#include <boost/mpl/empty_base.hpp>
#include <boost/fusion/sequence/intrinsic_fwd.hpp>
#include <boost/fusion/support/tag_of.hpp>
#include <boost/fusion/support/category_of.hpp>
namespace boost { namespace fusion
{
@ -50,12 +55,26 @@ namespace boost { namespace fusion
struct value_at_impl<std_pair_tag>;
}
namespace detail
{
template <typename Sequence, typename N, typename Tag>
struct value_at_impl
: mpl::if_<
mpl::or_<
mpl::less<N, typename extension::size_impl<Tag>::template apply<Sequence>::type>
, traits::is_unbounded<Sequence>
>
, typename extension::value_at_impl<Tag>::template apply<Sequence, N>
, mpl::empty_base
>::type
{};
}
namespace result_of
{
template <typename Sequence, typename N>
struct value_at
: extension::value_at_impl<typename detail::tag_of<Sequence>::type>::
template apply<Sequence, N>
: detail::value_at_impl<Sequence, N, typename detail::tag_of<Sequence>::type>
{};
template <typename Sequence, int N>

View File

@ -10,10 +10,15 @@
#include <boost/fusion/support/config.hpp>
#include <boost/mpl/int.hpp>
#include <boost/mpl/empty_base.hpp>
#include <boost/mpl/if.hpp>
#include <boost/mpl/or.hpp>
#include <boost/fusion/sequence/intrinsic_fwd.hpp>
#include <boost/fusion/sequence/intrinsic/has_key.hpp>
#include <boost/fusion/iterator/value_of_data.hpp>
#include <boost/fusion/algorithm/query/find.hpp>
#include <boost/fusion/support/tag_of.hpp>
#include <boost/fusion/support/category_of.hpp>
namespace boost { namespace fusion
{
@ -52,13 +57,27 @@ namespace boost { namespace fusion
template <>
struct value_at_key_impl<std_pair_tag>;
}
namespace detail
{
template <typename Sequence, typename N, typename Tag>
struct value_at_key_impl
: mpl::if_<
mpl::or_<
typename extension::has_key_impl<Tag>::template apply<Sequence, N>
, traits::is_unbounded<Sequence>
>
, typename extension::value_at_key_impl<Tag>::template apply<Sequence, N>
, mpl::empty_base
>::type
{};
}
namespace result_of
{
template <typename Sequence, typename N>
struct value_at_key
: extension::value_at_key_impl<typename detail::tag_of<Sequence>::type>::
template apply<Sequence, N>
: detail::value_at_key_impl<Sequence, N, typename detail::tag_of<Sequence>::type>
{};
}
}}

View File

@ -36,6 +36,8 @@ namespace boost { namespace fusion
struct associative_tag {};
struct unbounded_tag {};
namespace extension
{
template<typename Tag>
@ -107,6 +109,13 @@ namespace boost { namespace fusion
random_access_traversal_tag
, typename category_of<T>::type>
{};
template <typename T>
struct is_unbounded
: is_base_of<
unbounded_tag
, typename category_of<T>::type>
{};
}
}}