diff --git a/include/boost/fusion/sequence/intrinsic/at.hpp b/include/boost/fusion/sequence/intrinsic/at.hpp index fdfa72a6..319165b8 100644 --- a/include/boost/fusion/sequence/intrinsic/at.hpp +++ b/include/boost/fusion/sequence/intrinsic/at.hpp @@ -10,12 +10,13 @@ #include #include #include +#include #include #include #include #include #include -#include +#include namespace boost { namespace fusion { @@ -64,7 +65,10 @@ namespace boost { namespace fusion template struct at_impl : mpl::if_< - mpl::less::template apply::type> + mpl::or_< + mpl::less::template apply::type> + , traits::has_no_bounds + > , typename extension::at_impl::template apply , mpl::empty_base >::type diff --git a/include/boost/fusion/sequence/intrinsic/value_at.hpp b/include/boost/fusion/sequence/intrinsic/value_at.hpp index 362669b5..875b4b41 100644 --- a/include/boost/fusion/sequence/intrinsic/value_at.hpp +++ b/include/boost/fusion/sequence/intrinsic/value_at.hpp @@ -9,8 +9,13 @@ #include #include +#include +#include +#include +#include #include #include +#include namespace boost { namespace fusion { @@ -50,12 +55,26 @@ namespace boost { namespace fusion struct value_at_impl; } + namespace detail + { + template + struct value_at_impl + : mpl::if_< + mpl::or_< + mpl::less::template apply::type> + , traits::has_no_bounds + > + , typename extension::value_at_impl::template apply + , mpl::empty_base + >::type + {}; + } + namespace result_of { template struct value_at - : extension::value_at_impl::type>:: - template apply + : detail::value_at_impl::type> {}; template diff --git a/include/boost/fusion/support/category_of.hpp b/include/boost/fusion/support/category_of.hpp index 6bdf6d02..5fa0b3ad 100644 --- a/include/boost/fusion/support/category_of.hpp +++ b/include/boost/fusion/support/category_of.hpp @@ -36,6 +36,8 @@ namespace boost { namespace fusion struct associative_tag {}; + struct no_bounds_tag {}; + namespace extension { template @@ -107,6 +109,13 @@ namespace boost { namespace fusion random_access_traversal_tag , typename category_of::type> {}; + + template + struct has_no_bounds + : is_base_of< + no_bounds_tag + , typename category_of::type> + {}; } }}