mirror of
https://gitlab.kitware.com/vtk/vtk-m
synced 2024-09-19 02:25:42 +00:00
Force functions passed as templates to be functors
There are some special functions/methods that take as an argument a function-like object and then call that function with some arguments. There are some instances where a templated function was passed given the appropriate template. Even though there is a specific function, this gets passed as a function pointer and calling a function pointer on some devices is a no-no. Replace these function arguments with lambdas, which are constructed as unnamed functor objects.
This commit is contained in:
parent
6ff755a9a8
commit
a3d7f9475b
@ -66,18 +66,6 @@ struct GetValueType<ArrayType>
|
|||||||
using ValueType = typename ArrayType::ValueType;
|
using ValueType = typename ArrayType::ValueType;
|
||||||
};
|
};
|
||||||
|
|
||||||
// GetFromPortals: -------------------------------------------------------------
|
|
||||||
// Given a set of array portals as arguments, returns a Vec comprising the values
|
|
||||||
// at the provided index.
|
|
||||||
VTKM_SUPPRESS_EXEC_WARNINGS
|
|
||||||
template <typename... Portals>
|
|
||||||
VTKM_EXEC_CONT typename GetValueType<Portals...>::ValueType GetFromPortals(
|
|
||||||
vtkm::Id index,
|
|
||||||
const Portals&... portals)
|
|
||||||
{
|
|
||||||
return { portals.Get(index)... };
|
|
||||||
}
|
|
||||||
|
|
||||||
// SetToPortals: ---------------------------------------------------------------
|
// SetToPortals: ---------------------------------------------------------------
|
||||||
// Given a Vec-like object, and index, and a set of array portals, sets each of
|
// Given a Vec-like object, and index, and a set of array portals, sets each of
|
||||||
// the portals to the respective component of the Vec.
|
// the portals to the respective component of the Vec.
|
||||||
@ -137,14 +125,23 @@ public:
|
|||||||
VTKM_EXEC_CONT
|
VTKM_EXEC_CONT
|
||||||
ValueType Get(vtkm::Id index) const
|
ValueType Get(vtkm::Id index) const
|
||||||
{
|
{
|
||||||
return this->Portals.Apply(compvec::GetFromPortals<PortalTypes...>, index);
|
auto getFromPortals = [index](const auto&... portals) {
|
||||||
|
return ValueType{ portals.Get(index)... };
|
||||||
|
};
|
||||||
|
return this->Portals.Apply(getFromPortals);
|
||||||
}
|
}
|
||||||
|
|
||||||
template <typename Writable_ = Writable,
|
template <typename Writable_ = Writable,
|
||||||
typename = typename std::enable_if<Writable_::value>::type>
|
typename = typename std::enable_if<Writable_::value>::type>
|
||||||
VTKM_EXEC_CONT void Set(vtkm::Id index, const ValueType& value) const
|
VTKM_EXEC_CONT void Set(vtkm::Id index, const ValueType& value) const
|
||||||
{
|
{
|
||||||
this->Portals.Apply(compvec::SetToPortals<ValueType, PortalTypes...>, index, value);
|
// Note that we are using a lambda function here to implicitly construct a
|
||||||
|
// functor to pass to Apply. Some device compilers will not allow passing a
|
||||||
|
// function or function pointer to Tuple::Apply.
|
||||||
|
auto setToPortal = [index, &value](const auto&... portals) {
|
||||||
|
compvec::SetToPortals(index, value, portals...);
|
||||||
|
};
|
||||||
|
this->Portals.Apply(setToPortal);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user