/*============================================================================= Copyright (c) 2005-2012 Joel de Guzman Copyright (c) 2005-2006 Dan Marsden 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) ==============================================================================*/ #if !defined(BOOST_CPP03_FUSION_DEQUE_26112006_1649) #define BOOST_CPP03_FUSION_DEQUE_26112006_1649 #include #include #include #include #include #include #include #include #include #include #include #include #include #include namespace boost { namespace fusion { namespace detail { template struct keyed_element; template struct deque_keyed_values_impl; template struct deque_keyed_values_impl { typedef mpl::int_<(N::value + 1)> next_index; typedef typename deque_keyed_values_impl::type tail; typedef keyed_element type; static type call( typename add_reference::type>::type head , typename add_reference::type>::type... tail) { return type( head , deque_keyed_values_impl::call(tail...) ); } }; struct nil_keyed_element; template struct deque_keyed_values_impl { typedef nil_keyed_element type; static type call() { return type(); } }; template struct deque_keyed_values : deque_keyed_values_impl, Elements...> {}; } struct deque_tag; template struct deque; template struct deque : detail::deque_keyed_values::type , sequence_base> { typedef deque_tag fusion_tag; typedef bidirectional_traversal_tag category; typedef typename detail::deque_keyed_values::type base; typedef mpl::int_<(sizeof ...(Tail) + 1)> size; typedef mpl::int_ next_up; typedef mpl::int_::type::value> next_down; typedef mpl::false_ is_view; deque() {} explicit deque(typename add_reference::type>::type elem) : base(elem, detail::nil_keyed_element()) {} template deque(deque const& seq) : base(seq) {} deque(typename add_reference::type>::type head , typename add_reference::type>::type... tail) : base(detail::deque_keyed_values::call(head, tail...)) {} template deque(Sequence const& seq , typename disable_if >::type* /*dummy*/ = 0) : base(base::from_iterator(fusion::begin(seq))) {} template deque& operator=(deque const& rhs) { base::operator=(rhs); return *this; } template deque& operator=(T const& rhs) { base::operator=(rhs); return *this; } }; }} #endif