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