2015-06-17 01:40:45 +09:00
|
|
|
/*=============================================================================
|
|
|
|
Copyright (c) 2014 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)
|
|
|
|
==============================================================================*/
|
|
|
|
#ifndef FUSION_MAKE_VECTOR_11112014_2252
|
|
|
|
#define FUSION_MAKE_VECTOR_11112014_2252
|
|
|
|
|
|
|
|
#include <boost/fusion/support/config.hpp>
|
|
|
|
#include <boost/fusion/container/vector/vector.hpp>
|
|
|
|
|
2014-11-11 11:16:30 +09:00
|
|
|
#if !defined(BOOST_FUSION_HAS_VARIADIC_VECTOR)
|
2015-06-17 01:40:45 +09:00
|
|
|
# include <boost/fusion/container/generation/detail/pp_make_vector.hpp>
|
2014-11-11 11:16:30 +09:00
|
|
|
#else
|
2015-06-17 01:40:45 +09:00
|
|
|
|
2014-11-11 11:16:30 +09:00
|
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
|
|
// C++11 variadic interface
|
|
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
|
|
#include <boost/fusion/support/detail/as_fusion_element.hpp>
|
2015-06-28 13:46:56 +09:00
|
|
|
#include <boost/type_traits/remove_reference.hpp>
|
|
|
|
#include <utility>
|
2014-11-11 11:16:30 +09:00
|
|
|
|
|
|
|
namespace boost { namespace fusion
|
|
|
|
{
|
|
|
|
namespace result_of
|
|
|
|
{
|
|
|
|
template <typename ...T>
|
|
|
|
struct make_vector
|
|
|
|
{
|
2015-06-28 01:13:32 +09:00
|
|
|
// 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<numbered_vector_tag<sizeof...(U)>, 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<>
|
2015-06-28 13:46:56 +09:00
|
|
|
, typename detail::as_fusion_element<
|
|
|
|
typename remove_reference<T>::type
|
|
|
|
>::type...
|
2015-06-28 01:13:32 +09:00
|
|
|
>::type
|
|
|
|
type;
|
2014-11-11 11:16:30 +09:00
|
|
|
};
|
|
|
|
}
|
|
|
|
|
|
|
|
template <typename ...T>
|
2015-06-28 01:13:32 +09:00
|
|
|
BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
|
|
|
|
inline typename result_of::make_vector<T...>::type
|
2015-06-28 13:46:56 +09:00
|
|
|
make_vector(T&&... arg)
|
2014-11-11 11:16:30 +09:00
|
|
|
{
|
2015-06-28 13:46:56 +09:00
|
|
|
return typename result_of::make_vector<T...>::type(std::forward<T>(arg)...);
|
2014-11-11 11:16:30 +09:00
|
|
|
}
|
|
|
|
}}
|
|
|
|
|
|
|
|
|
|
|
|
#endif
|
2015-06-17 01:40:45 +09:00
|
|
|
#endif
|
|
|
|
|