blob: 9053f4ba93b413b1c3c6579390951ec8939d767c (
plain) (
blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
|
/*
* 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<T>() to indicate termination.
Derived class needs to implement increment operators.
*/
template<typename T>
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<T> inline methods ////////
template<typename T>
NV_INLINE IteratorBase<T>::IteratorBase(T curr) : m_curr(curr)
{
}
template<typename T>
NV_INLINE IteratorBase<T>::operator bool() const
{
return !isInvalidIndex<T>(m_curr);
}
template<typename T>
NV_INLINE IteratorBase<T>::operator T() const
{
return m_curr;
}
/**
Common functionality and implementation for an indexed linked list iterator
*/
template<typename IndexType>
class LListIt : public IteratorBase<IndexType>
{
public:
LListIt(IndexType curr, IndexType* links);
/** Pre-increment. Only use if valid() == true. */
uint32_t operator ++ ();
protected:
IndexType* m_links;
};
//////// LListIt<IndexType> inline methods ////////
template<typename IndexType>
NV_INLINE LListIt<IndexType>::LListIt(IndexType curr, IndexType* links) : IteratorBase<IndexType>(curr), m_links(links)
{
}
template<typename IndexType>
NV_INLINE uint32_t LListIt<IndexType>::operator ++ ()
{
NVBLAST_ASSERT((bool)(*this));
return (this->m_curr = m_links[this->m_curr]);
}
/**
Common functionality and implementation for an IndexDList<IndexType> iterator
*/
template<typename IndexType>
class DListIt : public IteratorBase<IndexType>
{
public:
DListIt(IndexType curr, IndexDLink<IndexType>* links);
/** Pre-increment. Only use if valid() == true. */
uint32_t operator ++ ();
protected:
IndexDLink<IndexType>* m_links;
};
//////// DListIt<IndexType> inline methods ////////
template<typename IndexType>
NV_INLINE DListIt<IndexType>::DListIt(IndexType curr, IndexDLink<IndexType>* links) : IteratorBase<IndexType>(curr), m_links(links)
{
}
template<typename IndexType>
NV_INLINE uint32_t DListIt<IndexType>::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
|