Skip to content

Commit 4011481

Browse files
committed
Minor revamp of _sign_extend, added byte_source concept
1 parent a974dc7 commit 4011481

File tree

2 files changed

+35
-20
lines changed

2 files changed

+35
-20
lines changed

bitreader/include/bitreader/bitreader.hpp

Lines changed: 13 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -9,12 +9,13 @@
99

1010
#include "bitreader/bitreader-utils.hpp"
1111
#include "common/numeric.hpp"
12+
#include "data_source/byte_source.hpp"
1213

1314
namespace brcpp {
1415

1516

1617
//--------------------------------------------------------------------------
17-
template<typename Source>
18+
template<byte_source Source>
1819
class bitreader {
1920
public:
2021
bitreader(std::shared_ptr<Source> source)
@@ -101,8 +102,7 @@ namespace brcpp {
101102
T read(size_t bits)
102103
{
103104
using value_type = std::underlying_type_t<T>;
104-
auto val = static_cast<T>(read<value_type>(bits));
105-
return val;
105+
return static_cast<T>(read<value_type>(bits));
106106
}
107107

108108
//----------------------------------------------------------------------
@@ -146,25 +146,18 @@ namespace brcpp {
146146
};
147147

148148
//----------------------------------------------------------------------
149-
template<signed_integral T>
150-
T _sign_extend(T raw, size_t bits)
151-
{
152-
const auto m = static_cast<T>(one<T> << (bits - 1));
153-
return (raw ^ m) - m;
154-
}
155-
156-
//----------------------------------------------------------------------
157-
template<unsigned_integral T>
158-
T _sign_extend(T raw, size_t bits)
159-
{
160-
return raw;
161-
}
162-
163-
//----------------------------------------------------------------------
164-
template<floating_point T>
149+
template<bit_readable T>
165150
T _sign_extend(T raw, size_t bits)
166151
{
167-
return raw;
152+
if constexpr (signed_integral<T>)
153+
{
154+
const auto m = static_cast<T>(one<T> << (bits - 1));
155+
return (raw ^ m) - m;
156+
}
157+
else
158+
{
159+
return raw;
160+
}
168161
}
169162

170163
//----------------------------------------------------------------------
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
#pragma once
2+
#include <cstdint>
3+
#include <cstddef>
4+
#include <concepts>
5+
#include <memory>
6+
7+
namespace brcpp
8+
{
9+
10+
template<typename T>
11+
concept byte_source = requires(T r, uint64_t& buf, uint64_t pos, size_t count)
12+
{
13+
{ r.get_n(buf, count) } -> std::same_as<size_t>;
14+
{ r.depleted() } -> std::same_as<bool>;
15+
{ r.available() } -> std::same_as<uint64_t>;
16+
{ r.position() } -> std::same_as<uint64_t>;
17+
{ r.seek(pos) } -> std::same_as<void>;
18+
{ r.skip(count) } -> std::same_as<void>;
19+
{ r.clone() } -> std::same_as<std::shared_ptr<T>>;
20+
};
21+
22+
}

0 commit comments

Comments
 (0)