• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*=============================================================================
2     Copyright (c) 2014-2015 Kohei Takahashi
3 
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 #ifndef FUSION_SET_11062014_1726
8 #define FUSION_SET_11062014_1726
9 
10 #include <boost/fusion/support/config.hpp>
11 #include <boost/fusion/container/set/set_fwd.hpp>
12 
13 ///////////////////////////////////////////////////////////////////////////////
14 // Without variadics, we will use the PP version
15 ///////////////////////////////////////////////////////////////////////////////
16 #if !defined(BOOST_FUSION_HAS_VARIADIC_SET)
17 # include <boost/fusion/container/set/detail/cpp03/set.hpp>
18 #else
19 
20 ///////////////////////////////////////////////////////////////////////////////
21 // C++11 interface
22 ///////////////////////////////////////////////////////////////////////////////
23 #include <boost/fusion/support/detail/access.hpp>
24 #include <boost/fusion/support/void.hpp>
25 #include <boost/fusion/support/detail/enabler.hpp>
26 #include <boost/fusion/support/sequence_base.hpp>
27 #include <boost/fusion/support/category_of.hpp>
28 #include <boost/fusion/support/is_sequence.hpp>
29 #include <boost/fusion/support/detail/is_same_size.hpp>
30 #include <boost/fusion/container/vector/vector.hpp>
31 #include <boost/fusion/container/set/detail/begin_impl.hpp>
32 #include <boost/fusion/container/set/detail/end_impl.hpp>
33 #include <boost/fusion/container/set/detail/value_of_impl.hpp>
34 #include <boost/fusion/container/set/detail/deref_data_impl.hpp>
35 #include <boost/fusion/container/set/detail/deref_impl.hpp>
36 #include <boost/fusion/container/set/detail/key_of_impl.hpp>
37 #include <boost/fusion/container/set/detail/value_of_data_impl.hpp>
38 #include <boost/mpl/bool.hpp>
39 #include <boost/core/enable_if.hpp>
40 
41 namespace boost { namespace fusion
42 {
43     struct fusion_sequence_tag;
44 
45     template <>
46     struct set<> : sequence_base<set<> >
47     {
48         struct category : forward_traversal_tag, associative_tag {};
49 
50         typedef set_tag fusion_tag;
51         typedef fusion_sequence_tag tag; // this gets picked up by MPL
52         typedef mpl::false_ is_view;
53 
54         typedef vector<> storage_type;
55 
56         typedef storage_type::size size;
57 
58         BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
setboost::fusion::set59         set()
60             : data() {}
61 
62         template <typename Sequence>
63         BOOST_FUSION_GPU_ENABLED
setboost::fusion::set64         set(Sequence const& rhs,
65             typename enable_if<traits::is_sequence<Sequence>, detail::enabler_>::type = detail::enabler,
66             typename enable_if<detail::is_same_size<Sequence, storage_type>, detail::enabler_>::type = detail::enabler)
67             : data(rhs) {}
68 
69         template <typename T>
70         BOOST_CXX14_CONSTEXPR BOOST_FUSION_GPU_ENABLED
71         set&
operator =boost::fusion::set72         operator=(T const& rhs)
73         {
74             data = rhs;
75             return *this;
76         }
77 
78         BOOST_CXX14_CONSTEXPR BOOST_FUSION_GPU_ENABLED
get_databoost::fusion::set79         storage_type& get_data() { return data; }
80         BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
get_databoost::fusion::set81         storage_type const& get_data() const { return data; }
82 
83     private:
84         storage_type data;
85     };
86 
87     template <typename ...T>
88     struct set : sequence_base<set<T...> >
89     {
90         struct category : forward_traversal_tag, associative_tag {};
91 
92         typedef set_tag fusion_tag;
93         typedef fusion_sequence_tag tag; // this gets picked up by MPL
94         typedef mpl::false_ is_view;
95 
96         typedef vector<T...> storage_type;
97 
98         typedef typename storage_type::size size;
99 
100         BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
setboost::fusion::set101         set()
102             : data() {}
103 
104         template <typename Sequence>
105         BOOST_FUSION_GPU_ENABLED
setboost::fusion::set106         set(Sequence&& rhs,
107             typename enable_if<traits::is_sequence<Sequence>, detail::enabler_>::type = detail::enabler,
108             typename enable_if<detail::is_same_size<Sequence, storage_type>, detail::enabler_>::type = detail::enabler)
109             : data(std::forward<Sequence>(rhs)) {}
110 
111         template <typename ...U>
112         BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
113         explicit
setboost::fusion::set114         set(U&& ...args)
115             : data(std::forward<U>(args)...) {}
116 
117         template <typename U>
118         BOOST_CXX14_CONSTEXPR BOOST_FUSION_GPU_ENABLED
119         set&
operator =boost::fusion::set120         operator=(U&& rhs)
121         {
122             data = std::forward<U>(rhs);
123             return *this;
124         }
125 
126         BOOST_CXX14_CONSTEXPR BOOST_FUSION_GPU_ENABLED
get_databoost::fusion::set127         storage_type& get_data() { return data; }
128         BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
get_databoost::fusion::set129         storage_type const& get_data() const { return data; }
130 
131     private:
132         storage_type data;
133     };
134 
135 }}
136 
137 #endif
138 #endif
139 
140 
141