Skip to content

Commit cfb2518

Browse files
committed
refactor: Update unpacking functions to use std::byte for improved type safety
1 parent 2b2a2c6 commit cfb2518

12 files changed

Lines changed: 22 additions & 56 deletions

examples/second_example.cpp

Lines changed: 2 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -9,37 +9,6 @@
99
#include <map>
1010
#include <msgpack23/msgpack23.h>
1111

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-
4312
struct MyData {
4413
std::int64_t my_integer;
4514
std::string my_string;
@@ -59,12 +28,9 @@ int main() {
5928
MyData const original {42, "Hello"};
6029

6130
std::vector<unsigned char> data{};
62-
msgpack23::pack(converting_insert_iterator{ std::back_inserter(data) }, original);
31+
msgpack23::pack(std::back_inserter(data), original);
6332

64-
const auto [my_integer, my_string] = msgpack23::unpack<MyData>(std::span{
65-
reinterpret_cast<std::byte *>(data.data()),
66-
data.size()
67-
});
33+
const auto [my_integer, my_string] = msgpack23::unpack<unsigned char, MyData>(data);
6834

6935
std::cout << my_integer << ' ' << my_string << '\n';
7036
}

include/msgpack23/msgpack23.h

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -503,9 +503,9 @@ namespace msgpack23 {
503503
std::span<B const> data_;
504504
std::size_t position_{0};
505505

506-
[[nodiscard]] B current() const {
506+
[[nodiscard]] std::byte current() const {
507507
if (position_ < data_.size()) {
508-
return data_[position_];
508+
return std::byte{ data_[position_] };
509509
}
510510
throw std::out_of_range("Unpacker doesn't have enough data.");
511511
}
@@ -564,7 +564,7 @@ namespace msgpack23 {
564564
if (read_conditional<FormatConstants::map32, std::uint32_t>(map_size)
565565
or read_conditional<FormatConstants::map16, std::uint16_t>(map_size)) {
566566
} else {
567-
map_size = std::to_integer<std::size_t>(current() & static_cast<B>(0b00001111));
567+
map_size = std::to_integer<std::size_t>(current() & static_cast<std::byte>(0b00001111));
568568
increment();
569569
}
570570
return map_size;
@@ -575,7 +575,7 @@ namespace msgpack23 {
575575
if (read_conditional<FormatConstants::array32, std::uint32_t>(array_size)
576576
or read_conditional<FormatConstants::array16, std::uint16_t>(array_size)) {
577577
} else {
578-
array_size = std::to_integer<std::size_t>(current() & static_cast<B>(0b00001111));
578+
array_size = std::to_integer<std::size_t>(current() & static_cast<std::byte>(0b00001111));
579579
increment();
580580
}
581581
return array_size;
@@ -977,7 +977,7 @@ namespace msgpack23 {
977977
or read_conditional<FormatConstants::str16, std::uint16_t>(str_size)
978978
or read_conditional<FormatConstants::str8, std::uint8_t>(str_size)) {
979979
} else {
980-
str_size = std::to_integer<std::size_t>(current() & static_cast<B>(0b00011111));
980+
str_size = std::to_integer<std::size_t>(current() & static_cast<std::byte>(0b00011111));
981981
increment();
982982
}
983983
if (position_ + str_size > data_.size()) {
@@ -1015,10 +1015,10 @@ namespace msgpack23 {
10151015
template<container Container>
10161016
Unpacker(Container const&)->Unpacker<typename Container::value_type>;
10171017

1018-
template<typename T, typename B>
1019-
concept unpackable_object = requires(T t, Unpacker<B> u)
1018+
template<typename T, typename U>
1019+
concept unpackable_object = requires(T t, U u)
10201020
{
1021-
{ t.unpack(u) };
1021+
t.unpack(u);
10221022
};
10231023

10241024
template<byte_type B, std::output_iterator<B> Iter, packable_object<Packer<B, Iter> > PackableObject>

tests/exception_tests.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ namespace {
5858
constexpr double expected{3.1415};
5959
packer(expected);
6060
std::nullptr_t actual;
61-
msgpack23::Unpacker unpacker{};
61+
msgpack23::Unpacker<std::byte> unpacker{};
6262
EXPECT_THROW(unpacker(actual), std::logic_error);
6363
}
6464

@@ -69,7 +69,7 @@ namespace {
6969
constexpr double expected{3.1415};
7070
packer(expected);
7171
bool actual;
72-
msgpack23::Unpacker unpacker{};
72+
msgpack23::Unpacker<std::byte> unpacker{};
7373
EXPECT_THROW(unpacker(actual), std::logic_error);
7474
}
7575

tests/int16_tests.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ namespace {
3131
std::vector<std::byte> data{};
3232
auto const inserter = std::back_insert_iterator(data);
3333
msgpack23::pack(inserter, testIntStruct);
34-
auto [actual] = msgpack23::unpack<Int16Struct>(data);
34+
auto [actual] = msgpack23::unpack<std::byte, Int16Struct>(data);
3535
EXPECT_EQ(actual, GetParam());
3636
}
3737

tests/int32_tests.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ namespace {
3131
std::vector<std::byte> data{};
3232
auto const inserter = std::back_insert_iterator(data);
3333
msgpack23::pack(inserter, testIntStruct);
34-
auto [actual] = msgpack23::unpack<Int32Struct>(data);
34+
auto [actual] = msgpack23::unpack<std::byte, Int32Struct>(data);
3535
EXPECT_EQ(actual, GetParam());
3636
}
3737

tests/int64_tests.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ namespace {
3131
std::vector<std::byte> data{};
3232
auto const inserter = std::back_insert_iterator(data);
3333
msgpack23::pack(inserter, testIntStruct);
34-
auto [actual] = msgpack23::unpack<Int64Struct>(data);
34+
auto [actual] = msgpack23::unpack<std::byte, Int64Struct>(data);
3535
EXPECT_EQ(actual, GetParam());
3636
}
3737

tests/int8_tests.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ namespace {
3131
std::vector<std::byte> data{};
3232
auto const inserter = std::back_insert_iterator(data);
3333
msgpack23::pack(inserter, testIntStruct);
34-
auto [actual] = msgpack23::unpack<Int8Struct>(data);
34+
auto [actual] = msgpack23::unpack<std::byte, Int8Struct>(data);
3535
EXPECT_EQ(actual, GetParam());
3636
}
3737

tests/object_packing_tests.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,7 @@ namespace {
8181
std::vector<std::byte> data{};
8282
auto inserter = std::back_insert_iterator(data);
8383
msgpack23::pack(inserter, test);
84-
auto obj = msgpack23::unpack<TestStruct>(data);
84+
auto const obj = msgpack23::unpack<std::byte, TestStruct>(data);
8585

8686
EXPECT_EQ(obj.int64, test.int64);
8787
EXPECT_EQ(obj.uint32, test.uint32);
@@ -117,6 +117,6 @@ namespace {
117117
std::vector<std::byte> data{};
118118
auto const inserter = std::back_insert_iterator(data);
119119
msgpack23::pack(inserter, my_data);
120-
auto obj = msgpack23::unpack<MyData>(data);
120+
auto obj = msgpack23::unpack<std::byte, MyData>(data);
121121
}
122122
}

tests/uint16_tests.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ namespace {
3030
std::vector<std::byte> data{};
3131
auto const inserter = std::back_insert_iterator(data);
3232
msgpack23::pack(inserter, testIntStruct);
33-
auto [uint16] = msgpack23::unpack<UInt16Struct>(data);
33+
auto [uint16] = msgpack23::unpack<std::byte, UInt16Struct>(data);
3434
EXPECT_EQ(uint16, GetParam());
3535
}
3636

tests/uint32_tests.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ namespace {
3030
std::vector<std::byte> data{};
3131
auto const inserter = std::back_insert_iterator(data);
3232
msgpack23::pack(inserter, testIntStruct);
33-
auto [int32] = msgpack23::unpack<UInt32Struct>(data);
33+
auto [int32] = msgpack23::unpack<std::byte, UInt32Struct>(data);
3434
EXPECT_EQ(int32, GetParam());
3535
}
3636

0 commit comments

Comments
 (0)