Skip to content

Commit

Permalink
Merge pull request #181 from elbeno/missing-byterator-api
Browse files Browse the repository at this point in the history
🎨 Add return type control to `byterator` peek/read aliases
  • Loading branch information
elbeno authored Jan 6, 2025
2 parents 4d57b2e + bc6d7e2 commit 4b3c50f
Show file tree
Hide file tree
Showing 2 changed files with 36 additions and 6 deletions.
24 changes: 18 additions & 6 deletions include/stdx/byterator.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -188,20 +188,32 @@ template <typename T> class byterator {
ptr += sizeof(R);
}

[[nodiscard]] auto peeku8() { return peek<std::uint8_t>(); }
[[nodiscard]] auto readu8() { return read<std::uint8_t>(); }
template <typename V = std::uint8_t> [[nodiscard]] auto peeku8() {
return peek<std::uint8_t, V>();
}
template <typename V = std::uint8_t> [[nodiscard]] auto readu8() {
return read<std::uint8_t, V>();
}
template <typename V> [[nodiscard]] auto writeu8(V &&v) {
return write(static_cast<std::uint8_t>(std::forward<V>(v)));
}

[[nodiscard]] auto peeku16() { return peek<std::uint16_t>(); }
[[nodiscard]] auto readu16() { return read<std::uint16_t>(); }
template <typename V = std::uint16_t> [[nodiscard]] auto peeku16() {
return peek<std::uint16_t, V>();
}
template <typename V = std::uint16_t> [[nodiscard]] auto readu16() {
return read<std::uint16_t, V>();
}
template <typename V> [[nodiscard]] auto writeu16(V &&v) {
return write(static_cast<std::uint16_t>(std::forward<V>(v)));
}

[[nodiscard]] auto peeku32() { return peek<std::uint32_t>(); }
[[nodiscard]] auto readu32() { return read<std::uint32_t>(); }
template <typename V = std::uint32_t> [[nodiscard]] auto peeku32() {
return peek<std::uint32_t, V>();
}
template <typename V = std::uint32_t> [[nodiscard]] auto readu32() {
return read<std::uint32_t, V>();
}
template <typename V> [[nodiscard]] auto writeu32(V &&v) {
return write(static_cast<std::uint32_t>(std::forward<V>(v)));
}
Expand Down
18 changes: 18 additions & 0 deletions test/byterator.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -258,3 +258,21 @@ TEST_CASE("write enum (constrained size)", "[byterator]") {
CHECK(a[0] == stdx::to_be<std::uint16_t>(0x0302));
CHECK((i == j));
}

TEST_CASE("peek enum (constrained size alias)", "[byterator]") {
auto const a = std::array{stdx::to_be<std::uint16_t>(0x0102),
stdx::to_be<std::uint16_t>(0x0304)};
auto i = stdx::byterator{std::begin(a)};
static_assert(std::is_same_v<decltype(i.readu32()), std::uint32_t>);
CHECK(i.peeku8<E2>() == E2::A);
}

TEST_CASE("read enum (constrained size alias)", "[byterator]") {
auto const a = std::array{stdx::to_be<std::uint16_t>(0x0102),
stdx::to_be<std::uint16_t>(0x0304)};
auto i = stdx::byterator{std::begin(a)};
auto j = std::next(i);
static_assert(std::is_same_v<decltype(i.readu32()), std::uint32_t>);
CHECK(i.readu8<E2>() == E2::A);
CHECK((i == j));
}

0 comments on commit 4b3c50f

Please sign in to comment.