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