mirror of
https://gitlab.kitware.com/vtk/vtk-m
synced 2024-09-20 02:55:47 +00:00
5fa02057ae
Previously, all the ApplyPolicy functions had the same name and used template resolution to figure out which one to use. This was pretty clear at first when there was just one for fields and one for cell sets. But then it grew to several different types, particularly for fields. It was hard to look at the code and figure out which form of ApplyPolicy was being used, and compilers were starting to get confused. Resolve the problem by giving all the methods unique names to make it clear which one you expect to be called.
102 lines
3.1 KiB
C++
102 lines
3.1 KiB
C++
//============================================================================
|
|
// Copyright (c) Kitware, Inc.
|
|
// All rights reserved.
|
|
// See LICENSE.txt for details.
|
|
//
|
|
// This software is distributed WITHOUT ANY WARRANTY; without even
|
|
// the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
|
|
// PURPOSE. See the above copyright notice for more information.
|
|
//============================================================================
|
|
|
|
#include <vtkm/cont/ArrayHandleCounting.h>
|
|
#include <vtkm/cont/ArrayHandlePermutation.h>
|
|
#include <vtkm/cont/CellSetPermutation.h>
|
|
#include <vtkm/cont/DynamicCellSet.h>
|
|
|
|
namespace
|
|
{
|
|
|
|
class ThresholdRange
|
|
{
|
|
public:
|
|
VTKM_CONT
|
|
ThresholdRange(const vtkm::Float64& lower, const vtkm::Float64& upper)
|
|
: Lower(lower)
|
|
, Upper(upper)
|
|
{
|
|
}
|
|
|
|
template <typename T>
|
|
VTKM_EXEC bool operator()(const T& value) const
|
|
{
|
|
return value >= static_cast<T>(this->Lower) && value <= static_cast<T>(this->Upper);
|
|
}
|
|
|
|
private:
|
|
vtkm::Float64 Lower;
|
|
vtkm::Float64 Upper;
|
|
};
|
|
|
|
} // end anon namespace
|
|
|
|
namespace vtkm
|
|
{
|
|
namespace filter
|
|
{
|
|
|
|
//-----------------------------------------------------------------------------
|
|
inline VTKM_CONT Threshold::Threshold()
|
|
: vtkm::filter::FilterDataSetWithField<Threshold>()
|
|
, LowerValue(0)
|
|
, UpperValue(0)
|
|
{
|
|
}
|
|
|
|
//-----------------------------------------------------------------------------
|
|
template <typename T, typename StorageType, typename DerivedPolicy>
|
|
inline VTKM_CONT vtkm::cont::DataSet Threshold::DoExecute(
|
|
const vtkm::cont::DataSet& input,
|
|
const vtkm::cont::ArrayHandle<T, StorageType>& field,
|
|
const vtkm::filter::FieldMetadata& fieldMeta,
|
|
vtkm::filter::PolicyBase<DerivedPolicy> policy)
|
|
{
|
|
//get the cells and coordinates of the dataset
|
|
const vtkm::cont::DynamicCellSet& cells = input.GetCellSet();
|
|
|
|
ThresholdRange predicate(this->GetLowerThreshold(), this->GetUpperThreshold());
|
|
vtkm::cont::DynamicCellSet cellOut = this->Worklet.Run(
|
|
vtkm::filter::ApplyPolicyCellSet(cells, policy), field, fieldMeta.GetAssociation(), predicate);
|
|
|
|
vtkm::cont::DataSet output;
|
|
output.SetCellSet(cellOut);
|
|
output.AddCoordinateSystem(input.GetCoordinateSystem(this->GetActiveCoordinateSystemIndex()));
|
|
return output;
|
|
}
|
|
|
|
//-----------------------------------------------------------------------------
|
|
template <typename T, typename StorageType, typename DerivedPolicy>
|
|
inline VTKM_CONT bool Threshold::DoMapField(vtkm::cont::DataSet& result,
|
|
const vtkm::cont::ArrayHandle<T, StorageType>& input,
|
|
const vtkm::filter::FieldMetadata& fieldMeta,
|
|
vtkm::filter::PolicyBase<DerivedPolicy>)
|
|
{
|
|
if (fieldMeta.IsPointField())
|
|
{
|
|
//we copy the input handle to the result dataset, reusing the metadata
|
|
result.AddField(fieldMeta.AsField(input));
|
|
return true;
|
|
}
|
|
else if (fieldMeta.IsCellField())
|
|
{
|
|
vtkm::cont::ArrayHandle<T> out = this->Worklet.ProcessCellField(input);
|
|
result.AddField(fieldMeta.AsField(out));
|
|
return true;
|
|
}
|
|
else
|
|
{
|
|
return false;
|
|
}
|
|
}
|
|
}
|
|
}
|