4
4
5
5
namespace cage
6
6
{
7
- Serializer::Serializer (PointerRange<char > buffer) : data(buffer.data()), size(buffer.size()) {}
7
+ namespace privat
8
+ {
9
+ SerializationInterface::SerializationInterface (PointerRange<char > buffer)
10
+ {
11
+ origin = buffer.data ();
12
+ getData = +[](void *origin) -> char * { return (char *)origin; };
13
+ }
14
+
15
+ SerializationInterface::SerializationInterface (MemoryBuffer &buffer)
16
+ {
17
+ origin = &buffer;
18
+ getData = +[](void *origin) -> char * { return ((MemoryBuffer *)origin)->data (); };
19
+ getSize = +[](void *origin) -> uintPtr { return ((MemoryBuffer *)origin)->size (); };
20
+ setSize = +[](void *origin, uintPtr size) -> void { ((MemoryBuffer *)origin)->resizeSmart (size); };
21
+ }
22
+ }
23
+
24
+ Serializer::Serializer (PointerRange<char > buffer) : interface(buffer), capacity(buffer.size()) {}
8
25
9
- Serializer::Serializer (MemoryBuffer &buffer, uintPtr size ) : buffer(& buffer), size(size == m && buffer.size() != 0 ? buffer.size() : size ) {}
26
+ Serializer::Serializer (MemoryBuffer &buffer, uintPtr capacity ) : interface( buffer), capacity(capacity == m && buffer.size() != 0 ? buffer.size() : capacity ) {}
10
27
11
- Serializer::Serializer (MemoryBuffer *buffer, char *data, uintPtr offset, uintPtr size ) : buffer(buffer ), data(data), offset(offset), size(size ) {}
28
+ Serializer::Serializer (privat::SerializationInterface interface, uintPtr offset, uintPtr capacity ) : interface(interface ), offset(offset), capacity(capacity ) {}
12
29
13
30
uintPtr Serializer::available () const
14
31
{
15
- CAGE_ASSERT (size >= offset);
16
- return size - offset;
32
+ CAGE_ASSERT (capacity >= offset);
33
+ return capacity - offset;
17
34
}
18
35
19
36
void Serializer::write (PointerRange<const char > buffer)
20
37
{
21
- auto dst = advance (buffer.size ());
22
- if (!buffer.empty ())
23
- detail::memcpy (dst.data (), buffer.data (), buffer.size ());
38
+ if (buffer.empty ())
39
+ return ;
40
+ auto dst = write (buffer.size ());
41
+ detail::memcpy (dst.data (), buffer.data (), buffer.size ());
24
42
}
25
43
26
44
PointerRange<char > Serializer::write (uintPtr size)
27
45
{
28
- return advance (size);
46
+ if (available () < size)
47
+ CAGE_THROW_ERROR (Exception, " serialization beyond available space" );
48
+ if (interface.getSize && interface.getSize (interface.origin ) < offset + size)
49
+ {
50
+ CAGE_ASSERT (interface.setSize );
51
+ interface.setSize (interface.origin , offset + size);
52
+ }
53
+ char *dst = interface.getData (interface.origin ) + offset;
54
+ offset += size;
55
+ return { dst, dst + size };
29
56
}
30
57
31
58
void Serializer::writeLine (const String &line)
@@ -36,23 +63,9 @@ namespace cage
36
63
37
64
Serializer Serializer::reserve (uintPtr s)
38
65
{
39
- uintPtr o = offset;
40
- advance (s);
41
- return Serializer (buffer, data, o, offset);
42
- }
43
-
44
- PointerRange<char > Serializer::advance (uintPtr s)
45
- {
46
- if (available () < s)
47
- CAGE_THROW_ERROR (Exception, " serialization beyond available space" );
48
- if (!data)
49
- {
50
- if (buffer->size () < offset + s)
51
- buffer->resizeSmart (offset + s);
52
- }
53
- char *dst = (data ? data : buffer->data ()) + offset;
54
- offset += s;
55
- return { dst, dst + s };
66
+ const uintPtr o = offset;
67
+ write (s);
68
+ return Serializer (interface, o, offset);
56
69
}
57
70
58
71
Deserializer::Deserializer (PointerRange<const char > buffer) : data(buffer.data()), size(buffer.size()) {}
@@ -85,7 +98,7 @@ namespace cage
85
98
{
86
99
const uintPtr a = available ();
87
100
PointerRange<const char > pr = { data + offset, data + offset + a };
88
- uintPtr l = detail::readLine (line, pr, false );
101
+ const uintPtr l = detail::readLine (line, pr, false );
89
102
if (l)
90
103
{
91
104
offset += l;
@@ -98,7 +111,7 @@ namespace cage
98
111
{
99
112
const uintPtr a = available ();
100
113
PointerRange<const char > pr = { data + offset, data + offset + a };
101
- uintPtr l = detail::readLine (line, pr, false );
114
+ const uintPtr l = detail::readLine (line, pr, false );
102
115
if (l)
103
116
{
104
117
offset += l;
@@ -109,7 +122,7 @@ namespace cage
109
122
110
123
Deserializer Deserializer::subview (uintPtr s)
111
124
{
112
- uintPtr o = offset;
125
+ const uintPtr o = offset;
113
126
read (s);
114
127
return Deserializer (data, o, offset);
115
128
}
0 commit comments