Shorten code for PrepareArgForExec

By making is_base_of part of PrepareArgForExec, we can shorten not only
the C++ code but also the code that is generated by it.

Also, return && instead of by value when passing through the argument.

Changes thanks to Robert Maynard.
This commit is contained in:
Kenneth Moreland 2018-07-10 13:01:57 -06:00
parent 3b828608a4
commit f14021dd84

@ -34,43 +34,28 @@ namespace cont
namespace detail namespace detail
{ {
template <typename T, typename Device, typename IsExecObject> template <typename Device, typename T>
struct PrepareArgForExecDetail; inline auto DoPrepareArgForExec(T&& object, std::true_type)
-> decltype(std::declval<T>().PrepareForExecution(Device()))
template <typename T, typename Device>
struct PrepareArgForExecDetail<T, Device, std::false_type>
{ {
using ExecType = T; return object.PrepareForExecution(Device{});
}
static VTKM_CONT ExecType DoPrepare(T&& object) { return std::forward<T>(object); }
};
template <typename T, typename Device>
struct PrepareArgForExecDetail<T, Device, std::true_type>
{
using ExecType = decltype(std::declval<T>().PrepareForExecution(Device()));
static VTKM_CONT ExecType DoPrepare(T&& object) { return object.PrepareForExecution(Device()); }
};
template <typename T, typename Device>
struct PrepareArgForExecHelper
{
using IsExecObject =
typename std::is_base_of<vtkm::cont::ExecutionObjectBase, typename std::decay<T>::type>::type;
using ExecType = typename PrepareArgForExecDetail<T, Device, IsExecObject>::ExecType;
static VTKM_CONT ExecType DoPrepare(T&& object)
{
return PrepareArgForExecDetail<T, Device, IsExecObject>::DoPrepare(object);
}
};
template <typename Device, typename T> template <typename Device, typename T>
VTKM_CONT typename PrepareArgForExecHelper<T, Device>::ExecType PrepareArgForExec(T&& object) inline T&& DoPrepareArgForExec(T&& object, std::false_type)
{ {
return PrepareArgForExecHelper<T, Device>::DoPrepare(object); return std::forward<T>(object);
}
template <typename Device, typename T>
auto PrepareArgForExec(T&& object) -> decltype(DoPrepareArgForExec<Device>(
std::forward<T>(object),
typename std::is_base_of<vtkm::cont::ExecutionObjectBase, typename std::decay<T>::type>::type{}))
{
return DoPrepareArgForExec<Device>(
std::forward<T>(object),
typename std::is_base_of<vtkm::cont::ExecutionObjectBase,
typename std::decay<T>::type>::type{});
} }
struct CopyFunctor struct CopyFunctor