From c9f1d1923383658c9255ddf781389fe63290e796 Mon Sep 17 00:00:00 2001 From: Robert Maynard Date: Tue, 7 Nov 2017 17:41:57 -0500 Subject: [PATCH] DynamicArrayHandle CastAndCall refactored to use the new vtkm::ForEach --- vtkm/cont/DynamicArrayHandle.h | 39 ++++++++++++++-------------------- 1 file changed, 16 insertions(+), 23 deletions(-) diff --git a/vtkm/cont/DynamicArrayHandle.h b/vtkm/cont/DynamicArrayHandle.h index 5901ea203..7baa4a813 100644 --- a/vtkm/cont/DynamicArrayHandle.h +++ b/vtkm/cont/DynamicArrayHandle.h @@ -132,9 +132,8 @@ template VTKM_CONT vtkm::cont::ArrayHandle* DynamicArrayHandleTryCast( vtkm::cont::detail::PolymorphicArrayHandleContainerBase* arrayContainer) { - vtkm::cont::detail::PolymorphicArrayHandleContainer* downcastContainer = - dynamic_cast*>( - arrayContainer); + vtkm::cont::detail::PolymorphicArrayHandleContainer* downcastContainer = nullptr; + downcastContainer = dynamic_cast(arrayContainer); if (downcastContainer != nullptr) { return &downcastContainer->Array; @@ -407,13 +406,10 @@ using DynamicArrayHandle = namespace detail { -template -struct ListFunctorWrapper +struct DynamicArrayHandleTry { - ListFunctorWrapper(bool& called, const Functor& f, PolymorphicArrayHandleContainerBase* c) - : Called(called) - , Container(c) - , Function(f) + DynamicArrayHandleTry(const PolymorphicArrayHandleContainerBase* const c) + : Container(c) { } @@ -425,16 +421,17 @@ struct ListFunctorWrapper this->run(std::forward(p), invalid{}, args...); } - template - void run(std::pair&&, std::false_type, Args&&... args) const + template + void run(std::pair&&, std::false_type, Functor&& f, bool& called, Args&&... args) const { - if (!this->Called) + if (!called) { - vtkm::cont::ArrayHandle* handle = DynamicArrayHandleTryCast(this->Container); - if (handle) + using downcastType = const vtkm::cont::detail::PolymorphicArrayHandleContainer* const; + downcastType downcastContainer = dynamic_cast(this->Container); + if (downcastContainer) { - this->Function(*handle, std::forward(args)...); - this->Called = true; + f(downcastContainer->Array, std::forward(args)...); + called = true; } } } @@ -444,9 +441,7 @@ struct ListFunctorWrapper { } - bool& Called; - PolymorphicArrayHandleContainerBase* Container; - const Functor& Function; + const PolymorphicArrayHandleContainerBase* const Container; }; VTKM_CONT_EXPORT void ThrowCastAndCallException(PolymorphicArrayHandleContainerBase*, @@ -462,11 +457,9 @@ VTKM_CONT void DynamicArrayHandleBase::CastAndCall(const //and make it extern using crossProduct = typename vtkm::ListCrossProduct; - auto* ptr = this->ArrayContainer.get(); bool called = false; - auto task = detail::ListFunctorWrapper(called, f, ptr); - - vtkm::ListForEach(task, crossProduct{}); + auto* ptr = this->ArrayContainer.get(); + vtkm::ListForEach(detail::DynamicArrayHandleTry(ptr), crossProduct{}, f, called); if (!called) { // throw an exception