Refactor MinAndMax to use vtkm::Vec<T,2> instead of Pair.

The types are the same which makes Vec a more suitable container.
This commit is contained in:
Robert Maynard 2016-11-25 13:04:26 -05:00
parent 8d60ed57ad
commit 64bcc34389
5 changed files with 27 additions and 32 deletions

@ -22,7 +22,6 @@
#include <vtkm/internal/ExportMacros.h>
#include <vtkm/Math.h>
#include <vtkm/Pair.h>
namespace vtkm {
@ -94,35 +93,35 @@ struct Minimum
/// Binary Predicate that takes two arguments argument \c x, and \c y and
/// returns a vtkm::Pair<T,T> that represents the minimum and maximum values
/// returns a vtkm::Vec<T,2> that represents the minimum and maximum values
/// Note: Requires Type \p T implement the vtkm::Min and vtkm::Max functions.
template <typename T>
struct MinAndMax
{
VTKM_EXEC_CONT
vtkm::Pair<T, T> operator()(const T& a, const T& b) const
vtkm::Vec<T,2> operator()(const T& a, const T& b) const
{
return vtkm::make_Pair(vtkm::Min(a, b), vtkm::Max(a, b));
return vtkm::make_Vec(vtkm::Min(a, b), vtkm::Max(a, b));
}
VTKM_EXEC_CONT
vtkm::Pair<T, T> operator()(
const vtkm::Pair<T, T>& a, const vtkm::Pair<T, T>& b) const
vtkm::Vec<T,2> operator()(
const vtkm::Vec<T,2>& a, const vtkm::Vec<T,2>& b) const
{
return vtkm::make_Pair(
vtkm::Min(a.first, b.first), vtkm::Max(a.second, b.second));
return vtkm::make_Vec(
vtkm::Min(a[0], b[0]), vtkm::Max(a[1], b[1]));
}
VTKM_EXEC_CONT
vtkm::Pair<T, T> operator()(const T& a, const vtkm::Pair<T, T>& b) const
vtkm::Vec<T,2> operator()(const T& a, const vtkm::Vec<T,2>& b) const
{
return vtkm::make_Pair(vtkm::Min(a, b.first), vtkm::Max(a, b.second));
return vtkm::make_Vec(vtkm::Min(a, b[0]), vtkm::Max(a, b[1]));
}
VTKM_EXEC_CONT
vtkm::Pair<T, T> operator()(const vtkm::Pair<T, T>& a, const T& b) const
vtkm::Vec<T,2> operator()(const vtkm::Vec<T,2>& a, const T& b) const
{
return vtkm::make_Pair(vtkm::Min(a.first, b), vtkm::Max(a.second, b));
return vtkm::make_Vec(vtkm::Min(a[0], b), vtkm::Max(a[1], b));
}
};

@ -56,19 +56,17 @@ public:
//not the greatest way of doing this for performance reasons. But
//this implementation should generate the smallest amount of code
const vtkm::Pair<ValueType, ValueType> initial(
input.GetPortalConstControl().Get(0),
input.GetPortalConstControl().Get(0));
vtkm::Vec<ValueType,2> initial(input.GetPortalConstControl().Get(0));
vtkm::Pair<ValueType, ValueType> result =
vtkm::Vec<ValueType, 2> result =
Algorithm::Reduce(input, initial, vtkm::MinAndMax<ValueType>());
this->Range->Allocate(NumberOfComponents);
for (vtkm::IdComponent i = 0; i < NumberOfComponents; ++i)
{
this->Range->GetPortalControl().Set(
i, vtkm::Range(VecType::GetComponent(result.first, i),
VecType::GetComponent(result.second, i)));
i, vtkm::Range(VecType::GetComponent(result[0], i),
VecType::GetComponent(result[1], i)));
}
}

@ -1088,14 +1088,14 @@ private:
testData[ARRAY_SIZE/2] = maxValue;
IdArrayHandle input = vtkm::cont::make_ArrayHandle(testData, ARRAY_SIZE);
vtkm::Pair<vtkm::Id,vtkm::Id> range = Algorithm::Reduce(input,
vtkm::Pair<vtkm::Id,vtkm::Id>(0,0),
vtkm::Vec<vtkm::Id,2> range = Algorithm::Reduce(input,
vtkm::Vec<vtkm::Id,2>(0,0),
vtkm::MinAndMax<vtkm::Id>());
VTKM_TEST_ASSERT(maxValue == range.second,
VTKM_TEST_ASSERT(maxValue == range[1],
"Got bad value from Reduce with comparison object");
VTKM_TEST_ASSERT(0 == range.first,
VTKM_TEST_ASSERT(0 == range[0],
"Got bad value from Reduce with comparison object");
}

@ -147,15 +147,14 @@ public:
const vtkm::Id numberOfValues = fieldArray.GetNumberOfValues();
const vtkm::Pair<FieldType, FieldType> initValue(
fieldArray.GetPortalConstControl().Get(0),
const vtkm::Vec<FieldType,2> initValue(
fieldArray.GetPortalConstControl().Get(0));
vtkm::Pair<FieldType,FieldType> result =
vtkm::Vec<FieldType,2> result =
DeviceAlgorithms::Reduce(fieldArray, initValue, vtkm::MinAndMax<FieldType>());
const FieldType& fieldMinValue = result.first;
const FieldType& fieldMaxValue = result.second;
const FieldType& fieldMinValue = result[0];
const FieldType& fieldMaxValue = result[1];
const FieldType fieldDelta = compute_delta(fieldMinValue, fieldMaxValue, numberOfBins);

@ -137,12 +137,11 @@ public:
statinfo.median = tempPortal.Get(dataSize / 2);
// Minimum and maximum
const vtkm::Pair<FieldType,FieldType> initValue(tempPortal.Get(0),
tempPortal.Get(0));
vtkm::Pair<FieldType,FieldType> result =
const vtkm::Vec<FieldType,2> initValue(tempPortal.Get(0));
vtkm::Vec<FieldType,2> result =
DeviceAlgorithms::Reduce(fieldArray, initValue, vtkm::MinAndMax<FieldType>());
statinfo.minimum = result.first;
statinfo.maximum = result.second;
statinfo.minimum = result[0];
statinfo.maximum = result[1];
// Mean
FieldType sum = DeviceAlgorithms::ScanInclusive(fieldArray, tempArray);