Add view storage

This commit is contained in:
Brad Davis 2017-02-17 12:49:55 -08:00
parent 3ed051317b
commit 285222d490
2 changed files with 26 additions and 24 deletions

View file

@ -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();
}

View file

@ -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;
};
}