diff --git a/cpp/CMakeLists.txt b/cpp/CMakeLists.txt index dbb74afb6..d79af6b71 100644 --- a/cpp/CMakeLists.txt +++ b/cpp/CMakeLists.txt @@ -98,6 +98,7 @@ set ( "src/base/synchronization/lock.cc" "src/base/threading/thread_restrictions.cc" "src/phonenumberutil.cc" + "src/re2_cache.cc" "src/stringutil.cc" "src/utf/rune.c" ) @@ -150,6 +151,7 @@ target_link_libraries (phonenumber re2) set (TEST_SOURCES "src/phonenumberutil_test.cc" + "src/re2_cache_test.cc" "src/run_tests.cc" "src/stringutil_test.cc" ) diff --git a/cpp/src/re2_cache.cc b/cpp/src/re2_cache.cc new file mode 100644 index 000000000..b90dbf562 --- /dev/null +++ b/cpp/src/re2_cache.cc @@ -0,0 +1,38 @@ +// Copyright (C) 2011 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Author: Fredrik Roubert + +#include "re2_cache.h" + +#include +#include + +#include + +namespace i18n { +namespace phonenumbers { + +using std::string; + +RE2Cache::RE2Cache(size_t /*max_items*/) {} +RE2Cache::~RE2Cache() {} + +RE2Cache::ScopedAccess::ScopedAccess(RE2Cache* /*cache*/, const string& pattern) + : pattern_(pattern), regexp_(new RE2(pattern_)) {} + +RE2Cache::ScopedAccess::~ScopedAccess() {} + +} // namespace phonenumbers +} // namespace i18n diff --git a/cpp/src/re2_cache.h b/cpp/src/re2_cache.h new file mode 100644 index 000000000..323fb2532 --- /dev/null +++ b/cpp/src/re2_cache.h @@ -0,0 +1,60 @@ +// Copyright (C) 2011 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Author: Fredrik Roubert + +// The RE2Cache provides an interface to store RE2 objects in some kind of +// cache. Currently, it doesn't do any caching at all but just provides the +// interface. TODO: Implement caching. ;-) + +#ifndef I18N_PHONENUMBERS_RE2_CACHE_H_ +#define I18N_PHONENUMBERS_RE2_CACHE_H_ + +#include +#include + +#include "base/scoped_ptr.h" + +namespace re2 { +class RE2; +} // namespace re2 + +namespace i18n { +namespace phonenumbers { + +using re2::RE2; +using std::string; + +class RE2Cache { + public: + explicit RE2Cache(size_t max_items); + ~RE2Cache(); + + class ScopedAccess { + public: + ScopedAccess(RE2Cache* cache, const string& pattern); + ~ScopedAccess(); + operator const RE2&() const { return *regexp_; } + + private: + const string pattern_; + scoped_ptr regexp_; + friend class RE2CacheTest_AccessConstructor_Test; + }; +}; + +} // namespace phonenumbers +} // namespace i18n + +#endif // I18N_PHONENUMBERS_RE2_CACHE_H_ diff --git a/cpp/src/re2_cache_test.cc b/cpp/src/re2_cache_test.cc new file mode 100644 index 000000000..c7d9b7ed4 --- /dev/null +++ b/cpp/src/re2_cache_test.cc @@ -0,0 +1,60 @@ +// Copyright (C) 2011 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Author: Fredrik Roubert + +// Test the wrapper of the cache. The cache functionality itself will be tested +// by the unit test for the cache implementation. + +#include +#include + +#include +#include + +#include "re2_cache.h" + +namespace i18n { +namespace phonenumbers { + +using std::string; + +class RE2CacheTest : public testing::Test { + protected: + static const size_t max_items_ = 2; + + RE2CacheTest() : cache_(max_items_) {} + virtual ~RE2CacheTest() {} + + RE2Cache cache_; +}; + +TEST_F(RE2CacheTest, AccessConstructor) { + static const string foo("foo"); + RE2Cache::ScopedAccess access(&cache_, foo); + + EXPECT_EQ(foo, access.pattern_); + EXPECT_TRUE(access.regexp_ != NULL); +} + +TEST_F(RE2CacheTest, OperatorRE2) { + static const string foo("foo"); + RE2Cache::ScopedAccess access(&cache_, foo); + + const RE2& regexp = access; + EXPECT_EQ(foo, regexp.pattern()); +} + +} // namespace phonenumbers +} // namespace i18n