1 #pragma once
2 
3 #include "serializer.h"
4 
5 #include <msgpack.hpp>
6 
7 class MessagePackReader : public Reader {
8   msgpack::unpacker* pk_;
9   msgpack::object_handle oh_;
10 
11   template <typename T>
Get()12   T Get() {
13     T ret = oh_.get().as<T>();
14     pk_->next(oh_);
15     return ret;
16   }
17 
18  public:
MessagePackReader(msgpack::unpacker * pk)19   MessagePackReader(msgpack::unpacker* pk) : pk_(pk) { pk->next(oh_); }
Format()20   SerializeFormat Format() const override {
21     return SerializeFormat::MessagePack;
22   }
23 
IsBool()24   bool IsBool() override { return oh_.get().type == msgpack::type::BOOLEAN; }
IsNull()25   bool IsNull() override { return oh_.get().is_nil(); }
IsArray()26   bool IsArray() override { return oh_.get().type == msgpack::type::ARRAY; }
IsInt()27   bool IsInt() override {
28     return oh_.get().type == msgpack::type::POSITIVE_INTEGER ||
29            oh_.get().type == msgpack::type::NEGATIVE_INTEGER;
30   }
IsInt64()31   bool IsInt64() override { return IsInt(); }
IsUint64()32   bool IsUint64() override { return IsInt(); }
IsDouble()33   bool IsDouble() override { return oh_.get().type == msgpack::type::FLOAT64; };
IsString()34   bool IsString() override { return oh_.get().type == msgpack::type::STR; }
35 
GetNull()36   void GetNull() override { pk_->next(oh_); }
GetBool()37   bool GetBool() override { return Get<bool>(); }
GetInt()38   int GetInt() override { return Get<int>(); }
GetUint32()39   uint32_t GetUint32() override { return Get<uint32_t>(); }
GetInt64()40   int64_t GetInt64() override { return Get<int64_t>(); }
GetUint64()41   uint64_t GetUint64() override { return Get<uint64_t>(); }
GetDouble()42   double GetDouble() override { return Get<double>(); }
GetString()43   std::string GetString() override { return Get<std::string>(); }
44 
HasMember(const char * x)45   bool HasMember(const char* x) override { return true; }
46   std::unique_ptr<Reader> operator[](const char* x) override { return {}; }
47 
IterArray(std::function<void (Reader &)> fn)48   void IterArray(std::function<void(Reader&)> fn) override {
49     size_t n = Get<size_t>();
50     for (size_t i = 0; i < n; i++)
51       fn(*this);
52   }
53 
DoMember(const char *,std::function<void (Reader &)> fn)54   void DoMember(const char*, std::function<void(Reader&)> fn) override {
55     fn(*this);
56   }
57 };
58 
59 class MessagePackWriter : public Writer {
60   msgpack::packer<msgpack::sbuffer>* m_;
61 
62  public:
MessagePackWriter(msgpack::packer<msgpack::sbuffer> * m)63   MessagePackWriter(msgpack::packer<msgpack::sbuffer>* m) : m_(m) {}
Format()64   SerializeFormat Format() const override {
65     return SerializeFormat::MessagePack;
66   }
67 
Null()68   void Null() override { m_->pack_nil(); }
Bool(bool x)69   void Bool(bool x) override { m_->pack(x); }
Int(int x)70   void Int(int x) override { m_->pack(x); }
Uint32(uint32_t x)71   void Uint32(uint32_t x) override { m_->pack(x); }
Int64(int64_t x)72   void Int64(int64_t x) override { m_->pack(x); }
Uint64(uint64_t x)73   void Uint64(uint64_t x) override { m_->pack(x); }
Double(double x)74   void Double(double x) override { m_->pack(x); }
String(const char * x)75   void String(const char* x) override { m_->pack(x); }
76   // TODO Remove std::string
String(const char * x,size_t len)77   void String(const char* x, size_t len) override {
78     m_->pack(std::string(x, len));
79   }
StartArray(size_t n)80   void StartArray(size_t n) override { m_->pack(n); }
EndArray()81   void EndArray() override {}
StartObject()82   void StartObject() override {}
EndObject()83   void EndObject() override {}
Key(const char * name)84   void Key(const char* name) override {}
85 };
86