/* * Copyright (c) 2016-2017, NVIDIA CORPORATION. All rights reserved. * * NVIDIA CORPORATION and its licensors retain all intellectual property * and proprietary rights in and to this software, related documentation * and any modifications thereto. Any use, reproduction, disclosure or * distribution of this software and related documentation without an express * license agreement from NVIDIA CORPORATION is strictly prohibited. */ #ifndef NVBLASTITERATORBASE_H #define NVBLASTITERATORBASE_H #include "NvBlastIndexFns.h" namespace Nv { namespace Blast { /** Common functionality and implementation for iterators over an index, using invalidIndex() to indicate termination. Derived class needs to implement increment operators. */ template class IteratorBase { public: /** Constructor sets m_curr value */ IteratorBase(T curr); /** Validity of current value. */ operator bool() const; /** Current value. */ operator T() const; protected: T m_curr; }; //////// IteratorBase inline methods //////// template NV_INLINE IteratorBase::IteratorBase(T curr) : m_curr(curr) { } template NV_INLINE IteratorBase::operator bool() const { return !isInvalidIndex(m_curr); } template NV_INLINE IteratorBase::operator T() const { return m_curr; } /** Common functionality and implementation for an indexed linked list iterator */ template class LListIt : public IteratorBase { public: LListIt(IndexType curr, IndexType* links); /** Pre-increment. Only use if valid() == true. */ uint32_t operator ++ (); protected: IndexType* m_links; }; //////// LListIt inline methods //////// template NV_INLINE LListIt::LListIt(IndexType curr, IndexType* links) : IteratorBase(curr), m_links(links) { } template NV_INLINE uint32_t LListIt::operator ++ () { NVBLAST_ASSERT((bool)(*this)); return (this->m_curr = m_links[this->m_curr]); } /** Common functionality and implementation for an IndexDList iterator */ template class DListIt : public IteratorBase { public: DListIt(IndexType curr, IndexDLink* links); /** Pre-increment. Only use if valid() == true. */ uint32_t operator ++ (); protected: IndexDLink* m_links; }; //////// DListIt inline methods //////// template NV_INLINE DListIt::DListIt(IndexType curr, IndexDLink* links) : IteratorBase(curr), m_links(links) { } template NV_INLINE uint32_t DListIt::operator ++ () { NVBLAST_ASSERT((bool)(*this)); return (this->m_curr = m_links[this->m_curr].m_adj[1]); } } // end namespace Blast } // end namespace Nv #endif // #ifndef NVBLASTITERATORBASE_H