From 00b5614ce27a9bfecd92867e0c74dffc7381e7af Mon Sep 17 00:00:00 2001 From: Andreas Kling Date: Sun, 17 May 2020 20:01:45 +0200 Subject: [PATCH] AK: Add a very basic Utf32View class This allows you to wrap a { const u32* codepoints, size_t length } in a simple object. --- AK/Forward.h | 4 +++- AK/Utf32View.h | 62 ++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 65 insertions(+), 1 deletion(-) create mode 100644 AK/Utf32View.h diff --git a/AK/Forward.h b/AK/Forward.h index f1336e781d9..b58e887a22b 100644 --- a/AK/Forward.h +++ b/AK/Forward.h @@ -46,6 +46,7 @@ class StringImpl; class StringView; class URL; class FlyString; +class Utf32View; class Utf8View; template @@ -116,6 +117,7 @@ using AK::CircularQueue; using AK::DebugLogStream; using AK::DoublyLinkedList; using AK::FixedArray; +using AK::FlyString; using AK::Function; using AK::HashMap; using AK::HashTable; @@ -138,6 +140,6 @@ using AK::StringImpl; using AK::StringView; using AK::Traits; using AK::URL; -using AK::FlyString; +using AK::Utf32View; using AK::Utf8View; using AK::Vector; diff --git a/AK/Utf32View.h b/AK/Utf32View.h new file mode 100644 index 00000000000..f75125a8e7b --- /dev/null +++ b/AK/Utf32View.h @@ -0,0 +1,62 @@ +/* + * Copyright (c) 2020, Andreas Kling + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#pragma once + +#include +#include +#include + +namespace AK { + +class Utf32View { +public: + Utf32View(const u32* codepoints, size_t length) + : m_codepoints(codepoints) + , m_length(length) + { + } + + const u32* codepoints() const { return m_codepoints; } + bool is_empty() const { return m_length == 0; } + size_t length() const { return m_length; } + + Utf32View substring_view(size_t offset, size_t length) const + { + ASSERT(offset < m_length); + ASSERT(!Checked::addition_would_overflow(offset, length)); + ASSERT((offset + length) <= m_length); + return Utf32View(m_codepoints + offset, length); + } + +private: + const u32* m_codepoints { nullptr }; + size_t m_length { 0 }; +}; + +} + +using AK::Utf32View;