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 : 8964 : inline uint16_t ReadLE16(const B* ptr)
20 : : {
21 : : uint16_t x;
22 : 8964 : memcpy(&x, ptr, 2);
23 : : return le16toh_internal(x);
24 : : }
25 : :
26 : : template <ByteType B>
27 [ + + ]: 53358728 : inline uint32_t ReadLE32(const B* ptr)
28 : : {
29 : : uint32_t x;
30 [ + + ]: 53876842 : memcpy(&x, ptr, 4);
31 : : return le32toh_internal(x);
32 : : }
33 : :
34 : : template <ByteType B>
35 [ + + ]: 142784271 : inline uint64_t ReadLE64(const B* ptr)
[ + + + + ]
36 : : {
37 : : uint64_t x;
38 [ + + ]: 142784271 : memcpy(&x, ptr, 8);
[ + + + + ]
39 : : return le64toh_internal(x);
40 : : }
41 : :
42 : : template <ByteType B>
43 : 347 : inline void WriteLE16(B* ptr, uint16_t x)
44 : : {
45 : 347 : uint16_t v = htole16_internal(x);
46 : 347 : memcpy(ptr, &v, 2);
47 : 347 : }
48 : :
49 : : template <ByteType B>
50 : 255578738 : inline void WriteLE32(B* ptr, uint32_t x)
51 : : {
52 : 255578738 : uint32_t v = htole32_internal(x);
53 : 255578738 : memcpy(ptr, &v, 4);
54 : 255578738 : }
55 : :
56 : : template <ByteType B>
57 : 10873059 : inline void WriteLE64(B* ptr, uint64_t x)
58 : : {
59 : 10873059 : uint64_t v = htole64_internal(x);
60 : 10873059 : memcpy(ptr, &v, 8);
61 : 10873059 : }
62 : :
63 : : template <ByteType B>
64 [ # # # # : 168 : inline uint16_t ReadBE16(const B* ptr)
# # # # ]
65 : : {
66 : : uint16_t x;
67 [ # # # # : 168 : memcpy(&x, ptr, 2);
# # # # #
# # # ]
68 [ # # # # : 168 : return be16toh_internal(x);
# # # # #
# # # ]
69 : : }
70 : :
71 : : template <ByteType B>
72 [ + + ]: 1249278 : inline uint32_t ReadBE32(const B* ptr)
[ # # # # ]
[ # # # #
# # # # ]
73 : : {
74 : : uint32_t x;
75 : 1414428 : memcpy(&x, ptr, 4);
76 [ + + ]: 1249278 : return be32toh_internal(x);
[ # # # # ]
[ # # # #
# # # # ]
77 : : }
78 : :
79 : : template <ByteType B>
80 : 12604903 : inline uint64_t ReadBE64(const B* ptr)
81 : : {
82 : : uint64_t x;
83 : 201678448 : memcpy(&x, ptr, 8);
84 : 12604903 : 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 : 51615541 : inline void WriteBE32(B* ptr, uint32_t x)
96 : : {
97 : 51615541 : uint32_t v = htobe32_internal(x);
98 : 51615541 : memcpy(ptr, &v, 4);
99 : 51615541 : }
100 : :
101 : : template <ByteType B>
102 : 108935743 : inline void WriteBE64(B* ptr, uint64_t x)
103 : : {
104 : 108935743 : uint64_t v = htobe64_internal(x);
105 : 108935743 : memcpy(ptr, &v, 8);
106 : 108935743 : }
107 : :
108 : : #endif // BITCOIN_CRYPTO_COMMON_H
|