Branch data Line data Source code
1 : : // Copyright (c) 2014-present The Bitcoin Core developers
2 : : // Distributed under the MIT software license, see the accompanying
3 : : // file COPYING or http://www.opensource.org/licenses/mit-license.php.
4 : :
5 : : #ifndef BITCOIN_CRYPTO_COMMON_H
6 : : #define BITCOIN_CRYPTO_COMMON_H
7 : :
8 : : #include <compat/endian.h>
9 : :
10 : : #include <concepts>
11 : : #include <cstddef>
12 : : #include <cstdint>
13 : : #include <cstring>
14 : :
15 : : template <typename B>
16 : : concept ByteType = std::same_as<B, unsigned char> || std::same_as<B, std::byte>;
17 : :
18 : : template <ByteType B>
19 : 10626 : inline uint16_t ReadLE16(const B* ptr)
20 : : {
21 : : uint16_t x;
22 : 10626 : memcpy(&x, ptr, 2);
23 : : return le16toh_internal(x);
24 : : }
25 : :
26 : : template <ByteType B>
27 [ + + ]: 112687815 : inline uint32_t ReadLE32(const B* ptr)
28 : : {
29 : : uint32_t x;
30 [ + + ]: 175322280 : memcpy(&x, ptr, 4);
31 : : return le32toh_internal(x);
32 : : }
33 : :
34 : : template <ByteType B>
35 [ + + + - ]: 360516755 : inline uint64_t ReadLE64(const B* ptr)
[ + + + + ]
36 : : {
37 : : uint64_t x;
38 [ + + + - ]: 360516755 : memcpy(&x, ptr, 8);
[ + + + + ]
39 : : return le64toh_internal(x);
40 : : }
41 : :
42 : : template <ByteType B>
43 : 359 : inline void WriteLE16(B* ptr, uint16_t x)
44 : : {
45 : 359 : uint16_t v = htole16_internal(x);
46 : 359 : memcpy(ptr, &v, 2);
47 : 359 : }
48 : :
49 : : template <ByteType B>
50 : 317924961 : inline void WriteLE32(B* ptr, uint32_t x)
51 : : {
52 : 317924961 : uint32_t v = htole32_internal(x);
53 : 317924961 : memcpy(ptr, &v, 4);
54 : 317924961 : }
55 : :
56 : : template <ByteType B>
57 : 16228373 : inline void WriteLE64(B* ptr, uint64_t x)
58 : : {
59 : 16228373 : uint64_t v = htole64_internal(x);
60 : 16228373 : memcpy(ptr, &v, 8);
61 : 16228373 : }
62 : :
63 : : template <ByteType B>
64 [ # # # # : 2085 : inline uint16_t ReadBE16(const B* ptr)
# # # # ]
65 : : {
66 : : uint16_t x;
67 [ # # # # : 2085 : memcpy(&x, ptr, 2);
# # # # #
# # # ]
68 [ # # # # : 2085 : return be16toh_internal(x);
# # # # #
# # # ]
69 : : }
70 : :
71 : : template <ByteType B>
72 [ + + ]: 11394924 : inline uint32_t ReadBE32(const B* ptr)
[ # # # # ]
[ + - + -
+ - + - ]
73 : : {
74 : : uint32_t x;
75 : 143907264 : memcpy(&x, ptr, 4);
76 [ + + ]: 11394924 : return be32toh_internal(x);
[ # # # # ]
[ + - + -
+ - + - ]
77 : : }
78 : :
79 : : template <ByteType B>
80 : 96580530 : inline uint64_t ReadBE64(const B* ptr)
81 : : {
82 : : uint64_t x;
83 : 1545288480 : memcpy(&x, ptr, 8);
84 : 96580530 : return be64toh_internal(x);
85 : : }
86 : :
87 : : template <ByteType B>
88 : 0 : inline void WriteBE16(B* ptr, uint16_t x)
89 : : {
90 : 0 : uint16_t v = htobe16_internal(x);
91 : 0 : memcpy(ptr, &v, 2);
92 : 0 : }
93 : :
94 : : template <ByteType B>
95 : 242138005 : inline void WriteBE32(B* ptr, uint32_t x)
96 : : {
97 : 242138005 : uint32_t v = htobe32_internal(x);
98 : 242138005 : memcpy(ptr, &v, 4);
99 : 242138005 : }
100 : :
101 : : template <ByteType B>
102 : 876612173 : inline void WriteBE64(B* ptr, uint64_t x)
103 : : {
104 : 876612173 : uint64_t v = htobe64_internal(x);
105 : 876612173 : memcpy(ptr, &v, 8);
106 : 876612173 : }
107 : :
108 : : #endif // BITCOIN_CRYPTO_COMMON_H
|