asset nested content

This commit is contained in:
2019-03-31 02:39:09 +07:00
parent c442707656
commit 227d2b3391
4 changed files with 71 additions and 14 deletions

View File

@@ -43,7 +43,7 @@ namespace e2d
template < typename Asset, typename Content >
class content_asset;
class content_asset_base;
class asset;
class library;

View File

@@ -32,23 +32,26 @@ namespace e2d
};
//
// content_asset_base
// asset
//
class content_asset_base
class asset
: private noncopyable
, public ref_counter<content_asset_base> {
, public ref_counter<asset> {
public:
content_asset_base() = default;
virtual ~content_asset_base() noexcept = default;
asset() = default;
virtual ~asset() noexcept = default;
};
using asset_ptr = intrusive_ptr<asset>;
using nested_content = hash_map<str_hash, asset_ptr>;
//
// content_asset
//
template < typename Asset, typename Content >
class content_asset : public content_asset_base {
class content_asset : public asset {
public:
using asset_type = Asset;
using content_type = Content;
@@ -61,14 +64,35 @@ namespace e2d
return load_result(new Asset(std::move(content)));
}
static load_result create(Content content, nested_content nested_content) {
return load_result(new Asset(std::move(content), std::move(nested_content)));
}
content_asset(Content content)
: content_(std::move(content)) {}
content_asset(Content content, nested_content nested_content)
: content_(std::move(content))
, nested_content_(std::move(nested_content)) {}
const Content& content() const noexcept {
return content_;
}
asset_ptr find_nested_asset(str_view name) const noexcept {
const auto iter = nested_content_.find(name);
return iter != nested_content_.end()
? iter->second
: nullptr;
}
template < typename T >
intrusive_ptr<T> find_nested_asset(str_view name) const noexcept {
return dynamic_pointer_cast<T>(find_nested_asset(name));
}
private:
Content content_;
nested_content nested_content_;
};
//
@@ -116,13 +140,13 @@ namespace e2d
class asset_cache : public asset_cache_base
, public module<asset_cache<Asset>> {
public:
using asset_result = typename Asset::load_result;
using asset_ptr = typename Asset::ptr;
public:
asset_cache(library& l);
~asset_cache() noexcept final;
asset_result find(str_hash address) const;
void store(str_hash address, const asset_result& asset);
asset_ptr find(str_hash address) const;
void store(str_hash address, const asset_ptr& asset);
void clear() noexcept;
std::size_t asset_count() const noexcept;
@@ -131,7 +155,7 @@ namespace e2d
private:
library& library_;
mutable std::mutex mutex_;
hash_map<str_hash, asset_result> assets_;
hash_map<str_hash, asset_ptr> assets_;
};
}

View File

@@ -43,7 +43,7 @@ namespace e2d
.then([
&cache,
address_hash = make_hash(address)
](auto&& new_asset){
](const typename Asset::load_result& new_asset){
cache.store(address_hash, new_asset);
return new_asset;
});
@@ -61,7 +61,7 @@ namespace e2d
asset_cache<T>::~asset_cache() noexcept = default;
template < typename T >
typename asset_cache<T>::asset_result asset_cache<T>::find(str_hash address) const {
typename asset_cache<T>::asset_ptr asset_cache<T>::find(str_hash address) const {
std::lock_guard<std::mutex> guard(mutex_);
const auto iter = assets_.find(address);
return iter != assets_.end()
@@ -70,7 +70,7 @@ namespace e2d
}
template < typename T >
void asset_cache<T>::store(str_hash address, const asset_result& asset) {
void asset_cache<T>::store(str_hash address, const asset_ptr& asset) {
std::lock_guard<std::mutex> guard(mutex_);
assets_[address] = asset;
}

View File

@@ -22,6 +22,39 @@ namespace
modules::shutdown<starter>();
}
};
class fake_asset final : public content_asset<fake_asset, int> {
public:
fake_asset(content_type content)
: content_asset<fake_asset, int>(std::move(content)) {}
fake_asset(content_type content, nested_content nested_content)
: content_asset<fake_asset, int>(std::move(content), std::move(nested_content)) {}
static load_async_result load_async(library& library, str_view address) {
E2D_UNUSED(library, address);
return stdex::make_resolved_promise(fake_asset::create(42, {
{"21", fake_asset::create(21)},
{"84", fake_asset::create(84)}}));
}
};
}
TEST_CASE("asset"){
safe_starter_initializer initializer;
library& l = the<library>();
{
auto fa = l.load_asset<fake_asset>("");
REQUIRE(fa);
REQUIRE(fa->content() == 42);
REQUIRE_FALSE(fa->find_nested_asset("none"));
REQUIRE(fa->find_nested_asset("21"));
REQUIRE_FALSE(fa->find_nested_asset<binary_asset>("21"));
REQUIRE(fa->find_nested_asset<fake_asset>("21"));
REQUIRE(fa->find_nested_asset<fake_asset>("21")->content() == 21);
REQUIRE(fa->find_nested_asset<fake_asset>("84")->content() == 84);
}
}
TEST_CASE("library"){