ICF 3.1.1.10
Technical documentation of ICF Libraries
TModelWrap.h
Go to the documentation of this file.
1/********************************************************************************
2** This file is part of the ICF Framework. Copyright (C) Witold Gantzke & Kirill Lepskiy
3** ICF Framework may be used under the terms of the LGPL License v. 2.1 by the Free Software Foundation.
4********************************************************************************/
5
6#ifndef imod_TModelWrap_included
7#define imod_TModelWrap_included
8
9
10// ICF includes
11#include <istd/IChangeable.h>
13#include <imod/CModelBase.h>
14
15
16namespace imod
17{
18
19
26template <class Base>
28{
29public:
32
33 template<typename... Args>
34 TModelWrap(Args&&... args): BaseClass(args...){}
35
36 void SetBaseObject(const Base& baseObject);
37
38 // pseudo-reimplemented (istd::IChangeable)
39 int GetSupportedOperations() const override;
40 std::unique_ptr<istd::IChangeable> CloneMe(istd::IChangeable::CompatibilityMode mode = istd::IChangeable::CM_WITHOUT_REFS) const override;
41 QMutex* GetChangesLock() const override;
42 void BeginChanges(const istd::IChangeable::ChangeSet& changeSet) override;
43 void EndChanges(const istd::IChangeable::ChangeSet& changeSet) override;
44 void BeginChangeGroup(const istd::IChangeable::ChangeSet& changeSet) override;
45 void EndChangeGroup(const istd::IChangeable::ChangeSet& changeSet) override;
46
47protected:
48 // reimplemented (imod::CModelBase)
49 void OnBeginGlobalChanges() override;
50 void OnEndGlobalChanges(const istd::IChangeable::ChangeSet& changeSet) override;
51
52private:
53 Q_DISABLE_COPY(TModelWrap);
54
55 mutable QMutex m_changesLock;
56};
57
58
59// public methods
60
61template <class Base>
62void TModelWrap<Base>::SetBaseObject(const Base& baseObject)
63{
64 Base::operator=(baseObject);
65}
66
67
68// pseudo-reimplemented (istd::IChangeable)
69
70template <class Base>
72{
73 int baseOperations = Base::GetSupportedOperations();
74
75 if constexpr (std::is_constructible_v<Base>) {
77 }
78 else {
79 return baseOperations | istd::IChangeable::SO_OBSERVE;
80 }
81}
82
83
84template <class Base>
85std::unique_ptr<istd::IChangeable> TModelWrap<Base>::CloneMe(istd::IChangeable::CompatibilityMode mode) const
86{
87 if constexpr (std::is_constructible_v<Base>) {
88 std::unique_ptr<istd::IChangeable> clonePtr{new TModelWrap<Base>()};
89
90 if (clonePtr->CopyFrom(*this, mode)){
91 return clonePtr;
92 }
93 }
94
95 return nullptr;
96}
97
98
99template <class Base>
101{
102 return &m_changesLock;
103}
104
105
106template <class Base>
108{
109 BaseClass2::NotifyBeforeChange(changeSet, false);
110}
111
112
113template <class Base>
115{
116 BaseClass2::NotifyAfterChange(changeSet);
117}
118
119
120template <class Base>
122{
123 BaseClass2::NotifyBeforeChange(changeSet, true);
124}
125
126
127template <class Base>
129{
130 BaseClass2::NotifyAfterChange(changeSet);
131}
132
133
134// protected methods
135
136// reimplemented (imod::CModelBase)
137
138template <class Base>
140{
141 this->OnBeginChanges();
142
143 m_changesLock.lock();
144}
145
146
147template <class Base>
149{
150 m_changesLock.unlock();
151
152 this->OnEndChanges(changeSet);
153}
154
155
156} // namespace imod
157
158
159#endif // !imod_TModelWrap_included
160
161
Basic implementation of a model.
Definition CModelBase.h:29
This model wrapper provides a simple connection between a concrete istd::IChangeable implementation a...
Definition TModelWrap.h:28
void EndChangeGroup(const istd::IChangeable::ChangeSet &changeSet) override
Definition TModelWrap.h:128
void OnEndGlobalChanges(const istd::IChangeable::ChangeSet &changeSet) override
Called after global changes are finished.
Definition TModelWrap.h:148
TModelWrap(Args &&... args)
Definition TModelWrap.h:34
QMutex * GetChangesLock() const override
Definition TModelWrap.h:100
std::unique_ptr< istd::IChangeable > CloneMe(istd::IChangeable::CompatibilityMode mode=istd::IChangeable::CM_WITHOUT_REFS) const override
Definition TModelWrap.h:85
void EndChanges(const istd::IChangeable::ChangeSet &changeSet) override
Definition TModelWrap.h:114
iser::TCopySerializedWrap< Base > BaseClass
Definition TModelWrap.h:30
void SetBaseObject(const Base &baseObject)
Definition TModelWrap.h:62
void BeginChanges(const istd::IChangeable::ChangeSet &changeSet) override
Definition TModelWrap.h:107
void OnBeginGlobalChanges() override
Called before global changes will be started.
Definition TModelWrap.h:139
int GetSupportedOperations() const override
Definition TModelWrap.h:71
imod::CModelBase BaseClass2
Definition TModelWrap.h:31
void BeginChangeGroup(const istd::IChangeable::ChangeSet &changeSet) override
Definition TModelWrap.h:121
Set of change flags (its IDs).
Definition IChangeable.h:38
CompatibilityMode
Control how relationship betweeen objects are interpreted.
@ CM_WITHOUT_REFS
External references are simple ignored.
@ SO_CLONE
Creating of copy of this object.
@ SO_OBSERVE
Observing of this object via observer-observable pattern.
This namespace containes basic implementation of Model/Observer design pattern This package is system...
Definition CModelBase.h:20

© Witold Gantzke and Kirill Lepskiy