-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathIH.InitialService.h
More file actions
67 lines (64 loc) · 2.83 KB
/
IH.InitialService.h
File metadata and controls
67 lines (64 loc) · 2.83 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
#pragma once
#include "IH.Loader.h"
namespace InitialLoad
{
template<typename ParamType, typename... TArgs>
IHInitialLoadService CreateRequest(const char* Name, TArgs&&... args)//创建后永不销毁
{
static_assert(std::is_base_of<InitialLoadParam, ParamType>::value, "ParamType 必须派生自 InitialLoadParam !");
return IHInitialLoadService{ Name,new ParamType(std::forward<TArgs>(args)...) };
}
void ServiceRequest(IHInitialLoadService IService);
template<typename ParamType, typename... TArgs>
void CreateRequestAndSubmit(const char* Name, TArgs&&... args)//创建后永不销毁
{
static_assert(std::is_base_of<InitialLoadParam, ParamType>::value, "ParamType 必须派生自 InitialLoadParam !");
ServiceRequest(IHInitialLoadService{ Name,new ParamType(std::forward<TArgs>(args)...) });
}
template<typename ParamType>
class Service
{
static_assert(std::is_base_of<InitialLoadParam, ParamType>::value, "ParamType 必须派生自 InitialLoadParam !");
std::string ServiceName;
PArray<IHInitialLoadService> Requests;
bool Requested{ false };
public:
Service() = delete;
Service(const Service&) = delete;
Service(Service&&) = delete;
Service(const std::string& Name) : ServiceName(Name), Requests() {}
Service(const char* Name) : ServiceName(Name), Requests() {}
void ProcessOnce(const std::function<void(const ParamType&)>& Func)//如果列表为空则填补并处理
{
if (!Requested)
{
Refresh();
for (size_t i = 0; i < Requests.N; i++)
if (Requests.Data[i].Param)
Func(*static_cast<const ParamType* const>(Requests.Data[i].Param));
Requested = true;
}
}
void Process(const std::function<void(const ParamType&)>& Func)//如果列表为空仍会尝试refresh
{
if (!Requests.N)Refresh();
for (size_t i = 0; i < Requests.N; i++)
if (Requests.Data[i].Param)
Func(*static_cast<const ParamType* const>(Requests.Data[i].Param));
}
void Refresh()
{
Requests = Init::QueryServiceRequest(ServiceName.c_str());
}
void RefreshAndProcess(const std::function<void(const ParamType&)>& Func)
{
Refresh();
Process(Func);
}
};
}
#define ClassRegisterByName(Type, Class) InitialLoad::CreateRequestAndSubmit<InitialLoadParam_RegisterVTable>(Type, #Class, GetIHFileRegisterKey<Class>(), sizeof(Class));
#define RegisterIHFile(Class) ClassRegisterByName("IHFile::RegisterIHFile", Class)
#define InitialRequest(Type, ...) InitialLoad::CreateRequestAndSubmit<InitialLoadParam_##Type>(__VA_ARGS__)
#define RegisterIHFileFilter(Class, Filter) InitialLoad::CreateRequestAndSubmit<InitialLoadParam_RegisterFunction>("IHFile::RegisterIHFileFilter", #Class, Filter);
#define RegisterIHFileBinding(Class, FileName) InitialLoad::CreateRequestAndSubmit<InitialLoadParam_RedirectFile>("IHFile::BindToStream", FileName, #Class);