5
5
#include < vector>
6
6
#include < jsi/jsi.h>
7
7
#include " cmp.h"
8
- #include < iostream>
9
- #include < sstream>
10
8
11
9
using namespace facebook ;
12
10
@@ -99,11 +97,18 @@ static bool mp_reader(cmp_ctx_t *ctx, void *data, size_t limit)
99
97
100
98
struct MessagePackWriter
101
99
{
102
- std::stringstream stream;
100
+ std::vector<uint8_t > data;
101
+
102
+ MessagePackWriter ()
103
+ {
104
+ data.reserve (1024 );
105
+ }
103
106
104
107
size_t write (void *data, size_t count)
105
108
{
106
- stream.write (static_cast <const char *>(data), count);
109
+ size_t prev_size = this ->data .size ();
110
+ this ->data .resize (prev_size + count);
111
+ std::move (static_cast <const uint8_t *>(data), static_cast <const uint8_t *>(data) + count, this ->data .data () + prev_size);
107
112
return count;
108
113
}
109
114
};
@@ -114,14 +119,14 @@ static size_t mp_writer(cmp_ctx_t *ctx, const void *data, size_t count)
114
119
return mp->write (const_cast <void *>(data), count);
115
120
}
116
121
117
- std::vector< uint8_t > write (jsi::Runtime &rt, const jsi::Value &value)
122
+ void write (jsi::Runtime &rt, const jsi::Value &value, std::vector< uint8_t > &data )
118
123
{
119
124
MessagePackWriter writer;
120
125
std::unique_ptr<cmp_ctx_s> ctx (new cmp_ctx_s);
121
126
cmp_init (ctx.get (), &writer, mp_reader, NULL , mp_writer);
122
127
writeValue (ctx.get (), rt, value);
123
- const std::string &data = writer.stream . str ();
124
- return std::vector< uint8_t >( data.begin (), data. end () );
128
+ writer.data . shrink_to_fit ();
129
+ data.swap (writer. data );
125
130
}
126
131
127
132
jsi::Value readValue (cmp_ctx_t *ctx, jsi::Runtime &rt)
0 commit comments