9#ifndef BOTAN_STL_UTIL_H_
10#define BOTAN_STL_UTIL_H_
20#include <botan/secmem.h>
26 return std::vector<uint8_t>(s.cbegin(), s.cend());
31 return std::string(bytes.cbegin(), bytes.cend());
37template<
typename K,
typename V>
51template<
typename K,
typename V>
69template<
typename K,
typename V>
72 const V& null_result = V())
74 auto i = mapping.find(key);
75 if(i == mapping.end())
80template<
typename K,
typename V,
typename R>
81inline R
search_map(
const std::map<K, V>& mapping,
const K& key,
82 const R& null_result,
const R& found_result)
84 auto i = mapping.find(key);
85 if(i == mapping.end())
93template<
typename K,
typename V>
95 const K& key,
const V& value)
97 multimap.insert(std::make_pair(key, value));
103template<
typename T,
typename OT>
107 for(
size_t i = 0; i != vec.size(); ++i)
113template<
typename T,
typename Pred>
116 auto i = assoc.begin();
117 while(i != assoc.end())
135 template <
typename ContainerT>
138 const auto result =
take(count);
139 return ContainerT(result.begin(), result.end());
142 auto take_vector(
const size_t count) {
return take_as<std::vector<uint8_t>>(count); }
145 std::span<const uint8_t>
take(
const size_t count)
148 auto result = m_remaining.first(count);
149 m_remaining = m_remaining.subspan(count);
155 const auto data =
take(sink.size());
156 std::copy(data.begin(), data.end(), sink.begin());
162 bool empty()
const {
return m_remaining.empty(); }
165 std::span<const uint8_t> m_remaining;
172template <
typename... Ts>
175 static_assert(
sizeof...(buffers) > 0,
"concat requires at least one buffer");
177 using result_t = std::remove_cvref_t<std::tuple_element_t<0, std::tuple<Ts...>>>;
179 result.reserve((buffers.size() + ...));
180 (result.insert(result.end(), buffers.begin(), buffers.end()), ...);
189template <
typename ResultT,
typename... Ts>
192 return concat(ResultT(), std::forward<Ts>(buffers)...);
195template<
typename... Alts,
typename... Ts>
197 return (std::holds_alternative<Alts>(v) || ...);
200template<
typename GeneralVariantT,
typename SpecialT>
203 return std::is_constructible_v<GeneralVariantT, SpecialT>;
206template<
typename GeneralVariantT,
typename... SpecialTs>
209 return (std::is_constructible_v<GeneralVariantT, SpecialTs> && ...);
219template<
typename GeneralVariantT,
typename SpecialT>
222 static_assert(std::is_constructible_v<GeneralVariantT, std::decay_t<SpecialT>>,
223 "Desired general type must be implicitly constructible by the specific type");
224 return std::forward<SpecialT>(specific);
234template<
typename GeneralVariantT,
typename... SpecialTs>
235constexpr GeneralVariantT
generalize_to(std::variant<SpecialTs...> specific)
noexcept
237 static_assert(is_generalizable_to<GeneralVariantT>(specific),
238 "Desired general type must be implicitly constructible by all types of the specialized std::variant<>");
239 return std::visit([](
auto s) -> GeneralVariantT {
return s; }, std::move(specific));
244template<
class... Ts>
struct overloaded : Ts... {
using Ts::operator()...; };
#define BOTAN_STATE_CHECK(expr)
auto take_secure_vector(const size_t count)
void skip(const size_t count)
auto take_vector(const size_t count)
void copy_into(std::span< uint8_t > sink)
BufferSlicer(std::span< const uint8_t > buffer)
auto take_as(const size_t count)
std::span< const uint8_t > take(const size_t count)
int(* final)(unsigned char *, CTX *)
constexpr GeneralVariantT generalize_to(SpecialT &&specific) noexcept
Converts a given variant into another variant-ish whose type states are a super set of the given vari...
void map_remove_if(Pred pred, T &assoc)
std::vector< uint8_t > to_byte_vector(std::string_view s)
constexpr bool holds_any_of(const std::variant< Ts... > &v) noexcept
std::set< K > map_keys_as_set(const std::map< K, V > &kv)
V search_map(const std::map< K, V > &mapping, const K &key, const V &null_result=V())
void multimap_insert(std::multimap< K, V > &multimap, const K &key, const V &value)
bool value_exists(const std::vector< T > &vec, const OT &val)
constexpr bool is_generalizable_to(const SpecialT &) noexcept
decltype(auto) concat(Ts &&...buffers)
std::string to_string(ErrorType type)
Convert an ErrorType to string.
ResultT concat_as(Ts &&...buffers)
std::vector< T, secure_allocator< T > > secure_vector