| // Copyright 2016 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "device/bluetooth/string_util_icu.h" |
| |
| #include <memory> |
| |
| #include "base/macros.h" |
| #include "base/memory/singleton.h" |
| #include "base/strings/string_util.h" |
| #include "third_party/icu/source/common/unicode/uniset.h" |
| |
| namespace device { |
| |
| namespace { |
| |
| class GraphicCharacters { |
| public: |
| static GraphicCharacters* GetInstance() { |
| return base::Singleton<GraphicCharacters, base::LeakySingletonTraits< |
| GraphicCharacters>>::get(); |
| } |
| |
| bool HasGraphicCharacter(base::StringPiece s) { |
| int32_t length = graphic_->spanUTF8( |
| s.data(), s.size(), USetSpanCondition::USET_SPAN_NOT_CONTAINED); |
| return static_cast<size_t>(length) != s.size(); |
| } |
| |
| private: |
| friend struct base::DefaultSingletonTraits<GraphicCharacters>; |
| |
| GraphicCharacters(); |
| |
| // set of graphic characters. |
| std::unique_ptr<icu::UnicodeSet> graphic_; |
| |
| DISALLOW_COPY_AND_ASSIGN(GraphicCharacters); |
| }; |
| |
| GraphicCharacters::GraphicCharacters() { |
| UErrorCode graphic_status = U_ZERO_ERROR; |
| |
| // The set of Unicode Graphic Characters as defined by |
| // http://www.unicode.org/reports/tr18/#graph |
| // This set is composed of the characters not included in the following |
| // sets: |
| // - Whitespace (WSpace) |
| // - gc=Control (Cc) |
| // - gc=Surrogate (Cs) |
| // - gc=Unassigned (Cn) |
| graphic_.reset( |
| new icu::UnicodeSet(UNICODE_STRING_SIMPLE("[:graph:]"), graphic_status)); |
| DCHECK(U_SUCCESS(graphic_status)); |
| |
| graphic_->freeze(); |
| } |
| |
| } // namespace |
| |
| bool HasGraphicCharacter(base::StringPiece s) { |
| DCHECK(base::IsStringUTF8(s)); |
| return GraphicCharacters::GetInstance()->HasGraphicCharacter(s); |
| } |
| |
| } // namespace device |