diff options
Diffstat (limited to 'boost/fusion/container/generation/make_vector.hpp')
-rw-r--r-- | boost/fusion/container/generation/make_vector.hpp | 61 |
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 |