Fix shared pointer usage in storage abstraction

This commit is contained in:
Bradley Austin Davis 2017-03-07 13:36:51 -08:00 committed by Brad Davis
parent e94f803b84
commit 62fcd238ae
3 changed files with 20 additions and 20 deletions

View file

@ -389,12 +389,14 @@ const Element& Texture::getStoredMipFormat() const {
} }
void Texture::assignStoredMip(uint16 level, Size size, const Byte* bytes) { void Texture::assignStoredMip(uint16 level, Size size, const Byte* bytes) {
storage::StoragePointer storage { new storage::MemoryStorage(size, bytes) }; auto rawStoragePointer = new storage::MemoryStorage(size, bytes);
storage::StoragePointer storage = rawStoragePointer->shared_from_this();
assignStoredMip(level, storage); assignStoredMip(level, storage);
} }
void Texture::assignStoredMipFace(uint16 level, uint8 face, Size size, const Byte* bytes) { void Texture::assignStoredMipFace(uint16 level, uint8 face, Size size, const Byte* bytes) {
storage::StoragePointer storage { new storage::MemoryStorage(size, bytes) }; auto rawStoragePointer = new storage::MemoryStorage(size, bytes);
storage::StoragePointer storage = rawStoragePointer->shared_from_this();
assignStoredMipFace(level, face, storage); assignStoredMipFace(level, face, storage);
} }
@ -973,4 +975,3 @@ Texture::ExternalUpdates Texture::getUpdates() const {
void Texture::setStorage(std::unique_ptr<Storage>& newStorage) { void Texture::setStorage(std::unique_ptr<Storage>& newStorage) {
_storage.swap(newStorage); _storage.swap(newStorage);
} }

View file

@ -12,7 +12,10 @@
using namespace storage; using namespace storage;
ViewStoragePointer Storage::createView(size_t viewSize, size_t offset) const { ViewStorage::ViewStorage(const storage::StoragePointer& owner, size_t size, const uint8_t* data)
: _owner(owner), _size(size), _data(data) {}
StoragePointer Storage::createView(size_t viewSize, size_t offset) const {
auto selfSize = size(); auto selfSize = size();
if (0 == viewSize) { if (0 == viewSize) {
viewSize = selfSize; viewSize = selfSize;
@ -20,14 +23,16 @@ ViewStoragePointer Storage::createView(size_t viewSize, size_t offset) const {
if ((viewSize + offset) > selfSize) { if ((viewSize + offset) > selfSize) {
throw std::runtime_error("Invalid mapping range"); throw std::runtime_error("Invalid mapping range");
} }
return ViewStoragePointer(new ViewStorage(shared_from_this(), viewSize, data() + offset)); auto viewPointer = new ViewStorage(shared_from_this(), viewSize, data() + offset);
return viewPointer->shared_from_this();
} }
MemoryStoragePointer Storage::toMemoryStorage() const { StoragePointer Storage::toMemoryStorage() const {
return MemoryStoragePointer(new MemoryStorage(size(), data())); auto rawPointer = new MemoryStorage(size(), data());
return rawPointer->shared_from_this();
} }
FileStoragePointer Storage::toFileStorage(const QString& filename) const { StoragePointer Storage::toFileStorage(const QString& filename) const {
return FileStorage::create(filename, size(), data()); return FileStorage::create(filename, size(), data());
} }
@ -38,7 +43,7 @@ MemoryStorage::MemoryStorage(size_t size, const uint8_t* data) {
} }
} }
FileStoragePointer FileStorage::create(const QString& filename, size_t size, const uint8_t* data) { StoragePointer 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)) {
throw std::runtime_error("Unable to open file for writing"); throw std::runtime_error("Unable to open file for writing");

View file

@ -19,12 +19,6 @@
namespace storage { namespace storage {
class Storage; class Storage;
using StoragePointer = std::shared_ptr<const Storage>; using StoragePointer = std::shared_ptr<const Storage>;
class MemoryStorage;
using MemoryStoragePointer = std::shared_ptr<const MemoryStorage>;
class FileStorage;
using FileStoragePointer = std::shared_ptr<const FileStorage>;
class ViewStorage;
using ViewStoragePointer = std::shared_ptr<const ViewStorage>;
class Storage : public std::enable_shared_from_this<Storage> { class Storage : public std::enable_shared_from_this<Storage> {
public: public:
@ -32,9 +26,9 @@ namespace 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 = 0, size_t offset = 0) const; StoragePointer createView(size_t size = 0, size_t offset = 0) const;
FileStoragePointer toFileStorage(const QString& filename) const; StoragePointer toFileStorage(const QString& filename) const;
MemoryStoragePointer toMemoryStorage() const; StoragePointer toMemoryStorage() const;
// Aliases to prevent having to re-write a ton of code // Aliases to prevent having to re-write a ton of code
inline size_t getSize() const { return size(); } inline size_t getSize() const { return size(); }
@ -53,7 +47,7 @@ namespace storage {
class FileStorage : public Storage { class FileStorage : public Storage {
public: public:
static FileStoragePointer create(const QString& filename, size_t size, const uint8_t* data); static StoragePointer create(const QString& filename, size_t size, const uint8_t* data);
FileStorage(const QString& filename); FileStorage(const QString& filename);
~FileStorage(); ~FileStorage();
// Prevent copying // Prevent copying
@ -69,7 +63,7 @@ namespace storage {
class ViewStorage : public Storage { class ViewStorage : public Storage {
public: public:
ViewStorage(const storage::StoragePointer& owner, size_t size, const uint8_t* data) : _owner(owner), _size(size), _data(data) {} ViewStorage(const storage::StoragePointer& owner, size_t size, const uint8_t* data);
const uint8_t* data() const override { return _data; } const uint8_t* data() const override { return _data; }
size_t size() const override { return _size; } size_t size() const override { return _size; }
private: private: