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 <sstream>
12 #include <iostream>
13 #include <algorithm>
14 #include <cctype>
15
16 #include <msgpack.hpp>
17
18 struct user {
19 std::string name;
20 int age;
21 std::string address;
22 MSGPACK_DEFINE(name, age, address);
23 };
24
25 struct proc:boost::static_visitor<void> {
operator ()proc26 void operator()(std::string& v) const {
27 std::cout << " match std::string& v" << std::endl;
28 std::cout << " v: " << v << std::endl;
29 std::cout << " capitalize" << std::endl;
30 for (std::string::iterator it = v.begin(), end = v.end();
31 it != end;
32 ++it) {
33 *it = std::toupper(*it);
34 }
35 }
operator ()proc36 void operator()(std::vector<msgpack::type::variant>& v) const {
37 std::cout << "match vector (msgpack::type::ARRAY)" << std::endl;
38 std::vector<msgpack::type::variant>::iterator it = v.begin();
39 std::vector<msgpack::type::variant>::const_iterator end = v.end();
40 for (; it != end; ++it) {
41 boost::apply_visitor(*this, *it);
42 }
43 }
44 template <typename T>
operator ()proc45 void operator()(T const&) const {
46 std::cout << " match others" << std::endl;
47 }
48 };
49
print(std::string const & buf)50 void print(std::string const& buf) {
51 for (std::string::const_iterator it = buf.begin(), end = buf.end();
52 it != end;
53 ++it) {
54 std::cout
55 << std::setw(2)
56 << std::hex
57 << std::setfill('0')
58 << (static_cast<int>(*it) & 0xff)
59 << ' ';
60 }
61 std::cout << std::dec << std::endl;
62 }
63
64
main()65 int main() {
66 std::stringstream ss1;
67 user u;
68 u.name = "Takatoshi Kondo";
69 u.age = 42;
70 u.address = "Tokyo, JAPAN";
71
72 std::cout << "Packing object." << std::endl;
73 msgpack::pack(ss1, u);
74 print(ss1.str());
75
76 msgpack::object_handle oh1 = msgpack::unpack(ss1.str().data(), ss1.str().size());
77 msgpack::object const& obj1 = oh1.get();
78 std::cout << "Unpacked msgpack object." << std::endl;
79 std::cout << obj1 << std::endl;
80
81 msgpack::type::variant v = obj1.as<msgpack::type::variant>();
82 std::cout << "Applying proc..." << std::endl;
83 boost::apply_visitor(proc(), v);
84
85 std::stringstream ss2;
86 std::cout << "Packing modified object." << std::endl;
87 msgpack::pack(ss2, v);
88 print(ss2.str());
89
90 msgpack::object_handle oh2 = msgpack::unpack(ss2.str().data(), ss2.str().size());
91 msgpack::object const& obj2 = oh2.get();
92 std::cout << "Modified msgpack object." << std::endl;
93 std::cout << obj2 << std::endl;
94 }
95