From 90d2ef285802198d5b620ce5a9ab8de6e3c554bf Mon Sep 17 00:00:00 2001 From: Michael Ragazzon Date: Mon, 25 Dec 2023 21:09:31 +0100 Subject: [PATCH] Introduce a basic implementation of a Span type --- CMake/FileList.cmake | 1 + Include/RmlUi/Core/Span.h | 71 ++++++++++++++++++++++++++++++++++++++ Include/RmlUi/Core/Types.h | 1 + 3 files changed, 73 insertions(+) create mode 100644 Include/RmlUi/Core/Span.h diff --git a/CMake/FileList.cmake b/CMake/FileList.cmake index 940cadd8b..5334c0d24 100644 --- a/CMake/FileList.cmake +++ b/CMake/FileList.cmake @@ -202,6 +202,7 @@ set(Core_PUB_HDR_FILES ${PROJECT_SOURCE_DIR}/Include/RmlUi/Core/RenderManager.h ${PROJECT_SOURCE_DIR}/Include/RmlUi/Core/ScriptInterface.h ${PROJECT_SOURCE_DIR}/Include/RmlUi/Core/ScrollTypes.h + ${PROJECT_SOURCE_DIR}/Include/RmlUi/Core/Span.h ${PROJECT_SOURCE_DIR}/Include/RmlUi/Core/Spritesheet.h ${PROJECT_SOURCE_DIR}/Include/RmlUi/Core/StableVector.h ${PROJECT_SOURCE_DIR}/Include/RmlUi/Core/Stream.h diff --git a/Include/RmlUi/Core/Span.h b/Include/RmlUi/Core/Span.h new file mode 100644 index 000000000..5fdfc61ce --- /dev/null +++ b/Include/RmlUi/Core/Span.h @@ -0,0 +1,71 @@ +/* + * This source file is part of RmlUi, the HTML/CSS Interface Middleware + * + * For the latest information, see http://github.com/mikke89/RmlUi + * + * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd + * Copyright (c) 2019-2023 The RmlUi Team, and contributors + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + * + */ + +#ifndef RMLUI_CORE_SPAN_H +#define RMLUI_CORE_SPAN_H + +#include "../Config/Config.h" +#include "Header.h" +#include +#include + +namespace Rml { + +/** + Basic implementation of a span, which refers to a contiguous sequence of objects. + */ + +template +class RMLUICORE_API Span { +public: + Span() = default; + Span(T* data, size_t size) : m_data(data), m_size(size) { RMLUI_ASSERT(data != nullptr || size == 0); } + + Span(const Vector>& container) : Span(container.data(), container.size()) {} + Span(Vector& container) : Span(container.data(), container.size()) {} + + T& operator[](size_t index) const + { + RMLUI_ASSERT(index < m_size); + return m_data[index]; + } + + T* data() const { return m_data; } + size_t size() const { return m_size; } + bool empty() const { return m_size == 0; } + + T* begin() const { return m_data; } + T* end() const { return m_data + m_size; } + +private: + T* m_data = nullptr; + size_t m_size = 0; +}; + +} // namespace Rml +#endif diff --git a/Include/RmlUi/Core/Types.h b/Include/RmlUi/Core/Types.h index 4074a4d8d..a45287910 100644 --- a/Include/RmlUi/Core/Types.h +++ b/Include/RmlUi/Core/Types.h @@ -51,6 +51,7 @@ enum class BoxArea { Margin, Border, Padding, Content, Auto }; #include "Matrix4.h" #include "ObserverPtr.h" #include "Rectangle.h" +#include "Span.h" #include "Vector2.h" #include "Vector3.h" #include "Vector4.h"