vtk-m/vtkm/cont/ArrayHandleImplicit.h

146 lines
4.4 KiB
C
Raw Normal View History

2015-02-13 06:24:43 +00:00
//=============================================================================
//
// 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 National Technology & Engineering Solutions of Sandia, LLC (NTESS).
2015-02-13 06:24:43 +00:00
// Copyright 2015 UT-Battelle, LLC.
// Copyright 2015 Los Alamos National Security.
2015-02-13 06:24:43 +00:00
//
// Under the terms of Contract DE-NA0003525 with NTESS,
2015-02-13 06:24:43 +00:00
// 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_ArrayHandleImplicit_h
#define vtk_m_cont_ArrayHandleImplicit_h
#include <vtkm/cont/ArrayHandle.h>
#include <vtkm/cont/StorageImplicit.h>
2017-05-18 14:29:41 +00:00
namespace vtkm
{
namespace cont
{
2015-02-13 06:24:43 +00:00
2017-05-18 14:29:41 +00:00
namespace detail
{
2017-05-30 15:13:18 +00:00
template <class FunctorType_>
class VTKM_ALWAYS_EXPORT ArrayPortalImplicit;
/// A convenience class that provides a typedef to the appropriate tag for
/// a implicit array container.
template <typename FunctorType>
struct ArrayHandleImplicitTraits
{
using ValueType = decltype(FunctorType{}(vtkm::Id{}));
using StorageTag = vtkm::cont::StorageTagImplicit<ArrayPortalImplicit<FunctorType>>;
using Superclass = vtkm::cont::ArrayHandle<ValueType, StorageTag>;
};
2015-02-13 06:24:43 +00:00
/// \brief An array portal that returns the result of a functor
///
/// This array portal is similar to an implicit array i.e an array that is
/// defined functionally rather than actually stored in memory. The array
/// comprises a functor that is called for each index.
///
/// The \c ArrayPortalImplicit is used in an ArrayHandle with an
/// \c StorageImplicit container.
///
2017-05-30 15:13:18 +00:00
template <class FunctorType_>
class VTKM_ALWAYS_EXPORT ArrayPortalImplicit
2015-02-13 06:24:43 +00:00
{
public:
2017-05-30 15:13:18 +00:00
using ValueType = typename ArrayHandleImplicitTraits<FunctorType_>::ValueType;
using FunctorType = FunctorType_;
2015-02-13 06:24:43 +00:00
VTKM_EXEC_CONT
2017-05-18 14:29:41 +00:00
ArrayPortalImplicit()
: Functor()
, NumberOfValues(0)
{
}
2015-02-13 06:24:43 +00:00
VTKM_EXEC_CONT
2017-05-18 14:29:41 +00:00
ArrayPortalImplicit(FunctorType f, vtkm::Id numValues)
: Functor(f)
, NumberOfValues(numValues)
{
}
2015-02-13 06:24:43 +00:00
VTKM_EXEC_CONT
2015-02-13 06:24:43 +00:00
vtkm::Id GetNumberOfValues() const { return this->NumberOfValues; }
VTKM_SUPPRESS_EXEC_WARNINGS
VTKM_EXEC_CONT
2015-02-13 06:24:43 +00:00
ValueType Get(vtkm::Id index) const { return this->Functor(index); }
VTKM_EXEC_CONT
2017-05-18 14:29:41 +00:00
void Set(vtkm::Id vtkmNotUsed(index), const ValueType& vtkmNotUsed(value)) const
{
#if !(defined(VTKM_MSVC) && defined(VTKM_CUDA))
VTKM_ASSERT(false && "Cannot write to read-only implicit array.");
#endif
}
using IteratorType =
vtkm::cont::internal::IteratorFromArrayPortal<ArrayPortalImplicit<FunctorType>>;
VTKM_CONT
2017-05-18 14:29:41 +00:00
IteratorType GetIteratorBegin() const { return IteratorType(*this); }
2015-02-13 06:24:43 +00:00
private:
FunctorType Functor;
vtkm::Id NumberOfValues;
};
} // namespace detail
/// \brief An \c ArrayHandle that computes values on the fly.
///
/// \c ArrayHandleImplicit is a specialization of ArrayHandle.
/// It takes a user defined functor which is called with a given index value.
/// The functor returns the result of the functor as the value of this
/// array at that position.
///
2017-05-30 15:13:18 +00:00
template <class FunctorType>
class ArrayHandleImplicit : public detail::ArrayHandleImplicitTraits<FunctorType>::Superclass
2015-02-13 06:24:43 +00:00
{
private:
using ArrayTraits = typename detail::ArrayHandleImplicitTraits<FunctorType>;
2015-02-13 06:24:43 +00:00
public:
VTKM_ARRAY_HANDLE_SUBCLASS(ArrayHandleImplicit,
2017-05-30 15:13:18 +00:00
(ArrayHandleImplicit<FunctorType>),
2017-05-18 14:29:41 +00:00
(typename ArrayTraits::Superclass));
VTKM_CONT
2015-02-13 06:24:43 +00:00
ArrayHandleImplicit(FunctorType functor, vtkm::Id length)
2017-05-18 14:29:41 +00:00
: Superclass(typename Superclass::PortalConstControl(functor, length))
{
}
2015-02-13 06:24:43 +00:00
};
/// make_ArrayHandleImplicit is convenience function to generate an
/// ArrayHandleImplicit. It takes a functor and the virtual length of the
/// arry.
2017-05-30 15:13:18 +00:00
template <typename FunctorType>
VTKM_CONT vtkm::cont::ArrayHandleImplicit<FunctorType> make_ArrayHandleImplicit(FunctorType functor,
vtkm::Id length)
2015-02-13 06:24:43 +00:00
{
2017-05-30 15:13:18 +00:00
return ArrayHandleImplicit<FunctorType>(functor, length);
2015-02-13 06:24:43 +00:00
}
}
} // namespace vtkm::cont
#endif //vtk_m_cont_ArrayHandleImplicit_h