1116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// Copyright 2014 The Chromium Authors. All rights reserved. 2116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// Use of this source code is governed by a BSD-style license that can be 3116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// found in the LICENSE file. 4116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 5116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "third_party/libaddressinput/src/cpp/src/util/string_compare.h" 6116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 7116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "base/basictypes.h" 8116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "base/lazy_instance.h" 9116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "base/logging.h" 10116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "base/memory/scoped_ptr.h" 11116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "third_party/icu/source/i18n/unicode/coll.h" 12116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 13116680a4aac90f2aa7413d9095a592090648e557Ben Murdochnamespace i18n { 14116680a4aac90f2aa7413d9095a592090648e557Ben Murdochnamespace addressinput { 15116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 16116680a4aac90f2aa7413d9095a592090648e557Ben Murdochnamespace { 17116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 18116680a4aac90f2aa7413d9095a592090648e557Ben Murdochclass IcuStringComparer { 19116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch public: 20116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch IcuStringComparer() { 21116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch UErrorCode error_code = U_ZERO_ERROR; 22116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch collator_.reset( 23116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch icu::Collator::createInstance(icu::Locale::getRoot(), error_code)); 24116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch DCHECK(U_SUCCESS(error_code)); 25116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch collator_->setStrength(icu::Collator::PRIMARY); 26116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 27116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 28116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ~IcuStringComparer() {} 29116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 30116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch int Compare(const std::string& a, const std::string& b) const { 31116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch UErrorCode error_code = U_ZERO_ERROR; 32116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch int result = collator_->compareUTF8(a, b, error_code); 33116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch DCHECK(U_SUCCESS(error_code)); 34116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return result; 35116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 36116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 37116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch private: 38116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // ::scoped_ptr is from "base/memory/scoped_ptr.h", which does not interfere 39116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // with ::i18n::addressinput::scoped_ptr from 40116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // <libaddressinput/util/scoped_ptr.h>. 41116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ::scoped_ptr<icu::Collator> collator_; 42116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 43116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch DISALLOW_COPY_AND_ASSIGN(IcuStringComparer); 44116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}; 45116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 46116680a4aac90f2aa7413d9095a592090648e557Ben Murdochstatic base::LazyInstance<IcuStringComparer> g_comparer = 47116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch LAZY_INSTANCE_INITIALIZER; 48116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 49116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} // namespace 50116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 51116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// Dummy required for scoped_ptr<Impl>. 52116680a4aac90f2aa7413d9095a592090648e557Ben Murdochclass StringCompare::Impl {}; 53116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 54116680a4aac90f2aa7413d9095a592090648e557Ben MurdochStringCompare::StringCompare() {} 55116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 56116680a4aac90f2aa7413d9095a592090648e557Ben MurdochStringCompare::~StringCompare() {} 57116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 58116680a4aac90f2aa7413d9095a592090648e557Ben Murdochbool StringCompare::NaturalEquals(const std::string& a, 59116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const std::string& b) const { 60116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return g_comparer.Get().Compare(a, b) == 0; 61116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 62116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 63116680a4aac90f2aa7413d9095a592090648e557Ben Murdochbool StringCompare::NaturalLess(const std::string& a, 64116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const std::string& b) const { 65116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return g_comparer.Get().Compare(a, b) < 0; 66116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 67116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 68116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} // namespace addressinput 69116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} // namespace i18n 70