Skip to content

Commit f3c4219

Browse files
committed
[CORE] Refactor XferCRC to make it branchless and to remove winsock dependency
1 parent 9527b54 commit f3c4219

File tree

2 files changed

+24
-33
lines changed

2 files changed

+24
-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: 23 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,35 @@ 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 = (data != NULL) & (leftover > 0);
141+
142+
UnsignedInt val = 0;
143+
const unsigned char *c = (const unsigned char *)uintPtr;
144+
145+
switch(leftover * validData)
157146
{
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);
147+
case 3:
148+
val += (c[2] << (2 * 8));
149+
case 2:
150+
val += (c[1] << (1 * 8));
151+
case 1:
152+
val += (c[0] << (0 * 8));
153+
default:
154+
break;
166155
}
156+
157+
m_crc = (m_crc << (1*validData)) + (val +((m_crc >> 31) & 0x01)) * validData;
167158

168159
} // end xferImplementation
169160

@@ -179,7 +170,7 @@ void XferCRC::skip( Int dataSize )
179170
UnsignedInt XferCRC::getCRC( void )
180171
{
181172

182-
return htonl(m_crc);
173+
return htobe(m_crc);
183174

184175
} // end skip
185176

0 commit comments

Comments
 (0)