Starting using SPan
diff --git a/dev/core_generator/lib/src/field_types/bytes_field_type.dart b/dev/core_generator/lib/src/field_types/bytes_field_type.dart index 8c2b57c..883ebc4 100644 --- a/dev/core_generator/lib/src/field_types/bytes_field_type.dart +++ b/dev/core_generator/lib/src/field_types/bytes_field_type.dart
@@ -5,15 +5,15 @@ : super( 'Bytes', 'CoreBytesType', - cppName: 'std::vector<uint8_t>', - include: '<vector>', + cppName: 'Span<uint8_t>', + include: 'rive/span.hpp', ); @override - String get defaultValue => 'std::vector<uint8_t>()'; + String get defaultValue => 'Span<uint8_t>(nullptr, 0)'; @override - String get cppGetterName => 'const std::vector<uint8_t>&'; + String get cppGetterName => 'const Span<uint8_t>&'; @override String convertCpp(String value) {
diff --git a/dev/defs/assets/file_asset_contents.json b/dev/defs/assets/file_asset_contents.json index 511d858..626b2e0 100644 --- a/dev/defs/assets/file_asset_contents.json +++ b/dev/defs/assets/file_asset_contents.json
@@ -18,6 +18,7 @@ }, "bytes": { "type": "Bytes", + "encoded": true, "key": { "int": 212, "string": "bytes"
diff --git a/include/rive/assets/file_asset_contents.hpp b/include/rive/assets/file_asset_contents.hpp index 7a237a9..7cdfd3d 100644 --- a/include/rive/assets/file_asset_contents.hpp +++ b/include/rive/assets/file_asset_contents.hpp
@@ -1,11 +1,18 @@ #ifndef _RIVE_FILE_ASSET_CONTENTS_HPP_ #define _RIVE_FILE_ASSET_CONTENTS_HPP_ #include "rive/generated/assets/file_asset_contents_base.hpp" +#include <cstdint> namespace rive { class FileAssetContents : public FileAssetContentsBase { + private: + std::vector<uint8_t> m_Bytes; + public: + const std::vector<uint8_t>& bytes() const; StatusCode import(ImportStack& importStack) override; + void decodeBytes(Span<uint8_t> value) override; + void copyBytes(const FileAssetContentsBase& object) override; }; } // namespace rive
diff --git a/include/rive/core/binary_reader.hpp b/include/rive/core/binary_reader.hpp index c8e6a8c..9cc6c2b 100644 --- a/include/rive/core/binary_reader.hpp +++ b/include/rive/core/binary_reader.hpp
@@ -4,6 +4,7 @@ #include <string> #include <vector> +#include "rive/span.hpp" namespace rive { class BinaryReader { @@ -23,7 +24,7 @@ size_t lengthInBytes() const; std::string readString(); - std::vector<uint8_t> readBytes(); + Span<uint8_t> readBytes(); double readFloat64(); float readFloat32(); uint8_t readByte();
diff --git a/include/rive/core/field_types/core_bytes_type.hpp b/include/rive/core/field_types/core_bytes_type.hpp index 2530cf5..834acb8 100644 --- a/include/rive/core/field_types/core_bytes_type.hpp +++ b/include/rive/core/field_types/core_bytes_type.hpp
@@ -1,7 +1,7 @@ #ifndef _RIVE_CORE_BYTES_TYPE_HPP_ #define _RIVE_CORE_BYTES_TYPE_HPP_ -#include <vector> +#include "rive/span.hpp" #include <cstdint> namespace rive { @@ -9,7 +9,7 @@ class CoreBytesType { public: static const int id = 1; - static std::vector<uint8_t> deserialize(BinaryReader& reader); + static Span<uint8_t> deserialize(BinaryReader& reader); }; } // namespace rive #endif \ No newline at end of file
diff --git a/include/rive/generated/assets/file_asset_contents_base.hpp b/include/rive/generated/assets/file_asset_contents_base.hpp index 89565d2..10456cb 100644 --- a/include/rive/generated/assets/file_asset_contents_base.hpp +++ b/include/rive/generated/assets/file_asset_contents_base.hpp
@@ -1,8 +1,8 @@ #ifndef _RIVE_FILE_ASSET_CONTENTS_BASE_HPP_ #define _RIVE_FILE_ASSET_CONTENTS_BASE_HPP_ -#include <vector> #include "rive/core.hpp" #include "rive/core/field_types/core_bytes_type.hpp" +#include "rive/span.hpp" namespace rive { class FileAssetContentsBase : public Core { protected: @@ -26,28 +26,17 @@ static const uint16_t bytesPropertyKey = 212; - private: - std::vector<uint8_t> m_Bytes; - public: - inline const std::vector<uint8_t>& bytes() const { return m_Bytes; } - void bytes(std::vector<uint8_t> value) { - if (m_Bytes == value) { - return; - } - m_Bytes = value; - bytesChanged(); - } + virtual void decodeBytes(Span<uint8_t> value) = 0; + virtual void copyBytes(const FileAssetContentsBase& object) = 0; Core* clone() const override; - void copy(const FileAssetContentsBase& object) { - m_Bytes = object.m_Bytes; - } + void copy(const FileAssetContentsBase& object) { copyBytes(object); } bool deserialize(uint16_t propertyKey, BinaryReader& reader) override { switch (propertyKey) { case bytesPropertyKey: - m_Bytes = CoreBytesType::deserialize(reader); + decodeBytes(CoreBytesType::deserialize(reader)); return true; } return false;
diff --git a/include/rive/generated/core_registry.hpp b/include/rive/generated/core_registry.hpp index d7d46a3..dbe63f3 100644 --- a/include/rive/generated/core_registry.hpp +++ b/include/rive/generated/core_registry.hpp
@@ -781,14 +781,6 @@ break; } } - static void - setBytes(Core* object, int propertyKey, std::vector<uint8_t> value) { - switch (propertyKey) { - case FileAssetContentsBase::bytesPropertyKey: - object->as<FileAssetContentsBase>()->bytes(value); - break; - } - } static std::string getString(Core* object, int propertyKey) { switch (propertyKey) { case ComponentBase::namePropertyKey: @@ -1157,13 +1149,6 @@ } return 0; } - static std::vector<uint8_t> getBytes(Core* object, int propertyKey) { - switch (propertyKey) { - case FileAssetContentsBase::bytesPropertyKey: - return object->as<FileAssetContentsBase>()->bytes(); - } - return std::vector<uint8_t>(); - } static int propertyFieldId(int propertyKey) { switch (propertyKey) { case ComponentBase::namePropertyKey:
diff --git a/include/rive/generated/shapes/mesh_base.hpp b/include/rive/generated/shapes/mesh_base.hpp index ff9b93d..736c86c 100644 --- a/include/rive/generated/shapes/mesh_base.hpp +++ b/include/rive/generated/shapes/mesh_base.hpp
@@ -1,8 +1,8 @@ #ifndef _RIVE_MESH_BASE_HPP_ #define _RIVE_MESH_BASE_HPP_ -#include <vector> #include "rive/container_component.hpp" #include "rive/core/field_types/core_bytes_type.hpp" +#include "rive/span.hpp" namespace rive { class MeshBase : public ContainerComponent { protected: @@ -29,7 +29,7 @@ static const uint16_t triangleIndexBytesPropertyKey = 223; public: - virtual void decodeTriangleIndexBytes(std::vector<uint8_t> value) = 0; + virtual void decodeTriangleIndexBytes(Span<uint8_t> value) = 0; virtual void copyTriangleIndexBytes(const MeshBase& object) = 0; Core* clone() const override;
diff --git a/include/rive/shapes/mesh.hpp b/include/rive/shapes/mesh.hpp index 1b531e5..3484fe4 100644 --- a/include/rive/shapes/mesh.hpp +++ b/include/rive/shapes/mesh.hpp
@@ -1,6 +1,7 @@ #ifndef _RIVE_MESH_HPP_ #define _RIVE_MESH_HPP_ #include "rive/generated/shapes/mesh_base.hpp" +#include "rive/span.hpp" namespace rive { class MeshVertex; @@ -12,7 +13,7 @@ StatusCode onAddedDirty(CoreContext* context) override; void markDrawableDirty(); void addVertex(MeshVertex* vertex); - void decodeTriangleIndexBytes(std::vector<uint8_t> value) override; + void decodeTriangleIndexBytes(Span<uint8_t> value) override; void copyTriangleIndexBytes(const MeshBase& object) override; #ifdef TESTING std::vector<MeshVertex*>& vertices() { return m_Vertices; }
diff --git a/src/assets/file_asset_contents.cpp b/src/assets/file_asset_contents.cpp index 1f552f6..2ba8602 100644 --- a/src/assets/file_asset_contents.cpp +++ b/src/assets/file_asset_contents.cpp
@@ -13,4 +13,15 @@ fileAssetImporter->loadContents(*this); return Super::import(importStack); -} \ No newline at end of file +} + +void FileAssetContents::decodeBytes(Span<uint8_t> value) { + m_Bytes = std::vector(value.begin(), value.end()); +} + +void FileAssetContents::copyBytes(const FileAssetContentsBase& object) { + // Should never be called. + assert(false); +} + +const std::vector<uint8_t>& FileAssetContents::bytes() const { return m_Bytes; } \ No newline at end of file
diff --git a/src/core/binary_reader.cpp b/src/core/binary_reader.cpp index c5e31e4..59004ec 100644 --- a/src/core/binary_reader.cpp +++ b/src/core/binary_reader.cpp
@@ -1,5 +1,6 @@ #include "rive/core/binary_reader.hpp" #include "rive/core/reader.h" +#include "rive/span.hpp" #include <vector> using namespace rive; @@ -50,15 +51,15 @@ return std::string(rawValue.data(), length); } -std::vector<uint8_t> BinaryReader::readBytes() { +Span<uint8_t> BinaryReader::readBytes() { uint64_t length = readVarUint64(); if (didOverflow()) { - return std::vector<uint8_t>(); + return Span<uint8_t>(m_Position, 0); } uint8_t* start = m_Position; m_Position += length; - return std::vector<uint8_t>(start, start + length); + return Span<uint8_t>(start, length); } double BinaryReader::readFloat64() {
diff --git a/src/core/field_types/core_bytes_type.cpp b/src/core/field_types/core_bytes_type.cpp index 68f7d8b..9a78bd2 100644 --- a/src/core/field_types/core_bytes_type.cpp +++ b/src/core/field_types/core_bytes_type.cpp
@@ -3,6 +3,6 @@ using namespace rive; -std::vector<uint8_t> CoreBytesType::deserialize(BinaryReader& reader) { +Span<uint8_t> CoreBytesType::deserialize(BinaryReader& reader) { return reader.readBytes(); } \ No newline at end of file
diff --git a/src/shapes/mesh.cpp b/src/shapes/mesh.cpp index e84b27e..76e90a0 100644 --- a/src/shapes/mesh.cpp +++ b/src/shapes/mesh.cpp
@@ -23,7 +23,7 @@ return StatusCode::Ok; } -void Mesh::decodeTriangleIndexBytes(std::vector<uint8_t> value) { +void Mesh::decodeTriangleIndexBytes(Span<uint8_t> value) { // decode the triangle index bytes }