190 lines
		
	
	
		
			7.0 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
		
		
			
		
	
	
			190 lines
		
	
	
		
			7.0 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
|   | /*============================================================================= | ||
|  |     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_FUSION_DEQUE_26112006_1649) | ||
|  | #define BOOST_FUSION_DEQUE_26112006_1649 | ||
|  | 
 | ||
|  | # include <boost/fusion/container/deque/deque_fwd.hpp> | ||
|  | 
 | ||
|  | /////////////////////////////////////////////////////////////////////////////// | ||
|  | // Without variadics, we will use the PP version | ||
|  | /////////////////////////////////////////////////////////////////////////////// | ||
|  | #if !defined(BOOST_FUSION_HAS_VARIADIC_DEQUE) | ||
|  | # include <boost/fusion/container/deque/detail/cpp03/deque.hpp> | ||
|  | #else | ||
|  | 
 | ||
|  | /////////////////////////////////////////////////////////////////////////////// | ||
|  | // C++11 interface | ||
|  | /////////////////////////////////////////////////////////////////////////////// | ||
|  | #include <boost/fusion/support/sequence_base.hpp> | ||
|  | #include <boost/fusion/support/void.hpp> | ||
|  | #include <boost/fusion/support/detail/enabler.hpp> | ||
|  | #include <boost/fusion/support/detail/access.hpp> | ||
|  | #include <boost/fusion/support/is_sequence.hpp> | ||
|  | #include <boost/fusion/container/deque/detail/keyed_element.hpp> | ||
|  | #include <boost/fusion/container/deque/detail/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> | ||
|  | #include <boost/fusion/container/deque/detail/begin_impl.hpp> | ||
|  | #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/fusion/sequence/intrinsic/empty.hpp> | ||
|  | 
 | ||
|  | #include <boost/mpl/int.hpp> | ||
|  | #include <boost/mpl/and.hpp> | ||
|  | #include <boost/utility/enable_if.hpp> | ||
|  | #include <boost/type_traits/is_convertible.hpp> | ||
|  | 
 | ||
|  | namespace boost { namespace fusion | ||
|  | { | ||
|  |     struct deque_tag; | ||
|  | 
 | ||
|  |     template <typename ...Elements> | ||
|  |     struct deque : detail::nil_keyed_element | ||
|  |     { | ||
|  |         typedef deque_tag fusion_tag; | ||
|  |         typedef bidirectional_traversal_tag category; | ||
|  |         typedef mpl::int_<0> size; | ||
|  |         typedef mpl::int_<0> next_up; | ||
|  |         typedef mpl::int_<-1> next_down; | ||
|  |         typedef mpl::false_ is_view; | ||
|  | 
 | ||
|  |         template <typename Sequence> | ||
|  |         BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED | ||
|  |         deque(Sequence const&, | ||
|  |             typename enable_if< | ||
|  |                 mpl::and_< | ||
|  |                     traits::is_sequence<Sequence> | ||
|  |                   , result_of::empty<Sequence>>, detail::enabler_>::type = detail::enabler) BOOST_NOEXCEPT | ||
|  |         {} | ||
|  | 
 | ||
|  |         BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED | ||
|  |         deque() BOOST_NOEXCEPT {} | ||
|  |     }; | ||
|  | 
 | ||
|  |     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<Head, Tail...>::type base; | ||
|  |         typedef mpl::int_<(sizeof ...(Tail) + 1)> size; | ||
|  |         typedef mpl::int_<size::value> next_up; | ||
|  |         typedef mpl::int_<-1> next_down; | ||
|  |         typedef mpl::false_ is_view; | ||
|  | 
 | ||
|  |         BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED | ||
|  |         deque() | ||
|  |         {} | ||
|  | 
 | ||
|  |         template <typename Head_, typename ...Tail_, typename = | ||
|  |             typename enable_if<is_convertible<Head_, Head> >::type | ||
|  |         > | ||
|  |         BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED | ||
|  |         deque(deque<Head_, Tail_...> const& seq) | ||
|  |           : base(seq) | ||
|  |         {} | ||
|  | 
 | ||
|  |         template <typename Head_, typename ...Tail_, typename = | ||
|  |             typename enable_if<is_convertible<Head_, Head> >::type | ||
|  |         > | ||
|  |         BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED | ||
|  |         deque(deque<Head_, Tail_...>& seq) | ||
|  |           : base(seq) | ||
|  |         {} | ||
|  | 
 | ||
|  | #if !defined(BOOST_NO_CXX11_RVALUE_REFERENCES) | ||
|  |         template <typename Head_, typename ...Tail_, typename = | ||
|  |             typename enable_if<is_convertible<Head_, Head> >::type | ||
|  |         > | ||
|  |         BOOST_CXX14_CONSTEXPR BOOST_FUSION_GPU_ENABLED | ||
|  |         deque(deque<Head_, Tail_...>&& seq) | ||
|  |           : base(std::forward<deque<Head_, Tail_...>>(seq)) | ||
|  |         {} | ||
|  | #endif | ||
|  | 
 | ||
|  |         BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED | ||
|  |         deque(deque const& seq) | ||
|  |           : base(seq) | ||
|  |         {} | ||
|  | 
 | ||
|  | #if !defined(BOOST_NO_CXX11_RVALUE_REFERENCES) | ||
|  |         BOOST_CXX14_CONSTEXPR BOOST_FUSION_GPU_ENABLED | ||
|  |         deque(deque&& seq) | ||
|  |           : base(std::forward<deque>(seq)) | ||
|  |         {} | ||
|  | #endif | ||
|  | 
 | ||
|  |         BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED | ||
|  |         explicit deque(typename detail::call_param<Head>::type head | ||
|  |                      , typename detail::call_param<Tail>::type... tail) | ||
|  |           : base(detail::deque_keyed_values<Head, Tail...>::construct(head, tail...)) | ||
|  |         {} | ||
|  | 
 | ||
|  | #if !defined(BOOST_NO_CXX11_RVALUE_REFERENCES) | ||
|  |         template <typename Head_, typename ...Tail_, typename = | ||
|  |             typename enable_if<is_convertible<Head_, Head> >::type | ||
|  |         > | ||
|  |         BOOST_CXX14_CONSTEXPR BOOST_FUSION_GPU_ENABLED | ||
|  |         explicit deque(Head_&& head, Tail_&&... tail) | ||
|  |           : base(detail::deque_keyed_values<Head, Tail...> | ||
|  |                 ::forward_(BOOST_FUSION_FWD_ELEM(Head_, head), BOOST_FUSION_FWD_ELEM(Tail_, tail)...)) | ||
|  |         {} | ||
|  | #else | ||
|  |         template <typename Head_, typename ...Tail_, typename = | ||
|  |             typename enable_if<is_convertible<Head_, Head> >::type | ||
|  |         > | ||
|  |         BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED | ||
|  |         explicit deque(Head_ const& head, Tail_ const&... tail) | ||
|  |           : base(detail::deque_keyed_values<Head_, Tail_...>::construct(head, tail...)) | ||
|  |         {} | ||
|  | #endif | ||
|  | 
 | ||
|  |         template <typename Sequence> | ||
|  |         BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED | ||
|  |         explicit deque(Sequence const& seq | ||
|  |           , typename disable_if<is_convertible<Sequence, Head>, detail::enabler_>::type = detail::enabler | ||
|  |           , typename enable_if<traits::is_sequence<Sequence>, detail::enabler_>::type = detail::enabler) | ||
|  |           : base(base::from_iterator(fusion::begin(seq))) | ||
|  |         {} | ||
|  | 
 | ||
|  |         template <typename ...Elements> | ||
|  |         BOOST_CXX14_CONSTEXPR BOOST_FUSION_GPU_ENABLED | ||
|  |         deque& operator=(deque<Elements...> const& rhs) | ||
|  |         { | ||
|  |             base::operator=(rhs); | ||
|  |             return *this; | ||
|  |         } | ||
|  | 
 | ||
|  |         template <typename T> | ||
|  |         BOOST_CXX14_CONSTEXPR BOOST_FUSION_GPU_ENABLED | ||
|  |         deque& operator=(T const& rhs) | ||
|  |         { | ||
|  |             base::operator=(rhs); | ||
|  |             return *this; | ||
|  |         } | ||
|  | 
 | ||
|  | #if !defined(BOOST_NO_CXX11_RVALUE_REFERENCES) | ||
|  |         template <typename T> | ||
|  |         BOOST_CXX14_CONSTEXPR BOOST_FUSION_GPU_ENABLED | ||
|  |         deque& operator=(T&& rhs) | ||
|  |         { | ||
|  |             base::operator=(BOOST_FUSION_FWD_ELEM(T, rhs)); | ||
|  |             return *this; | ||
|  |         } | ||
|  | #endif | ||
|  | 
 | ||
|  |     }; | ||
|  | }} | ||
|  | 
 | ||
|  | #endif | ||
|  | #endif |