11
11
using namespace NYql ;
12
12
using namespace NYql ::NUdf;
13
13
14
- enum EFormat : ui32 {
14
+ enum EFormat : ui8 {
15
15
FloatVector = 1
16
16
};
17
17
18
+ static constexpr size_t HeaderLen = sizeof (ui8);
18
19
19
20
class TFloatVectorSerializer {
20
21
public:
21
22
static TUnboxedValue Serialize (const IValueBuilder* valueBuilder, const TUnboxedValue x) {
22
23
auto serialize = [&x] (IOutputStream& outStream) {
23
- const EFormat format = EFormat::FloatVector;
24
- outStream.Write (&format, sizeof (ui32));
25
24
EnumerateVector (x, [&outStream] (float element) { outStream.Write (&element, sizeof (float )); });
25
+ const EFormat format = EFormat::FloatVector;
26
+ outStream.Write (&format, HeaderLen);
26
27
};
27
28
28
29
if (x.HasFastListLength ()) {
29
- auto str = valueBuilder->NewStringNotFilled (sizeof (ui32) + x.GetListLength () * sizeof (float ));
30
+ auto str = valueBuilder->NewStringNotFilled (HeaderLen + x.GetListLength () * sizeof (float ));
30
31
auto strRef = str.AsStringRef ();
31
32
TMemoryOutput memoryOutput (strRef.Data (), strRef.Size ());
32
33
@@ -42,9 +43,8 @@ class TFloatVectorSerializer {
42
43
}
43
44
44
45
static TUnboxedValue Deserialize (const IValueBuilder *valueBuilder, const TStringRef& str) {
45
- // skip format header, it was already read
46
- const char * buf = str.Data () + sizeof (ui32);
47
- const size_t len = str.Size () - sizeof (ui32);
46
+ const char * buf = str.Data ();
47
+ const size_t len = str.Size () - HeaderLen;
48
48
49
49
if (len % sizeof (float ) != 0 )
50
50
return {};
@@ -66,9 +66,8 @@ class TFloatVectorSerializer {
66
66
}
67
67
68
68
static const TArrayRef<const float > GetArray (const TStringRef& str) {
69
- // skip format header, it was already read
70
- const char * buf = str.Data () + sizeof (ui32);
71
- const size_t len = str.Size () - sizeof (ui32);
69
+ const char * buf = str.Data ();
70
+ const size_t len = str.Size () - HeaderLen;
72
71
73
72
if (len % sizeof (float ) != 0 )
74
73
return {};
@@ -95,8 +94,8 @@ class TSerializerFacade {
95
94
if (str.Size () == 0 )
96
95
return {};
97
96
98
- const ui32* format = reinterpret_cast < const ui32*>( str.Data ()) ;
99
- switch (* format) {
97
+ const ui8 format = str.Data ()[str. Size () - HeaderLen] ;
98
+ switch (format) {
100
99
case EFormat::FloatVector:
101
100
return TFloatVectorSerializer::Deserialize (valueBuilder, str);
102
101
default :
@@ -108,8 +107,8 @@ class TSerializerFacade {
108
107
if (str.Size () == 0 )
109
108
return {};
110
109
111
- const ui32* format = reinterpret_cast < const ui32*>( str.Data ()) ;
112
- switch (* format) {
110
+ const ui8 format = str.Data ()[str. Size () - HeaderLen] ;
111
+ switch (format) {
113
112
case EFormat::FloatVector:
114
113
return TFloatVectorSerializer::GetArray (str);
115
114
default :
0 commit comments