14 this->m_Buffer1 =
TNULL;
15 this->m_DataEnd =
TNULL;
16 this->m_Buffer2 =
TNULL;
17 this->m_Buffer3 =
TNULL;
18 this->m_SomeArray1 =
TNULL;
19 this->m_Buckets =
TNULL;
20 this->m_BucketCount = 0;
25 TFree( m_SomeArray1 );
27 for (
TSIZE i = 0; i < m_BucketCount; i++ )
29 for (
TSIZE k = 0; k < 256; k++ )
31 TFree( m_Buckets[ i ][ k ] );
34 TFree( m_Buckets[ i ] );
43 m_DataEnd = buffer + bufferSize;
47 m_MaxOffset = maxoffset;
48 m_BucketCount = ( unk < 1 ) ? 0 : unk - 1;
53 TSIZE arraySize1 = m_BucketCount * maxoffset;
56 for (
TSIZE i = 0; i < arraySize1; i++ )
58 m_SomeArray1[ i ].m_Ptr1 = &m_Root1;
59 m_SomeArray1[ i ].m_Ptr2 = m_Root1.m_Ptr2;
60 m_SomeArray1[ i ].m_Ptr1->m_Ptr2 = &m_SomeArray1[ i ];
61 m_SomeArray1[ i ].m_Ptr2->m_Ptr1 = &m_SomeArray1[ i ];
68 for (
TSIZE i = 0; i < m_BucketCount; i++ )
72 for (
TSIZE k = 0; k < 256; k++ )
75 someNode->m_Unk1 = someNode;
76 someNode->m_Unk2 = someNode;
77 m_Buckets[ i ][ k ] = someNode;
85 auto oldBuffer3 = m_Buffer3;
86 auto newBuffer3 = m_Buffer3 + dataSize;
88 if ( m_DataEnd <= newBuffer3 && newBuffer3 != m_DataEnd )
90 newBuffer3 = m_DataEnd;
93 m_Buffer3 = newBuffer3;
95 if ( m_MaxOffset <
static_cast<uintptr_t
>( m_Buffer3 - m_Buffer2 ) )
97 m_Buffer2 = m_Buffer3 - m_MaxOffset;
99 for (
TSIZE i = 0; i < 256; i++ )
101 if ( m_Offsets[ i ] < m_Buffer2 )
103 m_Offsets[ i ] =
TNULL;
107 auto node = m_Root2.m_Ptr1;
108 while ( node != &m_Root2 )
110 if ( m_Buffer2 <= node->m_Unk3 )
break;
111 auto nextNode = node->m_Ptr1;
113 node->m_Unk1->m_Unk2 = node->m_Unk2;
114 node->m_Unk2->m_Unk1 = node->m_Unk1;
117 node->m_Ptr1->m_Ptr2 = node->m_Ptr2;
118 node->m_Ptr2->m_Ptr1 = node->m_Ptr1;
119 node->m_Ptr1 = &m_Root1;
120 node->m_Ptr2 = m_Root1.m_Ptr2;
121 m_Root1.m_Ptr2 = node;
122 node->m_Ptr2->m_Ptr1 = node;
128 while ( oldBuffer3 < m_Buffer3 )
141 if ( bufferSize < 1 || m_Offsets[ (
TBYTE)*buffer ] ==
TNULL )
146 if ( m_BucketCount > 0 )
153 for (
TSIZE i = 0; i < m_BucketCount; i++ )
155 TSIZE localSize = 2 << ( i % 32 );
156 if ( bufferSize < localSize )
break;
160 TBOOL bRes =
FUN_0068b300( buffer, m_Buckets[ i ], localSize, localNode1, localNode2 );
161 if ( bRes ==
TFALSE )
break;
166 bucket = m_Buckets[ i ];
169 if ( node1 !=
TNULL )
173 if ( bucket == m_Buckets[ m_BucketCount - 1 ] )
175 someSize =
TMath::Min( bufferSize,
static_cast<TSIZE>( m_DataEnd - node1->m_Unk3 ) );
179 someSize =
TMath::Min( bufferSize, size * 2 - 1 );
182 if ( node1 == node2 )
191 while ( node1->m_Unk3[ size ] == buffer[ size ] )
193 if ( someSize <= size )
break;
197 if ( dataSize < size )
200 offset = node1->m_Unk3;
202 if ( someSize <= size )
208 node1 = node1->m_Unk1;
210 if ( node1 == node2 )
218 offset = m_Offsets[ (
TBYTE)*buffer ];
227 m_Offsets[ (
TBYTE)*buffer ] = buffer;
229 for (
TSIZE i = 0; i < m_BucketCount; i++ )
231 TSIZE unknown = 2 << ( i % 32 );
233 if (
static_cast<uintptr_t
>( m_DataEnd - buffer ) < unknown )
238 auto node = m_Root1.m_Ptr1;
239 if ( node == &m_Root1 )
241 TERROR(
"SlidingWindow::AllocSubstring: No free substrings!\n" );
246 node->m_Ptr1->m_Ptr2 = node->m_Ptr2;
247 node->m_Ptr2->m_Ptr1 = node->m_Ptr1;
248 node->m_Ptr1 = &m_Root2;
249 node->m_Ptr2 = m_Root2.m_Ptr2;
250 m_Root2.m_Ptr2 = node;
251 node->m_Ptr2->m_Ptr1 = node;
252 node->m_Unk4 = (
void*)( m_DataEnd - buffer );
253 node->m_Unk3 = buffer;
257 auto hashedNode = m_Buckets[ i ][ hash % 256 ];
258 node->m_Unk1 = hashedNode;
259 node->m_Unk2 = hashedNode->m_Unk2;
260 hashedNode->m_Unk2 = node;
261 node->m_Unk2->m_Unk1 = node;
267 auto hash =
HashData( buffer, bufferSize );
268 auto hashedNode = nodeBucket[ hash % 256 ];
271 hashedNode = hashedNode->m_Unk1;
274 while ( hashedNode != out2 )
276 TINT difference = Toshi::TUtil::MemCompare( out1->m_Unk3, buffer, bufferSize );
277 if ( difference == 0 )
break;
279 hashedNode = hashedNode->m_Unk1;
void * TMemalign(TSIZE a_uiAlignment, TSIZE a_uiSize, Toshi::TMemory::MemBlock *a_pMemBlock)
Allocates aligned memory from a specific memory block.
void TFree(void *a_pMem)
Frees previously allocated memory.
#define TOSHI_NAMESPACE_START
#define TOSHI_NAMESPACE_END
TFORCEINLINE const T & Min(const T &a, const T &b)
void AllocSubstring(TBYTE *buffer)
static TBOOL FUN_0068b300(TBYTE *buffer, Bucket nodeBucket, size_t bufferSize, Node *&out1, Node *&out2)
void FUN_0068ae40(size_t dataSize)
TBOOL FUN_0068af10(TBYTE *buffer, size_t bufferSize, TBYTE *&offset, size_t &dataSize)
static TUINT32 HashData(TBYTE *data, size_t size)
void Initialize(TBYTE *buffer, size_t bufferSize, TINT maxoffset, TINT unk)
static void MemClear(void *ptr, TSIZE size)