10 #ifndef hifi_Storage_h
11 #define hifi_Storage_h
19 #include <QtCore/QFile>
20 #include <QtCore/QString>
24 using Pointer = std::shared_ptr<const Storage>;
25 using StoragePointer = Pointer;
28 using Builder = std::function<StoragePointer()>;
29 using Builders = std::vector<Builder>;
32 class Storage :
public std::enable_shared_from_this<Storage> {
35 virtual const uint8_t* data()
const = 0;
36 virtual uint8_t* mutableData() = 0;
37 virtual size_t size()
const = 0;
38 virtual operator bool()
const {
return true; }
40 StoragePointer createView(
size_t size = 0,
size_t offset = 0)
const;
41 StoragePointer toFileStorage(
const QString& filename)
const;
42 StoragePointer toMemoryStorage()
const;
45 inline size_t getSize()
const {
return size(); }
46 inline const uint8_t* readData()
const {
return data(); }
49 class MemoryStorage :
public Storage {
51 MemoryStorage(
size_t size,
const uint8_t* data =
nullptr);
52 const uint8_t* data()
const override {
return _data.data(); }
53 uint8_t* data() {
return _data.data(); }
54 uint8_t* mutableData()
override {
return _data.data(); }
55 size_t size()
const override {
return _data.size(); }
56 operator bool()
const override {
return true; }
58 std::vector<uint8_t> _data;
61 class FileStorage :
public Storage {
63 static StoragePointer create(
const QString& filename,
size_t size,
const uint8_t* data);
64 FileStorage(
const QString& filename);
67 FileStorage(
const FileStorage& other) =
delete;
68 FileStorage& operator=(
const FileStorage& other) =
delete;
70 const uint8_t* data()
const override {
return _mapped; }
71 uint8_t* mutableData()
override {
return _hasWriteAccess ? _mapped :
nullptr; }
72 size_t size()
const override {
return _size; }
73 operator bool()
const override {
return _valid; }
78 bool _valid {
false };
79 bool _hasWriteAccess {
false };
81 uint8_t* _mapped {
nullptr };
84 class ViewStorage :
public Storage {
86 ViewStorage(
const storage::StoragePointer& owner,
size_t size,
const uint8_t* data);
87 const uint8_t* data()
const override {
return _data; }
88 uint8_t* mutableData()
override {
throw std::runtime_error(
"Cannot modify ViewStorage"); }
89 size_t size()
const override {
return _size; }
90 operator bool()
const override {
return *_owner; }
92 const storage::StoragePointer _owner;