1// MessagePack for C++ example 2// 3// Copyright (C) 2015 KONDO Takatoshi 4// 5// Distributed under the Boost Software License, Version 1.0. 6// (See accompanying file LICENSE_1_0.txt or copy at 7// http://www.boost.org/LICENSE_1_0.txt) 8// 9 10#include <string> 11#include <iostream> 12#include <iomanip> 13#include <sstream> 14#include <cassert> 15 16#include <msgpack.hpp> 17 18 19class my_class { 20public: 21 my_class() {} // When you want to convert from msgpack::object to my_class, 22 // my_class should be default constractible. 23 // If you use C++11, you can adapt non-default constructible 24 // classes to msgpack::object. 25 // See https://github.com/msgpack/msgpack-c/wiki/v1_1_cpp_adaptor#non-default-constructible-class-support-c11-only 26 my_class(std::string const& name, int age):name_(name), age_(age) {} 27 28 friend bool operator==(my_class const& lhs, my_class const& rhs) { 29 return lhs.name_ == rhs.name_ && lhs.age_ == rhs.age_; 30 } 31 32private: 33 std::string name_; 34 int age_; 35 36public: 37 MSGPACK_DEFINE_MAP(name_, age_); 38}; 39 40void print(std::string const& buf) { 41 for (std::string::const_iterator it = buf.begin(), end = buf.end(); 42 it != end; 43 ++it) { 44 std::cout 45 << std::setw(2) 46 << std::hex 47 << std::setfill('0') 48 << (static_cast<int>(*it) & 0xff) 49 << ' '; 50 } 51 std::cout << std::dec << std::endl; 52} 53 54int main() { 55 { // pack, unpack 56 my_class my("John Smith", 42); 57 std::stringstream ss; 58 msgpack::pack(ss, my); 59 60 print(ss.str()); 61 62 msgpack::unpacked unp; 63 msgpack::unpack(unp, ss.str().data(), ss.str().size()); 64 msgpack::object obj = unp.get(); 65 std::cout << obj << std::endl; 66 assert(obj.as<my_class>() == my); 67 } 68 { // create object with zone 69 my_class my("John Smith", 42); 70 msgpack::zone z; 71 msgpack::object obj(my, z); 72 std::cout << obj << std::endl; 73 assert(obj.as<my_class>() == my); 74 } 75} 76