From f14021dd84a2958b46fa9d5554dee7f8c88c7257 Mon Sep 17 00:00:00 2001 From: Kenneth Moreland Date: Tue, 10 Jul 2018 13:01:57 -0600 Subject: [PATCH] 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. --- vtkm/cont/Algorithm.h | 51 +++++++++++++++---------------------------- 1 file changed, 18 insertions(+), 33 deletions(-) diff --git a/vtkm/cont/Algorithm.h b/vtkm/cont/Algorithm.h index 51562cef9..f85a72f21 100644 --- a/vtkm/cont/Algorithm.h +++ b/vtkm/cont/Algorithm.h @@ -34,43 +34,28 @@ namespace cont namespace detail { -template -struct PrepareArgForExecDetail; - -template -struct PrepareArgForExecDetail +template +inline auto DoPrepareArgForExec(T&& object, std::true_type) + -> decltype(std::declval().PrepareForExecution(Device())) { - using ExecType = T; - - static VTKM_CONT ExecType DoPrepare(T&& object) { return std::forward(object); } -}; - -template -struct PrepareArgForExecDetail -{ - using ExecType = decltype(std::declval().PrepareForExecution(Device())); - - static VTKM_CONT ExecType DoPrepare(T&& object) { return object.PrepareForExecution(Device()); } -}; - -template -struct PrepareArgForExecHelper -{ - using IsExecObject = - typename std::is_base_of::type>::type; - - using ExecType = typename PrepareArgForExecDetail::ExecType; - - static VTKM_CONT ExecType DoPrepare(T&& object) - { - return PrepareArgForExecDetail::DoPrepare(object); - } -}; + return object.PrepareForExecution(Device{}); +} template -VTKM_CONT typename PrepareArgForExecHelper::ExecType PrepareArgForExec(T&& object) +inline T&& DoPrepareArgForExec(T&& object, std::false_type) { - return PrepareArgForExecHelper::DoPrepare(object); + return std::forward(object); +} + +template +auto PrepareArgForExec(T&& object) -> decltype(DoPrepareArgForExec( + std::forward(object), + typename std::is_base_of::type>::type{})) +{ + return DoPrepareArgForExec( + std::forward(object), + typename std::is_base_of::type>::type{}); } struct CopyFunctor