Skip to content

Commit fa239a4

Browse files
committed
[CORE] Refactor XferCRC to make it branchless and to remove winsock dependency
1 parent 3bda27a commit fa239a4

File tree

2 files changed

+16
-33
lines changed

2 files changed

+16
-33
lines changed

Core/GameEngine/Include/Common/XferCRC.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ class XferCRC : public Xfer
6464

6565
virtual void xferImplementation( void *data, Int dataSize );
6666

67-
void addCRC( UnsignedInt val ); ///< CRC a 4-byte block
67+
inline void addCRC( UnsignedInt val ); ///< CRC a 4-byte block
6868

6969
UnsignedInt m_crc;
7070

Core/GameEngine/Source/Common/System/XferCRC.cpp

Lines changed: 15 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@
3434
#include "Common/XferDeepCRC.h"
3535
#include "Common/crc.h"
3636
#include "Common/Snapshot.h"
37-
#include "winsock2.h" // for htonl
37+
#include "utility/endian_compat.h"
3838

3939
//-------------------------------------------------------------------------------------------------
4040
//-------------------------------------------------------------------------------------------------
@@ -97,22 +97,8 @@ void XferCRC::endBlock( void )
9797
//-------------------------------------------------------------------------------------------------
9898
void XferCRC::addCRC( UnsignedInt val )
9999
{
100-
int hibit;
101100

102-
val = htonl(val);
103-
104-
if (m_crc & 0x80000000)
105-
{
106-
hibit = 1;
107-
}
108-
else
109-
{
110-
hibit = 0;
111-
}
112-
113-
m_crc <<= 1;
114-
m_crc += val;
115-
m_crc += hibit;
101+
m_crc = (m_crc << 1) + htobe(val) +((m_crc >> 31) & 0x01);
116102

117103
} // end addCRC
118104

@@ -140,30 +126,27 @@ void XferCRC::xferSnapshot( Snapshot *snapshot )
140126
void XferCRC::xferImplementation( void *data, Int dataSize )
141127
{
142128

143-
if (!data || dataSize < 1)
144-
{
145-
return;
146-
}
147-
148129
const UnsignedInt *uintPtr = (const UnsignedInt *) (data);
130+
int validData = (data != NULL) & (dataSize > 0);
131+
int dataBytes = (dataSize / 4) * validData;
149132

150-
for (Int i=0 ; i<dataSize/4 ; i++)
133+
Int i = 0;
134+
for (i=0 ; i<dataBytes; i++)
151135
{
152136
addCRC (*uintPtr++);
153137
}
154138

155139
int leftover = dataSize & 3;
156-
if (leftover)
140+
validData = leftover > 0;
141+
142+
UnsignedInt val = 0;
143+
const unsigned char *c = (const unsigned char *)uintPtr;
144+
for (i=0; i<leftover; i++)
157145
{
158-
UnsignedInt val = 0;
159-
const unsigned char *c = (const unsigned char *)uintPtr;
160-
for (Int i=0; i<leftover; i++)
161-
{
162-
val += (c[i] << (i*8));
163-
}
164-
val = htonl(val);
165-
addCRC (val);
146+
val += (c[i] << (i*8));
166147
}
148+
149+
m_crc = (m_crc << (1*validData)) + (val +((m_crc >> 31) & 0x01)) * validData;
167150

168151
} // end xferImplementation
169152

@@ -179,7 +162,7 @@ void XferCRC::skip( Int dataSize )
179162
UnsignedInt XferCRC::getCRC( void )
180163
{
181164

182-
return htonl(m_crc);
165+
return htobe(m_crc);
183166

184167
} // end skip
185168

0 commit comments

Comments
 (0)