refl bugfix
This commit is contained in:
parent
b4028d719f
commit
dc3bce761e
@ -8,6 +8,8 @@ namespace singleapi {
|
|||||||
};
|
};
|
||||||
template <class T>
|
template <class T>
|
||||||
concept is_unique_wrap_t = requires(T* t) { typename T::UniqueType; { t->Ptr() } -> std::same_as<typename T::UniqueType*>; };
|
concept is_unique_wrap_t = requires(T* t) { typename T::UniqueType; { t->Ptr() } -> std::same_as<typename T::UniqueType*>; };
|
||||||
|
template <class T>
|
||||||
|
concept is_reinitialize_t = requires(T * t) { { t->reinitialize() }; };
|
||||||
struct MemoryInfo {
|
struct MemoryInfo {
|
||||||
void* data;
|
void* data;
|
||||||
bool isAlive;
|
bool isAlive;
|
||||||
@ -67,6 +69,9 @@ public:
|
|||||||
else {
|
else {
|
||||||
ms_Singleton = new(info.data)T(std::forward<Args>(args)...);
|
ms_Singleton = new(info.data)T(std::forward<Args>(args)...);
|
||||||
}
|
}
|
||||||
|
if constexpr (is_reinitialize_t<T>) {
|
||||||
|
ms_Singleton->reinitialize();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
~UniquePtr() {
|
~UniquePtr() {
|
||||||
using namespace singleapi;
|
using namespace singleapi;
|
||||||
@ -109,6 +114,9 @@ public:
|
|||||||
else {
|
else {
|
||||||
ms_Singleton = new(info.data)T(std::forward<Args>(args)...);
|
ms_Singleton = new(info.data)T(std::forward<Args>(args)...);
|
||||||
}
|
}
|
||||||
|
if constexpr (is_reinitialize_t<T>) {
|
||||||
|
ms_Singleton->reinitialize();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
~UniquePtr() {
|
~UniquePtr() {
|
||||||
using namespace singleapi;
|
using namespace singleapi;
|
||||||
|
|||||||
@ -39,4 +39,10 @@ namespace api {
|
|||||||
}
|
}
|
||||||
return new_meta;
|
return new_meta;
|
||||||
}
|
}
|
||||||
|
void AssetModule::InitResourceType()
|
||||||
|
{
|
||||||
|
meta::for_each_type<Resources>([]<typename T>() {
|
||||||
|
refl::register_meta<T>();
|
||||||
|
});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@ -6,5 +6,6 @@ namespace api {
|
|||||||
void OnLoad(int argc, char** argv) override;
|
void OnLoad(int argc, char** argv) override;
|
||||||
void OnUnload() override;
|
void OnUnload() override;
|
||||||
void InitMetaData(void) override {};
|
void InitMetaData(void) override {};
|
||||||
|
void InitResourceType();
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
@ -5,6 +5,7 @@
|
|||||||
namespace api {
|
namespace api {
|
||||||
void AssetModule::OnLoad(int argc, char** argv)
|
void AssetModule::OnLoad(int argc, char** argv)
|
||||||
{
|
{
|
||||||
|
InitResourceType();
|
||||||
AddSystem<ResourceSystem>();
|
AddSystem<ResourceSystem>();
|
||||||
AssetLoader::Init();
|
AssetLoader::Init();
|
||||||
TextArchive::Register<Guid>();
|
TextArchive::Register<Guid>();
|
||||||
|
|||||||
@ -8,11 +8,13 @@ namespace api {
|
|||||||
GENERATED_BODY()
|
GENERATED_BODY()
|
||||||
UPROPERTY()
|
UPROPERTY()
|
||||||
RscHandle<Shader> mOwner;
|
RscHandle<Shader> mOwner;
|
||||||
|
UPROPERTY()
|
||||||
ShaderStage mStage;
|
ShaderStage mStage;
|
||||||
public:
|
public:
|
||||||
refl::Any Meta() {
|
refl::Any Meta() {
|
||||||
return refl::Any{this};
|
return refl::Any{this};
|
||||||
}
|
}
|
||||||
|
ShaderProgram() : mOwner{},mStage(ShaderStage::NONE) {}
|
||||||
ShaderProgram(ShaderStage stage) : mStage(stage) {};
|
ShaderProgram(ShaderStage stage) : mStage(stage) {};
|
||||||
ShaderStage GetStage() {
|
ShaderStage GetStage() {
|
||||||
return mStage;
|
return mStage;
|
||||||
|
|||||||
@ -39,5 +39,7 @@ namespace meta
|
|||||||
|
|
||||||
template<typename T, typename ... Args>
|
template<typename T, typename ... Args>
|
||||||
constexpr auto tuple_construct(const std::tuple<Args...>&) noexcept;
|
constexpr auto tuple_construct(const std::tuple<Args...>&) noexcept;
|
||||||
|
template <typename Tuple, typename Func>
|
||||||
|
void for_each_type(Func&& func)noexcept;
|
||||||
}
|
}
|
||||||
#include "tuple.inl"
|
#include "tuple.inl"
|
||||||
@ -27,4 +27,17 @@ namespace meta
|
|||||||
{
|
{
|
||||||
using type = std::tuple<Wrap<Ts>...>;
|
using type = std::tuple<Wrap<Ts>...>;
|
||||||
};
|
};
|
||||||
|
// 泛型接口
|
||||||
|
template <typename Tuple, typename Func, size_t... Index>
|
||||||
|
void for_each_type_impl(Func&& func, std::index_sequence<Index...>) noexcept {
|
||||||
|
(func.template operator() < std::tuple_element_t<Index, Tuple> > (), ...);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename Tuple, typename Func>
|
||||||
|
void for_each_type(Func&& func) noexcept {
|
||||||
|
for_each_type_impl<Tuple>(
|
||||||
|
std::forward<Func>(func),
|
||||||
|
std::make_index_sequence<std::tuple_size_v<Tuple>>{}
|
||||||
|
);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@ -163,6 +163,7 @@ namespace pmr {
|
|||||||
std::mutex mutex;
|
std::mutex mutex;
|
||||||
public:
|
public:
|
||||||
StringEntryMemoryManager();
|
StringEntryMemoryManager();
|
||||||
|
void reinitialize();
|
||||||
StringEntry* GetStringEntry(StringEntryHandle stringEntryHandle) const;
|
StringEntry* GetStringEntry(StringEntryHandle stringEntryHandle) const;
|
||||||
StringEntryHandle AllocateStringEntry(StringEntryHeader stringEntryHeader, const char* data);
|
StringEntryHandle AllocateStringEntry(StringEntryHeader stringEntryHeader, const char* data);
|
||||||
private:
|
private:
|
||||||
|
|||||||
@ -82,12 +82,15 @@ namespace pmr {
|
|||||||
slotPool.slotArray = (Slot*)(xmalloc(SlotPool::SLOT_POOL_INITIALIZE_SIZE * sizeof(Slot)));
|
slotPool.slotArray = (Slot*)(xmalloc(SlotPool::SLOT_POOL_INITIALIZE_SIZE * sizeof(Slot)));
|
||||||
std::memset(slotPool.slotArray, 0, SlotPool::SLOT_POOL_INITIALIZE_SIZE);
|
std::memset(slotPool.slotArray, 0, SlotPool::SLOT_POOL_INITIALIZE_SIZE);
|
||||||
}
|
}
|
||||||
g_memory_blocks = memoryBlockArray;
|
|
||||||
currentMemoryBlockIndex = 0;
|
currentMemoryBlockIndex = 0;
|
||||||
currentMemoryBlockAlignedCursor = 0;
|
currentMemoryBlockAlignedCursor = 0;
|
||||||
memoryBlockArray[0] = (char*)(xmalloc(MAX_MEMORY_BLOCK_SIZE));
|
memoryBlockArray[0] = (char*)(xmalloc(MAX_MEMORY_BLOCK_SIZE));
|
||||||
std::memset(memoryBlockArray[0], 0, MAX_MEMORY_BLOCK_SIZE);
|
std::memset(memoryBlockArray[0], 0, MAX_MEMORY_BLOCK_SIZE);
|
||||||
}
|
}
|
||||||
|
inline void Name::StringEntryMemoryManager::reinitialize()
|
||||||
|
{
|
||||||
|
g_memory_blocks = memoryBlockArray;
|
||||||
|
}
|
||||||
inline Name::StringEntry* Name::StringEntryMemoryManager::GetStringEntry(StringEntryHandle stringEntryHandle) const
|
inline Name::StringEntry* Name::StringEntryMemoryManager::GetStringEntry(StringEntryHandle stringEntryHandle) const
|
||||||
{
|
{
|
||||||
return reinterpret_cast<Name::StringEntry*>(memoryBlockArray[stringEntryHandle.GetMemoryBlockIndex()] + stringEntryHandle.GetMemoryBlockAlignedOffset() * ALIGN_BYTES);
|
return reinterpret_cast<Name::StringEntry*>(memoryBlockArray[stringEntryHandle.GetMemoryBlockIndex()] + stringEntryHandle.GetMemoryBlockAlignedOffset() * ALIGN_BYTES);
|
||||||
|
|||||||
@ -112,6 +112,7 @@ namespace refl{
|
|||||||
}
|
}
|
||||||
auto fieldList = GetFields(EFieldFind::FIND_CTOR, Name("Ctor"));
|
auto fieldList = GetFields(EFieldFind::FIND_CTOR, Name("Ctor"));
|
||||||
if (fieldList.empty()) {
|
if (fieldList.empty()) {
|
||||||
|
memset(ptr, 0, size);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
std::array<Any, MAX_ARGS_LENGTH> ArgsArray = { Any{} , Any{ptr} };
|
std::array<Any, MAX_ARGS_LENGTH> ArgsArray = { Any{} , Any{ptr} };
|
||||||
@ -129,6 +130,7 @@ namespace refl{
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
memset(ptr, 0, size);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
if (!ArgsList.empty() && ArgsList[0].Check(this)) {
|
if (!ArgsList.empty() && ArgsList[0].Check(this)) {
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user