11767c5feSopenharmony_ci// Copyright (C) 2011 The Libphonenumber Authors
21767c5feSopenharmony_ci//
31767c5feSopenharmony_ci// Licensed under the Apache License, Version 2.0 (the "License");
41767c5feSopenharmony_ci// you may not use this file except in compliance with the License.
51767c5feSopenharmony_ci// You may obtain a copy of the License at
61767c5feSopenharmony_ci//
71767c5feSopenharmony_ci// http://www.apache.org/licenses/LICENSE-2.0
81767c5feSopenharmony_ci//
91767c5feSopenharmony_ci// Unless required by applicable law or agreed to in writing, software
101767c5feSopenharmony_ci// distributed under the License is distributed on an "AS IS" BASIS,
111767c5feSopenharmony_ci// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
121767c5feSopenharmony_ci// See the License for the specific language governing permissions and
131767c5feSopenharmony_ci// limitations under the License.
141767c5feSopenharmony_ci
151767c5feSopenharmony_ci// Author: Fredrik Roubert
161767c5feSopenharmony_ci
171767c5feSopenharmony_ci#include "phonenumbers/regexp_cache.h"
181767c5feSopenharmony_ci
191767c5feSopenharmony_ci#include <cstddef>
201767c5feSopenharmony_ci#include <string>
211767c5feSopenharmony_ci#include <utility>
221767c5feSopenharmony_ci
231767c5feSopenharmony_ci#include "phonenumbers/base/synchronization/lock.h"
241767c5feSopenharmony_ci#include "phonenumbers/regexp_adapter.h"
251767c5feSopenharmony_ci
261767c5feSopenharmony_ciusing std::string;
271767c5feSopenharmony_ci
281767c5feSopenharmony_cinamespace i18n {
291767c5feSopenharmony_cinamespace phonenumbers {
301767c5feSopenharmony_ci
311767c5feSopenharmony_ciRegExpCache::RegExpCache(const AbstractRegExpFactory& regexp_factory,
321767c5feSopenharmony_ci                         size_t min_items)
331767c5feSopenharmony_ci    : regexp_factory_(regexp_factory),
341767c5feSopenharmony_ci#ifdef I18N_PHONENUMBERS_USE_TR1_UNORDERED_MAP
351767c5feSopenharmony_ci      cache_impl_(new CacheImpl(min_items))
361767c5feSopenharmony_ci#else
371767c5feSopenharmony_ci      cache_impl_(new CacheImpl())
381767c5feSopenharmony_ci#endif
391767c5feSopenharmony_ci{}
401767c5feSopenharmony_ci
411767c5feSopenharmony_ciRegExpCache::~RegExpCache() {
421767c5feSopenharmony_ci  AutoLock l(lock_);
431767c5feSopenharmony_ci  for (CacheImpl::const_iterator
441767c5feSopenharmony_ci       it = cache_impl_->begin(); it != cache_impl_->end(); ++it) {
451767c5feSopenharmony_ci    delete it->second;
461767c5feSopenharmony_ci  }
471767c5feSopenharmony_ci}
481767c5feSopenharmony_ci
491767c5feSopenharmony_ciconst RegExp& RegExpCache::GetRegExp(const string& pattern) {
501767c5feSopenharmony_ci  AutoLock l(lock_);
511767c5feSopenharmony_ci  CacheImpl::const_iterator it = cache_impl_->find(pattern);
521767c5feSopenharmony_ci  if (it != cache_impl_->end()) return *it->second;
531767c5feSopenharmony_ci
541767c5feSopenharmony_ci  const RegExp* regexp = regexp_factory_.CreateRegExp(pattern);
551767c5feSopenharmony_ci  cache_impl_->insert(std::make_pair(pattern, regexp));
561767c5feSopenharmony_ci  return *regexp;
571767c5feSopenharmony_ci}
581767c5feSopenharmony_ci
591767c5feSopenharmony_ci}  // namespace phonenumbers
601767c5feSopenharmony_ci}  // namespace i18n
61