//============================================================================ // 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. //============================================================================ #ifndef vtk_m_cont_internal_IteratorFromArrayPortal_h #define vtk_m_cont_internal_IteratorFromArrayPortal_h #include #include #include namespace vtkm { namespace cont { namespace internal { template class IteratorFromArrayPortal { public: using value_type = typename std::remove_const::type; using reference = vtkm::internal::ArrayPortalValueReference; using pointer = typename std::add_pointer::type; using difference_type = std::ptrdiff_t; using iterator_category = std::random_access_iterator_tag; using iter = IteratorFromArrayPortal; VTKM_SUPPRESS_EXEC_WARNINGS VTKM_EXEC_CONT IteratorFromArrayPortal() : Portal() , Index(0) { } VTKM_SUPPRESS_EXEC_WARNINGS VTKM_EXEC_CONT explicit IteratorFromArrayPortal(const ArrayPortalType& portal, vtkm::Id index = 0) : Portal(portal) , Index(index) { VTKM_ASSERT(index >= 0); VTKM_ASSERT(index <= portal.GetNumberOfValues()); } VTKM_EXEC_CONT reference operator*() const { return reference(this->Portal, this->Index); } VTKM_EXEC_CONT reference operator->() const { return reference(this->Portal, this->Index); } VTKM_EXEC_CONT reference operator[](difference_type idx) const { return reference(this->Portal, this->Index + static_cast(idx)); } VTKM_EXEC_CONT iter& operator++() { this->Index++; VTKM_ASSERT(this->Index <= this->Portal.GetNumberOfValues()); return *this; } VTKM_EXEC_CONT iter operator++(int) { return iter(this->Portal, this->Index++); } VTKM_EXEC_CONT iter& operator--() { this->Index--; VTKM_ASSERT(this->Index >= 0); return *this; } VTKM_EXEC_CONT iter operator--(int) { return iter(this->Portal, this->Index--); } VTKM_EXEC_CONT iter& operator+=(difference_type n) { this->Index += static_cast(n); VTKM_ASSERT(this->Index <= this->Portal.GetNumberOfValues()); return *this; } VTKM_EXEC_CONT iter& operator-=(difference_type n) { this->Index -= static_cast(n); VTKM_ASSERT(this->Index >= 0); return *this; } VTKM_EXEC_CONT iter operator-(difference_type n) const { return iter(this->Portal, this->Index - static_cast(n)); } ArrayPortalType Portal; vtkm::Id Index; }; template VTKM_EXEC_CONT IteratorFromArrayPortal make_IteratorBegin( const ArrayPortalType& portal) { return IteratorFromArrayPortal(portal, 0); } template VTKM_EXEC_CONT IteratorFromArrayPortal make_IteratorEnd( const ArrayPortalType& portal) { return IteratorFromArrayPortal(portal, portal.GetNumberOfValues()); } template VTKM_EXEC_CONT bool operator==(vtkm::cont::internal::IteratorFromArrayPortal const& lhs, vtkm::cont::internal::IteratorFromArrayPortal const& rhs) { return lhs.Index == rhs.Index; } template VTKM_EXEC_CONT bool operator!=(vtkm::cont::internal::IteratorFromArrayPortal const& lhs, vtkm::cont::internal::IteratorFromArrayPortal const& rhs) { return lhs.Index != rhs.Index; } template VTKM_EXEC_CONT bool operator<(vtkm::cont::internal::IteratorFromArrayPortal const& lhs, vtkm::cont::internal::IteratorFromArrayPortal const& rhs) { return lhs.Index < rhs.Index; } template VTKM_EXEC_CONT bool operator<=(vtkm::cont::internal::IteratorFromArrayPortal const& lhs, vtkm::cont::internal::IteratorFromArrayPortal const& rhs) { return lhs.Index <= rhs.Index; } template VTKM_EXEC_CONT bool operator>(vtkm::cont::internal::IteratorFromArrayPortal const& lhs, vtkm::cont::internal::IteratorFromArrayPortal const& rhs) { return lhs.Index > rhs.Index; } template VTKM_EXEC_CONT bool operator>=(vtkm::cont::internal::IteratorFromArrayPortal const& lhs, vtkm::cont::internal::IteratorFromArrayPortal const& rhs) { return lhs.Index >= rhs.Index; } template VTKM_EXEC_CONT std::ptrdiff_t operator-( vtkm::cont::internal::IteratorFromArrayPortal const& lhs, vtkm::cont::internal::IteratorFromArrayPortal const& rhs) { return lhs.Index - rhs.Index; } template VTKM_EXEC_CONT vtkm::cont::internal::IteratorFromArrayPortal operator+( vtkm::cont::internal::IteratorFromArrayPortal const& iter, std::ptrdiff_t n) { return vtkm::cont::internal::IteratorFromArrayPortal( iter.Portal, iter.Index + static_cast(n)); } template VTKM_EXEC_CONT vtkm::cont::internal::IteratorFromArrayPortal operator+( std::ptrdiff_t n, vtkm::cont::internal::IteratorFromArrayPortal const& iter) { return vtkm::cont::internal::IteratorFromArrayPortal( iter.Portal, iter.Index + static_cast(n)); } } } } // namespace vtkm::cont::internal #endif //vtk_m_cont_internal_IteratorFromArrayPortal_h