diff options
Diffstat (limited to 'boost/fusion/container/deque/deque.hpp')
-rw-r--r-- | boost/fusion/container/deque/deque.hpp | 133 |
1 files changed, 57 insertions, 76 deletions
diff --git a/boost/fusion/container/deque/deque.hpp b/boost/fusion/container/deque/deque.hpp index 97238f4ada..215981e422 100644 --- a/boost/fusion/container/deque/deque.hpp +++ b/boost/fusion/container/deque/deque.hpp @@ -1,5 +1,5 @@ /*============================================================================= - Copyright (c) 2005-2011 Joel de Guzman + Copyright (c) 2005-2012 Joel de Guzman Copyright (c) 2005-2006 Dan Marsden Distributed under the Boost Software License, Version 1.0. (See accompanying @@ -8,20 +8,27 @@ #if !defined(BOOST_FUSION_DEQUE_26112006_1649) #define BOOST_FUSION_DEQUE_26112006_1649 -#include <boost/fusion/container/deque/limits.hpp> -#include <boost/fusion/container/deque/front_extended_deque.hpp> -#include <boost/fusion/container/deque/back_extended_deque.hpp> -#include <boost/fusion/container/deque/detail/deque_keyed_values.hpp> -#include <boost/fusion/container/deque/detail/deque_initial_size.hpp> +#include <boost/config.hpp> + +/////////////////////////////////////////////////////////////////////////////// +// With no decltype and variadics, we will use the C++03 version +/////////////////////////////////////////////////////////////////////////////// +#if (defined(BOOST_NO_DECLTYPE) \ + || defined(BOOST_NO_VARIADIC_TEMPLATES) \ + || defined(BOOST_NO_RVALUE_REFERENCES)) +# include <boost/fusion/container/deque/detail/cpp03_deque.hpp> +#else +# if !defined(BOOST_FUSION_HAS_CPP11_DEQUE) +# define BOOST_FUSION_HAS_CPP11_DEQUE +# endif + +/////////////////////////////////////////////////////////////////////////////// +// C++11 interface +/////////////////////////////////////////////////////////////////////////////// #include <boost/fusion/support/sequence_base.hpp> +#include <boost/fusion/support/detail/access.hpp> #include <boost/fusion/container/deque/detail/keyed_element.hpp> -#include <boost/preprocessor/repetition/enum_params.hpp> -#include <boost/preprocessor/repetition/enum_binary_params.hpp> -#include <boost/preprocessor/repetition/enum_params_with_a_default.hpp> -#include <boost/type_traits/add_reference.hpp> -#include <boost/type_traits/add_const.hpp> -#include <boost/type_traits/is_convertible.hpp> - +#include <boost/fusion/container/deque/detail/cpp11_deque_keyed_values.hpp> #include <boost/fusion/container/deque/deque_fwd.hpp> #include <boost/fusion/container/deque/detail/value_at_impl.hpp> #include <boost/fusion/container/deque/detail/at_impl.hpp> @@ -29,93 +36,67 @@ #include <boost/fusion/container/deque/detail/end_impl.hpp> #include <boost/fusion/container/deque/detail/is_sequence_impl.hpp> #include <boost/fusion/sequence/intrinsic/begin.hpp> -#include <boost/mpl/bool.hpp> -#include <boost/fusion/support/sequence_base.hpp> -#include <boost/fusion/support/void.hpp> +#include <boost/mpl/int.hpp> #include <boost/utility/enable_if.hpp> +#include <boost/type_traits/is_convertible.hpp> -#if !defined(BOOST_FUSION_DONT_USE_PREPROCESSED_FILES) -#include <boost/fusion/container/deque/detail/preprocessed/deque.hpp> -#else -#if defined(__WAVE__) && defined(BOOST_FUSION_CREATE_PREPROCESSED_FILES) -#pragma wave option(preserve: 2, line: 0, output: "detail/preprocessed/deque" FUSION_MAX_DEQUE_SIZE_STR ".hpp") -#endif - -/*============================================================================= - Copyright (c) 2001-2011 Joel de Guzman - - 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) - - This is an auto-generated file. Do not edit! -==============================================================================*/ - -#if defined(__WAVE__) && defined(BOOST_FUSION_CREATE_PREPROCESSED_FILES) -#pragma wave option(preserve: 1) -#endif - -namespace boost { namespace fusion { - +namespace boost { namespace fusion +{ struct deque_tag; - template<BOOST_PP_ENUM_PARAMS(FUSION_MAX_DEQUE_SIZE, typename T)> - struct deque - : - detail::deque_keyed_values<BOOST_PP_ENUM_PARAMS(FUSION_MAX_DEQUE_SIZE, T)>::type, - sequence_base<deque<BOOST_PP_ENUM_PARAMS(FUSION_MAX_DEQUE_SIZE, T)> > + template <typename ...Elements> + struct deque : detail::nil_keyed_element + { + }; + + template <typename Head, typename ...Tail> + struct deque<Head, Tail...> + : detail::deque_keyed_values<Head, Tail...>::type + , sequence_base<deque<Head, Tail...>> { typedef deque_tag fusion_tag; typedef bidirectional_traversal_tag category; - typedef typename detail::deque_keyed_values<BOOST_PP_ENUM_PARAMS(FUSION_MAX_DEQUE_SIZE, T)>::type base; - typedef typename detail::deque_initial_size<BOOST_PP_ENUM_PARAMS(FUSION_MAX_DEQUE_SIZE, T)>::type size; + typedef typename detail::deque_keyed_values<Head, Tail...>::type base; + typedef mpl::int_<(sizeof ...(Tail) + 1)> size; typedef mpl::int_<size::value> next_up; - typedef mpl::int_< - mpl::if_<mpl::equal_to<size, mpl::int_<0> >, mpl::int_<0>, mpl::int_<-1> >::type::value> next_down; + typedef mpl::int_<mpl::int_<((size::value == 0) ? 0 : -1)>::type::value> next_down; typedef mpl::false_ is_view; -#include <boost/fusion/container/deque/detail/deque_forward_ctor.hpp> - deque() - {} - - explicit deque(typename add_reference<typename add_const<T0>::type>::type t0) - : base(t0, detail::nil_keyed_element()) - {} - - template<BOOST_PP_ENUM_PARAMS(FUSION_MAX_DEQUE_SIZE, typename U)> - deque(deque<BOOST_PP_ENUM_PARAMS(FUSION_MAX_DEQUE_SIZE, U)> const& seq) - : base(seq) - {} - - template<typename Sequence> - deque(Sequence const& seq, typename disable_if<is_convertible<Sequence, T0> >::type* /*dummy*/ = 0) - : base(base::from_iterator(fusion::begin(seq))) - {} - - template <BOOST_PP_ENUM_PARAMS(FUSION_MAX_DEQUE_SIZE, typename U)> - deque& - operator=(deque<BOOST_PP_ENUM_PARAMS(FUSION_MAX_DEQUE_SIZE, U)> const& rhs) + {} + + template <typename ...Elements> + deque(deque<Elements...> const& seq) + : base(seq) + {} + + explicit deque(typename detail::call_param<Head>::type head + , typename detail::call_param<Tail>::type... tail) + : base(detail::deque_keyed_values<Head, Tail...>::call(head, tail...)) + {} + + template <typename Sequence> + explicit deque(Sequence const& seq + , typename disable_if<is_convertible<Sequence, Head> >::type* /*dummy*/ = 0) + : base(base::from_iterator(fusion::begin(seq))) + {} + + template <typename ...Elements> + deque& operator=(deque<Elements...> const& rhs) { base::operator=(rhs); return *this; } template <typename T> - deque& - operator=(T const& rhs) + deque& operator=(T const& rhs) { base::operator=(rhs); return *this; } - }; }} -#if defined(__WAVE__) && defined(BOOST_FUSION_CREATE_PREPROCESSED_FILES) -#pragma wave option(output: null) #endif - -#endif // BOOST_FUSION_DONT_USE_PREPROCESSED_FILES - #endif |