Program Listing for File CapnpBinary.hpp
↰ Return to documentation for file (include/db/Capnp/CapnpBinary/CapnpBinary.hpp
)
#pragma once
#include <vector>
#include <optional>
#include <capnp/message.h>
#include <capnp/serialize.h>
#include "MixBinary.capnp.h"
#include "MusicBinary.capnp.h"
#include "NoteBinary.capnp.h"
template<typename DType>
class CapReader{
private:
std::vector<kj::byte> Origin;
std::optional<capnp::FlatArrayMessageReader> capreader;
public:
CapReader() = default;
~CapReader() = default;
std::optional<typename DType::Reader> Rp;
bool open(const std::vector<kj::byte>& capnpBinary){
try
{
Origin.resize(capnpBinary.size());
memcpy(Origin.data(), capnpBinary.data(), capnpBinary.size());
kj::ArrayPtr<const kj::byte> arr(Origin.data(), Origin.size());
capreader.emplace(
::kj::arrayPtr(
reinterpret_cast<const capnp::word*>(arr.begin()),
arr.size() / sizeof(capnp::word)
)
);
Rp = capreader->getRoot<DType>();
return true;
}
catch(...)
{
return false;
}
}
std::vector<kj::byte> out(){
return Origin;
}
};
template<typename DType>
class CapWriter{
private:
std::optional<capnp::MallocMessageBuilder> capwriter;
public:
CapWriter() = default;
~CapWriter() = default;
std::optional<typename DType::Builder> Wp;
bool open(const std::vector<kj::byte>& capnpBinary){
try
{
kj::ArrayPtr<const kj::byte> arr(capnpBinary.data(), capnpBinary.size());
capwriter.emplace();
Wp = capwriter->initRoot<DType>();
capnp::FlatArrayMessageReader readed(
::kj::arrayPtr(
reinterpret_cast<const capnp::word*>(arr.begin()),
arr.size() / sizeof(capnp::word)
)
);
auto readroot = readed.getRoot<DType>();
Wp->initDatas(readroot.getDatas().size());
Wp->setDatas(readroot.getDatas());
return true;
}
catch(...)
{
return false;
}
}
bool makeNew(){
try
{
capnp::MallocMessageBuilder build;
capwriter.emplace();
Wp = capwriter->initRoot<DType>();
return true;
}
catch(...)
{
return false;
}
}
std::vector<kj::byte> out(){
try
{
auto farr = capnp::messageToFlatArray(capwriter.value());
auto fbyte = farr.asBytes();
std::vector<kj::byte> buffer(fbyte.begin(), fbyte.end());
return buffer;
}
catch(...)
{
return std::vector<kj::byte>();
}
}
};