Skip to content

Commit 0ee3c31

Browse files
committed
2 parents 00d75d1 + 88a300f commit 0ee3c31

4 files changed

Lines changed: 166 additions & 0 deletions

File tree

CMakeLists.txt

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,3 +77,8 @@ if (BUILD_TESTING)
7777
enable_testing()
7878
add_subdirectory(tests)
7979
endif ()
80+
81+
option(BUILD_EXAMPLES "..." ON)
82+
if (BUILD_EXAMPLES)
83+
add_subdirectory(examples)
84+
endif()

examples/CMakeLists.txt

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
cmake_minimum_required(VERSION 3.28)
2+
3+
add_executable(
4+
msgpack23_first_example
5+
first_example.cpp
6+
)
7+
8+
target_link_libraries(
9+
msgpack23_first_example
10+
PRIVATE
11+
msgpack23::msgpack23
12+
)
13+
14+
set_target_properties(msgpack23_first_example PROPERTIES CXX_STANDARD 23)
15+
target_compile_features(msgpack23_first_example PUBLIC cxx_std_23)
16+
17+
add_executable(
18+
msgpack23_second_example
19+
second_example.cpp
20+
)
21+
22+
target_link_libraries(
23+
msgpack23_second_example
24+
PRIVATE
25+
msgpack23::msgpack23
26+
)
27+
28+
set_target_properties(msgpack23_second_example PROPERTIES CXX_STANDARD 23)
29+
target_compile_features(msgpack23_second_example PUBLIC cxx_std_23)

examples/first_example.cpp

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
//
2+
// Created by Rene Windegger on 28/10/2025.
3+
//
4+
#include <iostream>
5+
#include <cstddef>
6+
#include <iterator>
7+
#include <utility>
8+
#include <vector>
9+
#include <map>
10+
#include <msgpack23/msgpack23.h>
11+
12+
class converting_insert_iterator final {
13+
public:
14+
using difference_type = std::ptrdiff_t;
15+
16+
constexpr explicit converting_insert_iterator(std::back_insert_iterator<std::vector<unsigned char>> &&iterator) : store_{std::move(iterator)} {}
17+
18+
constexpr converting_insert_iterator &operator=(const std::byte &value) {
19+
store_ = std::to_underlying(value);
20+
return *this;
21+
}
22+
23+
constexpr converting_insert_iterator &operator=(std::byte &&value) {
24+
store_ = std::to_underlying(value);
25+
return *this;
26+
}
27+
28+
[[nodiscard]] constexpr converting_insert_iterator &operator*() {
29+
return *this;
30+
}
31+
32+
constexpr converting_insert_iterator &operator++() {
33+
return *this;
34+
}
35+
36+
constexpr converting_insert_iterator operator++(int) {
37+
return *this;
38+
}
39+
private:
40+
std::back_insert_iterator<std::vector<unsigned char>> store_;
41+
};
42+
43+
int main() {
44+
std::map<std::string, int> const original {{"apple", 1}, {"banana", 2}};
45+
46+
std::vector<unsigned char> data{};
47+
msgpack23::Packer packer { converting_insert_iterator{ std::back_inserter(data) } };
48+
packer(original);
49+
50+
std::map<std::string, int> unpacked;
51+
msgpack23::Unpacker unpacker {
52+
std::span<std::byte>{
53+
reinterpret_cast<std::byte *>(data.data()),
54+
data.size()
55+
}
56+
};
57+
unpacker(unpacked);
58+
59+
for (auto const& [key, value] : unpacked) {
60+
std::cout << key << ": " << value << '\n';
61+
}
62+
}

examples/second_example.cpp

Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
//
2+
// Created by Rene Windegger on 28/10/2025.
3+
//
4+
#include <iostream>
5+
#include <cstddef>
6+
#include <iterator>
7+
#include <utility>
8+
#include <vector>
9+
#include <map>
10+
#include <msgpack23/msgpack23.h>
11+
12+
class converting_insert_iterator final {
13+
public:
14+
using difference_type = std::ptrdiff_t;
15+
16+
constexpr explicit converting_insert_iterator(std::back_insert_iterator<std::vector<unsigned char>> &&iterator) : store_{std::move(iterator)} {}
17+
18+
constexpr converting_insert_iterator &operator=(const std::byte &value) {
19+
store_ = std::to_underlying(value);
20+
return *this;
21+
}
22+
23+
constexpr converting_insert_iterator &operator=(std::byte &&value) {
24+
store_ = std::to_underlying(value);
25+
return *this;
26+
}
27+
28+
[[nodiscard]] constexpr converting_insert_iterator &operator*() {
29+
return *this;
30+
}
31+
32+
constexpr converting_insert_iterator &operator++() {
33+
return *this;
34+
}
35+
36+
constexpr converting_insert_iterator operator++(int) {
37+
return *this;
38+
}
39+
private:
40+
std::back_insert_iterator<std::vector<unsigned char>> store_;
41+
};
42+
43+
struct MyData {
44+
std::int64_t my_integer;
45+
std::string my_string;
46+
47+
template<typename T>
48+
void pack(T &packer) const {
49+
packer(my_integer, my_string);
50+
}
51+
52+
template<typename T>
53+
void unpack(T &unpacker) {
54+
unpacker(my_integer, my_string);
55+
}
56+
};
57+
58+
int main() {
59+
MyData const original {42, "Hello"};
60+
61+
std::vector<unsigned char> data{};
62+
msgpack23::pack(converting_insert_iterator{ std::back_inserter(data) }, original);
63+
64+
const auto [my_integer, my_string] = msgpack23::unpack<MyData>(std::span{
65+
reinterpret_cast<std::byte *>(data.data()),
66+
data.size()
67+
});
68+
69+
std::cout << my_integer << ' ' << my_string << '\n';
70+
}

0 commit comments

Comments
 (0)