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 : 21510 : inline uint16_t ReadLE16(const B* ptr)
20 : : {
21 : : uint16_t x;
22 : 21510 : memcpy(&x, ptr, 2);
23 : : return le16toh_internal(x);
24 : : }
25 : :
26 : : template <ByteType B>
27 [ + + ]: 367634502 : inline uint32_t ReadLE32(const B* ptr)
28 : : {
29 : : uint32_t x;
30 [ + + ]: 424418232 : memcpy(&x, ptr, 4);
31 : : return le32toh_internal(x);
32 : : }
33 : :
34 : : template <ByteType B>
35 [ + + + - : 345676098 : inline uint64_t ReadLE64(const B* ptr)
+ - ]
[ + + + - ]
[ + + + + ]
36 : : {
37 : : uint64_t x;
38 [ + + + - : 345676098 : memcpy(&x, ptr, 8);
+ - ]
[ + + + - ]
[ + + + + ]
39 : : return le64toh_internal(x);
40 : : }
41 : :
42 : : template <ByteType B>
43 : 377 : inline void WriteLE16(B* ptr, uint16_t x)
44 : : {
45 : 377 : uint16_t v = htole16_internal(x);
46 : 377 : memcpy(ptr, &v, 2);
47 : 377 : }
48 : :
49 : : template <ByteType B>
50 : 322678722 : inline void WriteLE32(B* ptr, uint32_t x)
51 : : {
52 : 322678722 : uint32_t v = htole32_internal(x);
53 : 322678722 : memcpy(ptr, &v, 4);
54 : 322678722 : }
55 : :
56 : : template <ByteType B>
57 : 16483581 : inline void WriteLE64(B* ptr, uint64_t x)
58 : : {
59 : 16483581 : uint64_t v = htole64_internal(x);
60 : 16483581 : memcpy(ptr, &v, 8);
61 : 16483581 : }
62 : :
63 : : template <ByteType B>
64 [ + - + + : 2649 : inline uint16_t ReadBE16(const B* ptr)
+ + - + ]
65 : : {
66 : : uint16_t x;
67 [ + - + - : 2654 : memcpy(&x, ptr, 2);
+ + + + +
- - + ]
68 [ + - + - : 2654 : return be16toh_internal(x);
+ + + + +
- - + ]
69 : : }
70 : :
71 : : template <ByteType B>
72 [ + + ]: 2305724 : inline uint32_t ReadBE32(const B* ptr)
[ + - + - ]
[ + - + -
+ - + - ]
73 : : {
74 : : uint32_t x;
75 : 3720989 : memcpy(&x, ptr, 4);
76 [ + + ]: 2305724 : return be32toh_internal(x);
[ + - + - ]
[ + - + -
+ - + - ]
77 : : }
78 : :
79 : : template <ByteType B>
80 : 96618068 : inline uint64_t ReadBE64(const B* ptr)
81 : : {
82 : : uint64_t x;
83 : 1545889088 : memcpy(&x, ptr, 8);
84 : 96618068 : return be64toh_internal(x);
85 : : }
86 : :
87 : : template <ByteType B>
88 : 20 : inline void WriteBE16(B* ptr, uint16_t x)
89 : : {
90 : 20 : uint16_t v = htobe16_internal(x);
91 : 20 : memcpy(ptr, &v, 2);
92 : 20 : }
93 : :
94 : : template <ByteType B>
95 : 765870497 : inline void WriteBE32(B* ptr, uint32_t x)
96 : : {
97 : 765870497 : uint32_t v = htobe32_internal(x);
98 : 765870497 : memcpy(ptr, &v, 4);
99 : 765870497 : }
100 : :
101 : : template <ByteType B>
102 : 941100825 : inline void WriteBE64(B* ptr, uint64_t x)
103 : : {
104 : 941100825 : uint64_t v = htobe64_internal(x);
105 : 941100825 : memcpy(ptr, &v, 8);
106 : 941100825 : }
107 : :
108 : : #endif // BITCOIN_CRYPTO_COMMON_H
|