From cfe14518a1ba08884a8c1399b3ac78051cab9815 Mon Sep 17 00:00:00 2001 From: Zach Pomerantz Date: Thu, 23 Feb 2017 16:27:08 -0500 Subject: [PATCH] KTXCache --- .../src/model-networking/KTXCache.cpp | 49 +++++++++++++ .../src/model-networking/KTXCache.h | 69 +++++++++++++++++++ 2 files changed, 118 insertions(+) create mode 100644 libraries/model-networking/src/model-networking/KTXCache.cpp create mode 100644 libraries/model-networking/src/model-networking/KTXCache.h diff --git a/libraries/model-networking/src/model-networking/KTXCache.cpp b/libraries/model-networking/src/model-networking/KTXCache.cpp new file mode 100644 index 0000000000..1ab32698b6 --- /dev/null +++ b/libraries/model-networking/src/model-networking/KTXCache.cpp @@ -0,0 +1,49 @@ +// +// KTXCache.cpp +// libraries/model-networking/src +// +// Created by Zach Pomerantz on 2/22/2017. +// Copyright 2017 High Fidelity, Inc. +// +// Distributed under the Apache License, Version 2.0. +// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html +// + +#include "KTXCache.h" + +#include + +KTXFilePointer KTXCache::writeFile(Data data) { + return std::static_pointer_cast(FileCache::writeFile(data.key, data.data, data.length, (void*)&data)); +} + +KTXFilePointer KTXCache::getFile(const QUrl& url) { + Key key; + { + Lock lock(_urlMutex); + const auto it = _urlMap.find(url); + if (it != _urlMap.cend()) { + key = it->second; + } + } + + KTXFilePointer file; + if (!key.empty()) { + file = std::static_pointer_cast(FileCache::getFile(key)); + } + + return file; +} + +File* KTXCache::createFile(const Key& key, const std::string& filepath, size_t length, void* extra) { + const QUrl& url = reinterpret_cast(extra)->url; + Lock lock(_urlMutex); + _urlMap[url] = key; + return new KTXFile(key, filepath, length, url); +} + +void KTXCache::evictedFile(const FilePointer& file) { + const QUrl url = std::static_pointer_cast(file)->getUrl(); + Lock lock(_urlMutex); + _urlMap.erase(url); +} diff --git a/libraries/model-networking/src/model-networking/KTXCache.h b/libraries/model-networking/src/model-networking/KTXCache.h new file mode 100644 index 0000000000..5b9cb04061 --- /dev/null +++ b/libraries/model-networking/src/model-networking/KTXCache.h @@ -0,0 +1,69 @@ +// +// KTXCache.h +// libraries/model-networking/src +// +// Created by Zach Pomerantz 2/22/2017. +// Copyright 2017 High Fidelity, Inc. +// +// Distributed under the Apache License, Version 2.0. +// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html +// + +#ifndef hifi_KTXCache_h +#define hifi_KTXCache_h + +#include + +#include + +class KTXFile; +using KTXFilePointer = std::shared_ptr; + +class KTXCache : public FileCache { + Q_OBJECT + +public: + KTXCache(const std::string& dir, const std::string& ext) : FileCache(dir, ext) {} + + struct Data { + Data(const QUrl& url, const Key& key, const char* data, size_t length) : + url(url), key(key), data(data), length(length) {} + const QUrl url; + const Key key; + const char* data; + size_t length; + }; + + KTXFilePointer writeFile(Data data); + KTXFilePointer getFile(const QUrl& url); + +protected: + File* createFile(const Key& key, const std::string& filepath, size_t length, void* extra) override final; + void evictedFile(const FilePointer& file) override final; + +private: + using Mutex = std::mutex; + using Lock = std::lock_guard; + struct QUrlHasher { std::size_t operator()(QUrl const& url) const { return qHash(url); } }; + + std::unordered_map _urlMap; + Mutex _urlMutex; +}; + +class KTXFile : public File { + Q_OBJECT + +public: + QUrl getUrl() const { return _url; } + +protected: + KTXFile(const Key& key, const std::string& filepath, size_t length, const QUrl& url) : + File(key, filepath, length), _url(url) {} + +private: + friend class KTXCache; + + const QUrl _url; +}; + +#endif // hifi_KTXCache_h