/* * STL Utility Functions * (C) 1999-2007 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #ifndef BOTAN_STL_UTIL_H__ #define BOTAN_STL_UTIL_H__ #include #include #include namespace Botan { inline std::vector to_byte_vector(const std::string& s) { return std::vector(reinterpret_cast(&s[0]), reinterpret_cast(&s[s.size()])); } /* * Searching through a std::map * @param mapping the map to search * @param key is what to look for * @param null_result is the value to return if key is not in mapping * @return mapping[key] or null_result */ template inline V search_map(const std::map& mapping, const K& key, const V& null_result = V()) { auto i = mapping.find(key); if(i == mapping.end()) return null_result; return i->second; } template inline R search_map(const std::map& mapping, const K& key, const R& null_result, const R& found_result) { auto i = mapping.find(key); if(i == mapping.end()) return null_result; return found_result; } /* * Insert a key/value pair into a multimap */ template void multimap_insert(std::multimap& multimap, const K& key, const V& value) { #if defined(BOTAN_BUILD_COMPILER_IS_SUN_STUDIO) // Work around a strange bug in Sun Studio multimap.insert(std::make_pair(key, value)); #else multimap.insert(std::make_pair(key, value)); #endif } /** * Existence check for values */ template bool value_exists(const std::vector& vec, const T& val) { for(size_t i = 0; i != vec.size(); ++i) if(vec[i] == val) return true; return false; } template void map_remove_if(Pred pred, T& assoc) { auto i = assoc.begin(); while(i != assoc.end()) { if(pred(i->first)) assoc.erase(i++); else i++; } } } #endif