#include "device/bluetooth/string_util_icu.h"
#include <memory>
#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();
}
GraphicCharacters(const GraphicCharacters&) = delete;
GraphicCharacters& operator=(const GraphicCharacters&) = delete;
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();
std::unique_ptr<icu::UnicodeSet> graphic_;
};
GraphicCharacters::GraphicCharacters() {
UErrorCode graphic_status = U_ZERO_ERROR;
graphic_ = std::make_unique<icu::UnicodeSet>(
UNICODE_STRING_SIMPLE("[:graph:]"), graphic_status);
DCHECK(U_SUCCESS(graphic_status));
graphic_->freeze();
}
}
bool HasGraphicCharacter(base::StringPiece s) {
DCHECK(base::IsStringUTF8(s));
return GraphicCharacters::GetInstance()->HasGraphicCharacter(s);
}
}