Coverage Report

Created: 2026-10-28 06:31

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/botan/build/include/public/botan/mem_ops.h
Line
Count
Source
1
/*
2
* Memory Operations
3
* (C) 1999-2009,2012,2015 Jack Lloyd
4
*
5
* Botan is released under the Simplified BSD License (see license.txt)
6
*/
7
8
#ifndef BOTAN_MEMORY_OPS_H_
9
#define BOTAN_MEMORY_OPS_H_
10
11
#include <botan/assert.h>
12
#include <botan/concepts.h>
13
#include <botan/types.h>
14
#include <array>
15
#include <cstring>
16
#include <ranges>
17
#include <span>
18
#include <type_traits>
19
#include <vector>
20
21
BOTAN_FUTURE_INTERNAL_HEADER(mem_ops.h)
22
23
/*
24
The header mem_ops.h previously included the contents of allocator.h
25
26
Library code should always include allocator.h to see these
27
declarations; however when we are not building the library continue to
28
include the header here to avoid breaking application code.
29
*/
30
#if !defined(BOTAN_IS_BEING_BUILT)
31
   #include <botan/allocator.h>
32
#endif
33
34
namespace Botan {
35
36
/**
37
* Scrub memory contents in a way that a compiler should not elide,
38
* using some system specific technique. Note that this function might
39
* not zero the memory (for example, in some hypothetical
40
* implementation it might combine the memory contents with the output
41
* of a system PRNG), but if you can detect any difference in behavior
42
* at runtime then the clearing is side-effecting and you can just
43
* use `clear_mem`.
44
*
45
* Use this function to scrub memory just before deallocating it, or on
46
* a stack buffer before returning from the function.
47
*
48
* @param ptr a pointer to memory to scrub
49
* @param n the number of bytes pointed to by ptr
50
*/
51
BOTAN_PUBLIC_API(2, 0) void secure_scrub_memory(void* ptr, size_t n);
52
53
/**
54
* Scrub memory contents in a way that a compiler should not elide,
55
* using some system specific technique. Note that this function might
56
* not zero the memory.
57
*
58
* @param data  the data region to be scrubbed
59
*/
60
7.13k
void secure_scrub_memory(ranges::contiguous_output_range auto&& data) {
61
7.13k
   secure_scrub_memory(std::ranges::data(data), ranges::size_bytes(data));
62
7.13k
}
Unexecuted instantiation: _ZN5Botan19secure_scrub_memoryITkNS_6ranges23contiguous_output_rangeERNSt3__15arrayIjLm8EEEEEvOT_
_ZN5Botan19secure_scrub_memoryITkNS_6ranges23contiguous_output_rangeERNSt3__15arrayImLm9EEEEEvOT_
Line
Count
Source
60
6.53k
void secure_scrub_memory(ranges::contiguous_output_range auto&& data) {
61
6.53k
   secure_scrub_memory(std::ranges::data(data), ranges::size_bytes(data));
62
6.53k
}
_ZN5Botan19secure_scrub_memoryITkNS_6ranges23contiguous_output_rangeERNSt3__15arrayIhLm16EEEEEvOT_
Line
Count
Source
60
603
void secure_scrub_memory(ranges::contiguous_output_range auto&& data) {
61
603
   secure_scrub_memory(std::ranges::data(data), ranges::size_bytes(data));
62
603
}
63
64
/**
65
* Memory comparison, input insensitive
66
* @param x a pointer to an array
67
* @param y a pointer to another array
68
* @param len the number of Ts in x and y
69
* @return 0xFF iff x[i] == y[i] forall i in [0...n) or 0x00 otherwise
70
*/
71
BOTAN_DEPRECATED("This function is deprecated, use constant_time_compare()")
72
BOTAN_PUBLIC_API(2, 9) uint8_t ct_compare_u8(const uint8_t x[], const uint8_t y[], size_t len);
73
74
/**
75
 * Memory comparison, input insensitive
76
 * @param x a range of bytes
77
 * @param y another range of bytes
78
 * @return true iff x and y have equal lengths and x[i] == y[i] forall i in [0...n)
79
 */
80
BOTAN_PUBLIC_API(3, 3) bool constant_time_compare(std::span<const uint8_t> x, std::span<const uint8_t> y);
81
82
/**
83
* Memory comparison, input insensitive
84
* @param x a pointer to an array
85
* @param y a pointer to another array
86
* @param len the number of Ts in x and y
87
* @return true iff x[i] == y[i] forall i in [0...n)
88
*/
89
0
inline bool constant_time_compare(const uint8_t x[], const uint8_t y[], size_t len) {
90
0
   // simply assumes that *x and *y point to len allocated bytes at least
91
0
   return constant_time_compare({x, len}, {y, len});
92
0
}
93
94
/**
95
* Zero out some bytes. Warning: use secure_scrub_memory instead if the
96
* memory is about to be freed or otherwise the compiler thinks it can
97
* elide the writes.
98
*
99
* @param ptr a pointer to memory to zero
100
* @param bytes the number of bytes to zero in ptr
101
*/
102
23.5M
inline constexpr void clear_bytes(void* ptr, size_t bytes) {
103
23.5M
   if(bytes > 0) {
104
22.1M
      std::memset(ptr, 0, bytes);
105
22.1M
   }
106
23.5M
}
107
108
/**
109
* Zero memory before use. This simply calls memset and should not be
110
* used in cases where the compiler cannot see the call as a
111
* side-effecting operation (for example, if calling clear_mem before
112
* deallocating memory, the compiler would be allowed to omit the call
113
* to memset entirely under the as-if rule.)
114
*
115
* @param ptr a pointer to an array of Ts to zero
116
* @param n the number of Ts pointed to by ptr
117
*/
118
template <typename T>
119
18.2M
inline constexpr void clear_mem(T* ptr, size_t n) {
120
18.2M
   clear_bytes(ptr, sizeof(T) * n);
121
18.2M
}
void Botan::clear_mem<unsigned char>(unsigned char*, unsigned long)
Line
Count
Source
119
204k
inline constexpr void clear_mem(T* ptr, size_t n) {
120
204k
   clear_bytes(ptr, sizeof(T) * n);
121
204k
}
void Botan::clear_mem<unsigned long>(unsigned long*, unsigned long)
Line
Count
Source
119
18.0M
inline constexpr void clear_mem(T* ptr, size_t n) {
120
18.0M
   clear_bytes(ptr, sizeof(T) * n);
121
18.0M
}
void Botan::clear_mem<unsigned int>(unsigned int*, unsigned long)
Line
Count
Source
119
6
inline constexpr void clear_mem(T* ptr, size_t n) {
120
6
   clear_bytes(ptr, sizeof(T) * n);
121
6
}
122
123
/**
124
* Zero memory before use. This simply calls memset and should not be
125
* used in cases where the compiler cannot see the call as a
126
* side-effecting operation.
127
*
128
* @param mem a contiguous range of Ts to zero
129
*/
130
template <ranges::contiguous_output_range R>
131
inline constexpr void clear_mem(R&& mem)  // NOLINT(*-missing-std-forward)
132
   requires std::is_trivially_copyable_v<std::ranges::range_value_t<R>>
133
5.26M
{
134
5.26M
   clear_bytes(std::ranges::data(mem), ranges::size_bytes(mem));
135
5.26M
}
_ZN5Botan9clear_memITkNS_6ranges23contiguous_output_rangeENSt3__14spanImLm18446744073709551615EEEEEvOT_Qsr3stdE23is_trivially_copyable_vINS2_11conditionalIXsr21__is_primary_templateINS2_15iterator_traitsIu14__remove_cvrefIDTclL_ZNS2_6ranges5__cpo5beginEEclsr3stdE7declvalIRS5_EEEEEEEEE5valueENS2_26indirectly_readable_traitsISD_EESE_E4type10value_typeEE
Line
Count
Source
133
146k
{
134
146k
   clear_bytes(std::ranges::data(mem), ranges::size_bytes(mem));
135
146k
}
_ZN5Botan9clear_memITkNS_6ranges23contiguous_output_rangeERNSt3__15arrayImLm18EEEEEvOT_Qsr3stdE23is_trivially_copyable_vINS2_11conditionalIXsr21__is_primary_templateINS2_15iterator_traitsIu14__remove_cvrefIDTclL_ZNS2_6ranges5__cpo5beginEEclsr3stdE7declvalIRS6_EEEEEEEEE5valueENS2_26indirectly_readable_traitsISE_EESF_E4type10value_typeEE
Line
Count
Source
133
5.11M
{
134
5.11M
   clear_bytes(std::ranges::data(mem), ranges::size_bytes(mem));
135
5.11M
}
Unexecuted instantiation: _ZN5Botan9clear_memITkNS_6ranges23contiguous_output_rangeERNSt3__14spanIhLm18446744073709551615EEEEEvOT_Qsr3stdE23is_trivially_copyable_vINS2_11conditionalIXsr21__is_primary_templateINS2_15iterator_traitsIu14__remove_cvrefIDTclL_ZNS2_6ranges5__cpo5beginEEclsr3stdE7declvalIRS6_EEEEEEEEE5valueENS2_26indirectly_readable_traitsISE_EESF_E4type10value_typeEE
136
137
/**
138
* Copy memory
139
* @param out the destination array
140
* @param in the source array
141
* @param n the number of elements of in/out
142
*/
143
template <typename T>
144
   requires std::is_trivial_v<std::decay_t<T>>
145
2.22M
inline constexpr void copy_mem(T* out, const T* in, size_t n) {
146
2.22M
   BOTAN_ASSERT_IMPLICATION(n > 0, in != nullptr && out != nullptr, "If n > 0 then args are not null");
147
148
2.22M
   if(in != nullptr && out != nullptr && n > 0) {
149
2.22M
      std::memmove(out, in, sizeof(T) * n);
150
2.22M
   }
151
2.22M
}
_ZN5Botan8copy_memIhQsr3stdE12is_trivial_vIu7__decayIT_EEEEvPS1_PKS1_m
Line
Count
Source
145
19.9k
inline constexpr void copy_mem(T* out, const T* in, size_t n) {
146
19.9k
   BOTAN_ASSERT_IMPLICATION(n > 0, in != nullptr && out != nullptr, "If n > 0 then args are not null");
147
148
19.9k
   if(in != nullptr && out != nullptr && n > 0) {
149
19.3k
      std::memmove(out, in, sizeof(T) * n);
150
19.3k
   }
151
19.9k
}
_ZN5Botan8copy_memImQsr3stdE12is_trivial_vIu7__decayIT_EEEEvPS1_PKS1_m
Line
Count
Source
145
2.20M
inline constexpr void copy_mem(T* out, const T* in, size_t n) {
146
2.20M
   BOTAN_ASSERT_IMPLICATION(n > 0, in != nullptr && out != nullptr, "If n > 0 then args are not null");
147
148
2.20M
   if(in != nullptr && out != nullptr && n > 0) {
149
2.20M
      std::memmove(out, in, sizeof(T) * n);
150
2.20M
   }
151
2.20M
}
Unexecuted instantiation: _ZN5Botan8copy_memIjQsr3stdE12is_trivial_vIu7__decayIT_EEEEvPS1_PKS1_m
Unexecuted instantiation: _ZN5Botan8copy_memIiQsr3stdE12is_trivial_vIu7__decayIT_EEEEvPS1_PKS1_m
152
153
/**
154
* Copy memory
155
* @param out the destination array
156
* @param in the source array
157
*/
158
template <ranges::contiguous_output_range OutR, ranges::contiguous_range InR>
159
   requires std::is_same_v<std::ranges::range_value_t<OutR>, std::ranges::range_value_t<InR>> &&
160
            std::is_trivially_copyable_v<std::ranges::range_value_t<InR>>
161
1.88M
inline constexpr void copy_mem(OutR&& out /* NOLINT(*-std-forward) */, const InR& in) {
162
1.88M
   ranges::assert_equal_byte_lengths(out, in);
163
1.88M
   if(std::is_constant_evaluated()) {
164
0
      std::copy(std::ranges::begin(in), std::ranges::end(in), std::ranges::begin(out));
165
1.88M
   } else if(ranges::size_bytes(out) > 0) {
166
1.88M
      std::memmove(std::ranges::data(out), std::ranges::data(in), ranges::size_bytes(out));
167
1.88M
   }
168
1.88M
}
_ZN5Botan8copy_memITkNS_6ranges23contiguous_output_rangeERNSt3__14spanIhLm18446744073709551615EEETkNS1_16contiguous_rangeENS3_IKhLm18446744073709551615EEEQaasr3stdE9is_same_vINS2_11conditionalIXsr21__is_primary_templateINS2_15iterator_traitsIu14__remove_cvrefIDTclL_ZNS2_6ranges5__cpo5beginEEclsr3stdE7declvalIRT_EEEEEEEEE5valueENS2_26indirectly_readable_traitsISF_EESG_E4type10value_typeENS8_IXsr21__is_primary_templateINS9_Iu14__remove_cvrefIDTclL_ZNSB_5beginEEclsr3stdE7declvalIRT0_EEEEEEEEE5valueENSH_ISP_EESQ_E4type10value_typeEEsr3stdE23is_trivially_copyable_vISU_EEEvOSC_RKSM_
Line
Count
Source
161
11.8k
inline constexpr void copy_mem(OutR&& out /* NOLINT(*-std-forward) */, const InR& in) {
162
11.8k
   ranges::assert_equal_byte_lengths(out, in);
163
11.8k
   if(std::is_constant_evaluated()) {
164
0
      std::copy(std::ranges::begin(in), std::ranges::end(in), std::ranges::begin(out));
165
11.8k
   } else if(ranges::size_bytes(out) > 0) {
166
11.8k
      std::memmove(std::ranges::data(out), std::ranges::data(in), ranges::size_bytes(out));
167
11.8k
   }
168
11.8k
}
Unexecuted instantiation: _ZN5Botan8copy_memITkNS_6ranges23contiguous_output_rangeERNSt3__14spanIhLm18446744073709551615EEETkNS1_16contiguous_rangeES4_Qaasr3stdE9is_same_vINS2_11conditionalIXsr21__is_primary_templateINS2_15iterator_traitsIu14__remove_cvrefIDTclL_ZNS2_6ranges5__cpo5beginEEclsr3stdE7declvalIRT_EEEEEEEEE5valueENS2_26indirectly_readable_traitsISD_EESE_E4type10value_typeENS6_IXsr21__is_primary_templateINS7_Iu14__remove_cvrefIDTclL_ZNS9_5beginEEclsr3stdE7declvalIRT0_EEEEEEEEE5valueENSF_ISN_EESO_E4type10value_typeEEsr3stdE23is_trivially_copyable_vISS_EEEvOSA_RKSK_
_ZN5Botan8copy_memITkNS_6ranges23contiguous_output_rangeENSt3__14spanIhLm18446744073709551615EEETkNS1_16contiguous_rangeENS3_IKhLm18446744073709551615EEEQaasr3stdE9is_same_vINS2_11conditionalIXsr21__is_primary_templateINS2_15iterator_traitsIu14__remove_cvrefIDTclL_ZNS2_6ranges5__cpo5beginEEclsr3stdE7declvalIRT_EEEEEEEEE5valueENS2_26indirectly_readable_traitsISE_EESF_E4type10value_typeENS7_IXsr21__is_primary_templateINS8_Iu14__remove_cvrefIDTclL_ZNSA_5beginEEclsr3stdE7declvalIRT0_EEEEEEEEE5valueENSG_ISO_EESP_E4type10value_typeEEsr3stdE23is_trivially_copyable_vIST_EEEvOSB_RKSL_
Line
Count
Source
161
25.8k
inline constexpr void copy_mem(OutR&& out /* NOLINT(*-std-forward) */, const InR& in) {
162
25.8k
   ranges::assert_equal_byte_lengths(out, in);
163
25.8k
   if(std::is_constant_evaluated()) {
164
0
      std::copy(std::ranges::begin(in), std::ranges::end(in), std::ranges::begin(out));
165
25.8k
   } else if(ranges::size_bytes(out) > 0) {
166
25.8k
      std::memmove(std::ranges::data(out), std::ranges::data(in), ranges::size_bytes(out));
167
25.8k
   }
168
25.8k
}
_ZN5Botan8copy_memITkNS_6ranges23contiguous_output_rangeERNSt3__14spanIhLm18446744073709551615EEETkNS1_16contiguous_rangeENS2_6vectorIhNS_16secure_allocatorIhEEEEQaasr3stdE9is_same_vINS2_11conditionalIXsr21__is_primary_templateINS2_15iterator_traitsIu14__remove_cvrefIDTclL_ZNS2_6ranges5__cpo5beginEEclsr3stdE7declvalIRT_EEEEEEEEE5valueENS2_26indirectly_readable_traitsISH_EESI_E4type10value_typeENSA_IXsr21__is_primary_templateINSB_Iu14__remove_cvrefIDTclL_ZNSD_5beginEEclsr3stdE7declvalIRT0_EEEEEEEEE5valueENSJ_ISR_EESS_E4type10value_typeEEsr3stdE23is_trivially_copyable_vISW_EEEvOSE_RKSO_
Line
Count
Source
161
1.48k
inline constexpr void copy_mem(OutR&& out /* NOLINT(*-std-forward) */, const InR& in) {
162
1.48k
   ranges::assert_equal_byte_lengths(out, in);
163
1.48k
   if(std::is_constant_evaluated()) {
164
0
      std::copy(std::ranges::begin(in), std::ranges::end(in), std::ranges::begin(out));
165
1.48k
   } else if(ranges::size_bytes(out) > 0) {
166
1.48k
      std::memmove(std::ranges::data(out), std::ranges::data(in), ranges::size_bytes(out));
167
1.48k
   }
168
1.48k
}
_ZN5Botan8copy_memITkNS_6ranges23contiguous_output_rangeERNSt3__15arrayIhLm16EEETkNS1_16contiguous_rangeENS2_4spanIKhLm18446744073709551615EEEQaasr3stdE9is_same_vINS2_11conditionalIXsr21__is_primary_templateINS2_15iterator_traitsIu14__remove_cvrefIDTclL_ZNS2_6ranges5__cpo5beginEEclsr3stdE7declvalIRT_EEEEEEEEE5valueENS2_26indirectly_readable_traitsISG_EESH_E4type10value_typeENS9_IXsr21__is_primary_templateINSA_Iu14__remove_cvrefIDTclL_ZNSC_5beginEEclsr3stdE7declvalIRT0_EEEEEEEEE5valueENSI_ISQ_EESR_E4type10value_typeEEsr3stdE23is_trivially_copyable_vISV_EEEvOSD_RKSN_
Line
Count
Source
161
638
inline constexpr void copy_mem(OutR&& out /* NOLINT(*-std-forward) */, const InR& in) {
162
638
   ranges::assert_equal_byte_lengths(out, in);
163
638
   if(std::is_constant_evaluated()) {
164
0
      std::copy(std::ranges::begin(in), std::ranges::end(in), std::ranges::begin(out));
165
638
   } else if(ranges::size_bytes(out) > 0) {
166
638
      std::memmove(std::ranges::data(out), std::ranges::data(in), ranges::size_bytes(out));
167
638
   }
168
638
}
_ZN5Botan8copy_memITkNS_6ranges23contiguous_output_rangeERNSt3__15arrayIhLm16EEETkNS1_16contiguous_rangeES4_Qaasr3stdE9is_same_vINS2_11conditionalIXsr21__is_primary_templateINS2_15iterator_traitsIu14__remove_cvrefIDTclL_ZNS2_6ranges5__cpo5beginEEclsr3stdE7declvalIRT_EEEEEEEEE5valueENS2_26indirectly_readable_traitsISD_EESE_E4type10value_typeENS6_IXsr21__is_primary_templateINS7_Iu14__remove_cvrefIDTclL_ZNS9_5beginEEclsr3stdE7declvalIRT0_EEEEEEEEE5valueENSF_ISN_EESO_E4type10value_typeEEsr3stdE23is_trivially_copyable_vISS_EEEvOSA_RKSK_
Line
Count
Source
161
638
inline constexpr void copy_mem(OutR&& out /* NOLINT(*-std-forward) */, const InR& in) {
162
638
   ranges::assert_equal_byte_lengths(out, in);
163
638
   if(std::is_constant_evaluated()) {
164
0
      std::copy(std::ranges::begin(in), std::ranges::end(in), std::ranges::begin(out));
165
638
   } else if(ranges::size_bytes(out) > 0) {
166
638
      std::memmove(std::ranges::data(out), std::ranges::data(in), ranges::size_bytes(out));
167
638
   }
168
638
}
_ZN5Botan8copy_memITkNS_6ranges23contiguous_output_rangeENSt3__14spanImLm18446744073709551615EEETkNS1_16contiguous_rangeENS3_IKmLm18446744073709551615EEEQaasr3stdE9is_same_vINS2_11conditionalIXsr21__is_primary_templateINS2_15iterator_traitsIu14__remove_cvrefIDTclL_ZNS2_6ranges5__cpo5beginEEclsr3stdE7declvalIRT_EEEEEEEEE5valueENS2_26indirectly_readable_traitsISE_EESF_E4type10value_typeENS7_IXsr21__is_primary_templateINS8_Iu14__remove_cvrefIDTclL_ZNSA_5beginEEclsr3stdE7declvalIRT0_EEEEEEEEE5valueENSG_ISO_EESP_E4type10value_typeEEsr3stdE23is_trivially_copyable_vIST_EEEvOSB_RKSL_
Line
Count
Source
161
25.1k
inline constexpr void copy_mem(OutR&& out /* NOLINT(*-std-forward) */, const InR& in) {
162
25.1k
   ranges::assert_equal_byte_lengths(out, in);
163
25.1k
   if(std::is_constant_evaluated()) {
164
0
      std::copy(std::ranges::begin(in), std::ranges::end(in), std::ranges::begin(out));
165
25.1k
   } else if(ranges::size_bytes(out) > 0) {
166
25.1k
      std::memmove(std::ranges::data(out), std::ranges::data(in), ranges::size_bytes(out));
167
25.1k
   }
168
25.1k
}
_ZN5Botan8copy_memITkNS_6ranges23contiguous_output_rangeERNSt3__16vectorImNS_16secure_allocatorImEEEETkNS1_16contiguous_rangeENS2_4spanImLm18446744073709551615EEEQaasr3stdE9is_same_vINS2_11conditionalIXsr21__is_primary_templateINS2_15iterator_traitsIu14__remove_cvrefIDTclL_ZNS2_6ranges5__cpo5beginEEclsr3stdE7declvalIRT_EEEEEEEEE5valueENS2_26indirectly_readable_traitsISH_EESI_E4type10value_typeENSA_IXsr21__is_primary_templateINSB_Iu14__remove_cvrefIDTclL_ZNSD_5beginEEclsr3stdE7declvalIRT0_EEEEEEEEE5valueENSJ_ISR_EESS_E4type10value_typeEEsr3stdE23is_trivially_copyable_vISW_EEEvOSE_RKSO_
Line
Count
Source
161
1.76M
inline constexpr void copy_mem(OutR&& out /* NOLINT(*-std-forward) */, const InR& in) {
162
1.76M
   ranges::assert_equal_byte_lengths(out, in);
163
1.76M
   if(std::is_constant_evaluated()) {
164
0
      std::copy(std::ranges::begin(in), std::ranges::end(in), std::ranges::begin(out));
165
1.76M
   } else if(ranges::size_bytes(out) > 0) {
166
1.76M
      std::memmove(std::ranges::data(out), std::ranges::data(in), ranges::size_bytes(out));
167
1.76M
   }
168
1.76M
}
_ZN5Botan8copy_memITkNS_6ranges23contiguous_output_rangeENSt3__14spanImLm4EEETkNS1_16contiguous_rangeENS2_5arrayImLm4EEEQaasr3stdE9is_same_vINS2_11conditionalIXsr21__is_primary_templateINS2_15iterator_traitsIu14__remove_cvrefIDTclL_ZNS2_6ranges5__cpo5beginEEclsr3stdE7declvalIRT_EEEEEEEEE5valueENS2_26indirectly_readable_traitsISE_EESF_E4type10value_typeENS7_IXsr21__is_primary_templateINS8_Iu14__remove_cvrefIDTclL_ZNSA_5beginEEclsr3stdE7declvalIRT0_EEEEEEEEE5valueENSG_ISO_EESP_E4type10value_typeEEsr3stdE23is_trivially_copyable_vIST_EEEvOSB_RKSL_
Line
Count
Source
161
18.6k
inline constexpr void copy_mem(OutR&& out /* NOLINT(*-std-forward) */, const InR& in) {
162
18.6k
   ranges::assert_equal_byte_lengths(out, in);
163
18.6k
   if(std::is_constant_evaluated()) {
164
0
      std::copy(std::ranges::begin(in), std::ranges::end(in), std::ranges::begin(out));
165
18.6k
   } else if(ranges::size_bytes(out) > 0) {
166
18.6k
      std::memmove(std::ranges::data(out), std::ranges::data(in), ranges::size_bytes(out));
167
18.6k
   }
168
18.6k
}
_ZN5Botan8copy_memITkNS_6ranges23contiguous_output_rangeENSt3__14spanIhLm32EEETkNS1_16contiguous_rangeENS3_IKhLm32EEEQaasr3stdE9is_same_vINS2_11conditionalIXsr21__is_primary_templateINS2_15iterator_traitsIu14__remove_cvrefIDTclL_ZNS2_6ranges5__cpo5beginEEclsr3stdE7declvalIRT_EEEEEEEEE5valueENS2_26indirectly_readable_traitsISE_EESF_E4type10value_typeENS7_IXsr21__is_primary_templateINS8_Iu14__remove_cvrefIDTclL_ZNSA_5beginEEclsr3stdE7declvalIRT0_EEEEEEEEE5valueENSG_ISO_EESP_E4type10value_typeEEsr3stdE23is_trivially_copyable_vIST_EEEvOSB_RKSL_
Line
Count
Source
161
67
inline constexpr void copy_mem(OutR&& out /* NOLINT(*-std-forward) */, const InR& in) {
162
67
   ranges::assert_equal_byte_lengths(out, in);
163
67
   if(std::is_constant_evaluated()) {
164
0
      std::copy(std::ranges::begin(in), std::ranges::end(in), std::ranges::begin(out));
165
67
   } else if(ranges::size_bytes(out) > 0) {
166
67
      std::memmove(std::ranges::data(out), std::ranges::data(in), ranges::size_bytes(out));
167
67
   }
168
67
}
Unexecuted instantiation: _ZN5Botan8copy_memITkNS_6ranges23contiguous_output_rangeERNSt3__15arrayImLm4EEETkNS1_16contiguous_rangeENS2_4spanImLm4EEEQaasr3stdE9is_same_vINS2_11conditionalIXsr21__is_primary_templateINS2_15iterator_traitsIu14__remove_cvrefIDTclL_ZNS2_6ranges5__cpo5beginEEclsr3stdE7declvalIRT_EEEEEEEEE5valueENS2_26indirectly_readable_traitsISF_EESG_E4type10value_typeENS8_IXsr21__is_primary_templateINS9_Iu14__remove_cvrefIDTclL_ZNSB_5beginEEclsr3stdE7declvalIRT0_EEEEEEEEE5valueENSH_ISP_EESQ_E4type10value_typeEEsr3stdE23is_trivially_copyable_vISU_EEEvOSC_RKSM_
Unexecuted instantiation: _ZN5Botan8copy_memITkNS_6ranges23contiguous_output_rangeENSt3__14spanImLm1EEETkNS1_16contiguous_rangeENS2_5arrayImLm1EEEQaasr3stdE9is_same_vINS2_11conditionalIXsr21__is_primary_templateINS2_15iterator_traitsIu14__remove_cvrefIDTclL_ZNS2_6ranges5__cpo5beginEEclsr3stdE7declvalIRT_EEEEEEEEE5valueENS2_26indirectly_readable_traitsISE_EESF_E4type10value_typeENS7_IXsr21__is_primary_templateINS8_Iu14__remove_cvrefIDTclL_ZNSA_5beginEEclsr3stdE7declvalIRT0_EEEEEEEEE5valueENSG_ISO_EESP_E4type10value_typeEEsr3stdE23is_trivially_copyable_vIST_EEEvOSB_RKSL_
_ZN5Botan8copy_memITkNS_6ranges23contiguous_output_rangeENSt3__14spanImLm6EEETkNS1_16contiguous_rangeENS2_5arrayImLm6EEEQaasr3stdE9is_same_vINS2_11conditionalIXsr21__is_primary_templateINS2_15iterator_traitsIu14__remove_cvrefIDTclL_ZNS2_6ranges5__cpo5beginEEclsr3stdE7declvalIRT_EEEEEEEEE5valueENS2_26indirectly_readable_traitsISE_EESF_E4type10value_typeENS7_IXsr21__is_primary_templateINS8_Iu14__remove_cvrefIDTclL_ZNSA_5beginEEclsr3stdE7declvalIRT0_EEEEEEEEE5valueENSG_ISO_EESP_E4type10value_typeEEsr3stdE23is_trivially_copyable_vIST_EEEvOSB_RKSL_
Line
Count
Source
161
7.31k
inline constexpr void copy_mem(OutR&& out /* NOLINT(*-std-forward) */, const InR& in) {
162
7.31k
   ranges::assert_equal_byte_lengths(out, in);
163
7.31k
   if(std::is_constant_evaluated()) {
164
0
      std::copy(std::ranges::begin(in), std::ranges::end(in), std::ranges::begin(out));
165
7.31k
   } else if(ranges::size_bytes(out) > 0) {
166
7.31k
      std::memmove(std::ranges::data(out), std::ranges::data(in), ranges::size_bytes(out));
167
7.31k
   }
168
7.31k
}
_ZN5Botan8copy_memITkNS_6ranges23contiguous_output_rangeENSt3__14spanIhLm48EEETkNS1_16contiguous_rangeENS3_IKhLm48EEEQaasr3stdE9is_same_vINS2_11conditionalIXsr21__is_primary_templateINS2_15iterator_traitsIu14__remove_cvrefIDTclL_ZNS2_6ranges5__cpo5beginEEclsr3stdE7declvalIRT_EEEEEEEEE5valueENS2_26indirectly_readable_traitsISE_EESF_E4type10value_typeENS7_IXsr21__is_primary_templateINS8_Iu14__remove_cvrefIDTclL_ZNSA_5beginEEclsr3stdE7declvalIRT0_EEEEEEEEE5valueENSG_ISO_EESP_E4type10value_typeEEsr3stdE23is_trivially_copyable_vIST_EEEvOSB_RKSL_
Line
Count
Source
161
15
inline constexpr void copy_mem(OutR&& out /* NOLINT(*-std-forward) */, const InR& in) {
162
15
   ranges::assert_equal_byte_lengths(out, in);
163
15
   if(std::is_constant_evaluated()) {
164
0
      std::copy(std::ranges::begin(in), std::ranges::end(in), std::ranges::begin(out));
165
15
   } else if(ranges::size_bytes(out) > 0) {
166
15
      std::memmove(std::ranges::data(out), std::ranges::data(in), ranges::size_bytes(out));
167
15
   }
168
15
}
Unexecuted instantiation: _ZN5Botan8copy_memITkNS_6ranges23contiguous_output_rangeERNSt3__15arrayImLm6EEETkNS1_16contiguous_rangeENS2_4spanImLm6EEEQaasr3stdE9is_same_vINS2_11conditionalIXsr21__is_primary_templateINS2_15iterator_traitsIu14__remove_cvrefIDTclL_ZNS2_6ranges5__cpo5beginEEclsr3stdE7declvalIRT_EEEEEEEEE5valueENS2_26indirectly_readable_traitsISF_EESG_E4type10value_typeENS8_IXsr21__is_primary_templateINS9_Iu14__remove_cvrefIDTclL_ZNSB_5beginEEclsr3stdE7declvalIRT0_EEEEEEEEE5valueENSH_ISP_EESQ_E4type10value_typeEEsr3stdE23is_trivially_copyable_vISU_EEEvOSC_RKSM_
_ZN5Botan8copy_memITkNS_6ranges23contiguous_output_rangeENSt3__14spanImLm8EEETkNS1_16contiguous_rangeENS2_5arrayImLm8EEEQaasr3stdE9is_same_vINS2_11conditionalIXsr21__is_primary_templateINS2_15iterator_traitsIu14__remove_cvrefIDTclL_ZNS2_6ranges5__cpo5beginEEclsr3stdE7declvalIRT_EEEEEEEEE5valueENS2_26indirectly_readable_traitsISE_EESF_E4type10value_typeENS7_IXsr21__is_primary_templateINS8_Iu14__remove_cvrefIDTclL_ZNSA_5beginEEclsr3stdE7declvalIRT0_EEEEEEEEE5valueENSG_ISO_EESP_E4type10value_typeEEsr3stdE23is_trivially_copyable_vIST_EEEvOSB_RKSL_
Line
Count
Source
161
5.08k
inline constexpr void copy_mem(OutR&& out /* NOLINT(*-std-forward) */, const InR& in) {
162
5.08k
   ranges::assert_equal_byte_lengths(out, in);
163
5.08k
   if(std::is_constant_evaluated()) {
164
0
      std::copy(std::ranges::begin(in), std::ranges::end(in), std::ranges::begin(out));
165
5.08k
   } else if(ranges::size_bytes(out) > 0) {
166
5.08k
      std::memmove(std::ranges::data(out), std::ranges::data(in), ranges::size_bytes(out));
167
5.08k
   }
168
5.08k
}
_ZN5Botan8copy_memITkNS_6ranges23contiguous_output_rangeENSt3__14spanIhLm64EEETkNS1_16contiguous_rangeENS3_IKhLm64EEEQaasr3stdE9is_same_vINS2_11conditionalIXsr21__is_primary_templateINS2_15iterator_traitsIu14__remove_cvrefIDTclL_ZNS2_6ranges5__cpo5beginEEclsr3stdE7declvalIRT_EEEEEEEEE5valueENS2_26indirectly_readable_traitsISE_EESF_E4type10value_typeENS7_IXsr21__is_primary_templateINS8_Iu14__remove_cvrefIDTclL_ZNSA_5beginEEclsr3stdE7declvalIRT0_EEEEEEEEE5valueENSG_ISO_EESP_E4type10value_typeEEsr3stdE23is_trivially_copyable_vIST_EEEvOSB_RKSL_
Line
Count
Source
161
5
inline constexpr void copy_mem(OutR&& out /* NOLINT(*-std-forward) */, const InR& in) {
162
5
   ranges::assert_equal_byte_lengths(out, in);
163
5
   if(std::is_constant_evaluated()) {
164
0
      std::copy(std::ranges::begin(in), std::ranges::end(in), std::ranges::begin(out));
165
5
   } else if(ranges::size_bytes(out) > 0) {
166
5
      std::memmove(std::ranges::data(out), std::ranges::data(in), ranges::size_bytes(out));
167
5
   }
168
5
}
Unexecuted instantiation: _ZN5Botan8copy_memITkNS_6ranges23contiguous_output_rangeERNSt3__15arrayImLm8EEETkNS1_16contiguous_rangeENS2_4spanImLm8EEEQaasr3stdE9is_same_vINS2_11conditionalIXsr21__is_primary_templateINS2_15iterator_traitsIu14__remove_cvrefIDTclL_ZNS2_6ranges5__cpo5beginEEclsr3stdE7declvalIRT_EEEEEEEEE5valueENS2_26indirectly_readable_traitsISF_EESG_E4type10value_typeENS8_IXsr21__is_primary_templateINS9_Iu14__remove_cvrefIDTclL_ZNSB_5beginEEclsr3stdE7declvalIRT0_EEEEEEEEE5valueENSH_ISP_EESQ_E4type10value_typeEEsr3stdE23is_trivially_copyable_vISU_EEEvOSC_RKSM_
_ZN5Botan8copy_memITkNS_6ranges23contiguous_output_rangeENSt3__14spanImLm9EEETkNS1_16contiguous_rangeENS2_5arrayImLm9EEEQaasr3stdE9is_same_vINS2_11conditionalIXsr21__is_primary_templateINS2_15iterator_traitsIu14__remove_cvrefIDTclL_ZNS2_6ranges5__cpo5beginEEclsr3stdE7declvalIRT_EEEEEEEEE5valueENS2_26indirectly_readable_traitsISE_EESF_E4type10value_typeENS7_IXsr21__is_primary_templateINS8_Iu14__remove_cvrefIDTclL_ZNSA_5beginEEclsr3stdE7declvalIRT0_EEEEEEEEE5valueENSG_ISO_EESP_E4type10value_typeEEsr3stdE23is_trivially_copyable_vIST_EEEvOSB_RKSL_
Line
Count
Source
161
12.4k
inline constexpr void copy_mem(OutR&& out /* NOLINT(*-std-forward) */, const InR& in) {
162
12.4k
   ranges::assert_equal_byte_lengths(out, in);
163
12.4k
   if(std::is_constant_evaluated()) {
164
0
      std::copy(std::ranges::begin(in), std::ranges::end(in), std::ranges::begin(out));
165
12.4k
   } else if(ranges::size_bytes(out) > 0) {
166
12.4k
      std::memmove(std::ranges::data(out), std::ranges::data(in), ranges::size_bytes(out));
167
12.4k
   }
168
12.4k
}
_ZN5Botan8copy_memITkNS_6ranges23contiguous_output_rangeENSt3__14spanImLm3EEETkNS1_16contiguous_rangeENS2_5arrayImLm3EEEQaasr3stdE9is_same_vINS2_11conditionalIXsr21__is_primary_templateINS2_15iterator_traitsIu14__remove_cvrefIDTclL_ZNS2_6ranges5__cpo5beginEEclsr3stdE7declvalIRT_EEEEEEEEE5valueENS2_26indirectly_readable_traitsISE_EESF_E4type10value_typeENS7_IXsr21__is_primary_templateINS8_Iu14__remove_cvrefIDTclL_ZNSA_5beginEEclsr3stdE7declvalIRT0_EEEEEEEEE5valueENSG_ISO_EESP_E4type10value_typeEEsr3stdE23is_trivially_copyable_vIST_EEEvOSB_RKSL_
Line
Count
Source
161
2.94k
inline constexpr void copy_mem(OutR&& out /* NOLINT(*-std-forward) */, const InR& in) {
162
2.94k
   ranges::assert_equal_byte_lengths(out, in);
163
2.94k
   if(std::is_constant_evaluated()) {
164
0
      std::copy(std::ranges::begin(in), std::ranges::end(in), std::ranges::begin(out));
165
2.94k
   } else if(ranges::size_bytes(out) > 0) {
166
2.94k
      std::memmove(std::ranges::data(out), std::ranges::data(in), ranges::size_bytes(out));
167
2.94k
   }
168
2.94k
}
_ZN5Botan8copy_memITkNS_6ranges23contiguous_output_rangeENSt3__14spanIhLm24EEETkNS1_16contiguous_rangeENS3_IKhLm24EEEQaasr3stdE9is_same_vINS2_11conditionalIXsr21__is_primary_templateINS2_15iterator_traitsIu14__remove_cvrefIDTclL_ZNS2_6ranges5__cpo5beginEEclsr3stdE7declvalIRT_EEEEEEEEE5valueENS2_26indirectly_readable_traitsISE_EESF_E4type10value_typeENS7_IXsr21__is_primary_templateINS8_Iu14__remove_cvrefIDTclL_ZNSA_5beginEEclsr3stdE7declvalIRT0_EEEEEEEEE5valueENSG_ISO_EESP_E4type10value_typeEEsr3stdE23is_trivially_copyable_vIST_EEEvOSB_RKSL_
Line
Count
Source
161
10
inline constexpr void copy_mem(OutR&& out /* NOLINT(*-std-forward) */, const InR& in) {
162
10
   ranges::assert_equal_byte_lengths(out, in);
163
10
   if(std::is_constant_evaluated()) {
164
0
      std::copy(std::ranges::begin(in), std::ranges::end(in), std::ranges::begin(out));
165
10
   } else if(ranges::size_bytes(out) > 0) {
166
10
      std::memmove(std::ranges::data(out), std::ranges::data(in), ranges::size_bytes(out));
167
10
   }
168
10
}
Unexecuted instantiation: _ZN5Botan8copy_memITkNS_6ranges23contiguous_output_rangeERNSt3__15arrayImLm3EEETkNS1_16contiguous_rangeENS2_4spanImLm3EEEQaasr3stdE9is_same_vINS2_11conditionalIXsr21__is_primary_templateINS2_15iterator_traitsIu14__remove_cvrefIDTclL_ZNS2_6ranges5__cpo5beginEEclsr3stdE7declvalIRT_EEEEEEEEE5valueENS2_26indirectly_readable_traitsISF_EESG_E4type10value_typeENS8_IXsr21__is_primary_templateINS9_Iu14__remove_cvrefIDTclL_ZNSB_5beginEEclsr3stdE7declvalIRT0_EEEEEEEEE5valueENSH_ISP_EESQ_E4type10value_typeEEsr3stdE23is_trivially_copyable_vISU_EEEvOSC_RKSM_
_ZN5Botan8copy_memITkNS_6ranges23contiguous_output_rangeERNSt3__14spanIhLm28EEETkNS1_16contiguous_rangeENS3_IKhLm28EEEQaasr3stdE9is_same_vINS2_11conditionalIXsr21__is_primary_templateINS2_15iterator_traitsIu14__remove_cvrefIDTclL_ZNS2_6ranges5__cpo5beginEEclsr3stdE7declvalIRT_EEEEEEEEE5valueENS2_26indirectly_readable_traitsISF_EESG_E4type10value_typeENS8_IXsr21__is_primary_templateINS9_Iu14__remove_cvrefIDTclL_ZNSB_5beginEEclsr3stdE7declvalIRT0_EEEEEEEEE5valueENSH_ISP_EESQ_E4type10value_typeEEsr3stdE23is_trivially_copyable_vISU_EEEvOSC_RKSM_
Line
Count
Source
161
3.71k
inline constexpr void copy_mem(OutR&& out /* NOLINT(*-std-forward) */, const InR& in) {
162
3.71k
   ranges::assert_equal_byte_lengths(out, in);
163
3.71k
   if(std::is_constant_evaluated()) {
164
0
      std::copy(std::ranges::begin(in), std::ranges::end(in), std::ranges::begin(out));
165
3.71k
   } else if(ranges::size_bytes(out) > 0) {
166
3.71k
      std::memmove(std::ranges::data(out), std::ranges::data(in), ranges::size_bytes(out));
167
3.71k
   }
168
3.71k
}
_ZN5Botan8copy_memITkNS_6ranges23contiguous_output_rangeENSt3__14spanIhLm28EEETkNS1_16contiguous_rangeENS3_IKhLm28EEEQaasr3stdE9is_same_vINS2_11conditionalIXsr21__is_primary_templateINS2_15iterator_traitsIu14__remove_cvrefIDTclL_ZNS2_6ranges5__cpo5beginEEclsr3stdE7declvalIRT_EEEEEEEEE5valueENS2_26indirectly_readable_traitsISE_EESF_E4type10value_typeENS7_IXsr21__is_primary_templateINS8_Iu14__remove_cvrefIDTclL_ZNSA_5beginEEclsr3stdE7declvalIRT0_EEEEEEEEE5valueENSG_ISO_EESP_E4type10value_typeEEsr3stdE23is_trivially_copyable_vIST_EEEvOSB_RKSL_
Line
Count
Source
161
7
inline constexpr void copy_mem(OutR&& out /* NOLINT(*-std-forward) */, const InR& in) {
162
7
   ranges::assert_equal_byte_lengths(out, in);
163
7
   if(std::is_constant_evaluated()) {
164
0
      std::copy(std::ranges::begin(in), std::ranges::end(in), std::ranges::begin(out));
165
7
   } else if(ranges::size_bytes(out) > 0) {
166
7
      std::memmove(std::ranges::data(out), std::ranges::data(in), ranges::size_bytes(out));
167
7
   }
168
7
}
Unexecuted instantiation: _ZN5Botan8copy_memITkNS_6ranges23contiguous_output_rangeENSt3__14spanIhLm72EEETkNS1_16contiguous_rangeENS3_IKhLm72EEEQaasr3stdE9is_same_vINS2_11conditionalIXsr21__is_primary_templateINS2_15iterator_traitsIu14__remove_cvrefIDTclL_ZNS2_6ranges5__cpo5beginEEclsr3stdE7declvalIRT_EEEEEEEEE5valueENS2_26indirectly_readable_traitsISE_EESF_E4type10value_typeENS7_IXsr21__is_primary_templateINS8_Iu14__remove_cvrefIDTclL_ZNSA_5beginEEclsr3stdE7declvalIRT0_EEEEEEEEE5valueENSG_ISO_EESP_E4type10value_typeEEsr3stdE23is_trivially_copyable_vIST_EEEvOSB_RKSL_
_ZN5Botan8copy_memITkNS_6ranges23contiguous_output_rangeERNSt3__14spanIhLm66EEETkNS1_16contiguous_rangeENS3_IKhLm66EEEQaasr3stdE9is_same_vINS2_11conditionalIXsr21__is_primary_templateINS2_15iterator_traitsIu14__remove_cvrefIDTclL_ZNS2_6ranges5__cpo5beginEEclsr3stdE7declvalIRT_EEEEEEEEE5valueENS2_26indirectly_readable_traitsISF_EESG_E4type10value_typeENS8_IXsr21__is_primary_templateINS9_Iu14__remove_cvrefIDTclL_ZNSB_5beginEEclsr3stdE7declvalIRT0_EEEEEEEEE5valueENSH_ISP_EESQ_E4type10value_typeEEsr3stdE23is_trivially_copyable_vISU_EEEvOSC_RKSM_
Line
Count
Source
161
3.16k
inline constexpr void copy_mem(OutR&& out /* NOLINT(*-std-forward) */, const InR& in) {
162
3.16k
   ranges::assert_equal_byte_lengths(out, in);
163
3.16k
   if(std::is_constant_evaluated()) {
164
0
      std::copy(std::ranges::begin(in), std::ranges::end(in), std::ranges::begin(out));
165
3.16k
   } else if(ranges::size_bytes(out) > 0) {
166
3.16k
      std::memmove(std::ranges::data(out), std::ranges::data(in), ranges::size_bytes(out));
167
3.16k
   }
168
3.16k
}
_ZN5Botan8copy_memITkNS_6ranges23contiguous_output_rangeENSt3__14spanIhLm66EEETkNS1_16contiguous_rangeENS3_IKhLm66EEEQaasr3stdE9is_same_vINS2_11conditionalIXsr21__is_primary_templateINS2_15iterator_traitsIu14__remove_cvrefIDTclL_ZNS2_6ranges5__cpo5beginEEclsr3stdE7declvalIRT_EEEEEEEEE5valueENS2_26indirectly_readable_traitsISE_EESF_E4type10value_typeENS7_IXsr21__is_primary_templateINS8_Iu14__remove_cvrefIDTclL_ZNSA_5beginEEclsr3stdE7declvalIRT0_EEEEEEEEE5valueENSG_ISO_EESP_E4type10value_typeEEsr3stdE23is_trivially_copyable_vIST_EEEvOSB_RKSL_
Line
Count
Source
161
14
inline constexpr void copy_mem(OutR&& out /* NOLINT(*-std-forward) */, const InR& in) {
162
14
   ranges::assert_equal_byte_lengths(out, in);
163
14
   if(std::is_constant_evaluated()) {
164
0
      std::copy(std::ranges::begin(in), std::ranges::end(in), std::ranges::begin(out));
165
14
   } else if(ranges::size_bytes(out) > 0) {
166
14
      std::memmove(std::ranges::data(out), std::ranges::data(in), ranges::size_bytes(out));
167
14
   }
168
14
}
Unexecuted instantiation: _ZN5Botan8copy_memITkNS_6ranges23contiguous_output_rangeENSt3__14spanIhLm98EEETkNS1_16contiguous_rangeENS3_IKhLm98EEEQaasr3stdE9is_same_vINS2_11conditionalIXsr21__is_primary_templateINS2_15iterator_traitsIu14__remove_cvrefIDTclL_ZNS2_6ranges5__cpo5beginEEclsr3stdE7declvalIRT_EEEEEEEEE5valueENS2_26indirectly_readable_traitsISE_EESF_E4type10value_typeENS7_IXsr21__is_primary_templateINS8_Iu14__remove_cvrefIDTclL_ZNSA_5beginEEclsr3stdE7declvalIRT0_EEEEEEEEE5valueENSG_ISO_EESP_E4type10value_typeEEsr3stdE23is_trivially_copyable_vIST_EEEvOSB_RKSL_
Unexecuted instantiation: _ZN5Botan8copy_memITkNS_6ranges23contiguous_output_rangeERNSt3__15arrayImLm9EEETkNS1_16contiguous_rangeENS2_4spanImLm9EEEQaasr3stdE9is_same_vINS2_11conditionalIXsr21__is_primary_templateINS2_15iterator_traitsIu14__remove_cvrefIDTclL_ZNS2_6ranges5__cpo5beginEEclsr3stdE7declvalIRT_EEEEEEEEE5valueENS2_26indirectly_readable_traitsISF_EESG_E4type10value_typeENS8_IXsr21__is_primary_templateINS9_Iu14__remove_cvrefIDTclL_ZNSB_5beginEEclsr3stdE7declvalIRT0_EEEEEEEEE5valueENSH_ISP_EESQ_E4type10value_typeEEsr3stdE23is_trivially_copyable_vISU_EEEvOSC_RKSM_
169
170
/**
171
 * Copy a range of a trivially copyable type into another range of trivially
172
 * copyable type of matching byte length.
173
 */
174
template <ranges::contiguous_output_range ToR, ranges::contiguous_range FromR>
175
   requires std::is_trivially_copyable_v<std::ranges::range_value_t<FromR>> &&
176
            std::is_trivially_copyable_v<std::ranges::range_value_t<ToR>>
177
3.22M
inline constexpr void typecast_copy(ToR&& out /* NOLINT(*-std-forward) */, const FromR& in) {
178
3.22M
   ranges::assert_equal_byte_lengths(out, in);
179
3.22M
   std::memcpy(std::ranges::data(out), std::ranges::data(in), ranges::size_bytes(out));
180
3.22M
}
Unexecuted instantiation: _ZN5Botan13typecast_copyITkNS_6ranges23contiguous_output_rangeERNSt3__15arrayImLm4EEETkNS1_16contiguous_rangeENS2_4spanIhLm32EEEQaasr3stdE23is_trivially_copyable_vINS2_11conditionalIXsr21__is_primary_templateINS2_15iterator_traitsIu14__remove_cvrefIDTclL_ZNS2_6ranges5__cpo5beginEEclsr3stdE7declvalIRT0_EEEEEEEEE5valueENS2_26indirectly_readable_traitsISF_EESG_E4type10value_typeEEsr3stdE23is_trivially_copyable_vINS8_IXsr21__is_primary_templateINS9_Iu14__remove_cvrefIDTclL_ZNSB_5beginEEclsr3stdE7declvalIRT_EEEEEEEEE5valueENSH_ISP_EESQ_E4type10value_typeEEEEvOSM_RKSC_
_ZN5Botan13typecast_copyITkNS_6ranges23contiguous_output_rangeERNSt3__15arrayImLm4EEETkNS1_16contiguous_rangeENS2_4spanIKhLm32EEEQaasr3stdE23is_trivially_copyable_vINS2_11conditionalIXsr21__is_primary_templateINS2_15iterator_traitsIu14__remove_cvrefIDTclL_ZNS2_6ranges5__cpo5beginEEclsr3stdE7declvalIRT0_EEEEEEEEE5valueENS2_26indirectly_readable_traitsISG_EESH_E4type10value_typeEEsr3stdE23is_trivially_copyable_vINS9_IXsr21__is_primary_templateINSA_Iu14__remove_cvrefIDTclL_ZNSC_5beginEEclsr3stdE7declvalIRT_EEEEEEEEE5valueENSI_ISQ_EESR_E4type10value_typeEEEEvOSN_RKSD_
Line
Count
Source
177
141k
inline constexpr void typecast_copy(ToR&& out /* NOLINT(*-std-forward) */, const FromR& in) {
178
141k
   ranges::assert_equal_byte_lengths(out, in);
179
141k
   std::memcpy(std::ranges::data(out), std::ranges::data(in), ranges::size_bytes(out));
180
141k
}
_ZN5Botan13typecast_copyITkNS_6ranges23contiguous_output_rangeENSt3__14spanIhLm32EEETkNS1_16contiguous_rangeENS2_5arrayImLm4EEEQaasr3stdE23is_trivially_copyable_vINS2_11conditionalIXsr21__is_primary_templateINS2_15iterator_traitsIu14__remove_cvrefIDTclL_ZNS2_6ranges5__cpo5beginEEclsr3stdE7declvalIRT0_EEEEEEEEE5valueENS2_26indirectly_readable_traitsISE_EESF_E4type10value_typeEEsr3stdE23is_trivially_copyable_vINS7_IXsr21__is_primary_templateINS8_Iu14__remove_cvrefIDTclL_ZNSA_5beginEEclsr3stdE7declvalIRT_EEEEEEEEE5valueENSG_ISO_EESP_E4type10value_typeEEEEvOSL_RKSB_
Line
Count
Source
177
70.8k
inline constexpr void typecast_copy(ToR&& out /* NOLINT(*-std-forward) */, const FromR& in) {
178
70.8k
   ranges::assert_equal_byte_lengths(out, in);
179
70.8k
   std::memcpy(std::ranges::data(out), std::ranges::data(in), ranges::size_bytes(out));
180
70.8k
}
_ZN5Botan13typecast_copyITkNS_6ranges23contiguous_output_rangeERNSt3__14spanImLm18446744073709551615EEETkNS1_16contiguous_rangeENS3_IKhLm18446744073709551615EEEQaasr3stdE23is_trivially_copyable_vINS2_11conditionalIXsr21__is_primary_templateINS2_15iterator_traitsIu14__remove_cvrefIDTclL_ZNS2_6ranges5__cpo5beginEEclsr3stdE7declvalIRT0_EEEEEEEEE5valueENS2_26indirectly_readable_traitsISF_EESG_E4type10value_typeEEsr3stdE23is_trivially_copyable_vINS8_IXsr21__is_primary_templateINS9_Iu14__remove_cvrefIDTclL_ZNSB_5beginEEclsr3stdE7declvalIRT_EEEEEEEEE5valueENSH_ISP_EESQ_E4type10value_typeEEEEvOSM_RKSC_
Line
Count
Source
177
4.60k
inline constexpr void typecast_copy(ToR&& out /* NOLINT(*-std-forward) */, const FromR& in) {
178
4.60k
   ranges::assert_equal_byte_lengths(out, in);
179
4.60k
   std::memcpy(std::ranges::data(out), std::ranges::data(in), ranges::size_bytes(out));
180
4.60k
}
Unexecuted instantiation: _ZN5Botan13typecast_copyITkNS_6ranges23contiguous_output_rangeERNSt3__14spanIhLm18446744073709551615EEETkNS1_16contiguous_rangeENS3_IKmLm18446744073709551615EEEQaasr3stdE23is_trivially_copyable_vINS2_11conditionalIXsr21__is_primary_templateINS2_15iterator_traitsIu14__remove_cvrefIDTclL_ZNS2_6ranges5__cpo5beginEEclsr3stdE7declvalIRT0_EEEEEEEEE5valueENS2_26indirectly_readable_traitsISF_EESG_E4type10value_typeEEsr3stdE23is_trivially_copyable_vINS8_IXsr21__is_primary_templateINS9_Iu14__remove_cvrefIDTclL_ZNSB_5beginEEclsr3stdE7declvalIRT_EEEEEEEEE5valueENSH_ISP_EESQ_E4type10value_typeEEEEvOSM_RKSC_
_ZN5Botan13typecast_copyITkNS_6ranges23contiguous_output_rangeENSt3__14spanImLm1EEETkNS1_16contiguous_rangeENS3_IKhLm8EEEQaasr3stdE23is_trivially_copyable_vINS2_11conditionalIXsr21__is_primary_templateINS2_15iterator_traitsIu14__remove_cvrefIDTclL_ZNS2_6ranges5__cpo5beginEEclsr3stdE7declvalIRT0_EEEEEEEEE5valueENS2_26indirectly_readable_traitsISE_EESF_E4type10value_typeEEsr3stdE23is_trivially_copyable_vINS7_IXsr21__is_primary_templateINS8_Iu14__remove_cvrefIDTclL_ZNSA_5beginEEclsr3stdE7declvalIRT_EEEEEEEEE5valueENSG_ISO_EESP_E4type10value_typeEEEEvOSL_RKSB_
Line
Count
Source
177
1.40M
inline constexpr void typecast_copy(ToR&& out /* NOLINT(*-std-forward) */, const FromR& in) {
178
1.40M
   ranges::assert_equal_byte_lengths(out, in);
179
1.40M
   std::memcpy(std::ranges::data(out), std::ranges::data(in), ranges::size_bytes(out));
180
1.40M
}
_ZN5Botan13typecast_copyITkNS_6ranges23contiguous_output_rangeERNSt3__14spanIhLm8EEETkNS1_16contiguous_rangeENS3_IKmLm1EEEQaasr3stdE23is_trivially_copyable_vINS2_11conditionalIXsr21__is_primary_templateINS2_15iterator_traitsIu14__remove_cvrefIDTclL_ZNS2_6ranges5__cpo5beginEEclsr3stdE7declvalIRT0_EEEEEEEEE5valueENS2_26indirectly_readable_traitsISF_EESG_E4type10value_typeEEsr3stdE23is_trivially_copyable_vINS8_IXsr21__is_primary_templateINS9_Iu14__remove_cvrefIDTclL_ZNSB_5beginEEclsr3stdE7declvalIRT_EEEEEEEEE5valueENSH_ISP_EESQ_E4type10value_typeEEEEvOSM_RKSC_
Line
Count
Source
177
821k
inline constexpr void typecast_copy(ToR&& out /* NOLINT(*-std-forward) */, const FromR& in) {
178
821k
   ranges::assert_equal_byte_lengths(out, in);
179
821k
   std::memcpy(std::ranges::data(out), std::ranges::data(in), ranges::size_bytes(out));
180
821k
}
Unexecuted instantiation: _ZN5Botan13typecast_copyITkNS_6ranges23contiguous_output_rangeERNSt3__15arrayIjLm16EEETkNS1_16contiguous_rangeENS2_4spanIKhLm18446744073709551615EEEQaasr3stdE23is_trivially_copyable_vINS2_11conditionalIXsr21__is_primary_templateINS2_15iterator_traitsIu14__remove_cvrefIDTclL_ZNS2_6ranges5__cpo5beginEEclsr3stdE7declvalIRT0_EEEEEEEEE5valueENS2_26indirectly_readable_traitsISG_EESH_E4type10value_typeEEsr3stdE23is_trivially_copyable_vINS9_IXsr21__is_primary_templateINSA_Iu14__remove_cvrefIDTclL_ZNSC_5beginEEclsr3stdE7declvalIRT_EEEEEEEEE5valueENSI_ISQ_EESR_E4type10value_typeEEEEvOSN_RKSD_
_ZN5Botan13typecast_copyITkNS_6ranges23contiguous_output_rangeERNSt3__14spanIhLm18446744073709551615EEETkNS1_16contiguous_rangeENS3_IKjLm18446744073709551615EEEQaasr3stdE23is_trivially_copyable_vINS2_11conditionalIXsr21__is_primary_templateINS2_15iterator_traitsIu14__remove_cvrefIDTclL_ZNS2_6ranges5__cpo5beginEEclsr3stdE7declvalIRT0_EEEEEEEEE5valueENS2_26indirectly_readable_traitsISF_EESG_E4type10value_typeEEsr3stdE23is_trivially_copyable_vINS8_IXsr21__is_primary_templateINS9_Iu14__remove_cvrefIDTclL_ZNSB_5beginEEclsr3stdE7declvalIRT_EEEEEEEEE5valueENSH_ISP_EESQ_E4type10value_typeEEEEvOSM_RKSC_
Line
Count
Source
177
7.64k
inline constexpr void typecast_copy(ToR&& out /* NOLINT(*-std-forward) */, const FromR& in) {
178
7.64k
   ranges::assert_equal_byte_lengths(out, in);
179
7.64k
   std::memcpy(std::ranges::data(out), std::ranges::data(in), ranges::size_bytes(out));
180
7.64k
}
_ZN5Botan13typecast_copyITkNS_6ranges23contiguous_output_rangeENSt3__14spanIjLm1EEETkNS1_16contiguous_rangeENS3_IKhLm4EEEQaasr3stdE23is_trivially_copyable_vINS2_11conditionalIXsr21__is_primary_templateINS2_15iterator_traitsIu14__remove_cvrefIDTclL_ZNS2_6ranges5__cpo5beginEEclsr3stdE7declvalIRT0_EEEEEEEEE5valueENS2_26indirectly_readable_traitsISE_EESF_E4type10value_typeEEsr3stdE23is_trivially_copyable_vINS7_IXsr21__is_primary_templateINS8_Iu14__remove_cvrefIDTclL_ZNSA_5beginEEclsr3stdE7declvalIRT_EEEEEEEEE5valueENSG_ISO_EESP_E4type10value_typeEEEEvOSL_RKSB_
Line
Count
Source
177
14.7k
inline constexpr void typecast_copy(ToR&& out /* NOLINT(*-std-forward) */, const FromR& in) {
178
14.7k
   ranges::assert_equal_byte_lengths(out, in);
179
14.7k
   std::memcpy(std::ranges::data(out), std::ranges::data(in), ranges::size_bytes(out));
180
14.7k
}
_ZN5Botan13typecast_copyITkNS_6ranges23contiguous_output_rangeERNSt3__14spanIhLm4EEETkNS1_16contiguous_rangeENS3_IKjLm1EEEQaasr3stdE23is_trivially_copyable_vINS2_11conditionalIXsr21__is_primary_templateINS2_15iterator_traitsIu14__remove_cvrefIDTclL_ZNS2_6ranges5__cpo5beginEEclsr3stdE7declvalIRT0_EEEEEEEEE5valueENS2_26indirectly_readable_traitsISF_EESG_E4type10value_typeEEsr3stdE23is_trivially_copyable_vINS8_IXsr21__is_primary_templateINS9_Iu14__remove_cvrefIDTclL_ZNSB_5beginEEclsr3stdE7declvalIRT_EEEEEEEEE5valueENSH_ISP_EESQ_E4type10value_typeEEEEvOSM_RKSC_
Line
Count
Source
177
452k
inline constexpr void typecast_copy(ToR&& out /* NOLINT(*-std-forward) */, const FromR& in) {
178
452k
   ranges::assert_equal_byte_lengths(out, in);
179
452k
   std::memcpy(std::ranges::data(out), std::ranges::data(in), ranges::size_bytes(out));
180
452k
}
Unexecuted instantiation: _ZN5Botan13typecast_copyITkNS_6ranges23contiguous_output_rangeERNSt3__14spanIhLm2EEETkNS1_16contiguous_rangeENS3_IKtLm1EEEQaasr3stdE23is_trivially_copyable_vINS2_11conditionalIXsr21__is_primary_templateINS2_15iterator_traitsIu14__remove_cvrefIDTclL_ZNS2_6ranges5__cpo5beginEEclsr3stdE7declvalIRT0_EEEEEEEEE5valueENS2_26indirectly_readable_traitsISF_EESG_E4type10value_typeEEsr3stdE23is_trivially_copyable_vINS8_IXsr21__is_primary_templateINS9_Iu14__remove_cvrefIDTclL_ZNSB_5beginEEclsr3stdE7declvalIRT_EEEEEEEEE5valueENSH_ISP_EESQ_E4type10value_typeEEEEvOSM_RKSC_
_ZN5Botan13typecast_copyITkNS_6ranges23contiguous_output_rangeERNSt3__14spanIjLm18446744073709551615EEETkNS1_16contiguous_rangeENS3_IKhLm18446744073709551615EEEQaasr3stdE23is_trivially_copyable_vINS2_11conditionalIXsr21__is_primary_templateINS2_15iterator_traitsIu14__remove_cvrefIDTclL_ZNS2_6ranges5__cpo5beginEEclsr3stdE7declvalIRT0_EEEEEEEEE5valueENS2_26indirectly_readable_traitsISF_EESG_E4type10value_typeEEsr3stdE23is_trivially_copyable_vINS8_IXsr21__is_primary_templateINS9_Iu14__remove_cvrefIDTclL_ZNSB_5beginEEclsr3stdE7declvalIRT_EEEEEEEEE5valueENSH_ISP_EESQ_E4type10value_typeEEEEvOSM_RKSC_
Line
Count
Source
177
526
inline constexpr void typecast_copy(ToR&& out /* NOLINT(*-std-forward) */, const FromR& in) {
178
526
   ranges::assert_equal_byte_lengths(out, in);
179
526
   std::memcpy(std::ranges::data(out), std::ranges::data(in), ranges::size_bytes(out));
180
526
}
_ZN5Botan13typecast_copyITkNS_6ranges23contiguous_output_rangeERNSt3__15arrayIjLm16EEETkNS1_16contiguous_rangeENS2_4spanIKhLm64EEEQaasr3stdE23is_trivially_copyable_vINS2_11conditionalIXsr21__is_primary_templateINS2_15iterator_traitsIu14__remove_cvrefIDTclL_ZNS2_6ranges5__cpo5beginEEclsr3stdE7declvalIRT0_EEEEEEEEE5valueENS2_26indirectly_readable_traitsISG_EESH_E4type10value_typeEEsr3stdE23is_trivially_copyable_vINS9_IXsr21__is_primary_templateINSA_Iu14__remove_cvrefIDTclL_ZNSC_5beginEEclsr3stdE7declvalIRT_EEEEEEEEE5valueENSI_ISQ_EESR_E4type10value_typeEEEEvOSN_RKSD_
Line
Count
Source
177
190k
inline constexpr void typecast_copy(ToR&& out /* NOLINT(*-std-forward) */, const FromR& in) {
178
190k
   ranges::assert_equal_byte_lengths(out, in);
179
190k
   std::memcpy(std::ranges::data(out), std::ranges::data(in), ranges::size_bytes(out));
180
190k
}
_ZN5Botan13typecast_copyITkNS_6ranges23contiguous_output_rangeENSt3__14spanImLm1EEETkNS1_16contiguous_rangeENS3_IhLm8EEEQaasr3stdE23is_trivially_copyable_vINS2_11conditionalIXsr21__is_primary_templateINS2_15iterator_traitsIu14__remove_cvrefIDTclL_ZNS2_6ranges5__cpo5beginEEclsr3stdE7declvalIRT0_EEEEEEEEE5valueENS2_26indirectly_readable_traitsISD_EESE_E4type10value_typeEEsr3stdE23is_trivially_copyable_vINS6_IXsr21__is_primary_templateINS7_Iu14__remove_cvrefIDTclL_ZNS9_5beginEEclsr3stdE7declvalIRT_EEEEEEEEE5valueENSF_ISN_EESO_E4type10value_typeEEEEvOSK_RKSA_
Line
Count
Source
177
27.2k
inline constexpr void typecast_copy(ToR&& out /* NOLINT(*-std-forward) */, const FromR& in) {
178
27.2k
   ranges::assert_equal_byte_lengths(out, in);
179
27.2k
   std::memcpy(std::ranges::data(out), std::ranges::data(in), ranges::size_bytes(out));
180
27.2k
}
Unexecuted instantiation: _ZN5Botan13typecast_copyITkNS_6ranges23contiguous_output_rangeERNSt3__15arrayImLm2EEETkNS1_16contiguous_rangeENS2_4spanIKhLm16EEEQaasr3stdE23is_trivially_copyable_vINS2_11conditionalIXsr21__is_primary_templateINS2_15iterator_traitsIu14__remove_cvrefIDTclL_ZNS2_6ranges5__cpo5beginEEclsr3stdE7declvalIRT0_EEEEEEEEE5valueENS2_26indirectly_readable_traitsISG_EESH_E4type10value_typeEEsr3stdE23is_trivially_copyable_vINS9_IXsr21__is_primary_templateINSA_Iu14__remove_cvrefIDTclL_ZNSC_5beginEEclsr3stdE7declvalIRT_EEEEEEEEE5valueENSI_ISQ_EESR_E4type10value_typeEEEEvOSN_RKSD_
Unexecuted instantiation: _ZN5Botan13typecast_copyITkNS_6ranges23contiguous_output_rangeERNSt3__15arrayIhLm16EEETkNS1_16contiguous_rangeENS2_4spanImLm2EEEQaasr3stdE23is_trivially_copyable_vINS2_11conditionalIXsr21__is_primary_templateINS2_15iterator_traitsIu14__remove_cvrefIDTclL_ZNS2_6ranges5__cpo5beginEEclsr3stdE7declvalIRT0_EEEEEEEEE5valueENS2_26indirectly_readable_traitsISF_EESG_E4type10value_typeEEsr3stdE23is_trivially_copyable_vINS8_IXsr21__is_primary_templateINS9_Iu14__remove_cvrefIDTclL_ZNSB_5beginEEclsr3stdE7declvalIRT_EEEEEEEEE5valueENSH_ISP_EESQ_E4type10value_typeEEEEvOSM_RKSC_
_ZN5Botan13typecast_copyITkNS_6ranges23contiguous_output_rangeERNSt3__15arrayIhLm8EEETkNS1_16contiguous_rangeENS3_ImLm1EEEQaasr3stdE23is_trivially_copyable_vINS2_11conditionalIXsr21__is_primary_templateINS2_15iterator_traitsIu14__remove_cvrefIDTclL_ZNS2_6ranges5__cpo5beginEEclsr3stdE7declvalIRT0_EEEEEEEEE5valueENS2_26indirectly_readable_traitsISE_EESF_E4type10value_typeEEsr3stdE23is_trivially_copyable_vINS7_IXsr21__is_primary_templateINS8_Iu14__remove_cvrefIDTclL_ZNSA_5beginEEclsr3stdE7declvalIRT_EEEEEEEEE5valueENSG_ISO_EESP_E4type10value_typeEEEEvOSL_RKSB_
Line
Count
Source
177
87.1k
inline constexpr void typecast_copy(ToR&& out /* NOLINT(*-std-forward) */, const FromR& in) {
178
87.1k
   ranges::assert_equal_byte_lengths(out, in);
179
87.1k
   std::memcpy(std::ranges::data(out), std::ranges::data(in), ranges::size_bytes(out));
180
87.1k
}
Unexecuted instantiation: _ZN5Botan13typecast_copyITkNS_6ranges23contiguous_output_rangeENSt3__14spanItLm1EEETkNS1_16contiguous_rangeENS3_IKhLm2EEEQaasr3stdE23is_trivially_copyable_vINS2_11conditionalIXsr21__is_primary_templateINS2_15iterator_traitsIu14__remove_cvrefIDTclL_ZNS2_6ranges5__cpo5beginEEclsr3stdE7declvalIRT0_EEEEEEEEE5valueENS2_26indirectly_readable_traitsISE_EESF_E4type10value_typeEEsr3stdE23is_trivially_copyable_vINS7_IXsr21__is_primary_templateINS8_Iu14__remove_cvrefIDTclL_ZNSA_5beginEEclsr3stdE7declvalIRT_EEEEEEEEE5valueENSG_ISO_EESP_E4type10value_typeEEEEvOSL_RKSB_
181
182
/**
183
 * Copy a range of trivially copyable type into an instance of trivially
184
 * copyable type with matching length.
185
 */
186
template <typename ToT, ranges::contiguous_range FromR>
187
   requires std::is_trivially_copyable_v<std::ranges::range_value_t<FromR>> && std::is_trivially_copyable_v<ToT> &&
188
            (!std::ranges::range<ToT>)
189
1.45M
inline constexpr void typecast_copy(ToT& out, const FromR& in) {
190
1.45M
   typecast_copy(std::span<ToT, 1>(&out, 1), in);
191
1.45M
}
_ZN5Botan13typecast_copyImTkNS_6ranges16contiguous_rangeENSt3__14spanIKhLm8EEEQaaaasr3stdE23is_trivially_copyable_vINS2_11conditionalIXsr21__is_primary_templateINS2_15iterator_traitsIu14__remove_cvrefIDTclL_ZNS2_6ranges5__cpo5beginEEclsr3stdE7declvalIRT0_EEEEEEEEE5valueENS2_26indirectly_readable_traitsISD_EESE_E4type10value_typeEEsr3stdE23is_trivially_copyable_vIT_Entsr3std6rangesE5rangeISK_EEEvRSK_RKSA_
Line
Count
Source
189
1.40M
inline constexpr void typecast_copy(ToT& out, const FromR& in) {
190
1.40M
   typecast_copy(std::span<ToT, 1>(&out, 1), in);
191
1.40M
}
_ZN5Botan13typecast_copyIjTkNS_6ranges16contiguous_rangeENSt3__14spanIKhLm4EEEQaaaasr3stdE23is_trivially_copyable_vINS2_11conditionalIXsr21__is_primary_templateINS2_15iterator_traitsIu14__remove_cvrefIDTclL_ZNS2_6ranges5__cpo5beginEEclsr3stdE7declvalIRT0_EEEEEEEEE5valueENS2_26indirectly_readable_traitsISD_EESE_E4type10value_typeEEsr3stdE23is_trivially_copyable_vIT_Entsr3std6rangesE5rangeISK_EEEvRSK_RKSA_
Line
Count
Source
189
14.7k
inline constexpr void typecast_copy(ToT& out, const FromR& in) {
190
14.7k
   typecast_copy(std::span<ToT, 1>(&out, 1), in);
191
14.7k
}
_ZN5Botan13typecast_copyImTkNS_6ranges16contiguous_rangeENSt3__14spanIhLm8EEEQaaaasr3stdE23is_trivially_copyable_vINS2_11conditionalIXsr21__is_primary_templateINS2_15iterator_traitsIu14__remove_cvrefIDTclL_ZNS2_6ranges5__cpo5beginEEclsr3stdE7declvalIRT0_EEEEEEEEE5valueENS2_26indirectly_readable_traitsISC_EESD_E4type10value_typeEEsr3stdE23is_trivially_copyable_vIT_Entsr3std6rangesE5rangeISJ_EEEvRSJ_RKS9_
Line
Count
Source
189
27.2k
inline constexpr void typecast_copy(ToT& out, const FromR& in) {
190
27.2k
   typecast_copy(std::span<ToT, 1>(&out, 1), in);
191
27.2k
}
Unexecuted instantiation: _ZN5Botan13typecast_copyItTkNS_6ranges16contiguous_rangeENSt3__14spanIKhLm2EEEQaaaasr3stdE23is_trivially_copyable_vINS2_11conditionalIXsr21__is_primary_templateINS2_15iterator_traitsIu14__remove_cvrefIDTclL_ZNS2_6ranges5__cpo5beginEEclsr3stdE7declvalIRT0_EEEEEEEEE5valueENS2_26indirectly_readable_traitsISD_EESE_E4type10value_typeEEsr3stdE23is_trivially_copyable_vIT_Entsr3std6rangesE5rangeISK_EEEvRSK_RKSA_
192
193
/**
194
 * Copy an instance of trivially copyable type into a range of trivially
195
 * copyable type with matching length.
196
 */
197
template <ranges::contiguous_output_range ToR, typename FromT>
198
   requires std::is_trivially_copyable_v<FromT> &&
199
            (!std::ranges::range<FromT>) && std::is_trivially_copyable_v<std::ranges::range_value_t<ToR>>
200
1.27M
inline constexpr void typecast_copy(ToR&& out /* NOLINT(*-std-forward) */, const FromT& in) {
201
1.27M
   typecast_copy(out, std::span<const FromT, 1>(&in, 1));
202
1.27M
}
_ZN5Botan13typecast_copyITkNS_6ranges23contiguous_output_rangeERNSt3__14spanIhLm8EEEmQaaaasr3stdE23is_trivially_copyable_vIT0_Entsr3std6rangesE5rangeIS6_Esr3stdE23is_trivially_copyable_vINS2_11conditionalIXsr21__is_primary_templateINS2_15iterator_traitsIu14__remove_cvrefIDTclL_ZNS2_6ranges5__cpo5beginEEclsr3stdE7declvalIRT_EEEEEEEEE5valueENS2_26indirectly_readable_traitsISE_EESF_E4type10value_typeEEEEvOSB_RKS6_
Line
Count
Source
200
821k
inline constexpr void typecast_copy(ToR&& out /* NOLINT(*-std-forward) */, const FromT& in) {
201
821k
   typecast_copy(out, std::span<const FromT, 1>(&in, 1));
202
821k
}
_ZN5Botan13typecast_copyITkNS_6ranges23contiguous_output_rangeERNSt3__14spanIhLm4EEEjQaaaasr3stdE23is_trivially_copyable_vIT0_Entsr3std6rangesE5rangeIS6_Esr3stdE23is_trivially_copyable_vINS2_11conditionalIXsr21__is_primary_templateINS2_15iterator_traitsIu14__remove_cvrefIDTclL_ZNS2_6ranges5__cpo5beginEEclsr3stdE7declvalIRT_EEEEEEEEE5valueENS2_26indirectly_readable_traitsISE_EESF_E4type10value_typeEEEEvOSB_RKS6_
Line
Count
Source
200
452k
inline constexpr void typecast_copy(ToR&& out /* NOLINT(*-std-forward) */, const FromT& in) {
201
452k
   typecast_copy(out, std::span<const FromT, 1>(&in, 1));
202
452k
}
Unexecuted instantiation: _ZN5Botan13typecast_copyITkNS_6ranges23contiguous_output_rangeERNSt3__14spanIhLm2EEEtQaaaasr3stdE23is_trivially_copyable_vIT0_Entsr3std6rangesE5rangeIS6_Esr3stdE23is_trivially_copyable_vINS2_11conditionalIXsr21__is_primary_templateINS2_15iterator_traitsIu14__remove_cvrefIDTclL_ZNS2_6ranges5__cpo5beginEEclsr3stdE7declvalIRT_EEEEEEEEE5valueENS2_26indirectly_readable_traitsISE_EESF_E4type10value_typeEEEEvOSB_RKS6_
203
204
/**
205
 * Create a trivial type by bit-casting a range of trivially copyable type with
206
 * matching length into it.
207
 */
208
template <typename ToT, ranges::contiguous_range FromR>
209
   requires std::is_default_constructible_v<ToT> && std::is_trivially_copyable_v<ToT> &&
210
            std::is_trivially_copyable_v<std::ranges::range_value_t<FromR>>
211
1.59M
inline constexpr ToT typecast_copy(const FromR& src) {
212
1.59M
   ToT dst;  // NOLINT(*-member-init)
213
1.59M
   typecast_copy(dst, src);
214
1.59M
   return dst;
215
1.59M
}
Unexecuted instantiation: _ZN5Botan13typecast_copyINSt3__15arrayImLm4EEETkNS_6ranges16contiguous_rangeENS1_4spanIhLm32EEEQaaaasr3stdE26is_default_constructible_vIT_Esr3stdE23is_trivially_copyable_vIS7_Esr3stdE23is_trivially_copyable_vINS1_11conditionalIXsr21__is_primary_templateINS1_15iterator_traitsIu14__remove_cvrefIDTclL_ZNS1_6ranges5__cpo5beginEEclsr3stdE7declvalIRT0_EEEEEEEEE5valueENS1_26indirectly_readable_traitsISF_EESG_E4type10value_typeEEEES7_RKSC_
_ZN5Botan13typecast_copyINSt3__15arrayImLm4EEETkNS_6ranges16contiguous_rangeENS1_4spanIKhLm32EEEQaaaasr3stdE26is_default_constructible_vIT_Esr3stdE23is_trivially_copyable_vIS8_Esr3stdE23is_trivially_copyable_vINS1_11conditionalIXsr21__is_primary_templateINS1_15iterator_traitsIu14__remove_cvrefIDTclL_ZNS1_6ranges5__cpo5beginEEclsr3stdE7declvalIRT0_EEEEEEEEE5valueENS1_26indirectly_readable_traitsISG_EESH_E4type10value_typeEEEES8_RKSD_
Line
Count
Source
211
141k
inline constexpr ToT typecast_copy(const FromR& src) {
212
141k
   ToT dst;  // NOLINT(*-member-init)
213
141k
   typecast_copy(dst, src);
214
141k
   return dst;
215
141k
}
_ZN5Botan13typecast_copyImTkNS_6ranges16contiguous_rangeENSt3__14spanIKhLm8EEEQaaaasr3stdE26is_default_constructible_vIT_Esr3stdE23is_trivially_copyable_vIS6_Esr3stdE23is_trivially_copyable_vINS2_11conditionalIXsr21__is_primary_templateINS2_15iterator_traitsIu14__remove_cvrefIDTclL_ZNS2_6ranges5__cpo5beginEEclsr3stdE7declvalIRT0_EEEEEEEEE5valueENS2_26indirectly_readable_traitsISE_EESF_E4type10value_typeEEEES6_RKSB_
Line
Count
Source
211
1.40M
inline constexpr ToT typecast_copy(const FromR& src) {
212
1.40M
   ToT dst;  // NOLINT(*-member-init)
213
1.40M
   typecast_copy(dst, src);
214
1.40M
   return dst;
215
1.40M
}
_ZN5Botan13typecast_copyIjTkNS_6ranges16contiguous_rangeENSt3__14spanIKhLm4EEEQaaaasr3stdE26is_default_constructible_vIT_Esr3stdE23is_trivially_copyable_vIS6_Esr3stdE23is_trivially_copyable_vINS2_11conditionalIXsr21__is_primary_templateINS2_15iterator_traitsIu14__remove_cvrefIDTclL_ZNS2_6ranges5__cpo5beginEEclsr3stdE7declvalIRT0_EEEEEEEEE5valueENS2_26indirectly_readable_traitsISE_EESF_E4type10value_typeEEEES6_RKSB_
Line
Count
Source
211
14.7k
inline constexpr ToT typecast_copy(const FromR& src) {
212
14.7k
   ToT dst;  // NOLINT(*-member-init)
213
14.7k
   typecast_copy(dst, src);
214
14.7k
   return dst;
215
14.7k
}
_ZN5Botan13typecast_copyImTkNS_6ranges16contiguous_rangeENSt3__14spanIhLm8EEEQaaaasr3stdE26is_default_constructible_vIT_Esr3stdE23is_trivially_copyable_vIS5_Esr3stdE23is_trivially_copyable_vINS2_11conditionalIXsr21__is_primary_templateINS2_15iterator_traitsIu14__remove_cvrefIDTclL_ZNS2_6ranges5__cpo5beginEEclsr3stdE7declvalIRT0_EEEEEEEEE5valueENS2_26indirectly_readable_traitsISD_EESE_E4type10value_typeEEEES5_RKSA_
Line
Count
Source
211
27.2k
inline constexpr ToT typecast_copy(const FromR& src) {
212
27.2k
   ToT dst;  // NOLINT(*-member-init)
213
27.2k
   typecast_copy(dst, src);
214
27.2k
   return dst;
215
27.2k
}
Unexecuted instantiation: _ZN5Botan13typecast_copyItTkNS_6ranges16contiguous_rangeENSt3__14spanIKhLm2EEEQaaaasr3stdE26is_default_constructible_vIT_Esr3stdE23is_trivially_copyable_vIS6_Esr3stdE23is_trivially_copyable_vINS2_11conditionalIXsr21__is_primary_templateINS2_15iterator_traitsIu14__remove_cvrefIDTclL_ZNS2_6ranges5__cpo5beginEEclsr3stdE7declvalIRT0_EEEEEEEEE5valueENS2_26indirectly_readable_traitsISE_EESF_E4type10value_typeEEEES6_RKSB_
216
217
// TODO: deprecate and replace
218
template <typename T>
219
inline constexpr void typecast_copy(uint8_t out[], T in[], size_t N)
220
   requires std::is_trivially_copyable_v<T>
221
{
222
   // asserts that *in and *out point to the correct amount of memory
223
   typecast_copy(std::span<uint8_t>(out, sizeof(T) * N), std::span<const T>(in, N));
224
}
225
226
// TODO: deprecate and replace
227
template <typename T>
228
inline constexpr void typecast_copy(T out[], const uint8_t in[], size_t N)
229
   requires std::is_trivial_v<T>
230
{
231
   // asserts that *in and *out point to the correct amount of memory
232
   typecast_copy(std::span<T>(out, N), std::span<const uint8_t>(in, N * sizeof(T)));
233
}
234
235
// TODO: deprecate and replace
236
template <typename T>
237
inline constexpr void typecast_copy(uint8_t out[], const T& in) {
238
   // asserts that *out points to the correct amount of memory
239
   typecast_copy(std::span<uint8_t, sizeof(T)>(out, sizeof(T)), in);
240
}
241
242
// TODO: deprecate and replace
243
template <typename T>
244
   requires std::is_trivial_v<std::decay_t<T>>
245
inline constexpr void typecast_copy(T& out, const uint8_t in[]) {
246
   // asserts that *in points to the correct amount of memory
247
   typecast_copy(out, std::span<const uint8_t, sizeof(T)>(in, sizeof(T)));
248
}
249
250
// TODO: deprecate and replace
251
template <typename To>
252
   requires std::is_trivial_v<To>
253
inline constexpr To typecast_copy(const uint8_t src[]) noexcept {
254
   // asserts that *src points to the correct amount of memory
255
   return typecast_copy<To>(std::span<const uint8_t, sizeof(To)>(src, sizeof(To)));
256
}
257
258
#if !defined(BOTAN_IS_BEING_BUILT)
259
/**
260
* Set memory to a fixed value
261
* @param ptr a pointer to an array of bytes
262
* @param n the number of Ts pointed to by ptr
263
* @param val the value to set each byte to
264
*/
265
BOTAN_DEPRECATED("This function is deprecated") inline constexpr void set_mem(uint8_t* ptr, size_t n, uint8_t val) {
266
   if(n > 0) {
267
      std::memset(ptr, val, n);
268
   }
269
}
270
#endif
271
272
#if !defined(BOTAN_IS_BEING_BUILT)
273
inline const uint8_t* cast_char_ptr_to_uint8(const char* s) {
274
   return reinterpret_cast<const uint8_t*>(s);
275
}
276
277
inline uint8_t* cast_char_ptr_to_uint8(char* s) {
278
   return reinterpret_cast<uint8_t*>(s);
279
}
280
#endif
281
282
152
inline const char* cast_uint8_ptr_to_char(const uint8_t* b) {
283
152
   return reinterpret_cast<const char*>(b);
284
152
}
285
286
0
inline char* cast_uint8_ptr_to_char(uint8_t* b) {
287
0
   return reinterpret_cast<char*>(b);
288
0
}
289
290
#if !defined(BOTAN_IS_BEING_BUILT)
291
/**
292
* Memory comparison, input insensitive
293
* @param p1 a pointer to an array
294
* @param p2 a pointer to another array
295
* @param n the number of Ts in p1 and p2
296
* @return true iff p1[i] == p2[i] forall i in [0...n)
297
*/
298
template <typename T>
299
BOTAN_DEPRECATED("This function is deprecated")
300
inline bool same_mem(const T* p1, const T* p2, size_t n) {
301
   volatile T difference = 0;
302
303
   for(size_t i = 0; i != n; ++i) {
304
      difference = difference | (p1[i] ^ p2[i]);
305
   }
306
307
   return difference == 0;
308
}
309
#endif
310
311
#if !defined(BOTAN_IS_BEING_BUILT)
312
313
template <typename T, typename Alloc>
314
BOTAN_DEPRECATED("The buffer_insert functions are deprecated")
315
size_t buffer_insert(std::vector<T, Alloc>& buf, size_t buf_offset, const T input[], size_t input_length) {
316
   BOTAN_ASSERT_NOMSG(buf_offset <= buf.size());
317
   const size_t to_copy = std::min(input_length, buf.size() - buf_offset);
318
   if(to_copy > 0) {
319
      copy_mem(&buf[buf_offset], input, to_copy);
320
   }
321
   return to_copy;
322
}
323
324
template <typename T, typename Alloc, typename Alloc2>
325
BOTAN_DEPRECATED("The buffer_insert functions are deprecated")
326
size_t buffer_insert(std::vector<T, Alloc>& buf, size_t buf_offset, const std::vector<T, Alloc2>& input) {
327
   BOTAN_ASSERT_NOMSG(buf_offset <= buf.size());
328
   const size_t to_copy = std::min(input.size(), buf.size() - buf_offset);
329
   if(to_copy > 0) {
330
      copy_mem(&buf[buf_offset], input.data(), to_copy);
331
   }
332
   return to_copy;
333
}
334
335
#endif
336
337
/**
338
* XOR arrays. Postcondition out[i] = in[i] ^ out[i] forall i = 0...length
339
* @param out the input/output range
340
* @param in the read-only input range
341
*/
342
inline constexpr void xor_buf(ranges::contiguous_output_range<uint8_t> auto&& out,
343
0
                              ranges::contiguous_range<uint8_t> auto&& in) {
344
0
   ranges::assert_equal_byte_lengths(out, in);
345
346
0
   std::span<uint8_t> o(out);
347
0
   std::span<const uint8_t> i(in);
348
349
0
   for(; o.size_bytes() >= 32; o = o.subspan(32), i = i.subspan(32)) {
350
0
      auto x = typecast_copy<std::array<uint64_t, 4>>(o.template first<32>());
351
0
      const auto y = typecast_copy<std::array<uint64_t, 4>>(i.template first<32>());
352
353
0
      x[0] ^= y[0];
354
0
      x[1] ^= y[1];
355
0
      x[2] ^= y[2];
356
0
      x[3] ^= y[3];
357
358
0
      typecast_copy(o.template first<32>(), x);
359
0
   }
360
361
0
   for(size_t off = 0; off != o.size_bytes(); ++off) {
362
0
      o[off] ^= i[off];
363
0
   }
364
0
}
Unexecuted instantiation: _ZN5Botan7xor_bufITkNS_6ranges23contiguous_output_rangeIhEENSt3__14spanIhLm18446744073709551615EEETkNS1_16contiguous_rangeIhEENS4_IKhLm18446744073709551615EEEEEvOT_OT0_
Unexecuted instantiation: _ZN5Botan7xor_bufITkNS_6ranges23contiguous_output_rangeIhEENSt3__14spanIhLm18446744073709551615EEETkNS1_16contiguous_rangeIhEES5_EEvOT_OT0_
Unexecuted instantiation: _ZN5Botan7xor_bufITkNS_6ranges23contiguous_output_rangeIhEENSt3__14spanIhLm18446744073709551615EEETkNS1_16contiguous_rangeIhEERKNS3_6vectorIhNS_16secure_allocatorIhEEEEEEvOT_OT0_
365
366
/**
367
* XOR arrays. Postcondition out[i] = in1[i] ^ in2[i] forall i = 0...length
368
* @param out the output range
369
* @param in1 the first input range
370
* @param in2 the second input range
371
*/
372
inline constexpr void xor_buf(ranges::contiguous_output_range<uint8_t> auto&& out,
373
                              ranges::contiguous_range<uint8_t> auto&& in1,
374
34.6k
                              ranges::contiguous_range<uint8_t> auto&& in2) {
375
34.6k
   ranges::assert_equal_byte_lengths(out, in1, in2);
376
377
34.6k
   std::span o{out};
378
34.6k
   std::span i1{in1};
379
34.6k
   std::span i2{in2};
380
381
105k
   for(; o.size_bytes() >= 32; o = o.subspan(32), i1 = i1.subspan(32), i2 = i2.subspan(32)) {
382
70.8k
      auto x = typecast_copy<std::array<uint64_t, 4>>(i1.template first<32>());
383
70.8k
      const auto y = typecast_copy<std::array<uint64_t, 4>>(i2.template first<32>());
384
385
70.8k
      x[0] ^= y[0];
386
70.8k
      x[1] ^= y[1];
387
70.8k
      x[2] ^= y[2];
388
70.8k
      x[3] ^= y[3];
389
390
70.8k
      typecast_copy(o.template first<32>(), x);
391
70.8k
   }
392
393
93.9k
   for(size_t off = 0; off != o.size_bytes(); ++off) {
394
59.3k
      o[off] = i1[off] ^ i2[off];
395
59.3k
   }
396
34.6k
}
_ZN5Botan7xor_bufITkNS_6ranges23contiguous_output_rangeIhEENSt3__14spanIhLm18446744073709551615EEETkNS1_16contiguous_rangeIhEENS4_IKhLm18446744073709551615EEETkNS6_IhEES8_EEvOT_OT0_OT1_
Line
Count
Source
374
34.0k
                              ranges::contiguous_range<uint8_t> auto&& in2) {
375
34.0k
   ranges::assert_equal_byte_lengths(out, in1, in2);
376
377
34.0k
   std::span o{out};
378
34.0k
   std::span i1{in1};
379
34.0k
   std::span i2{in2};
380
381
104k
   for(; o.size_bytes() >= 32; o = o.subspan(32), i1 = i1.subspan(32), i2 = i2.subspan(32)) {
382
70.8k
      auto x = typecast_copy<std::array<uint64_t, 4>>(i1.template first<32>());
383
70.8k
      const auto y = typecast_copy<std::array<uint64_t, 4>>(i2.template first<32>());
384
385
70.8k
      x[0] ^= y[0];
386
70.8k
      x[1] ^= y[1];
387
70.8k
      x[2] ^= y[2];
388
70.8k
      x[3] ^= y[3];
389
390
70.8k
      typecast_copy(o.template first<32>(), x);
391
70.8k
   }
392
393
85.7k
   for(size_t off = 0; off != o.size_bytes(); ++off) {
394
51.6k
      o[off] = i1[off] ^ i2[off];
395
51.6k
   }
396
34.0k
}
_ZN5Botan7xor_bufITkNS_6ranges23contiguous_output_rangeIhEERNSt3__14spanIhLm18446744073709551615EEETkNS1_16contiguous_rangeIhEES5_TkNS7_IhEES5_EEvOT_OT0_OT1_
Line
Count
Source
374
603
                              ranges::contiguous_range<uint8_t> auto&& in2) {
375
603
   ranges::assert_equal_byte_lengths(out, in1, in2);
376
377
603
   std::span o{out};
378
603
   std::span i1{in1};
379
603
   std::span i2{in2};
380
381
603
   for(; o.size_bytes() >= 32; o = o.subspan(32), i1 = i1.subspan(32), i2 = i2.subspan(32)) {
382
0
      auto x = typecast_copy<std::array<uint64_t, 4>>(i1.template first<32>());
383
0
      const auto y = typecast_copy<std::array<uint64_t, 4>>(i2.template first<32>());
384
385
0
      x[0] ^= y[0];
386
0
      x[1] ^= y[1];
387
0
      x[2] ^= y[2];
388
0
      x[3] ^= y[3];
389
390
0
      typecast_copy(o.template first<32>(), x);
391
0
   }
392
393
8.22k
   for(size_t off = 0; off != o.size_bytes(); ++off) {
394
7.62k
      o[off] = i1[off] ^ i2[off];
395
7.62k
   }
396
603
}
397
398
/**
399
* XOR arrays. Postcondition out[i] = in[i] ^ out[i] forall i = 0...length
400
* @param out the input/output buffer
401
* @param in the read-only input buffer
402
* @param length the length of the buffers
403
*/
404
0
inline void xor_buf(uint8_t out[], const uint8_t in[], size_t length) {
405
   // simply assumes that *out and *in point to "length" allocated bytes at least
406
0
   xor_buf(std::span{out, length}, std::span{in, length});
407
0
}
408
409
/**
410
* XOR arrays. Postcondition out[i] = in[i] ^ in2[i] forall i = 0...length
411
* @param out the output buffer
412
* @param in the first input buffer
413
* @param in2 the second input buffer
414
* @param length the length of the three buffers
415
*/
416
34.0k
inline void xor_buf(uint8_t out[], const uint8_t in[], const uint8_t in2[], size_t length) {
417
   // simply assumes that *out, *in, and *in2 point to "length" allocated bytes at least
418
34.0k
   xor_buf(std::span{out, length}, std::span{in, length}, std::span{in2, length});
419
34.0k
}
420
421
// TODO: deprecate and replace, use .subspan()
422
0
inline void xor_buf(std::span<uint8_t> out, std::span<const uint8_t> in, size_t n) {
423
0
   BOTAN_ARG_CHECK(out.size() >= n, "output span is too small");
424
0
   BOTAN_ARG_CHECK(in.size() >= n, "input span is too small");
425
0
   xor_buf(out.first(n), in.first(n));
426
0
}
427
428
// TODO: deprecate and replace, use .subspan()
429
template <typename Alloc>
430
0
void xor_buf(std::vector<uint8_t, Alloc>& out, const uint8_t* in, size_t n) {
431
0
   BOTAN_ARG_CHECK(out.size() >= n, "output vector is too small");
432
   // simply assumes that *in points to "n" allocated bytes at least
433
0
   xor_buf(std::span{out}.first(n), std::span{in, n});
434
0
}
435
436
// TODO: deprecate and replace
437
template <typename Alloc, typename Alloc2>
438
void xor_buf(std::vector<uint8_t, Alloc>& out, const uint8_t* in, const std::vector<uint8_t, Alloc2>& in2, size_t n) {
439
   BOTAN_ARG_CHECK(out.size() >= n, "output vector is too small");
440
   BOTAN_ARG_CHECK(in2.size() >= n, "input vector is too small");
441
   // simply assumes that *in points to "n" allocated bytes at least
442
   xor_buf(std::span{out}.first(n), std::span{in, n}, std::span{in2}.first(n));
443
}
444
445
template <typename Alloc, typename Alloc2>
446
0
std::vector<uint8_t, Alloc>& operator^=(std::vector<uint8_t, Alloc>& out, const std::vector<uint8_t, Alloc2>& in) {
447
0
   if(out.size() < in.size()) {
448
0
      out.resize(in.size());
449
0
   }
450
451
0
   xor_buf(std::span{out}.first(in.size()), in);
452
0
   return out;
453
0
}
454
455
}  // namespace Botan
456
457
#endif