Coverage Report

Created: 2022-06-23 06:44

/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