-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathCommandFactory.h
122 lines (94 loc) · 4.32 KB
/
CommandFactory.h
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
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
#pragma once
#include"RxCommand/IncludeExtLibs.h"
#include"RxCommand/CommandControllerAction.h"
#include"RxCommand/Export.h"
#include"RxCommand/ReactorConfig.h"
namespace Reactor
{
// ---------------------------------------------------------------
// Class CommandFactoryPolicy
// ---------------------------------------------------------------
class DLL_STATE CommandFactoryPolicy
{};
// ---------------------------------------------------------------
// Class CommandFactoryState
// ---------------------------------------------------------------
class DLL_STATE CommandFactoryState
{
public:
virtual ~CommandFactoryState() {}
ReactorConfig::CommandControllerAccess executors() const;
};
// ---------------------------------------------------------------
// Class CommandFactory
// ---------------------------------------------------------------
class DLL_STATE CommandFactory
: public Templates::FactorySingleton<CommandFactory>
, public Templates::ContextObject<CommandFactoryPolicy, CommandFactoryState>
{
public:
CommandFactory();
virtual ~CommandFactory();
template <typename T>
static typename CommandActions<T>::Ptr CreateCommand(CommandPolicy policy, typename Templates::Action0<T>::Ptr action)
{
typename CommandActions<T>::Ptr command = std::make_shared<CommandActions<T>>(policy);
command->Add(action);
return command;
}
template <typename Return>
typename CommandControllerAction<Return>::Ptr CreateCommandController(CommandControllerPolicy policy, RxThreadPool::Ptr threadPool)
{
typename CommandControllerAction<Return>::Ptr commandController(new CommandControllerAction<Return>(policy, threadPool));
commandController->SetCommandThreadPool(RxThreadPoolFactory::CommandPool());
this->state().executors().Write(commandController, commandController);
return commandController;
}
template <typename Return>
typename CommandControllerAction<Return>::Ptr CreateCommandController()
{
typename CommandControllerAction<Return>::Ptr commandController(new CommandControllerAction<Return>(
CommandControllerPolicy::Default(),
RxThreadPoolFactory::ControllerPool()));
commandController->SetCommandThreadPool(RxThreadPoolFactory::CommandPool());
this->state().executors().Write(commandController, commandController);
return commandController;
}
template <typename K, typename V>
typename CommandControllerKeyValue<K,V>::Ptr CreateCommandControllerKeyValue(
CommandControllerPolicy policy,
RxThreadPool::Ptr threadPool)
{
typename CommandControllerKeyValue<K,V>::Ptr commandController(
new CommandControllerKeyValue<K,V>(
policy,
threadPool == nullptr ? RxThreadPoolFactory::ControllerPool() : threadPool
)
);
commandController->SetCommandThreadPool(RxThreadPoolFactory::CommandPool());
this->state().executors().Write(commandController, commandController);
return commandController;
}
private:
// ------------------------------------------
// private functions
// ------------------------------------------
template<typename K, typename V>
static CommandControllerAction<std::pair<K, V>>* createCommandController(
CommandControllerPolicy commandControllerPolicy,
CommandObserver<std::pair<K, V>> *,
RxThreadPool::Ptr threadPool)
{
CommandControllerAction<std::pair<K, V>> *cmdController = new CommandControllerAction<std::pair<K, V>>(commandControllerPolicy, RxThreadPoolFactory::ControllerPool());
if (threadPool != nullptr)
cmdController->SetCommandThreadPool(threadPool);
else
cmdController->SetCommandThreadPool(RxThreadPoolFactory::CommandPool());
// if (observer != nullptr)
// cmdController->connectDataObserver(observer);
// CommandControllers are cached since policy handling is done by CommandMonitor
//CommandFactory::Instance().state().controllercache<K, V>(instance().config()).put(cmdController, cmdController);
return cmdController;
}
};
}