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) {
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);
}
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);
}
@ -973,4 +975,3 @@ Texture::ExternalUpdates Texture::getUpdates() const {
void Texture::setStorage(std::unique_ptr<Storage>& newStorage) {
_storage.swap(newStorage);
}

View file

@ -12,7 +12,10 @@
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();
if (0 == viewSize) {
viewSize = selfSize;
@ -20,14 +23,16 @@ ViewStoragePointer Storage::createView(size_t viewSize, size_t offset) const {
if ((viewSize + offset) > selfSize) {
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 {
return MemoryStoragePointer(new MemoryStorage(size(), data()));
StoragePointer Storage::toMemoryStorage() const {
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());
}
@ -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);
if (!file.open(QFile::ReadWrite | QIODevice::Truncate)) {
throw std::runtime_error("Unable to open file for writing");

View file

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