mirror of
https://github.com/enduro2d/enduro2d.git
synced 2025-12-15 00:11:55 +07:00
hide some library classes to impl namespace
This commit is contained in:
@@ -92,7 +92,7 @@ namespace e2d
|
||||
|
||||
class factory;
|
||||
class library;
|
||||
class asset_cache;
|
||||
class asset_store;
|
||||
class asset_group;
|
||||
class asset_dependencies;
|
||||
|
||||
|
||||
@@ -71,24 +71,27 @@ namespace e2d
|
||||
};
|
||||
|
||||
//
|
||||
// asset_cache_base
|
||||
// asset_cache
|
||||
//
|
||||
|
||||
class asset_cache_base : private noncopyable {
|
||||
namespace impl
|
||||
{
|
||||
class asset_cache;
|
||||
using asset_cache_iptr = intrusive_ptr<asset_cache>;
|
||||
|
||||
class asset_cache
|
||||
: private noncopyable
|
||||
, public ref_counter<asset_cache> {
|
||||
public:
|
||||
asset_cache_base() = default;
|
||||
virtual ~asset_cache_base() noexcept = default;
|
||||
asset_cache() = default;
|
||||
virtual ~asset_cache() noexcept = default;
|
||||
|
||||
virtual std::size_t asset_count() const noexcept = 0;
|
||||
virtual std::size_t unload_unused_assets() noexcept = 0;
|
||||
};
|
||||
|
||||
//
|
||||
// typed_asset_cache
|
||||
//
|
||||
|
||||
template < typename Asset >
|
||||
class typed_asset_cache : public asset_cache_base {
|
||||
class typed_asset_cache : public asset_cache {
|
||||
public:
|
||||
using asset_ptr = typename Asset::ptr;
|
||||
public:
|
||||
@@ -103,15 +106,16 @@ namespace e2d
|
||||
private:
|
||||
hash_map<str_hash, asset_ptr> assets_;
|
||||
};
|
||||
}
|
||||
|
||||
//
|
||||
// asset_cache
|
||||
// asset_store
|
||||
//
|
||||
|
||||
class asset_cache final {
|
||||
class asset_store final {
|
||||
public:
|
||||
asset_cache() = default;
|
||||
~asset_cache() noexcept = default;
|
||||
asset_store() = default;
|
||||
~asset_store() noexcept = default;
|
||||
|
||||
template < typename Asset >
|
||||
void store(str_hash address, const typename Asset::ptr& asset);
|
||||
@@ -125,8 +129,7 @@ namespace e2d
|
||||
|
||||
std::size_t unload_unused_assets() noexcept;
|
||||
private:
|
||||
using asset_cache_uptr = std::unique_ptr<asset_cache_base>;
|
||||
hash_map<utils::type_family_id, asset_cache_uptr> caches_;
|
||||
hash_map<utils::type_family_id, impl::asset_cache_iptr> caches_;
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
@@ -74,6 +74,8 @@ namespace e2d
|
||||
// typed_asset_cache
|
||||
//
|
||||
|
||||
namespace impl
|
||||
{
|
||||
template < typename T >
|
||||
typename typed_asset_cache<T>::asset_ptr typed_asset_cache<T>::find(str_hash address) const noexcept {
|
||||
const auto iter = assets_.find(address);
|
||||
@@ -105,31 +107,32 @@ namespace e2d
|
||||
}
|
||||
return result;
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
// asset_cache
|
||||
// asset_store
|
||||
//
|
||||
|
||||
template < typename Asset >
|
||||
void asset_cache::store(str_hash address, const typename Asset::ptr& asset) {
|
||||
void asset_store::store(str_hash address, const typename Asset::ptr& asset) {
|
||||
const auto family = utils::type_family<Asset>::id();
|
||||
const auto iter = caches_.find(family);
|
||||
typed_asset_cache<Asset>* cache = iter != caches_.end() && iter->second
|
||||
? static_cast<typed_asset_cache<Asset>*>(iter->second.get())
|
||||
impl::typed_asset_cache<Asset>* cache = iter != caches_.end() && iter->second
|
||||
? static_cast<impl::typed_asset_cache<Asset>*>(iter->second.get())
|
||||
: nullptr;
|
||||
if ( !cache ) {
|
||||
cache = static_cast<typed_asset_cache<Asset>*>(caches_.emplace(
|
||||
cache = static_cast<impl::typed_asset_cache<Asset>*>(caches_.emplace(
|
||||
family,
|
||||
std::make_unique<typed_asset_cache<Asset>>()).first->second.get());
|
||||
make_intrusive<impl::typed_asset_cache<Asset>>()).first->second.get());
|
||||
}
|
||||
cache->store(address, asset);
|
||||
}
|
||||
|
||||
template < typename Asset >
|
||||
typename Asset::ptr asset_cache::find(str_hash address) const noexcept {
|
||||
typename Asset::ptr asset_store::find(str_hash address) const noexcept {
|
||||
const auto iter = caches_.find(utils::type_family<Asset>::id());
|
||||
const typed_asset_cache<Asset>* cache = iter != caches_.end() && iter->second
|
||||
? static_cast<const typed_asset_cache<Asset>*>(iter->second.get())
|
||||
const impl::typed_asset_cache<Asset>* cache = iter != caches_.end() && iter->second
|
||||
? static_cast<const impl::typed_asset_cache<Asset>*>(iter->second.get())
|
||||
: nullptr;
|
||||
return cache
|
||||
? cache->find(address)
|
||||
@@ -137,14 +140,14 @@ namespace e2d
|
||||
}
|
||||
|
||||
template < typename Asset >
|
||||
std::size_t asset_cache::asset_count() const noexcept {
|
||||
std::size_t asset_store::asset_count() const noexcept {
|
||||
const auto iter = caches_.find(utils::type_family<Asset>::id());
|
||||
return iter != caches_.end() && iter->second
|
||||
? iter->second->asset_count()
|
||||
: 0u;
|
||||
}
|
||||
|
||||
inline std::size_t asset_cache::asset_count() const noexcept {
|
||||
inline std::size_t asset_store::asset_count() const noexcept {
|
||||
return std::accumulate(
|
||||
caches_.begin(), caches_.end(), std::size_t(0),
|
||||
[](std::size_t acc, const auto& p){
|
||||
@@ -154,7 +157,7 @@ namespace e2d
|
||||
});
|
||||
}
|
||||
|
||||
inline std::size_t asset_cache::unload_unused_assets() noexcept {
|
||||
inline std::size_t asset_store::unload_unused_assets() noexcept {
|
||||
return std::accumulate(
|
||||
caches_.begin(), caches_.end(), std::size_t(0),
|
||||
[](std::size_t acc, const auto& p){
|
||||
|
||||
@@ -27,6 +27,8 @@ namespace e2d
|
||||
// loading_asset
|
||||
//
|
||||
|
||||
namespace impl
|
||||
{
|
||||
class loading_asset;
|
||||
using loading_asset_iptr = intrusive_ptr<loading_asset>;
|
||||
|
||||
@@ -60,6 +62,7 @@ namespace e2d
|
||||
str_hash address_;
|
||||
promise_type promise_;
|
||||
};
|
||||
}
|
||||
|
||||
//
|
||||
// library
|
||||
@@ -71,7 +74,7 @@ namespace e2d
|
||||
~library() noexcept final;
|
||||
|
||||
const url& root() const noexcept;
|
||||
const asset_cache& cache() const noexcept;
|
||||
const asset_store& store() const noexcept;
|
||||
|
||||
std::size_t unload_unused_assets() noexcept;
|
||||
std::size_t loading_asset_count() const noexcept;
|
||||
@@ -89,11 +92,11 @@ namespace e2d
|
||||
typename Nested::load_async_result load_asset_async(str_view address) const;
|
||||
private:
|
||||
template < typename Asset >
|
||||
vector<loading_asset_iptr>::iterator
|
||||
vector<impl::loading_asset_iptr>::iterator
|
||||
find_loading_asset_iter_(str_hash address) const noexcept;
|
||||
|
||||
template < typename Asset >
|
||||
typename typed_loading_asset<Asset>::ptr
|
||||
typename impl::typed_loading_asset<Asset>::ptr
|
||||
find_loading_asset_(str_hash address) const noexcept;
|
||||
|
||||
template < typename Asset >
|
||||
@@ -104,9 +107,9 @@ namespace e2d
|
||||
starter::library_parameters params_;
|
||||
std::atomic<bool> cancelled_{false};
|
||||
private:
|
||||
mutable asset_cache cache_;
|
||||
mutable asset_store store_;
|
||||
mutable std::recursive_mutex mutex_;
|
||||
mutable vector<loading_asset_iptr> loading_assets_;
|
||||
mutable vector<impl::loading_asset_iptr> loading_assets_;
|
||||
};
|
||||
|
||||
//
|
||||
@@ -136,6 +139,8 @@ namespace e2d
|
||||
// asset_dependency
|
||||
//
|
||||
|
||||
namespace impl
|
||||
{
|
||||
class asset_dependency;
|
||||
using asset_dependency_iptr = intrusive_ptr<asset_dependency>;
|
||||
|
||||
@@ -164,6 +169,7 @@ namespace e2d
|
||||
private:
|
||||
str main_address_;
|
||||
};
|
||||
}
|
||||
|
||||
//
|
||||
// asset_dependencies
|
||||
@@ -178,7 +184,7 @@ namespace e2d
|
||||
asset_dependencies& add_dependency(str_view address);
|
||||
stdex::promise<asset_group> load_async(const library& library) const;
|
||||
private:
|
||||
flat_multimap<str, asset_dependency_iptr> dependencies_;
|
||||
flat_multimap<str, impl::asset_dependency_iptr> dependencies_;
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
@@ -11,9 +11,11 @@
|
||||
namespace e2d
|
||||
{
|
||||
//
|
||||
// loading_asset
|
||||
// typed_loading_asset
|
||||
//
|
||||
|
||||
namespace impl
|
||||
{
|
||||
template < typename Asset >
|
||||
typed_loading_asset<Asset>::typed_loading_asset(str_hash address, promise_type promise)
|
||||
: address_(address)
|
||||
@@ -39,6 +41,7 @@ namespace e2d
|
||||
void typed_loading_asset<Asset>::wait(deferrer& deferrer) const noexcept {
|
||||
deferrer.active_safe_wait_promise(promise_);
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
// library
|
||||
@@ -56,12 +59,12 @@ namespace e2d
|
||||
return params_.root();
|
||||
}
|
||||
|
||||
inline const asset_cache& library::cache() const noexcept {
|
||||
return cache_;
|
||||
inline const asset_store& library::store() const noexcept {
|
||||
return store_;
|
||||
}
|
||||
|
||||
inline std::size_t library::unload_unused_assets() noexcept {
|
||||
return cache_.unload_unused_assets();
|
||||
return store_.unload_unused_assets();
|
||||
}
|
||||
|
||||
inline std::size_t library::loading_asset_count() const noexcept {
|
||||
@@ -87,8 +90,8 @@ namespace e2d
|
||||
return stdex::make_rejected_promise<typename Asset::load_result>(library_cancelled_exception());
|
||||
}
|
||||
|
||||
if ( auto cached_asset = cache_.find<Asset>(main_address_hash) ) {
|
||||
return stdex::make_resolved_promise(std::move(cached_asset));
|
||||
if ( auto stored_asset = store_.find<Asset>(main_address_hash) ) {
|
||||
return stdex::make_resolved_promise(std::move(stored_asset));
|
||||
}
|
||||
|
||||
if ( auto asset = find_loading_asset_<Asset>(main_address_hash) ) {
|
||||
@@ -101,7 +104,7 @@ namespace e2d
|
||||
main_address_hash
|
||||
](const typename Asset::load_result& new_asset){
|
||||
std::lock_guard<std::recursive_mutex> guard(mutex_);
|
||||
cache_.store<Asset>(main_address_hash, new_asset);
|
||||
store_.store<Asset>(main_address_hash, new_asset);
|
||||
remove_loading_asset_<Asset>(main_address_hash);
|
||||
return new_asset;
|
||||
}).except([
|
||||
@@ -136,7 +139,7 @@ namespace e2d
|
||||
|
||||
const auto zero_us = time::to_chrono(make_microseconds(0));
|
||||
if ( p.wait_for(zero_us) == stdex::promise_wait_status::timeout ) {
|
||||
loading_assets_.push_back(new typed_loading_asset<Asset>(main_address_hash, p));
|
||||
loading_assets_.push_back(new impl::typed_loading_asset<Asset>(main_address_hash, p));
|
||||
}
|
||||
|
||||
return p;
|
||||
@@ -174,22 +177,22 @@ namespace e2d
|
||||
}
|
||||
|
||||
template < typename Asset >
|
||||
vector<loading_asset_iptr>::iterator
|
||||
vector<impl::loading_asset_iptr>::iterator
|
||||
library::find_loading_asset_iter_(str_hash address) const noexcept {
|
||||
return std::find_if(
|
||||
loading_assets_.begin(), loading_assets_.end(),
|
||||
[address](const loading_asset_iptr& asset) noexcept {
|
||||
[address](const impl::loading_asset_iptr& asset) noexcept {
|
||||
return asset->address() == address
|
||||
&& dynamic_pointer_cast<typed_loading_asset<Asset>>(asset);
|
||||
&& dynamic_pointer_cast<impl::typed_loading_asset<Asset>>(asset);
|
||||
});
|
||||
}
|
||||
|
||||
template < typename Asset >
|
||||
typename typed_loading_asset<Asset>::ptr
|
||||
typename impl::typed_loading_asset<Asset>::ptr
|
||||
library::find_loading_asset_(str_hash address) const noexcept {
|
||||
auto iter = find_loading_asset_iter_<Asset>(address);
|
||||
return iter != loading_assets_.end()
|
||||
? static_pointer_cast<typed_loading_asset<Asset>>(*iter)
|
||||
? static_pointer_cast<impl::typed_loading_asset<Asset>>(*iter)
|
||||
: nullptr;
|
||||
}
|
||||
|
||||
@@ -261,6 +264,8 @@ namespace e2d
|
||||
// asset_dependency
|
||||
//
|
||||
|
||||
namespace impl
|
||||
{
|
||||
template < typename Asset >
|
||||
typed_asset_dependency<Asset>::typed_asset_dependency(str_view address)
|
||||
: main_address_(address::parent(address)) {}
|
||||
@@ -280,6 +285,7 @@ namespace e2d
|
||||
return asset_ptr(main_asset);
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
// asset_dependencies
|
||||
@@ -287,7 +293,8 @@ namespace e2d
|
||||
|
||||
template < typename Asset, typename Nested >
|
||||
asset_dependencies& asset_dependencies::add_dependency(str_view address) {
|
||||
asset_dependency_iptr dep(new typed_asset_dependency<Asset>(address));
|
||||
impl::asset_dependency_iptr dep =
|
||||
make_intrusive<impl::typed_asset_dependency<Asset>>(address);
|
||||
dependencies_.emplace(dep->main_address(), std::move(dep));
|
||||
return *this;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user