1/*
2 * Copyright (C) 2017 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#ifndef LIBTEXTCLASSIFIER_UTIL_GTL_MAP_UTIL_H_
18#define LIBTEXTCLASSIFIER_UTIL_GTL_MAP_UTIL_H_
19
20namespace libtextclassifier2 {
21
22// Returns a const reference to the value associated with the given key if it
23// exists, otherwise returns a const reference to the provided default value.
24//
25// WARNING: If a temporary object is passed as the default "value,"
26// this function will return a reference to that temporary object,
27// which will be destroyed at the end of the statement. A common
28// example: if you have a map with string values, and you pass a char*
29// as the default "value," either use the returned value immediately
30// or store it in a string (not string&).
31template <class Collection>
32const typename Collection::value_type::second_type& FindWithDefault(
33    const Collection& collection,
34    const typename Collection::value_type::first_type& key,
35    const typename Collection::value_type::second_type& value) {
36  typename Collection::const_iterator it = collection.find(key);
37  if (it == collection.end()) {
38    return value;
39  }
40  return it->second;
41}
42
43// Inserts the given key and value into the given collection if and only if the
44// given key did NOT already exist in the collection. If the key previously
45// existed in the collection, the value is not changed. Returns true if the
46// key-value pair was inserted; returns false if the key was already present.
47template <class Collection>
48bool InsertIfNotPresent(Collection* const collection,
49                        const typename Collection::value_type& vt) {
50  return collection->insert(vt).second;
51}
52
53// Same as above except the key and value are passed separately.
54template <class Collection>
55bool InsertIfNotPresent(
56    Collection* const collection,
57    const typename Collection::value_type::first_type& key,
58    const typename Collection::value_type::second_type& value) {
59  return InsertIfNotPresent(collection,
60                            typename Collection::value_type(key, value));
61}
62
63}  // namespace libtextclassifier2
64
65#endif  // LIBTEXTCLASSIFIER_UTIL_GTL_MAP_UTIL_H_
66