Skip to content

Commit d2f7bc5

Browse files
committed
refactor: Simplify unpacking calls by removing explicit byte type parameters
1 parent beb14b3 commit d2f7bc5

13 files changed

Lines changed: 48 additions & 28 deletions

examples/first_example.cpp

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22
// Created by Rene Windegger on 28/10/2025.
33
//
44
#include <iostream>
5-
#include <cstddef>
65
#include <iterator>
76
#include <utility>
87
#include <vector>

examples/second_example.cpp

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,8 @@
22
// Created by Rene Windegger on 28/10/2025.
33
//
44
#include <iostream>
5-
#include <cstddef>
65
#include <iterator>
7-
#include <utility>
86
#include <vector>
9-
#include <map>
107
#include <msgpack23/msgpack23.h>
118

129
struct MyData {
@@ -30,7 +27,7 @@ int main() {
3027
std::vector<unsigned char> data{};
3128
msgpack23::pack(std::back_inserter(data), original);
3229

33-
const auto [my_integer, my_string] = msgpack23::unpack<unsigned char, MyData>(data);
30+
const auto [my_integer, my_string] = msgpack23::unpack<MyData>(data);
3431

3532
std::cout << my_integer << ' ' << my_string << '\n';
3633
}

include/msgpack23/msgpack23.h

Lines changed: 33 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@
88
#include <bitset>
99
#include <chrono>
1010
#include <cstddef>
11-
#include <cstring>
1211
#include <iterator>
1312
#include <span>
1413
#include <string>
@@ -156,16 +155,17 @@ namespace msgpack23 {
156155
constexpr counting_inserter operator++(int) {
157156
return *this;
158157
}
158+
159159
private:
160160
std::size_t *size_{};
161161
};
162162

163163
template<typename T>
164164
concept byte_type = std::same_as<T, std::byte>
165-
or std::same_as<T, char>
166-
or std::same_as<T, unsigned char>
167-
or std::same_as<T, std::uint8_t>
168-
or std::same_as<T, std::int8_t>;
165+
or std::same_as<T, char>
166+
or std::same_as<T, unsigned char>
167+
or std::same_as<T, std::uint8_t>
168+
or std::same_as<T, std::int8_t>;
169169

170170
template<byte_type B, std::output_iterator<B> Iter>
171171
class Packer final {
@@ -478,7 +478,7 @@ namespace msgpack23 {
478478

479479
template<typename Container>
480480
Packer(std::back_insert_iterator<Container>) ->
481-
Packer<typename Container::value_type, std::back_insert_iterator<Container>>;
481+
Packer<typename Container::value_type, std::back_insert_iterator<Container> >;
482482

483483
template<typename T, typename P>
484484
concept packable_object = requires(T t, P p)
@@ -526,7 +526,7 @@ namespace msgpack23 {
526526
return static_cast<FormatConstants>(std::to_integer<std::uint8_t>(current()));
527527
}
528528

529-
template<typename T, std::enable_if_t<std::is_unsigned_v<T>, int> = 0>
529+
template<typename T, std::enable_if_t<std::is_unsigned_v<T>, int> = 0>
530530
[[nodiscard]] T read_integral() {
531531
if (position_ + sizeof(T) > data_.size()) {
532532
throw std::out_of_range("Unpacker doesn't have enough data.");
@@ -1006,15 +1006,15 @@ namespace msgpack23 {
10061006
};
10071007

10081008
template<typename T>
1009-
Unpacker(std::span<T const>) -> Unpacker<std::remove_const_t<T>>;
1009+
Unpacker(std::span<T const>) -> Unpacker<std::remove_const_t<T> >;
10101010

10111011
template<typename T>
10121012
concept container = requires (T b) {
10131013
typename T::value_type;
10141014
} && byte_type<typename T::value_type>;
10151015

10161016
template<container Container>
1017-
Unpacker(Container const&)->Unpacker<typename Container::value_type>;
1017+
Unpacker(Container const &) -> Unpacker<typename Container::value_type>;
10181018

10191019
template<typename T, typename U>
10201020
concept unpackable_object = requires(T t, U u)
@@ -1040,4 +1040,28 @@ namespace msgpack23 {
10401040
obj.unpack(unpacker);
10411041
return obj;
10421042
}
1043+
1044+
template<typename T>
1045+
struct span_value_type;
1046+
1047+
template<typename T>
1048+
requires requires { typename std::ranges::range_value_t<T>; }
1049+
struct span_value_type<T> {
1050+
using type = std::ranges::range_value_t<T>;
1051+
};
1052+
1053+
template<typename T>
1054+
using span_value_type_t = typename span_value_type<T>::type;
1055+
1056+
template<typename T>
1057+
concept span_convertible = std::ranges::contiguous_range<T>
1058+
&& std::ranges::sized_range<T>
1059+
&& byte_type<std::remove_const_t<span_value_type_t<T>>>;
1060+
1061+
template<typename UnpackableObject, span_convertible Container>
1062+
requires unpackable_object<UnpackableObject, Unpacker<std::remove_const_t<span_value_type_t<Container>>>>
1063+
[[nodiscard]] UnpackableObject unpack(Container const& data) {
1064+
using B = std::remove_const_t<span_value_type_t<Container>>;
1065+
return unpack<B, UnpackableObject>(std::span<B const>{data});
1066+
}
10431067
}

tests/byte_type_tests.cpp

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

8686
EXPECT_EQ(obj.int64, test.int64);
8787
EXPECT_EQ(obj.uint32, test.uint32);
@@ -125,7 +125,7 @@ namespace {
125125
std::vector<std::uint8_t> data{};
126126
auto inserter = std::back_insert_iterator(data);
127127
msgpack23::pack(inserter, test);
128-
auto const obj = msgpack23::unpack<std::uint8_t, TestStruct>(data);
128+
auto const obj = msgpack23::unpack<TestStruct>(data);
129129

130130
EXPECT_EQ(obj.int64, test.int64);
131131
EXPECT_EQ(obj.uint32, test.uint32);
@@ -169,7 +169,7 @@ namespace {
169169
std::vector<char> data{};
170170
auto inserter = std::back_insert_iterator(data);
171171
msgpack23::pack(inserter, test);
172-
auto const obj = msgpack23::unpack<char, TestStruct>(data);
172+
auto const obj = msgpack23::unpack<TestStruct>(data);
173173

174174
EXPECT_EQ(obj.int64, test.int64);
175175
EXPECT_EQ(obj.uint32, test.uint32);
@@ -213,7 +213,7 @@ namespace {
213213
std::vector<std::int8_t> data{};
214214
auto inserter = std::back_insert_iterator(data);
215215
msgpack23::pack(inserter, test);
216-
auto const obj = msgpack23::unpack<std::int8_t, TestStruct>(data);
216+
auto const obj = msgpack23::unpack<TestStruct>(data);
217217

218218
EXPECT_EQ(obj.int64, test.int64);
219219
EXPECT_EQ(obj.uint32, test.uint32);

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<std::byte, Int16Struct>(data);
34+
auto [actual] = msgpack23::unpack<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<std::byte, Int32Struct>(data);
34+
auto [actual] = msgpack23::unpack<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<std::byte, Int64Struct>(data);
34+
auto [actual] = msgpack23::unpack<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<std::byte, Int8Struct>(data);
34+
auto [actual] = msgpack23::unpack<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 const obj = msgpack23::unpack<std::byte, TestStruct>(data);
84+
auto const obj = msgpack23::unpack<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<std::byte, MyData>(data);
120+
auto obj = msgpack23::unpack<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<std::byte, UInt16Struct>(data);
33+
auto [uint16] = msgpack23::unpack<UInt16Struct>(data);
3434
EXPECT_EQ(uint16, GetParam());
3535
}
3636

0 commit comments

Comments
 (0)