vtkm::Vec const& operator[] is now constexpr

This allows for developers to do things such as the following
as constexpr's:
```cxx
constexpr vtkm::Id2 dims(16,16);
constexpr vtkm::Float64 dx = vtkm::Float64(4.0 * vtkm::Pi()) / vtkm::Float64(dims[0] - 1);
```
This commit is contained in:
Robert Maynard 2019-08-21 12:42:04 -04:00
parent 8373adc654
commit a529b90c73
3 changed files with 71 additions and 46 deletions

@ -0,0 +1,11 @@
# vtkm::Vec const& operator[] is now `constexpr`
This was done to allow for developers to write normal operations on vtkm::Vec but have
the resolved at compile time, allowing for both readible code and no runtime cost.
Now you can do things such as:
```cxx
constexpr vtkm::Id2 dims(16,16);
constexpr vtkm::Float64 dx = vtkm::Float64(4.0 * vtkm::Pi()) / vtkm::Float64(dims[0] - 1);
```

@ -678,12 +678,13 @@ public:
}
public:
inline VTKM_EXEC_CONT vtkm::IdComponent GetNumberOfComponents() const { return NUM_COMPONENTS; }
inline VTKM_EXEC_CONT const ComponentType& operator[](vtkm::IdComponent idx) const
inline VTKM_EXEC_CONT constexpr vtkm::IdComponent GetNumberOfComponents() const
{
return NUM_COMPONENTS;
}
inline VTKM_EXEC_CONT constexpr const ComponentType& operator[](vtkm::IdComponent idx) const
{
VTKM_ASSERT(idx >= 0);
VTKM_ASSERT(idx < NUM_COMPONENTS);
return this->Components[idx];
}
@ -854,8 +855,16 @@ public:
return *this;
}
inline VTKM_EXEC_CONT constexpr vtkm::IdComponent GetNumberOfComponents() const
{
return NUM_COMPONENTS;
}
VTKM_EXEC_CONT
ComponentType operator[](vtkm::IdComponent vtkmNotUsed(idx)) const { return ComponentType(); }
constexpr ComponentType operator[](vtkm::IdComponent vtkmNotUsed(idx)) const
{
return ComponentType();
}
VTKM_EXEC_CONT
bool operator==(const Vec<T, NUM_COMPONENTS>& vtkmNotUsed(other)) const { return true; }

@ -85,8 +85,8 @@ inline vtkm::cont::DataSet MakeTestDataSet::Make1DUniformDataSet0()
vtkm::cont::DataSet dataSet = dsb.Create(nVerts);
vtkm::cont::DataSetFieldAdd dsf;
vtkm::Float32 var[nVerts] = { -1.0f, .5f, -.2f, 1.7f, -.1f, .8f };
vtkm::Float32 var2[nVerts] = { -1.1f, .7f, -.2f, 0.2f, -.1f, .4f };
constexpr vtkm::Float32 var[nVerts] = { -1.0f, .5f, -.2f, 1.7f, -.1f, .8f };
constexpr vtkm::Float32 var2[nVerts] = { -1.1f, .7f, -.2f, 0.2f, -.1f, .4f };
dsf.AddPointField(dataSet, "pointvar", var, nVerts);
dsf.AddPointField(dataSet, "pointvar2", var2, nVerts);
@ -101,7 +101,7 @@ inline vtkm::cont::DataSet MakeTestDataSet::Make1DUniformDataSet1()
vtkm::cont::DataSet dataSet = dsb.Create(nVerts);
vtkm::cont::DataSetFieldAdd dsf;
vtkm::Float32 var[nVerts] = { 1.0e3f, 5.e5f, 2.e8f, 1.e10f, 2e12f, 3e15f };
constexpr vtkm::Float32 var[nVerts] = { 1.0e3f, 5.e5f, 2.e8f, 1.e10f, 2e12f, 3e15f };
dsf.AddPointField(dataSet, "pointvar", var, nVerts);
return dataSet;
@ -117,7 +117,7 @@ inline vtkm::cont::DataSet MakeTestDataSet::Make1DUniformDataSet2()
vtkm::cont::DataSetFieldAdd dsf;
vtkm::Float64 pointvar[dims];
vtkm::Float64 dx = vtkm::Float64(4.0 * vtkm::Pi()) / vtkm::Float64(dims - 1);
constexpr vtkm::Float64 dx = vtkm::Float64(4.0 * vtkm::Pi()) / vtkm::Float64(dims - 1);
vtkm::Id idx = 0;
for (vtkm::Id x = 0; x < dims; ++x)
@ -159,7 +159,7 @@ inline vtkm::cont::DataSet MakeTestDataSet::Make1DExplicitDataSet0()
dataSet = dsb.Create(coords, vtkm::CellShapeTagLine(), 2, conn, "coordinates", "cells");
vtkm::cont::DataSetFieldAdd dsf;
vtkm::Float32 var[nVerts] = { -1.0f, .5f, -.2f, 1.7f, .8f };
constexpr vtkm::Float32 var[nVerts] = { -1.0f, .5f, -.2f, 1.7f, .8f };
dsf.AddPointField(dataSet, "pointvar", var, nVerts);
return dataSet;
@ -169,16 +169,16 @@ inline vtkm::cont::DataSet MakeTestDataSet::Make1DExplicitDataSet0()
inline vtkm::cont::DataSet MakeTestDataSet::Make2DUniformDataSet0()
{
vtkm::cont::DataSetBuilderUniform dsb;
vtkm::Id2 dimensions(3, 2);
constexpr vtkm::Id2 dimensions(3, 2);
vtkm::cont::DataSet dataSet = dsb.Create(dimensions);
vtkm::cont::DataSetFieldAdd dsf;
const vtkm::Id nVerts = 6;
vtkm::Float32 var[nVerts] = { 10.1f, 20.1f, 30.1f, 40.1f, 50.1f, 60.1f };
constexpr vtkm::Id nVerts = 6;
constexpr vtkm::Float32 var[nVerts] = { 10.1f, 20.1f, 30.1f, 40.1f, 50.1f, 60.1f };
dsf.AddPointField(dataSet, "pointvar", var, nVerts);
vtkm::Float32 cellvar[2] = { 100.1f, 200.1f };
constexpr vtkm::Float32 cellvar[2] = { 100.1f, 200.1f };
dsf.AddCellField(dataSet, "cellvar", cellvar, 2, "cells");
return dataSet;
@ -188,17 +188,20 @@ inline vtkm::cont::DataSet MakeTestDataSet::Make2DUniformDataSet0()
inline vtkm::cont::DataSet MakeTestDataSet::Make2DUniformDataSet1()
{
vtkm::cont::DataSetBuilderUniform dsb;
vtkm::Id2 dimensions(5, 5);
constexpr vtkm::Id2 dimensions(5, 5);
vtkm::cont::DataSet dataSet = dsb.Create(dimensions);
vtkm::cont::DataSetFieldAdd dsf;
const vtkm::Id nVerts = 25;
const vtkm::Id nCells = 16;
vtkm::Float32 pointvar[nVerts] = { 100.0f, 78.0f, 49.0f, 17.0f, 1.0f, 94.0f, 71.0f, 47.0f, 33.0f,
6.0f, 52.0f, 44.0f, 50.0f, 45.0f, 48.0f, 8.0f, 12.0f, 46.0f,
91.0f, 43.0f, 0.0f, 5.0f, 51.0f, 76.0f, 83.0f };
vtkm::Float32 cellvar[nCells] = { 0.0f, 1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f, 7.0f,
8.0f, 9.0f, 10.0f, 11.0f, 12.0f, 13.0f, 14.0f, 15.0f };
constexpr vtkm::Id nVerts = 25;
constexpr vtkm::Id nCells = 16;
constexpr vtkm::Float32 pointvar[nVerts] = { 100.0f, 78.0f, 49.0f, 17.0f, 1.0f, 94.0f, 71.0f,
47.0f, 33.0f, 6.0f, 52.0f, 44.0f, 50.0f, 45.0f,
48.0f, 8.0f, 12.0f, 46.0f, 91.0f, 43.0f, 0.0f,
5.0f, 51.0f, 76.0f, 83.0f };
constexpr vtkm::Float32 cellvar[nCells] = {
0.0f, 1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f, 7.0f,
8.0f, 9.0f, 10.0f, 11.0f, 12.0f, 13.0f, 14.0f, 15.0f
};
dsf.AddPointField(dataSet, "pointvar", pointvar, nVerts);
dsf.AddCellField(dataSet, "cellvar", cellvar, nCells, "cells");
@ -210,14 +213,14 @@ inline vtkm::cont::DataSet MakeTestDataSet::Make2DUniformDataSet1()
inline vtkm::cont::DataSet MakeTestDataSet::Make2DUniformDataSet2()
{
vtkm::cont::DataSetBuilderUniform dsb;
vtkm::Id2 dims(16, 16);
constexpr vtkm::Id2 dims(16, 16);
vtkm::cont::DataSet dataSet = dsb.Create(dims);
vtkm::cont::DataSetFieldAdd dsf;
constexpr vtkm::Id nVerts = 256;
vtkm::Float64 pointvar[nVerts];
vtkm::Float64 dx = vtkm::Float64(4.0 * vtkm::Pi()) / vtkm::Float64(dims[0] - 1);
vtkm::Float64 dy = vtkm::Float64(2.0 * vtkm::Pi()) / vtkm::Float64(dims[1] - 1);
constexpr vtkm::Float64 dx = vtkm::Float64(4.0 * vtkm::Pi()) / vtkm::Float64(dims[0] - 1);
constexpr vtkm::Float64 dy = vtkm::Float64(2.0 * vtkm::Pi()) / vtkm::Float64(dims[1] - 1);
vtkm::Id idx = 0;
for (vtkm::Id y = 0; y < dims[1]; ++y)
@ -243,19 +246,19 @@ inline vtkm::cont::DataSet MakeTestDataSet::Make2DUniformDataSet2()
inline vtkm::cont::DataSet MakeTestDataSet::Make3DUniformDataSet0()
{
vtkm::cont::DataSetBuilderUniform dsb;
vtkm::Id3 dimensions(3, 2, 3);
constexpr vtkm::Id3 dimensions(3, 2, 3);
vtkm::cont::DataSet dataSet = dsb.Create(dimensions);
vtkm::cont::DataSetFieldAdd dsf;
const int nVerts = 18;
vtkm::Float32 vars[nVerts] = { 10.1f, 20.1f, 30.1f, 40.1f, 50.2f, 60.2f,
70.2f, 80.2f, 90.3f, 100.3f, 110.3f, 120.3f,
130.4f, 140.4f, 150.4f, 160.4f, 170.5f, 180.5f };
constexpr int nVerts = 18;
constexpr vtkm::Float32 vars[nVerts] = { 10.1f, 20.1f, 30.1f, 40.1f, 50.2f, 60.2f,
70.2f, 80.2f, 90.3f, 100.3f, 110.3f, 120.3f,
130.4f, 140.4f, 150.4f, 160.4f, 170.5f, 180.5f };
//Set point and cell scalar
dsf.AddPointField(dataSet, "pointvar", vars, nVerts);
vtkm::Float32 cellvar[4] = { 100.1f, 100.2f, 100.3f, 100.4f };
constexpr vtkm::Float32 cellvar[4] = { 100.1f, 100.2f, 100.3f, 100.4f };
dsf.AddCellField(dataSet, "cellvar", cellvar, 4, "cells");
return dataSet;
@ -265,13 +268,13 @@ inline vtkm::cont::DataSet MakeTestDataSet::Make3DUniformDataSet0()
inline vtkm::cont::DataSet MakeTestDataSet::Make3DUniformDataSet1()
{
vtkm::cont::DataSetBuilderUniform dsb;
vtkm::Id3 dimensions(5, 5, 5);
constexpr vtkm::Id3 dimensions(5, 5, 5);
vtkm::cont::DataSet dataSet = dsb.Create(dimensions);
vtkm::cont::DataSetFieldAdd dsf;
const vtkm::Id nVerts = 125;
const vtkm::Id nCells = 64;
vtkm::Float32 pointvar[nVerts] = {
constexpr vtkm::Id nVerts = 125;
constexpr vtkm::Id nCells = 64;
constexpr vtkm::Float32 pointvar[nVerts] = {
0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f,
0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f,
@ -287,17 +290,19 @@ inline vtkm::cont::DataSet MakeTestDataSet::Make3DUniformDataSet1()
0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f,
0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f
};
vtkm::Float32 cellvar[nCells] = { 0.0f, 1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f, 7.0f,
8.0f, 9.0f, 10.0f, 11.0f, 12.0f, 13.0f, 14.0f, 15.0f,
constexpr vtkm::Float32 cellvar[nCells] = {
0.0f, 1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f, 7.0f,
8.0f, 9.0f, 10.0f, 11.0f, 12.0f, 13.0f, 14.0f, 15.0f,
16.0f, 17.0f, 18.0f, 19.0f, 20.0f, 21.0f, 22.0f, 23.0f,
24.0f, 25.0f, 26.0f, 27.0f, 28.0f, 29.0f, 30.0f, 31.0f,
16.0f, 17.0f, 18.0f, 19.0f, 20.0f, 21.0f, 22.0f, 23.0f,
24.0f, 25.0f, 26.0f, 27.0f, 28.0f, 29.0f, 30.0f, 31.0f,
32.0f, 33.0f, 34.0f, 35.0f, 36.0f, 37.0f, 38.0f, 39.0f,
40.0f, 41.0f, 42.0f, 43.0f, 44.0f, 45.0f, 46.0f, 47.0f,
32.0f, 33.0f, 34.0f, 35.0f, 36.0f, 37.0f, 38.0f, 39.0f,
40.0f, 41.0f, 42.0f, 43.0f, 44.0f, 45.0f, 46.0f, 47.0f,
48.0f, 49.0f, 50.0f, 51.0f, 52.0f, 53.0f, 54.0f, 55.0f,
56.0f, 57.0f, 58.0f, 59.0f, 60.0f, 61.0f, 62.0f, 63.0f };
48.0f, 49.0f, 50.0f, 51.0f, 52.0f, 53.0f, 54.0f, 55.0f,
56.0f, 57.0f, 58.0f, 59.0f, 60.0f, 61.0f, 62.0f, 63.0f
};
dsf.AddPointField(dataSet, "pointvar", pointvar, nVerts);
dsf.AddCellField(dataSet, "cellvar", cellvar, nCells, "cells");
@ -307,13 +312,13 @@ inline vtkm::cont::DataSet MakeTestDataSet::Make3DUniformDataSet1()
inline vtkm::cont::DataSet MakeTestDataSet::Make3DUniformDataSet2()
{
const vtkm::Id base_size = 256;
constexpr vtkm::Id base_size = 256;
vtkm::cont::DataSetBuilderUniform dsb;
vtkm::Id3 dimensions(base_size, base_size, base_size);
vtkm::cont::DataSet dataSet = dsb.Create(dimensions);
vtkm::cont::DataSetFieldAdd dsf;
const vtkm::Id nVerts = base_size * base_size * base_size;
constexpr vtkm::Id nVerts = base_size * base_size * base_size;
vtkm::Float32* pointvar = new vtkm::Float32[nVerts];
for (vtkm::Id z = 0; z < base_size; ++z)