mirror of
https://github.com/JulianGro/overte.git
synced 2025-04-29 20:42:56 +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;
|
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 {
|
MemoryStoragePointer Storage::toMemoryStorage() const {
|
||||||
return std::make_unique<MemoryStorage>(size(), data());
|
return MemoryStoragePointer(new MemoryStorage(size(), data()));
|
||||||
}
|
}
|
||||||
|
|
||||||
FileStoragePointer Storage::toFileStorage(const QString& filename) const {
|
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);
|
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) {
|
FileStoragePointer FileStorage::create(const QString& filename, size_t size, const uint8_t* data) {
|
||||||
QFile file(filename);
|
QFile file(filename);
|
||||||
if (!file.open(QFile::ReadWrite | QIODevice::Truncate)) {
|
if (!file.open(QFile::ReadWrite | QIODevice::Truncate)) {
|
||||||
|
@ -52,7 +52,7 @@ FileStoragePointer FileStorage::create(const QString& filename, size_t size, con
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
file.close();
|
file.close();
|
||||||
return std::make_unique<FileStorage>(filename);
|
return FileStoragePointer(new FileStorage(filename));
|
||||||
}
|
}
|
||||||
|
|
||||||
FileStorage::FileStorage(const QString& filename) : _file(filename) {
|
FileStorage::FileStorage(const QString& filename) : _file(filename) {
|
||||||
|
@ -75,12 +75,3 @@ FileStorage::~FileStorage() {
|
||||||
_file.close();
|
_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>;
|
using MemoryStoragePointer = std::unique_ptr<MemoryStorage>;
|
||||||
class FileStorage;
|
class FileStorage;
|
||||||
using FileStoragePointer = std::unique_ptr<FileStorage>;
|
using FileStoragePointer = std::unique_ptr<FileStorage>;
|
||||||
|
class ViewStorage;
|
||||||
|
using ViewStoragePointer = std::unique_ptr<ViewStorage>;
|
||||||
|
|
||||||
class Storage {
|
class Storage {
|
||||||
public:
|
public:
|
||||||
virtual ~Storage() {}
|
virtual ~Storage() {}
|
||||||
virtual const uint8_t* data() const = 0;
|
virtual const uint8_t* data() const = 0;
|
||||||
virtual size_t size() const = 0;
|
virtual size_t size() const = 0;
|
||||||
|
ViewStoragePointer createView(size_t size, size_t offset = 0) const;
|
||||||
FileStoragePointer toFileStorage(const QString& filename) const;
|
FileStoragePointer toFileStorage(const QString& filename) const;
|
||||||
MemoryStoragePointer toMemoryStorage() const;
|
MemoryStoragePointer toMemoryStorage() const;
|
||||||
};
|
};
|
||||||
|
@ -37,8 +39,8 @@ namespace storage {
|
||||||
class MemoryStorage : public Storage {
|
class MemoryStorage : public Storage {
|
||||||
public:
|
public:
|
||||||
MemoryStorage(size_t size, const uint8_t* data);
|
MemoryStorage(size_t size, const uint8_t* data);
|
||||||
const uint8_t* data() const override;
|
const uint8_t* data() const override { return _data.data(); }
|
||||||
size_t size() const override;
|
size_t size() const override { return _data.size(); }
|
||||||
private:
|
private:
|
||||||
std::vector<uint8_t> _data;
|
std::vector<uint8_t> _data;
|
||||||
};
|
};
|
||||||
|
@ -52,13 +54,22 @@ namespace storage {
|
||||||
FileStorage(const FileStorage& other) = delete;
|
FileStorage(const FileStorage& other) = delete;
|
||||||
FileStorage& operator=(const FileStorage& other) = delete;
|
FileStorage& operator=(const FileStorage& other) = delete;
|
||||||
|
|
||||||
const uint8_t* data() const override;
|
const uint8_t* data() const override { return _mapped; }
|
||||||
size_t size() const override;
|
size_t size() const override { return _file.size(); }
|
||||||
private:
|
private:
|
||||||
QFile _file;
|
QFile _file;
|
||||||
uint8_t* _mapped { nullptr };
|
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