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:
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
|
||||||
|
Loading…
Reference in New Issue
Block a user