/src/botan/build/include/botan/internal/stl_util.h
Line | Count | Source (jump to first uncovered line) |
1 | | /* |
2 | | * STL Utility Functions |
3 | | * (C) 1999-2007 Jack Lloyd |
4 | | * (C) 2015 Simon Warta (Kullo GmbH) |
5 | | * |
6 | | * Botan is released under the Simplified BSD License (see license.txt) |
7 | | */ |
8 | | |
9 | | #ifndef BOTAN_STL_UTIL_H_ |
10 | | #define BOTAN_STL_UTIL_H_ |
11 | | |
12 | | #include <vector> |
13 | | #include <variant> |
14 | | #include <string> |
15 | | #include <map> |
16 | | #include <set> |
17 | | #include <botan/secmem.h> |
18 | | |
19 | | namespace Botan { |
20 | | |
21 | | inline std::vector<uint8_t> to_byte_vector(const std::string& s) |
22 | 0 | { |
23 | 0 | return std::vector<uint8_t>(s.cbegin(), s.cend()); |
24 | 0 | } |
25 | | |
26 | | inline std::string to_string(const secure_vector<uint8_t> &bytes) |
27 | 0 | { |
28 | 0 | return std::string(bytes.cbegin(), bytes.cend()); |
29 | 0 | } |
30 | | |
31 | | /** |
32 | | * Return the keys of a map as a std::set |
33 | | */ |
34 | | template<typename K, typename V> |
35 | | std::set<K> map_keys_as_set(const std::map<K, V>& kv) |
36 | | { |
37 | | std::set<K> s; |
38 | | for(auto&& i : kv) |
39 | | { |
40 | | s.insert(i.first); |
41 | | } |
42 | | return s; |
43 | | } |
44 | | |
45 | | /* |
46 | | * Searching through a std::map |
47 | | * @param mapping the map to search |
48 | | * @param key is what to look for |
49 | | * @param null_result is the value to return if key is not in mapping |
50 | | * @return mapping[key] or null_result |
51 | | */ |
52 | | template<typename K, typename V> |
53 | | inline V search_map(const std::map<K, V>& mapping, |
54 | | const K& key, |
55 | | const V& null_result = V()) |
56 | 0 | { |
57 | 0 | auto i = mapping.find(key); |
58 | 0 | if(i == mapping.end()) |
59 | 0 | return null_result; |
60 | 0 | return i->second; |
61 | 0 | } |
62 | | |
63 | | template<typename K, typename V, typename R> |
64 | | inline R search_map(const std::map<K, V>& mapping, const K& key, |
65 | | const R& null_result, const R& found_result) |
66 | | { |
67 | | auto i = mapping.find(key); |
68 | | if(i == mapping.end()) |
69 | | return null_result; |
70 | | return found_result; |
71 | | } |
72 | | |
73 | | /* |
74 | | * Insert a key/value pair into a multimap |
75 | | */ |
76 | | template<typename K, typename V> |
77 | | void multimap_insert(std::multimap<K, V>& multimap, |
78 | | const K& key, const V& value) |
79 | 178k | { |
80 | 178k | multimap.insert(std::make_pair(key, value)); |
81 | 178k | } void Botan::multimap_insert<Botan::OID, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >(std::__1::multimap<Botan::OID, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::less<Botan::OID>, std::__1::allocator<std::__1::pair<Botan::OID const, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > > > >&, Botan::OID const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&) Line | Count | Source | 79 | 158k | { | 80 | 158k | multimap.insert(std::make_pair(key, value)); | 81 | 158k | } |
void Botan::multimap_insert<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >(std::__1::multimap<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::less<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >, std::__1::allocator<std::__1::pair<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > > > >&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&) Line | Count | Source | 79 | 17.3k | { | 80 | 17.3k | multimap.insert(std::make_pair(key, value)); | 81 | 17.3k | } |
void Botan::multimap_insert<Botan::OID, Botan::ASN1_String>(std::__1::multimap<Botan::OID, Botan::ASN1_String, std::__1::less<Botan::OID>, std::__1::allocator<std::__1::pair<Botan::OID const, Botan::ASN1_String> > >&, Botan::OID const&, Botan::ASN1_String const&) Line | Count | Source | 79 | 2.72k | { | 80 | 2.72k | multimap.insert(std::make_pair(key, value)); | 81 | 2.72k | } |
|
82 | | |
83 | | /** |
84 | | * Existence check for values |
85 | | */ |
86 | | template<typename T> |
87 | | bool value_exists(const std::vector<T>& vec, |
88 | | const T& val) |
89 | 1.39M | { |
90 | 4.32M | for(size_t i = 0; i != vec.size(); ++i) |
91 | 3.05M | if(vec[i] == val) |
92 | 126k | return true; |
93 | 1.26M | return false; |
94 | 1.39M | } bool Botan::value_exists<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >(std::__1::vector<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::allocator<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > > > const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&) Line | Count | Source | 89 | 28.4k | { | 90 | 53.2k | for(size_t i = 0; i != vec.size(); ++i) | 91 | 53.2k | if(vec[i] == val) | 92 | 28.4k | return true; | 93 | 0 | return false; | 94 | 28.4k | } |
bool Botan::value_exists<Botan::TLS::Group_Params>(std::__1::vector<Botan::TLS::Group_Params, std::__1::allocator<Botan::TLS::Group_Params> > const&, Botan::TLS::Group_Params const&) Line | Count | Source | 89 | 295k | { | 90 | 1.09M | for(size_t i = 0; i != vec.size(); ++i) | 91 | 856k | if(vec[i] == val) | 92 | 56.5k | return true; | 93 | 238k | return false; | 94 | 295k | } |
bool Botan::value_exists<Botan::TLS::Protocol_Version>(std::__1::vector<Botan::TLS::Protocol_Version, std::__1::allocator<Botan::TLS::Protocol_Version> > const&, Botan::TLS::Protocol_Version const&) Line | Count | Source | 89 | 20 | { | 90 | 252 | for(size_t i = 0; i != vec.size(); ++i) | 91 | 248 | if(vec[i] == val) | 92 | 16 | return true; | 93 | 4 | return false; | 94 | 20 | } |
bool Botan::value_exists<unsigned short>(std::__1::vector<unsigned short, std::__1::allocator<unsigned short> > const&, unsigned short const&) Line | Count | Source | 89 | 1.04M | { | 90 | 3.15M | for(size_t i = 0; i != vec.size(); ++i) | 91 | 2.12M | if(vec[i] == val) | 92 | 19.8k | return true; | 93 | 1.02M | return false; | 94 | 1.04M | } |
bool Botan::value_exists<unsigned char>(std::__1::vector<unsigned char, std::__1::allocator<unsigned char> > const&, unsigned char const&) Line | Count | Source | 89 | 21.1k | { | 90 | 24.8k | for(size_t i = 0; i != vec.size(); ++i) | 91 | 24.8k | if(vec[i] == val) | 92 | 21.1k | return true; | 93 | 12 | return false; | 94 | 21.1k | } |
|
95 | | |
96 | | template<typename T, typename Pred> |
97 | | void map_remove_if(Pred pred, T& assoc) |
98 | 616 | { |
99 | 616 | auto i = assoc.begin(); |
100 | 1.84k | while(i != assoc.end()) |
101 | 1.23k | { |
102 | 1.23k | if(pred(i->first)) |
103 | 616 | assoc.erase(i++); |
104 | 616 | else |
105 | 616 | i++; |
106 | 1.23k | } |
107 | 616 | } |
108 | | |
109 | | template <typename T> T concat(T buffer) { return buffer; } |
110 | | template <typename T, typename... Ts> |
111 | | T concat(const T& buffer, const Ts& ...buffers) |
112 | | { |
113 | | auto result = concat(buffers...); |
114 | | result.insert(result.begin(), buffer.begin(), buffer.end()); |
115 | | return result; |
116 | | } |
117 | | |
118 | | template<typename... Alts, typename... Ts> |
119 | | constexpr bool holds_any_of(const std::variant<Ts...>& v) noexcept { |
120 | | return (std::holds_alternative<Alts>(v) || ...); |
121 | | } |
122 | | |
123 | | } |
124 | | |
125 | | #endif |