OpenBarnyard
 
Loading...
Searching...
No Matches
TSharedBuffer< T, BUFSIZE, IDENTIFIER > Class Template Reference

#include <TSharedBuffer.h>

Classes

class  TNode
 

Public Member Functions

 TSharedBuffer ()
 
 ~TSharedBuffer ()
 
TUINT GetSize () const
 
TBOOL SetSize (TINT a_iSize)
 
T & At (TINT a_iIndex)
 
const T & At (TINT a_iIndex) const
 
T & operator[] (TINT a_iIndex)
 
const T & operator[] (TINT a_iIndex) const
 

Static Public Member Functions

static void CreateSharedBuffers (TINT a_iNumBuffers)
 
static void DestroySharedBuffers ()
 
static TBOOL IsAnyBuffersUsed ()
 

Detailed Description

template<typename T, TINT BUFSIZE, TINT IDENTIFIER>
class TSharedBuffer< T, BUFSIZE, IDENTIFIER >

Definition at line 13 of file TSharedBuffer.h.

Constructor & Destructor Documentation

◆ TSharedBuffer()

template<typename T, TINT BUFSIZE, TINT IDENTIFIER>
TSharedBuffer< T, BUFSIZE, IDENTIFIER >::TSharedBuffer ( )
inline

Definition at line 111 of file TSharedBuffer.h.

112 : m_oArray( 4, 10 )
113 {
114 TASSERT( ( 1 << TMath::IntLog2( BUFSIZE ) ) == BUFSIZE );
115 }
#define TASSERT(X,...)
Definition Defines.h:138

◆ ~TSharedBuffer()

template<typename T, TINT BUFSIZE, TINT IDENTIFIER>
TSharedBuffer< T, BUFSIZE, IDENTIFIER >::~TSharedBuffer ( )
inline

Definition at line 117 of file TSharedBuffer.h.

118 {
119 SetSize( 0 );
120 }
TBOOL SetSize(TINT a_iSize)

Member Function Documentation

◆ At() [1/2]

template<typename T, TINT BUFSIZE, TINT IDENTIFIER>
T & TSharedBuffer< T, BUFSIZE, IDENTIFIER >::At ( TINT a_iIndex)
inline

Definition at line 182 of file TSharedBuffer.h.

183 {
184 TASSERT( TMath::IntLog2( BUFSIZE ) == m_iMainIndexShift );
185 TASSERT( m_oFreeList.Size() <= m_iNumBuffers );
186 TASSERT( a_iIndex < m_oArray.Size() * BUFSIZE );
187
188 TINT iSubIndex = m_iSubIndexMask & a_iIndex;
189 TINT iMainIndex = a_iIndex >> ( m_iMainIndexShift % BUFSIZE );
190
191 TASSERT( iMainIndex < m_oArray.Size() );
193
194 return m_oArray[ iMainIndex ]->GetElement( iSubIndex );
195 }

◆ At() [2/2]

template<typename T, TINT BUFSIZE, TINT IDENTIFIER>
const T & TSharedBuffer< T, BUFSIZE, IDENTIFIER >::At ( TINT a_iIndex) const
inline

Definition at line 197 of file TSharedBuffer.h.

198 {
199 TASSERT( TMath::IntLog2( BUFSIZE ) == m_iMainIndexShift );
200 TASSERT( m_oFreeList.Size() <= m_iNumBuffers );
201 TASSERT( a_iIndex < m_oArray.Size() * BUFSIZE );
202
203 TINT iSubIndex = m_iSubIndexMask & a_iIndex;
204 TINT iMainIndex = a_iIndex >> ( m_iMainIndexShift % BUFSIZE );
205
206 TASSERT( iMainIndex < m_oArray.Size() );
208
209 return m_oArray[ iMainIndex ]->GetElement( iSubIndex );
210 }

◆ CreateSharedBuffers()

template<typename T, TINT BUFSIZE, TINT IDENTIFIER>
static void TSharedBuffer< T, BUFSIZE, IDENTIFIER >::CreateSharedBuffers ( TINT a_iNumBuffers)
inlinestatic

Definition at line 53 of file TSharedBuffer.h.

54 {
55 TASSERT( m_iNumBuffers == 0 );
56 TASSERT( m_pNodeArray == TNULL );
57
58 m_iNumBuffers = a_iNumBuffers;
59
60 if ( a_iNumBuffers > m_oFreeList.SizeAllocated() )
61 {
62 m_oFreeList.Resize( a_iNumBuffers );
63 }
64
65 m_oFreeList.SetSize( a_iNumBuffers );
66 m_pNodeArray = TSTATICCAST( TNode, TMalloc( sizeof( TNode ) * m_iNumBuffers ) );
67
68 for ( TINT i = 0; i < m_iNumBuffers; i++ )
69 {
70 m_oFreeList[ i ] = &m_pNodeArray[ i ];
71 }
72
73 TASSERT( m_oFreeList.Size() <= m_iNumBuffers );
74 TASSERT( ( 1 << TMath::IntLog2( BUFSIZE ) ) == BUFSIZE );
75
76 m_iMainIndexShift = TMath::IntLog2( BUFSIZE );
77 m_iSubIndexMask = ( 1 << TMath::IntLog2( BUFSIZE ) ) - 1;
78 }
void * TMalloc(TSIZE a_uiSize, Toshi::TMemory::MemBlock *a_pMemBlock, const TCHAR *a_szFileName, TINT a_iLineNum)
Allocates memory from a specific memory block.
Definition TMemory.cpp:973
#define TSTATICCAST(POINTERTYPE, VALUE)
Definition Defines.h:69
TFORCEINLINE constexpr TUINT IntLog2(TUINT32 a_uiValue)
Definition TMathInline.h:66

◆ DestroySharedBuffers()

template<typename T, TINT BUFSIZE, TINT IDENTIFIER>
static void TSharedBuffer< T, BUFSIZE, IDENTIFIER >::DestroySharedBuffers ( )
inlinestatic

Definition at line 80 of file TSharedBuffer.h.

81 {
82 TASSERT( m_oFreeList.Size() <= m_iNumBuffers );
84
85 m_oFreeList.Clear();
86
87 TVALIDPTR( m_pNodeArray );
88 TFree( m_pNodeArray );
89
90 m_iNumBuffers = 0;
91 m_pNodeArray = TNULL;
92 }
void TFree(void *a_pMem)
Frees previously allocated memory.
Definition TMemory.cpp:1054
#define TVALIDPTR(PTR)
Definition Defines.h:139
static TBOOL IsAnyBuffersUsed()

◆ GetSize()

template<typename T, TINT BUFSIZE, TINT IDENTIFIER>
TUINT TSharedBuffer< T, BUFSIZE, IDENTIFIER >::GetSize ( ) const
inline

Definition at line 122 of file TSharedBuffer.h.

123 {
124 return m_oArray.Size() << m_iMainIndexShift;
125 }

◆ IsAnyBuffersUsed()

template<typename T, TINT BUFSIZE, TINT IDENTIFIER>
static TBOOL TSharedBuffer< T, BUFSIZE, IDENTIFIER >::IsAnyBuffersUsed ( )
inlinestatic

Definition at line 94 of file TSharedBuffer.h.

95 {
96 return m_iNumBuffers != m_oFreeList.Size();
97 }

◆ operator[]() [1/2]

template<typename T, TINT BUFSIZE, TINT IDENTIFIER>
T & TSharedBuffer< T, BUFSIZE, IDENTIFIER >::operator[] ( TINT a_iIndex)
inline

Definition at line 212 of file TSharedBuffer.h.

213 {
214 return At( a_iIndex );
215 }
T & At(TINT a_iIndex)

◆ operator[]() [2/2]

template<typename T, TINT BUFSIZE, TINT IDENTIFIER>
const T & TSharedBuffer< T, BUFSIZE, IDENTIFIER >::operator[] ( TINT a_iIndex) const
inline

Definition at line 217 of file TSharedBuffer.h.

218 {
219 return At( a_iIndex );
220 }

◆ SetSize()

template<typename T, TINT BUFSIZE, TINT IDENTIFIER>
TBOOL TSharedBuffer< T, BUFSIZE, IDENTIFIER >::SetSize ( TINT a_iSize)
inline

Definition at line 127 of file TSharedBuffer.h.

128 {
129 TASSERT( a_iSize >= 0 );
130 TASSERT( m_oFreeList.Size() <= m_iNumBuffers );
131 TASSERT( TMath::IntLog2( BUFSIZE ) == m_iMainIndexShift );
132
133 TINT iDesiredNumNodes = a_iSize >> ( m_iMainIndexShift % BUFSIZE );
134
135 if ( 0 < ( m_iSubIndexMask & a_iSize ) )
136 {
137 iDesiredNumNodes += 1;
138 }
139
141
142 if ( m_oArray.Size() != iDesiredNumNodes )
143 {
144 if ( 10 < iDesiredNumNodes ) return TFALSE;
145
146 if ( iDesiredNumNodes < m_oArray.Size() )
147 {
148 // Removing elements from m_oArray
149
150 while ( iDesiredNumNodes < m_oArray.Size() )
151 {
152 // Remove the last element from array and store in the freelist
153 m_oFreeList.Push( m_oArray.Pop() );
154 }
155
156 TASSERT( m_oArray.Size() == iDesiredNumNodes );
157 TASSERT( m_oFreeList.Size() <= m_iNumBuffers );
158 }
159 else
160 {
161 // Adding new elements to m_oArray
162
163 if ( m_oFreeList.Size() < 1 ) return TFALSE;
164
165 while ( m_oArray.Size() < iDesiredNumNodes )
166 {
167 if ( m_oFreeList.Size() < 1 ) return TFALSE;
168
169 TASSERT( m_oArray.Size() < m_oArray.SizeAllocated() );
170
171 m_oArray.Push( m_oFreeList.Pop() );
172 }
173
174 TASSERT( m_oArray.Size() == iDesiredNumNodes );
175 TASSERT( m_oFreeList.Size() <= m_iNumBuffers );
176 }
177 }
178
179 return TTRUE;
180 }

The documentation for this class was generated from the following file: