-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathMementoCommand.h
140 lines (112 loc) · 4.3 KB
/
MementoCommand.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
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
#pragma once
#include"RxCommand/IncludeExtLibs.h"
#include"RxCommand/Command.h"
namespace Reactor
{
template <typename Return>
class MementoCommandActions
: public CommandActions<Return>
, public Templates::UndoRedoBase
{
protected:
typedef MutexTypeLocker<MementoCommandActions<Return>> Locker;
public:
MementoCommandActions(CommandPolicy policy = CommandPolicy::Default())
: CommandActions<Return>(policy)
{}
virtual ~MementoCommandActions()
{}
CLASS_TRAITS(MementoCommandActions)
// ------------------------------------------
// Interface UndoRedoBase
// ------------------------------------------
virtual bool CreateMemento() const
{
return caretakers_.CreateMemento();
}
virtual bool Undo()
{
return caretakers_.Undo();
}
virtual bool Redo()
{
return caretakers_.Redo();
}
virtual void ClearUndo()
{
caretakers_.ClearUndo();
}
virtual void ClearRedo()
{
caretakers_.ClearRedo();
}
// ------------------------------------------
// Add functions
// ------------------------------------------
template <typename T>
void Add(typename Templates::MementoAction0<T, Return>::Ptr action)
{
createCaretaker<T>(std::dynamic_pointer_cast<Templates::Originator<T>::Ptr>(action));
CommandActions<Return>::Add(action);
}
template <typename T, typename Arg1>
void Add(typename Templates::MementoAction1<T, Return, Arg1>::Ptr action, Arg1 arg1)
{
createCaretaker<T>(std::dynamic_pointer_cast<Templates::Originator<T>>(action));
CommandActions<Return>::template Add<Arg1>(action, arg1);
}
template <typename T, typename Arg1, typename Arg2>
void Add(typename Templates::MementoAction2<T, Return, Arg1, Arg2>::Ptr action, Arg1 arg1, Arg2 arg2)
{
createCaretaker<T>(std::dynamic_pointer_cast<Templates::Originator<T>>(action));
CommandActions<Return>::template Add<Arg1, Arg2>(action, arg1, arg2);
}
template <typename T, typename Arg1, typename Arg2, typename Arg3>
void Add(typename Templates::MementoAction3<T, Return, Arg1, Arg2, Arg3>::Ptr action, Arg1 arg1, Arg2 arg2, Arg3 arg3)
{
createCaretaker<T>(std::dynamic_pointer_cast<Templates::Originator<T>>(action));
CommandActions<Return>::template Add<Arg1, Arg2, Arg3>(action, arg1, arg2, arg3);
}
template <typename T, typename Arg1, typename Arg2, typename Arg3, typename Arg4>
void Add(typename Templates::MementoAction4<T, Return, Arg1, Arg2, Arg3, Arg4>::Ptr action, Arg1 arg1, Arg2 arg2, Arg3 arg3, Arg4 arg4)
{
createCaretaker<T>(std::dynamic_pointer_cast<Templates::Originator<T>>(action));
CommandActions<Return>::template Add<Arg1, Arg2, Arg3, Arg4>(action, arg1, arg2, arg3, arg4);
}
template <typename T, typename Arg1, typename Arg2, typename Arg3, typename Arg4, typename Arg5>
void Add(typename Templates::MementoAction5<T, Return, Arg1, Arg2, Arg3, Arg4, Arg5>::Ptr action, Arg1 arg1, Arg2 arg2, Arg3 arg3, Arg4 arg4, Arg5 arg5)
{
createCaretaker<T>(std::dynamic_pointer_cast<Templates::Originator<T>>(action));
CommandActions<Return>::template Add<Arg1, Arg2, Arg3, Arg4, Arg5>(action, arg1, arg2, arg3, arg4, arg5);
}
// -----------------------------------------------------------
// Interface RxObserver<T>
// -----------------------------------------------------------
virtual bool OnComplete()
{
caretakers_.CreateMemento();
return this->processOnComplete();
}
virtual bool OnNext(Return)
{
// Note: Currently, this is only used from this command's CompositionStrategy.
return true;
}
virtual bool OnError(GeneralException throwable)
{
return this->processOnError(throwable);
}
private:
// -----------------------------------------------------------
// private functions
// -----------------------------------------------------------
template <typename T>
void createCaretaker(std::shared_ptr<Templates::Originator<T>> originator)
{
std::shared_ptr<Templates::Caretaker<T>> caretaker(new Templates::Caretaker<T>(originator));
caretakers_.push_back(caretaker);
}
private:
Templates::Caretakers caretakers_;
};
}