diff --git a/include/boost/fusion/container/deque/cpp11_deque.hpp b/include/boost/fusion/container/deque/cpp11_deque.hpp new file mode 100644 index 00000000..c6d70d33 --- /dev/null +++ b/include/boost/fusion/container/deque/cpp11_deque.hpp @@ -0,0 +1,127 @@ +/*============================================================================= + 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 diff --git a/include/boost/fusion/container/deque/cpp11_deque_fwd.hpp b/include/boost/fusion/container/deque/cpp11_deque_fwd.hpp new file mode 100644 index 00000000..420fe611 --- /dev/null +++ b/include/boost/fusion/container/deque/cpp11_deque_fwd.hpp @@ -0,0 +1,19 @@ +/*============================================================================= + Copyright (c) 2005-2012 Joel de Guzman + Copyright (c) 2005-2007 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(FUSION_CPP11_DEQUE_FORWARD_04072012_0355) +#define FUSION_CPP11_DEQUE_FORWARD_04072012_0355 + +namespace boost { namespace fusion +{ + struct void_; + + template + struct deque; +}} + +#endif