1// Copyright (C) 2011 The Libphonenumber Authors 2// 3// Licensed under the Apache License, Version 2.0 (the "License"); 4// you may not use this file except in compliance with the License. 5// You may obtain a copy of the License at 6// 7// http://www.apache.org/licenses/LICENSE-2.0 8// 9// Unless required by applicable law or agreed to in writing, software 10// distributed under the License is distributed on an "AS IS" BASIS, 11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12// See the License for the specific language governing permissions and 13// limitations under the License. 14 15// Author: Fredrik Roubert 16 17#include "phonenumbers/regexp_cache.h" 18 19#include <cstddef> 20#include <string> 21#include <utility> 22 23#include "phonenumbers/base/synchronization/lock.h" 24#include "phonenumbers/regexp_adapter.h" 25 26using std::string; 27 28namespace i18n { 29namespace phonenumbers { 30 31RegExpCache::RegExpCache(const AbstractRegExpFactory& regexp_factory, 32 size_t min_items) 33 : regexp_factory_(regexp_factory), 34#ifdef I18N_PHONENUMBERS_USE_TR1_UNORDERED_MAP 35 cache_impl_(new CacheImpl(min_items)) 36#else 37 cache_impl_(new CacheImpl()) 38#endif 39{} 40 41RegExpCache::~RegExpCache() { 42 AutoLock l(lock_); 43 for (CacheImpl::const_iterator 44 it = cache_impl_->begin(); it != cache_impl_->end(); ++it) { 45 delete it->second; 46 } 47} 48 49const RegExp& RegExpCache::GetRegExp(const string& pattern) { 50 AutoLock l(lock_); 51 CacheImpl::const_iterator it = cache_impl_->find(pattern); 52 if (it != cache_impl_->end()) return *it->second; 53 54 const RegExp* regexp = regexp_factory_.CreateRegExp(pattern); 55 cache_impl_->insert(make_pair(pattern, regexp)); 56 return *regexp; 57} 58 59} // namespace phonenumbers 60} // namespace i18n 61