From 285222d4907ebd45efe1a2f17ff9ce8f60d9250f Mon Sep 17 00:00:00 2001 From: Brad Davis Date: Fri, 17 Feb 2017 12:49:55 -0800 Subject: [PATCH] Add view storage --- libraries/shared/src/shared/Storage.cpp | 29 +++++++++---------------- libraries/shared/src/shared/Storage.h | 21 +++++++++++++----- 2 files changed, 26 insertions(+), 24 deletions(-) diff --git a/libraries/shared/src/shared/Storage.cpp b/libraries/shared/src/shared/Storage.cpp index fe17d678c7..d3f1f3c5d3 100644 --- a/libraries/shared/src/shared/Storage.cpp +++ b/libraries/shared/src/shared/Storage.cpp @@ -12,8 +12,16 @@ using namespace storage; +ViewStoragePointer Storage::createView(size_t viewSize, size_t offset) const { + auto selfSize = size(); + if ((viewSize + offset) > selfSize) { + throw std::runtime_error("Unable to map file"); + } + return ViewStoragePointer(new ViewStorage(viewSize, data() + offset)); +} + MemoryStoragePointer Storage::toMemoryStorage() const { - return std::make_unique(size(), data()); + return MemoryStoragePointer(new MemoryStorage(size(), data())); } FileStoragePointer Storage::toFileStorage(const QString& filename) const { @@ -25,14 +33,6 @@ MemoryStorage::MemoryStorage(size_t size, const uint8_t* data) { memcpy(_data.data(), data, size); } -const uint8_t* MemoryStorage::data() const { - return _data.data(); -} - -size_t MemoryStorage::size() const { - return _data.size(); -} - FileStoragePointer FileStorage::create(const QString& filename, size_t size, const uint8_t* data) { QFile file(filename); if (!file.open(QFile::ReadWrite | QIODevice::Truncate)) { @@ -52,7 +52,7 @@ FileStoragePointer FileStorage::create(const QString& filename, size_t size, con } } file.close(); - return std::make_unique(filename); + return FileStoragePointer(new FileStorage(filename)); } FileStorage::FileStorage(const QString& filename) : _file(filename) { @@ -75,12 +75,3 @@ FileStorage::~FileStorage() { _file.close(); } } - - -const uint8_t* FileStorage::data() const { - return _mapped; -} - -size_t FileStorage::size() const { - return _file.size(); -} diff --git a/libraries/shared/src/shared/Storage.h b/libraries/shared/src/shared/Storage.h index 3198172b06..8096b631ed 100644 --- a/libraries/shared/src/shared/Storage.h +++ b/libraries/shared/src/shared/Storage.h @@ -23,13 +23,15 @@ namespace storage { using MemoryStoragePointer = std::unique_ptr; class FileStorage; using FileStoragePointer = std::unique_ptr; + class ViewStorage; + using ViewStoragePointer = std::unique_ptr; class Storage { public: virtual ~Storage() {} virtual const uint8_t* data() const = 0; virtual size_t size() const = 0; - + ViewStoragePointer createView(size_t size, size_t offset = 0) const; FileStoragePointer toFileStorage(const QString& filename) const; MemoryStoragePointer toMemoryStorage() const; }; @@ -37,8 +39,8 @@ namespace storage { class MemoryStorage : public Storage { public: MemoryStorage(size_t size, const uint8_t* data); - const uint8_t* data() const override; - size_t size() const override; + const uint8_t* data() const override { return _data.data(); } + size_t size() const override { return _data.size(); } private: std::vector _data; }; @@ -52,13 +54,22 @@ namespace storage { FileStorage(const FileStorage& other) = delete; FileStorage& operator=(const FileStorage& other) = delete; - const uint8_t* data() const override; - size_t size() const override; + const uint8_t* data() const override { return _mapped; } + size_t size() const override { return _file.size(); } private: QFile _file; uint8_t* _mapped { nullptr }; }; + class ViewStorage : public Storage { + public: + ViewStorage(size_t size, const uint8_t* data) : _size(size), _data(data) {} + const uint8_t* data() const override { return _data; } + size_t size() const override { return _size; } + private: + const size_t _size; + const uint8_t* _data; + }; }