Have filter specify its own field types

Previously, the policy specified which field types the filter should
operate on. The filter could remove some types, but it was not able to
add any types.

This is backward. Instead, the filter should specify what types its
supports and the policy may cull out some of those.
This commit is contained in:
Kenneth Moreland 2020-04-28 10:31:44 -06:00
parent f7741be0e1
commit 882dcacca4
7 changed files with 27 additions and 5 deletions

@ -523,6 +523,8 @@ VTKM_SUPPRESS_EXEC_WARNINGS
template <typename Functor, typename... Ts, typename... Args>
VTKM_EXEC_CONT void ListForEachImpl(Functor&& f, vtkm::List<Ts...>, Args&&... args)
{
VTKM_STATIC_ASSERT_MSG((!std::is_same<vtkm::List<Ts...>, vtkm::ListUniversal>::value),
"Cannot call ListFor on vtkm::ListUniversal.");
auto init_list = { ListForEachCallThrough(
std::forward<Functor>(f), Ts{}, std::forward<Args>(args)...)... };
(void)init_list;

@ -101,6 +101,8 @@ public:
template <typename TypeList>
VTKM_CONT const vtkm::cont::ArrayHandle<vtkm::Range>& GetRange(TypeList) const
{
VTKM_STATIC_ASSERT_MSG((!std::is_same<TypeList, vtkm::ListUniversal>::value),
"Cannot get the field range with vtkm::ListUniversal.");
return this->GetRangeImpl(TypeList());
}

@ -75,6 +75,8 @@ VTKM_CONT vtkm::cont::ArrayHandle<vtkm::Range> FieldRangeCompute(
TypeList)
{
VTKM_IS_LIST(TypeList);
VTKM_STATIC_ASSERT_MSG((!std::is_same<TypeList, vtkm::ListUniversal>::value),
"Cannot use vtkm::ListUniversal with FieldRangeCompute.");
return vtkm::cont::detail::FieldRangeComputeImpl(pds, name, assoc, TypeList());
}

@ -63,6 +63,9 @@ namespace cont
template <typename TypeList>
class VTKM_ALWAYS_EXPORT VariantArrayHandleBase
{
VTKM_STATIC_ASSERT_MSG((!std::is_same<TypeList, vtkm::ListUniversal>::value),
"Cannot use vtkm::ListUniversal with VariantArrayHandle.");
public:
VTKM_CONT
VariantArrayHandleBase() = default;

@ -184,7 +184,7 @@ public:
/// A filter is able to state what subset of types it supports
/// by default. By default we use ListUniversal to represent that the
/// filter accepts all types specified by the users provided policy
using SupportedTypes = vtkm::ListUniversal;
using SupportedTypes = VTKM_DEFAULT_TYPE_LIST;
/// \brief Specify which additional field storage to support.
///

@ -212,7 +212,12 @@ template <typename DerivedPolicy>
inline VTKM_CONT void Histogram::PreExecute(const vtkm::cont::PartitionedDataSet& input,
const vtkm::filter::PolicyBase<DerivedPolicy>&)
{
using TypeList = typename DerivedPolicy::FieldTypeList;
// Policies are on their way out, but until they are we want to respect them. In the mean
// time, respect the policy if it is defined.
using TypeList = typename std::conditional<
std::is_same<typename DerivedPolicy::FieldTypeList, vtkm::ListUniversal>::value,
VTKM_DEFAULT_TYPE_LIST,
typename DerivedPolicy::FieldTypeList>::type;
if (this->Range.IsNonEmpty())
{
this->ComputedRange = this->Range;

@ -32,7 +32,7 @@ namespace filter
template <typename Derived>
struct PolicyBase
{
using FieldTypeList = VTKM_DEFAULT_TYPE_LIST;
using FieldTypeList = vtkm::ListUniversal;
using StorageList = VTKM_DEFAULT_STORAGE_LIST;
using StructuredCellSetList = VTKM_DEFAULT_CELL_SET_LIST_STRUCTURED;
@ -201,10 +201,18 @@ using ArrayHandleMultiplexerForStorageList = vtkm::cont::ArrayHandleMultiplexerF
/// passed to the `DoMapField` method of filters.
///
template <typename DerivedPolicy>
VTKM_CONT vtkm::cont::VariantArrayHandleBase<typename DerivedPolicy::FieldTypeList>
VTKM_CONT vtkm::cont::VariantArrayHandleBase<typename std::conditional<
std::is_same<typename DerivedPolicy::FieldTypeList, vtkm::ListUniversal>::value,
VTKM_DEFAULT_TYPE_LIST,
typename DerivedPolicy::FieldTypeList>::type>
ApplyPolicyFieldNotActive(const vtkm::cont::Field& field, vtkm::filter::PolicyBase<DerivedPolicy>)
{
using TypeList = typename DerivedPolicy::FieldTypeList;
// Policies are on their way out, but until they are we want to respect them. In the mean
// time, respect the policy if it is defined.
using TypeList = typename std::conditional<
std::is_same<typename DerivedPolicy::FieldTypeList, vtkm::ListUniversal>::value,
VTKM_DEFAULT_TYPE_LIST,
typename DerivedPolicy::FieldTypeList>::type;
return field.GetData().ResetTypes(TypeList());
}