string_compare.cc revision 116680a4aac90f2aa7413d9095a592090648e557
1// Copyright 2014 The Chromium Authors. All rights reserved. 2// Use of this source code is governed by a BSD-style license that can be 3// found in the LICENSE file. 4 5#include "third_party/libaddressinput/src/cpp/src/util/string_compare.h" 6 7#include "base/basictypes.h" 8#include "base/lazy_instance.h" 9#include "base/logging.h" 10#include "base/memory/scoped_ptr.h" 11#include "third_party/icu/source/i18n/unicode/coll.h" 12 13namespace i18n { 14namespace addressinput { 15 16namespace { 17 18class IcuStringComparer { 19 public: 20 IcuStringComparer() { 21 UErrorCode error_code = U_ZERO_ERROR; 22 collator_.reset( 23 icu::Collator::createInstance(icu::Locale::getRoot(), error_code)); 24 DCHECK(U_SUCCESS(error_code)); 25 collator_->setStrength(icu::Collator::PRIMARY); 26 } 27 28 ~IcuStringComparer() {} 29 30 int Compare(const std::string& a, const std::string& b) const { 31 UErrorCode error_code = U_ZERO_ERROR; 32 int result = collator_->compareUTF8(a, b, error_code); 33 DCHECK(U_SUCCESS(error_code)); 34 return result; 35 } 36 37 private: 38 // ::scoped_ptr is from "base/memory/scoped_ptr.h", which does not interfere 39 // with ::i18n::addressinput::scoped_ptr from 40 // <libaddressinput/util/scoped_ptr.h>. 41 ::scoped_ptr<icu::Collator> collator_; 42 43 DISALLOW_COPY_AND_ASSIGN(IcuStringComparer); 44}; 45 46static base::LazyInstance<IcuStringComparer> g_comparer = 47 LAZY_INSTANCE_INITIALIZER; 48 49} // namespace 50 51// Dummy required for scoped_ptr<Impl>. 52class StringCompare::Impl {}; 53 54StringCompare::StringCompare() {} 55 56StringCompare::~StringCompare() {} 57 58bool StringCompare::NaturalEquals(const std::string& a, 59 const std::string& b) const { 60 return g_comparer.Get().Compare(a, b) == 0; 61} 62 63bool StringCompare::NaturalLess(const std::string& a, 64 const std::string& b) const { 65 return g_comparer.Get().Compare(a, b) < 0; 66} 67 68} // namespace addressinput 69} // namespace i18n 70