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