#include <vector>
#include "nn/nlib/msgpack/JsonStreamGenerator.h"
#include "nn/nlib/msgpack/JsonStreamParser.h"
using nlib_ns::msgpack::MpObject;
using nlib_ns::msgpack::JsonStreamGenerator;
using nlib_ns::msgpack::JsonStreamGeneratorSettings;
using nlib_ns::msgpack::JsonStreamParser;
using nlib_ns::msgpack::JsonStreamParserSettings;
#ifndef VECSIZE
#define VECSIZE (1000000)
#endif
void SetupVector(std::vector<int>* vec) {
vec->clear();
for (int i = 0; i < VECSIZE; ++i) vec->push_back(i);
}
bool ReadWriteMessagePack() {
std::vector<int> vec;
std::vector<int> ans;
ans.reserve(VECSIZE);
vec.reserve(VECSIZE);
SetupVector(&vec);
ReallocOutputStream ostr;
ostr.Reserve(VECSIZE * 8);
uint64_t from, to1, to2;
{
MpObject obj;
obj.Box(vec);
JsonStreamGenerator gen;
JsonStreamGeneratorSettings settings;
settings.msgpack = true;
gen.Object(obj);
}
{
JsonStreamParser parser;
JsonStreamParserSettings settings;
settings.max_array_size = VECSIZE;
ReallocOutputStream::UniquePtrType data;
size_t data_size = ostr.Release(&data);
MemoryInputStream istr(data.get(), data_size);
UniquePtr<MpObject> obj;
parser.Init(settings);
parser.Open(&istr);
if (
nlib_is_error(JsonStreamParser::Parse(&parser, obj)))
return false;
obj->Unbox(&ans);
}
nlib_printf(
"time: ReadWriteMessagePack(VECSIZE = %d): write = %" PRIu64
", read = %" PRIu64
" msec\n",
VECSIZE, to1 - from, to2 - to1);
if (ans != vec) return false;
return true;
}
bool ReadWriteMessagePackDirect() {
std::vector<int> vec;
std::vector<int> ans;
ans.reserve(VECSIZE);
vec.reserve(VECSIZE);
SetupVector(&vec);
ReallocOutputStream ostr;
ostr.Reserve(VECSIZE * 8);
uint64_t from, to1, to2;
{
JsonStreamGenerator gen;
JsonStreamGeneratorSettings settings;
settings.msgpack = true;
gen.Int32Array(&vec[0], vec.size());
}
{
JsonStreamParser parser;
JsonStreamParserSettings settings;
settings.max_array_size = VECSIZE;
ReallocOutputStream::UniquePtrType data;
size_t data_size = ostr.Release(&data);
MemoryInputStream istr(data.get(), data_size);
parser.Init(settings);
parser.Open(&istr);
JsonStreamParser::Event ev = parser.Next();
if (ev != JsonStreamParser::kEventStartArray) return false;
while ((ev = parser.Next()) != JsonStreamParser::kEventEndArray) {
int num;
if (JsonStreamParser::ToInt32(parser.GetToken(), &num) != 0) return false;
ans.push_back(num);
}
}
nlib_printf(
"time: ReadWriteMessagePackDirect(VECSIZE = %d): write = %" PRIu64
", read = %" PRIu64 " msec\n",
VECSIZE, to1 - from, to2 - to1);
if (ans != vec) return false;
return true;
}
bool SampleMain(int, char**) { return ReadWriteMessagePack() && ReadWriteMessagePackDirect(); }
NLIB_MAINFUNC