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