mirror of
https://gitlab.kitware.com/vtk/vtk-m
synced 2024-09-16 17:22:55 +00:00
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:
parent
8373adc654
commit
a529b90c73
11
docs/changelog/vtkm-vec-operator-constexpr.md
Normal file
11
docs/changelog/vtkm-vec-operator-constexpr.md
Normal file
@ -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);
|
||||
```
|
21
vtkm/Types.h
21
vtkm/Types.h
@ -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)
|
||||
|
Loading…
Reference in New Issue
Block a user