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
|
#include "dynamic_bitset.h"
#include "Runtime/Serialize/TypeTree.h"
#include "Runtime/Serialize/SwapEndianArray.h"
template<>
class SerializeTraits<dynamic_bitset>: public SerializeTraitsBase<dynamic_bitset>
{
public:
typedef dynamic_bitset value_type;
inline static const char* GetTypeString (value_type*) { return "bitset"; }
inline static bool IsAnimationChannel () { return false; }
inline static bool MightContainPPtr () { return false; }
inline static bool AllowTransferOptimization () { return false; }
template<class TransferFunction> inline
static void Transfer (value_type& data, TransferFunction& transfer)
{
SInt32 bitCount = data.size ();
transfer.Transfer (bitCount, "bitCount");
unsigned byteSize = data.num_blocks () * sizeof (value_type::block_type);
transfer.TransferTypeless (&byteSize, "bitblocks");
AssertIf (sizeof (value_type::block_type) != 4);
AssertIf (byteSize % 4 != 0);
if (transfer.IsReading ())
{
data.resize (bitCount);
transfer.TransferTypelessData (byteSize, data.m_bits);
if (transfer.ConvertEndianess ())
SwapEndianArray (data.m_bits, sizeof (value_type::block_type), byteSize / 4);
data.m_zero_unused_bits ();
}
else if (transfer.IsWriting ())
{
value_type::block_type* writeData = data.m_bits;
if (transfer.ConvertEndianess ())
{
writeData = (value_type::block_type*)UNITY_MALLOC (kMemTempAlloc, byteSize);
memcpy (writeData, data.m_bits, byteSize);
SwapEndianArray (writeData, sizeof (value_type::block_type), byteSize / 4);
}
AssertIf (data.num_blocks () != byteSize / 4);
transfer.TransferTypelessData (byteSize, writeData);
if (transfer.ConvertEndianess ())
UNITY_FREE (kMemTempAlloc, writeData);
}
else
transfer.TransferTypelessData (byteSize, NULL);
}
// Deque<bool> converter
template<class TransferFunction>
static bool Convert (value_type& data, TransferFunction& transfer)
{
const TypeTree& oldTypeTree = transfer.GetActiveOldTypeTree ();
const std::string& oldType = transfer.GetActiveOldTypeTree ().m_Type;
if ((oldType == "vector" || oldType == "deque") && GetElementTypeFromContainer (oldTypeTree).m_Type == "bool")
{
std::deque<bool> dequeBool;
transfer.TransferSTLStyleArray (dequeBool);
data.resize (dequeBool.size ());
std::deque<bool>::iterator d = dequeBool.begin ();
for (int i=0;i<data.size ();i++)
{
data[i] = *d;
d++;
}
return true;
}
else
return false;
}
};
|