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 26 using std::string; 27 28 namespace i18n { 29 namespace phonenumbers { 30 RegExpCache(const AbstractRegExpFactory & regexp_factory,size_t min_items)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 ~RegExpCache()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 GetRegExp(const string & pattern)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(std::make_pair(pattern, regexp)); 56 return *regexp; 57 } 58 59 } // namespace phonenumbers 60 } // namespace i18n 61