summaryrefslogtreecommitdiff
path: root/boost/fusion/container/generation/make_vector.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'boost/fusion/container/generation/make_vector.hpp')
-rw-r--r--boost/fusion/container/generation/make_vector.hpp61
1 files changed, 60 insertions, 1 deletions
diff --git a/boost/fusion/container/generation/make_vector.hpp b/boost/fusion/container/generation/make_vector.hpp
index 8f0674815e..cd3b992bb5 100644
--- a/boost/fusion/container/generation/make_vector.hpp
+++ b/boost/fusion/container/generation/make_vector.hpp
@@ -1,5 +1,5 @@
/*=============================================================================
- Copyright (c) 2014 Kohei Takahashi
+ Copyright (c) 2014-2015 Kohei Takahashi
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)
@@ -10,7 +10,66 @@
#include <boost/fusion/support/config.hpp>
#include <boost/fusion/container/vector/vector.hpp>
+#if !defined(BOOST_FUSION_HAS_VARIADIC_VECTOR)
# include <boost/fusion/container/generation/detail/pp_make_vector.hpp>
+#else
+///////////////////////////////////////////////////////////////////////////////
+// C++11 variadic interface
+///////////////////////////////////////////////////////////////////////////////
+
+#include <boost/fusion/support/detail/as_fusion_element.hpp>
+#include <boost/type_traits/remove_reference.hpp>
+#include <boost/type_traits/remove_const.hpp>
+#include <utility>
+
+namespace boost { namespace fusion
+{
+ namespace result_of
+ {
+ template <typename ...T>
+ struct make_vector
+ {
+ // make `make_vector<T..., void_...>' into `make_vector<T...>'
+ template <typename, typename...> struct trim_void;
+
+ template <typename... U>
+ struct trim_void<vector<U...> >
+ {
+ typedef vector<U...> type;
+ };
+
+ template <typename... U, typename... Tail>
+ struct trim_void<vector<U...>, void_, Tail...>
+ : trim_void<vector<U...> > { };
+
+ template <typename... U, typename Head, typename... Tail>
+ struct trim_void<vector<U...>, Head, Tail...>
+ : trim_void<vector<U..., Head>, Tail...> { };
+
+ typedef
+ typename trim_void<
+ vector<>
+ , typename detail::as_fusion_element<
+ typename remove_const<
+ typename remove_reference<T>::type
+ >::type
+ >::type...
+ >::type
+ type;
+ };
+ }
+
+ template <typename ...T>
+ BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
+ inline typename result_of::make_vector<T...>::type
+ make_vector(T&&... arg)
+ {
+ return typename result_of::make_vector<T...>::type(std::forward<T>(arg)...);
+ }
+ }}
+
+
+#endif
#endif