mirror of
https://github.com/enduro2d/enduro2d.git
synced 2025-12-15 00:11:55 +07:00
asset nested content
This commit is contained in:
@@ -43,7 +43,7 @@ namespace e2d
|
||||
|
||||
template < typename Asset, typename Content >
|
||||
class content_asset;
|
||||
class content_asset_base;
|
||||
class asset;
|
||||
|
||||
class library;
|
||||
|
||||
|
||||
@@ -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_;
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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"){
|
||||
|
||||
Reference in New Issue
Block a user