/src/libtorrent/fuzzers/src/read_bits.hpp
Line | Count | Source |
1 | | /* |
2 | | |
3 | | Copyright (c) 2020, Arvid Norberg |
4 | | All rights reserved. |
5 | | |
6 | | You may use, distribute and modify this code under the terms of the BSD license, |
7 | | see LICENSE file. |
8 | | */ |
9 | | |
10 | | struct read_bits |
11 | | { |
12 | | read_bits(std::uint8_t const* d, std::size_t s) |
13 | 2.19k | : m_data(d), m_size(s) |
14 | 2.19k | {} |
15 | | |
16 | | int read(int bits) |
17 | 2.23M | { |
18 | 2.23M | if (m_size == 0) return 0; |
19 | 656k | int ret = 0; |
20 | 1.35M | while (bits > 0 && m_size > 0) |
21 | 700k | { |
22 | 700k | int const bits_to_copy = std::min(8 - m_bit, bits); |
23 | 700k | ret <<= bits_to_copy; |
24 | 700k | ret |= ((*m_data) >> m_bit) & ((1 << bits_to_copy) - 1); |
25 | 700k | m_bit += bits_to_copy; |
26 | 700k | bits -= bits_to_copy; |
27 | 700k | if (m_bit == 8) |
28 | 125k | { |
29 | 125k | --m_size; |
30 | 125k | ++m_data; |
31 | 125k | m_bit = 0; |
32 | 125k | } |
33 | 700k | } |
34 | 656k | return ret; |
35 | 2.23M | } |
36 | | private: |
37 | | std::uint8_t const* m_data; |
38 | | std::size_t m_size; |
39 | | int m_bit = 0; |
40 | | }; |
41 | | |
42 | | |