Commit 6b68666d authored by Kenneth Moreland's avatar Kenneth Moreland

Created DynamicCellSet

The DynamicCellSet will be used in place of the pointer to a CellSet
in a DataSet. This will prevent us from having to cast it all the time
and also remove reliance on boost smart_ptr.
parent 53d66977
......@@ -75,7 +75,7 @@ struct ArrayHandleImplicitTraits
{
typedef vtkm::cont::StorageTagImplicit<
vtkm::cont::detail::ArrayPortalImplicit<ValueType,
FunctorType> > Tag;
FunctorType> > StorageTag;
};
} // namespace detail
......@@ -94,16 +94,16 @@ class ArrayHandleImplicit
: public vtkm::cont::ArrayHandle <
ValueType,
typename detail::ArrayHandleImplicitTraits<ValueType,
FunctorType>::Tag >
FunctorType>::StorageTag >
{
private:
typedef typename detail::ArrayHandleImplicitTraits<ValueType,
FunctorType> ArrayTraits;
typedef typename ArrayTraits::Tag Tag;
public:
typedef vtkm::cont::ArrayHandle<ValueType,Tag> Superclass;
typedef typename ArrayTraits::StorageTag StorageTag;
typedef vtkm::cont::ArrayHandle<ValueType,StorageTag> Superclass;
ArrayHandleImplicit()
: Superclass(typename Superclass::PortalConstControl(FunctorType(),0)) { }
......
......@@ -35,6 +35,7 @@ set(headers
Assert.h
CellSet.h
CellSetExplicit.h
CellSetListTag.h
CellSetStructured.h
CoordinateSystem.h
DataSet.h
......@@ -42,6 +43,7 @@ set(headers
DeviceAdapterAlgorithm.h
DeviceAdapterSerial.h
DynamicArrayHandle.h
DynamicCellSet.h
DynamicPointCoordinates.h
ExplicitConnectivity.h
Error.h
......
......@@ -27,22 +27,29 @@ namespace vtkm {
namespace cont {
template<typename ShapeStorageTag = VTKM_DEFAULT_STORAGE_TAG,
typename IndiceStorageTag = VTKM_DEFAULT_STORAGE_TAG,
typename IndexStorageTag = VTKM_DEFAULT_STORAGE_TAG,
typename ConnectivityStorageTag = VTKM_DEFAULT_STORAGE_TAG >
class CellSetExplicit : public CellSet
{
public:
typedef ExplicitConnectivity<ShapeStorageTag,
IndiceStorageTag,
IndexStorageTag,
ConnectivityStorageTag
> ExplicitConnectivityType;
VTKM_CONT_EXPORT
CellSetExplicit(const std::string &name, vtkm::IdComponent dimensionality)
CellSetExplicit(const std::string &name = "",
vtkm::IdComponent dimensionality = 3)
: CellSet(name, dimensionality)
{
}
VTKM_CONT_EXPORT
CellSetExplicit(int dimensionality)
: CellSet("", dimensionality)
{
}
virtual vtkm::Id GetNumCells() const
{
return this->NodesOfCellsConnectivity.GetNumberOfElements();
......
//============================================================================
// 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.
//
// Copyright 2015 Sandia Corporation.
// Copyright 2015 UT-Battelle, LLC.
// Copyright 2015 Los Alamos National Security.
//
// Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation,
// the U.S. Government retains certain rights in this software.
//
// Under the terms of Contract DE-AC52-06NA25396 with Los Alamos National
// Laboratory (LANL), the U.S. Government retains certain rights in
// this software.
//============================================================================
#ifndef vtk_m_cont_CellSetListTag_h
#define vtk_m_cont_CellSetListTag_h
#ifndef VTKM_DEFAULT_CELL_SET_LIST_TAG
#define VTKM_DEFAULT_CELL_SET_LIST_TAG ::vtkm::cont::CellSetListTagCommon
#endif
#include <vtkm/ListTag.h>
#include <vtkm/cont/CellSetExplicit.h>
#include <vtkm/cont/CellSetStructured.h>
namespace vtkm {
namespace cont {
struct CellSetListTagStructured1D
: vtkm::ListTagBase<vtkm::cont::CellSetStructured<1> > { };
struct CellSetListTagStructured2D
: vtkm::ListTagBase<vtkm::cont::CellSetStructured<2> > { };
struct CellSetListTagStructured3D
: vtkm::ListTagBase<vtkm::cont::CellSetStructured<3> > { };
template<typename ShapeStorageTag = VTKM_DEFAULT_STORAGE_TAG,
typename IndexStorageTag = VTKM_DEFAULT_STORAGE_TAG,
typename ConnectivityStorageTag = VTKM_DEFAULT_STORAGE_TAG >
struct CellSetListTagExplicit
: vtkm::ListTagBase<
vtkm::cont::CellSetExplicit<
ShapeStorageTag,
IndexStorageTag,
ConnectivityStorageTag> > { };
struct CellSetListTagExplicitDefault
: CellSetListTagExplicit<> { };
struct CellSetListTagCommon
: vtkm::ListTagBase<
vtkm::cont::CellSetStructured<2>,
vtkm::cont::CellSetStructured<3>,
vtkm::cont::CellSetExplicit<> > { };
}
} // namespace vtkm::cont
#endif //vtk_m_cont_CellSetListTag_h
......@@ -36,7 +36,7 @@ public:
static const int Dimension=DIMENSION;
VTKM_CONT_EXPORT
CellSetStructured(const std::string &name)
CellSetStructured(const std::string &name = "")
: CellSet(name,Dimension)
{
}
......
......@@ -141,7 +141,7 @@ public:
template<typename Type, typename Storage>
VTKM_CONT_EXPORT
DynamicArrayHandle(const vtkm::cont::ArrayHandle<Type,Storage> &array)
: ArrayStorage(new vtkm::cont::detail::PolymorphicArrayHandleContainer<
: ArrayContainer(new vtkm::cont::detail::PolymorphicArrayHandleContainer<
Type,Storage>(array))
{ }
......@@ -149,7 +149,7 @@ public:
VTKM_CONT_EXPORT
DynamicArrayHandle(
const internal::DynamicArrayHandleCast<TypeList,StorageList> &dynamicArray)
: ArrayStorage(dynamicArray.ArrayStorage) { }
: ArrayContainer(dynamicArray.ArrayContainer) { }
/// Returns true if this array is of the provided type and uses the provided
/// storage.
......@@ -157,7 +157,7 @@ public:
template<typename Type, typename Storage>
VTKM_CONT_EXPORT
bool IsTypeAndStorage(Type = Type(), Storage = Storage()) const {
return (this->TryCastStorage<Type,Storage>() != NULL);
return (this->TryCastContainer<Type,Storage>() != NULL);
}
/// Returns this array cast to an ArrayHandle object of the given type and
......@@ -169,7 +169,7 @@ public:
vtkm::cont::ArrayHandle<Type, Storage>
CastToArrayHandle(Type = Type(), Storage = Storage()) const {
vtkm::cont::detail::PolymorphicArrayHandleContainer<Type,Storage> *container
= this->TryCastStorage<Type,Storage>();
= this->TryCastContainer<Type,Storage>();
if (container == NULL)
{
throw vtkm::cont::ErrorControlBadValue("Bad cast of dynamic array.");
......@@ -241,7 +241,7 @@ public:
DynamicArrayHandle NewInstance() const
{
DynamicArrayHandle newArray;
newArray.ArrayStorage = this->ArrayStorage->NewInstance();
newArray.ArrayContainer = this->ArrayContainer->NewInstance();
return newArray;
}
......@@ -254,7 +254,7 @@ public:
VTKM_CONT_EXPORT
vtkm::IdComponent GetNumberOfComponents() const
{
return this->ArrayStorage->GetNumberOfComponents();
return this->ArrayContainer->GetNumberOfComponents();
}
/// \brief Get the number of values in the array.
......@@ -262,21 +262,21 @@ public:
VTKM_CONT_EXPORT
vtkm::Id GetNumberOfValues() const
{
return this->ArrayStorage->GetNumberOfValues();
return this->ArrayContainer->GetNumberOfValues();
}
private:
boost::shared_ptr<vtkm::cont::detail::PolymorphicArrayHandleContainerBase>
ArrayStorage;
ArrayContainer;
template<typename Type, typename Storage>
VTKM_CONT_EXPORT
vtkm::cont::detail::PolymorphicArrayHandleContainer<Type,Storage> *
TryCastStorage() const {
TryCastContainer() const {
return
dynamic_cast<
vtkm::cont::detail::PolymorphicArrayHandleContainer<Type,Storage> *>(
this->ArrayStorage.get());
this->ArrayContainer.get());
}
};
......
This diff is collapsed.
......@@ -17,8 +17,8 @@
// Laboratory (LANL), the U.S. Government retains certain rights in
// this software.
//============================================================================
#ifndef vtk_m_StorageListTag_h
#define vtk_m_StorageListTag_h
#ifndef vtk_m_cont_StorageListTag_h
#define vtk_m_cont_StorageListTag_h
#ifndef VTKM_DEFAULT_STORAGE_LIST_TAG
#define VTKM_DEFAULT_STORAGE_LIST_TAG ::vtkm::cont::StorageListTagBasic
......@@ -38,4 +38,4 @@ struct StorageListTagBasic
}
} // namespace vtkm::cont
#endif //vtk_m_StorageListTag_h
#endif //vtk_m_cont_StorageListTag_h
......@@ -36,6 +36,8 @@ struct SimplePolymorphicContainerBase {
virtual boost::shared_ptr<SimplePolymorphicContainerBase>
NewInstance() const = 0;
virtual const void *GetVoidPointer() const = 0;
};
/// \brief Simple object container that can use C++ run-time type information.
......@@ -63,6 +65,11 @@ struct SimplePolymorphicContainer : public SimplePolymorphicContainerBase
return boost::shared_ptr<SimplePolymorphicContainerBase>(
new SimplePolymorphicContainer<T>());
}
virtual const void *GetVoidPointer() const
{
return &this->Item;
}
};
}
......
......@@ -22,6 +22,7 @@
#include "vtkm/cont/ArrayHandle.h"
#include "vtkm/cont/DynamicArrayHandle.h"
#include "vtkm/cont/DynamicCellSet.h"
#include "vtkm/cont/DynamicPointCoordinates.h"
#include "vtkm/internal/FunctionInterface.h"
......@@ -79,6 +80,17 @@ struct ArrayHandleStringFunctor {
}
};
struct CellSetStructuredFunctor {
template<typename T>
void operator()(const T &) const {
VTKM_TEST_FAIL("Called wrong form of functor operator.");
}
void operator()(const vtkm::cont::CellSetStructured<3> &) const {
std::cout << " In CellSetStructured<3> functor." << std::endl;
g_FunctionCalls++;
}
};
struct FunctionInterfaceFunctor {
template<typename Signature>
void operator()(const vtkm::internal::FunctionInterface<Signature> &) const {
......@@ -89,6 +101,7 @@ struct FunctionInterfaceFunctor {
void(vtkm::cont::ArrayHandle<vtkm::FloatDefault>,
vtkm::cont::ArrayHandle<vtkm::FloatDefault>,
vtkm::cont::ArrayHandle<std::string>,
vtkm::cont::CellSetStructured<3>,
vtkm::cont::ArrayHandleUniformPointCoordinates)> &) const {
std::cout << " In FunctionInterface<...> functor." << std::endl;
g_FunctionCalls++;
......@@ -118,6 +131,18 @@ void TestBasicTransform()
TRY_TRANSFORM(transform(dynamicArray.ResetTypeList(TypeListTagString()),
ArrayHandleStringFunctor(),
indexTag));
std::cout << " Trying with structured cell set." << std::endl;
vtkm::cont::CellSetStructured<3> concreteCellSet;
TRY_TRANSFORM(transform(concreteCellSet,
CellSetStructuredFunctor(),
indexTag));
std::cout << " Trying with dynamic cell set." << std::endl;
vtkm::cont::DynamicCellSet dynamicCellSet = concreteCellSet;
TRY_TRANSFORM(transform(dynamicCellSet,
CellSetStructuredFunctor(),
indexTag));
}
void TestFunctionTransform()
......@@ -126,6 +151,7 @@ void TestFunctionTransform()
vtkm::cont::ArrayHandle<vtkm::FloatDefault> scalarArray;
vtkm::cont::ArrayHandle<std::string> stringArray;
vtkm::cont::CellSetStructured<3> structuredCellSet;
vtkm::cont::ArrayHandleUniformPointCoordinates pointCoordinatesArray;
std::cout << " Trying basic functor call w/o transform (make sure it works)."
......@@ -135,6 +161,7 @@ void TestFunctionTransform()
scalarArray,
scalarArray,
stringArray,
structuredCellSet,
pointCoordinatesArray)));
std::cout << " Trying dynamic cast" << std::endl;
......@@ -143,6 +170,7 @@ void TestFunctionTransform()
scalarArray,
vtkm::cont::DynamicArrayHandle(scalarArray),
vtkm::cont::DynamicArrayHandle(stringArray).ResetTypeList(TypeListTagString()),
vtkm::cont::DynamicCellSet(structuredCellSet),
vtkm::cont::DynamicPointCoordinates(vtkm::cont::PointCoordinatesUniform()))
.DynamicTransformCont(vtkm::cont::internal::DynamicTransform(),
FunctionInterfaceFunctor()));
......
......@@ -47,6 +47,7 @@ set(unit_tests
UnitTestDeviceAdapterAlgorithmGeneral.cxx
UnitTestDeviceAdapterSerial.cxx
UnitTestDynamicArrayHandle.cxx
UnitTestDynamicCellSet.cxx
UnitTestDynamicPointCoordinates.cxx
UnitTestPointCoordinates.cxx
UnitTestStorageBasic.cxx
......
//============================================================================
// 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.
//
// Copyright 2015 Sandia Corporation.
// Copyright 2015 UT-Battelle, LLC.
// Copyright 2015 Los Alamos National Security.
//
// Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation,
// the U.S. Government retains certain rights in this software.
//
// Under the terms of Contract DE-AC52-06NA25396 with Los Alamos National
// Laboratory (LANL), the U.S. Government retains certain rights in
// this software.
//============================================================================
#include <vtkm/cont/DynamicCellSet.h>
#include <vtkm/cont/ArrayHandleConstant.h>
#include <vtkm/cont/testing/Testing.h>
namespace {
struct NonDefaultCellSetList
: vtkm::ListTagBase<
vtkm::cont::CellSetStructured<1>,
vtkm::cont::CellSetExplicit<vtkm::cont::ArrayHandleConstant<vtkm::Id>::StorageTag > >
{ };
bool CheckCalled;
template<typename ExpectedCellType>
struct CheckFunctor
{
void operator()(const ExpectedCellType &) const
{
CheckCalled = true;
}
template<typename UnexpectedType>
void operator()(const UnexpectedType &) const
{
VTKM_TEST_FAIL("CastAndCall functor called with wrong type.");
}
};
template<typename CellSetType, typename CellSetList>
void CheckDynamicCellSet(
const CellSetType &cellSet,
vtkm::cont::DynamicCellSetBase<CellSetList> dynamicCellSet)
{
VTKM_TEST_ASSERT(dynamicCellSet.IsType(cellSet),
"DynamicCellSet reports wrong type.");
VTKM_TEST_ASSERT(!dynamicCellSet.IsType(vtkm::Id()),
"DynamicCellSet reports wrong type.");
dynamicCellSet.CastTo(cellSet);
CheckCalled = false;
dynamicCellSet.CastAndCall(CheckFunctor<CellSetType>());
VTKM_TEST_ASSERT(CheckCalled,
"The functor was never called (and apparently a bad value exception not thrown).");
}
template<typename CellSetType, typename CellSetList>
void TryNewInstance(
CellSetType, vtkm::cont::DynamicCellSetBase<CellSetList> &originalCellSet)
{
vtkm::cont::DynamicCellSetBase<CellSetList> newCellSet =
originalCellSet.NewInstance();
VTKM_TEST_ASSERT(newCellSet.IsType(CellSetType()),
"New cell set wrong type.");
VTKM_TEST_ASSERT(&originalCellSet.CastTo(CellSetType())
!= &newCellSet.CastTo(CellSetType()),
"NewInstance did not make a copy.");
}
template<typename CellSetType, typename CellSetList>
void TryCellSet(CellSetType cellSet,
vtkm::cont::DynamicCellSetBase<CellSetList> &dynamicCellSet)
{
CheckDynamicCellSet(cellSet, dynamicCellSet);
CheckDynamicCellSet(
cellSet,
dynamicCellSet.ResetCellSetList(vtkm::ListTagBase<CellSetType>()));
TryNewInstance(cellSet, dynamicCellSet);
}
template<typename CellSetType>
void TryDefaultCellSet(CellSetType cellSet)
{
vtkm::cont::DynamicCellSet dynamicCellSet(cellSet);
TryCellSet(cellSet, dynamicCellSet);
}
template<typename CellSetType>
void TryNonDefaultCellSet(CellSetType cellSet)
{
vtkm::cont::DynamicCellSetBase<NonDefaultCellSetList> dynamicCellSet(cellSet);
TryCellSet(cellSet, dynamicCellSet);
}
void TestDynamicCellSet()
{
std::cout << "Try default types with default type lists." << std::endl;
std::cout << "*** 2D Structured Grid ******************" << std::endl;
TryDefaultCellSet(vtkm::cont::CellSetStructured<2>());
std::cout << "*** 3D Structured Grid ******************" << std::endl;
TryDefaultCellSet(vtkm::cont::CellSetStructured<3>());
std::cout << "*** Explicit Grid ***********************" << std::endl;
TryDefaultCellSet(vtkm::cont::CellSetExplicit<>());
std::cout << std::endl << "Try non-default types." << std::endl;
std::cout << "*** 1D Structured Grid ******************" << std::endl;
TryNonDefaultCellSet(vtkm::cont::CellSetStructured<1>());
std::cout << "*** Explicit Grid Constant Shape ********" << std::endl;
TryNonDefaultCellSet(vtkm::cont::CellSetExplicit<
vtkm::cont::ArrayHandleConstant<vtkm::Id>::StorageTag>());
}
} // anonymous namespace
int UnitTestDynamicCellSet(int, char *[])
{
return vtkm::cont::testing::Testing::Run(TestDynamicCellSet);
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment