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