// 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 #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>::get(); } bool HasGraphicCharacter(base::StringPiece s) { int32_t length = graphic_->spanUTF8( s.data(), s.size(), USetSpanCondition::USET_SPAN_NOT_CONTAINED); return static_cast(length) != s.size(); } private: friend struct base::DefaultSingletonTraits; GraphicCharacters(); // set of graphic characters. std::unique_ptr 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