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