deque.hpp 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160
  1. /*=============================================================================
  2. Copyright (c) 2005-2012 Joel de Guzman
  3. Copyright (c) 2005-2006 Dan Marsden
  4. Distributed under the Boost Software License, Version 1.0. (See accompanying
  5. file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
  6. ==============================================================================*/
  7. #if !defined(BOOST_FUSION_DEQUE_26112006_1649)
  8. #define BOOST_FUSION_DEQUE_26112006_1649
  9. # include <boost/fusion/container/deque/deque_fwd.hpp>
  10. ///////////////////////////////////////////////////////////////////////////////
  11. // Without variadics, we will use the PP version
  12. ///////////////////////////////////////////////////////////////////////////////
  13. #if !defined(BOOST_FUSION_HAS_VARIADIC_DEQUE)
  14. # include <boost/fusion/container/deque/detail/cpp03/deque.hpp>
  15. #else
  16. ///////////////////////////////////////////////////////////////////////////////
  17. // C++11 interface
  18. ///////////////////////////////////////////////////////////////////////////////
  19. #include <boost/fusion/support/sequence_base.hpp>
  20. #include <boost/fusion/support/detail/access.hpp>
  21. #include <boost/fusion/support/is_sequence.hpp>
  22. #include <boost/fusion/container/deque/detail/keyed_element.hpp>
  23. #include <boost/fusion/container/deque/detail/deque_keyed_values.hpp>
  24. #include <boost/fusion/container/deque/deque_fwd.hpp>
  25. #include <boost/fusion/container/deque/detail/value_at_impl.hpp>
  26. #include <boost/fusion/container/deque/detail/at_impl.hpp>
  27. #include <boost/fusion/container/deque/detail/begin_impl.hpp>
  28. #include <boost/fusion/container/deque/detail/end_impl.hpp>
  29. #include <boost/fusion/container/deque/detail/is_sequence_impl.hpp>
  30. #include <boost/fusion/sequence/intrinsic/begin.hpp>
  31. #include <boost/fusion/sequence/intrinsic/empty.hpp>
  32. #include <boost/mpl/int.hpp>
  33. #include <boost/mpl/and.hpp>
  34. #include <boost/utility/enable_if.hpp>
  35. #include <boost/type_traits/is_convertible.hpp>
  36. namespace boost { namespace fusion
  37. {
  38. struct deque_tag;
  39. template <typename ...Elements>
  40. struct deque : detail::nil_keyed_element
  41. {
  42. typedef deque_tag fusion_tag;
  43. typedef bidirectional_traversal_tag category;
  44. typedef mpl::int_<0> size;
  45. typedef mpl::int_<0> next_up;
  46. typedef mpl::int_<0> next_down;
  47. typedef mpl::false_ is_view;
  48. template <typename Sequence>
  49. deque(Sequence const&,
  50. typename enable_if<
  51. mpl::and_<
  52. traits::is_sequence<Sequence>
  53. , result_of::empty<Sequence>>>::type* /*dummy*/ = 0)
  54. {}
  55. deque() {}
  56. };
  57. template <typename Head, typename ...Tail>
  58. struct deque<Head, Tail...>
  59. : detail::deque_keyed_values<Head, Tail...>::type
  60. , sequence_base<deque<Head, Tail...>>
  61. {
  62. typedef deque_tag fusion_tag;
  63. typedef bidirectional_traversal_tag category;
  64. typedef typename detail::deque_keyed_values<Head, Tail...>::type base;
  65. typedef mpl::int_<(sizeof ...(Tail) + 1)> size;
  66. typedef mpl::int_<size::value> next_up;
  67. typedef mpl::int_<((size::value == 0) ? 0 : -1)> next_down;
  68. typedef mpl::false_ is_view;
  69. deque()
  70. {}
  71. template <typename ...Elements>
  72. deque(deque<Elements...> const& seq)
  73. : base(seq)
  74. {}
  75. template <typename ...Elements>
  76. deque(deque<Elements...>& seq)
  77. : base(seq)
  78. {}
  79. #if !defined(BOOST_NO_CXX11_RVALUE_REFERENCES)
  80. template <typename ...Elements>
  81. deque(deque<Elements...>&& seq)
  82. : base(std::forward<deque<Elements...>>(seq))
  83. {}
  84. #endif
  85. deque(deque const& seq)
  86. : base(seq)
  87. {}
  88. #if !defined(BOOST_NO_CXX11_RVALUE_REFERENCES)
  89. deque(deque&& seq)
  90. : base(std::forward<deque>(seq))
  91. {}
  92. #endif
  93. explicit deque(Head const& head, Tail const&... tail)
  94. : base(detail::deque_keyed_values<Head, Tail...>::construct(head, tail...))
  95. {}
  96. template <typename Head_, typename ...Tail_>
  97. explicit deque(Head_ const& head, Tail_ const&... tail)
  98. : base(detail::deque_keyed_values<Head_, Tail_...>::construct(head, tail...))
  99. {}
  100. #if !defined(BOOST_NO_CXX11_RVALUE_REFERENCES)
  101. template <typename Head_, typename ...Tail_>
  102. explicit deque(Head_&& head, Tail_&&... tail)
  103. : base(detail::deque_keyed_values<Head, Tail...>
  104. ::forward_(std::forward<Head_>(head), std::forward<Tail_>(tail)...))
  105. {}
  106. #endif
  107. template <typename Sequence>
  108. explicit deque(Sequence const& seq
  109. , typename disable_if<is_convertible<Sequence, Head> >::type* /*dummy*/ = 0)
  110. : base(base::from_iterator(fusion::begin(seq)))
  111. {}
  112. template <typename ...Elements>
  113. deque& operator=(deque<Elements...> const& rhs)
  114. {
  115. base::operator=(rhs);
  116. return *this;
  117. }
  118. template <typename T>
  119. deque& operator=(T const& rhs)
  120. {
  121. base::operator=(rhs);
  122. return *this;
  123. }
  124. #if !defined(BOOST_NO_CXX11_RVALUE_REFERENCES)
  125. template <typename T>
  126. deque& operator=(T&& rhs)
  127. {
  128. base::operator=(std::forward<T>(rhs));
  129. return *this;
  130. }
  131. #endif
  132. };
  133. }}
  134. #endif
  135. #endif