mirror of
https://github.com/JulianGro/overte.git
synced 2025-04-25 17:35:08 +02:00
Add view storage
This commit is contained in:
parent
3ed051317b
commit
285222d490
2 changed files with 26 additions and 24 deletions
|
@ -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<MemoryStorage>(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<FileStorage>(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();
|
||||
}
|
||||
|
|
|
@ -23,13 +23,15 @@ namespace storage {
|
|||
using MemoryStoragePointer = std::unique_ptr<MemoryStorage>;
|
||||
class FileStorage;
|
||||
using FileStoragePointer = std::unique_ptr<FileStorage>;
|
||||
class ViewStorage;
|
||||
using ViewStoragePointer = std::unique_ptr<ViewStorage>;
|
||||
|
||||
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<uint8_t> _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;
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue