1*6777b538SAndroid Build Coastguard Worker // Copyright 2023 The Chromium Authors
2*6777b538SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*6777b538SAndroid Build Coastguard Worker // found in the LICENSE file.
4*6777b538SAndroid Build Coastguard Worker
5*6777b538SAndroid Build Coastguard Worker #ifndef BASE_CONTAINERS_MAP_UTIL_H_
6*6777b538SAndroid Build Coastguard Worker #define BASE_CONTAINERS_MAP_UTIL_H_
7*6777b538SAndroid Build Coastguard Worker
8*6777b538SAndroid Build Coastguard Worker #include <memory>
9*6777b538SAndroid Build Coastguard Worker
10*6777b538SAndroid Build Coastguard Worker #include "base/types/to_address.h"
11*6777b538SAndroid Build Coastguard Worker
12*6777b538SAndroid Build Coastguard Worker namespace base {
13*6777b538SAndroid Build Coastguard Worker
14*6777b538SAndroid Build Coastguard Worker namespace internal {
15*6777b538SAndroid Build Coastguard Worker
16*6777b538SAndroid Build Coastguard Worker template <typename Map>
17*6777b538SAndroid Build Coastguard Worker using MappedType = typename Map::mapped_type;
18*6777b538SAndroid Build Coastguard Worker
19*6777b538SAndroid Build Coastguard Worker } // namespace internal
20*6777b538SAndroid Build Coastguard Worker
21*6777b538SAndroid Build Coastguard Worker // Returns a pointer to the const value associated with the given key if it
22*6777b538SAndroid Build Coastguard Worker // exists, or null otherwise.
23*6777b538SAndroid Build Coastguard Worker template <typename Map, typename Key>
FindOrNull(const Map & map,const Key & key)24*6777b538SAndroid Build Coastguard Worker constexpr const internal::MappedType<Map>* FindOrNull(const Map& map,
25*6777b538SAndroid Build Coastguard Worker const Key& key) {
26*6777b538SAndroid Build Coastguard Worker auto it = map.find(key);
27*6777b538SAndroid Build Coastguard Worker return it != map.end() ? &it->second : nullptr;
28*6777b538SAndroid Build Coastguard Worker }
29*6777b538SAndroid Build Coastguard Worker
30*6777b538SAndroid Build Coastguard Worker // Returns a pointer to the value associated with the given key if it exists, or
31*6777b538SAndroid Build Coastguard Worker // null otherwise.
32*6777b538SAndroid Build Coastguard Worker template <typename Map, typename Key>
FindOrNull(Map & map,const Key & key)33*6777b538SAndroid Build Coastguard Worker constexpr internal::MappedType<Map>* FindOrNull(Map& map, const Key& key) {
34*6777b538SAndroid Build Coastguard Worker auto it = map.find(key);
35*6777b538SAndroid Build Coastguard Worker return it != map.end() ? &it->second : nullptr;
36*6777b538SAndroid Build Coastguard Worker }
37*6777b538SAndroid Build Coastguard Worker
38*6777b538SAndroid Build Coastguard Worker // Returns the const pointer value associated with the given key. If none is
39*6777b538SAndroid Build Coastguard Worker // found, null is returned. The function is designed to be used with a map of
40*6777b538SAndroid Build Coastguard Worker // keys to pointers or smart pointers.
41*6777b538SAndroid Build Coastguard Worker //
42*6777b538SAndroid Build Coastguard Worker // This function does not distinguish between a missing key and a key mapped
43*6777b538SAndroid Build Coastguard Worker // to a null value.
44*6777b538SAndroid Build Coastguard Worker template <typename Map,
45*6777b538SAndroid Build Coastguard Worker typename Key,
46*6777b538SAndroid Build Coastguard Worker typename MappedElementType =
47*6777b538SAndroid Build Coastguard Worker std::pointer_traits<internal::MappedType<Map>>::element_type>
FindPtrOrNull(const Map & map,const Key & key)48*6777b538SAndroid Build Coastguard Worker constexpr const MappedElementType* FindPtrOrNull(const Map& map,
49*6777b538SAndroid Build Coastguard Worker const Key& key) {
50*6777b538SAndroid Build Coastguard Worker auto it = map.find(key);
51*6777b538SAndroid Build Coastguard Worker return it != map.end() ? base::to_address(it->second) : nullptr;
52*6777b538SAndroid Build Coastguard Worker }
53*6777b538SAndroid Build Coastguard Worker
54*6777b538SAndroid Build Coastguard Worker // Returns the pointer value associated with the given key. If none is found,
55*6777b538SAndroid Build Coastguard Worker // null is returned. The function is designed to be used with a map of keys to
56*6777b538SAndroid Build Coastguard Worker // pointers or smart pointers.
57*6777b538SAndroid Build Coastguard Worker //
58*6777b538SAndroid Build Coastguard Worker // This function does not distinguish between a missing key and a key mapped
59*6777b538SAndroid Build Coastguard Worker // to a null value.
60*6777b538SAndroid Build Coastguard Worker template <typename Map,
61*6777b538SAndroid Build Coastguard Worker typename Key,
62*6777b538SAndroid Build Coastguard Worker typename MappedElementType =
63*6777b538SAndroid Build Coastguard Worker std::pointer_traits<internal::MappedType<Map>>::element_type>
FindPtrOrNull(Map & map,const Key & key)64*6777b538SAndroid Build Coastguard Worker constexpr MappedElementType* FindPtrOrNull(Map& map, const Key& key) {
65*6777b538SAndroid Build Coastguard Worker auto it = map.find(key);
66*6777b538SAndroid Build Coastguard Worker return it != map.end() ? base::to_address(it->second) : nullptr;
67*6777b538SAndroid Build Coastguard Worker }
68*6777b538SAndroid Build Coastguard Worker
69*6777b538SAndroid Build Coastguard Worker } // namespace base
70*6777b538SAndroid Build Coastguard Worker
71*6777b538SAndroid Build Coastguard Worker #endif // BASE_CONTAINERS_MAP_UTIL_H_
72