11 #include <tbb/spin_rw_mutex.h>
13 #define SCOPED_WRITE_LOCK_BEGIN \
14 tbb::spin_rw_mutex::scoped_lock* lock = nullptr; \
15 if (myIsRemoteComponent) { lock = new tbb::spin_rw_mutex::scoped_lock(myMutex, true); }
16 #define SCOPED_READ_LOCK_BEGIN \
17 tbb::spin_rw_mutex::scoped_lock* lock = nullptr; \
18 if (myIsRemoteComponent) { lock = new tbb::spin_rw_mutex::scoped_lock(myMutex, false); }
19 #define SCOPED_LOCK_END delete lock;
21 #define DEFINE_FIELD(MemberType, Member) \
23 MemberType my##Member{};
25 #define ACCESSOR_MUTATOR_MEMBER(MemberType, Accessor, MutatorAndMember) \
27 DEFINE_REF_ACCESSORS(MemberType, Accessor, MutatorAndMember); \
28 DEFINE_MUTATOR(MemberType, MutatorAndMember); \
29 DEFINE_FIELD(MemberType, MutatorAndMember)
31 #define FRAME_ACCESSOR(MemberType, Accessor) \
32 const MemberType Accessor() const override { return frameState().Accessor(); };
33 #define FRAME_ACCESSOR_BY_REF(MemberType, Accessor) \
34 const MemberType& Accessor() const override { return frameState().Accessor(); };
35 #define FRAME_MUTATOR(MemberType, MutatorAndMember) \
36 void set##MutatorAndMember(const MemberType& v) override { frameState().set##MutatorAndMember(v); };
38 #define FRAME_ACCESSOR_WITHLOCK(MemberType, Accessor) \
39 const MemberType Accessor() const override { SCOPED_READ_LOCK_BEGIN MemberType mt = frameState().Accessor(); SCOPED_LOCK_END return mt; };
40 #define FRAME_ACCESSOR_BY_REF_WITHLOCK(MemberType, Accessor) \
41 const MemberType& Accessor() const override { SCOPED_READ_LOCK_BEGIN const MemberType& mt = frameState().Accessor(); SCOPED_LOCK_END return mt; };
43 #define NEXT_FRAME_MUTATOR(MemberType, MutatorAndMember, Accessor) \
44 void set##MutatorAndMember(const MemberType& v) override { if (frameState().Accessor() != v) { markModified(); frameState().set##MutatorAndMember(v); } };
46 #define NEXT_FRAME_MUTATOR_WITHLOCK(MemberType, MutatorAndMember, Accessor) \
47 void set##MutatorAndMember(const MemberType& v) override { if (frameState().Accessor() != v) { SCOPED_WRITE_LOCK_BEGIN markModified(); frameState().set##MutatorAndMember(v); SCOPED_LOCK_END } };
49 #define NEXTFRAME_ACCESSOR_MUTATOR(MemberType, Accessor, MutatorAndMember) \
51 FRAME_ACCESSOR(MemberType, Accessor) \
52 NEXT_FRAME_MUTATOR(MemberType, MutatorAndMember, Accessor)
53 #define NEXTFRAME_ACCESSOR_MUTATOR_WITHLOCK(MemberType, Accessor, MutatorAndMember) \
55 FRAME_ACCESSOR_WITHLOCK(MemberType, Accessor) \
56 NEXT_FRAME_MUTATOR_WITHLOCK(MemberType, MutatorAndMember, Accessor)
57 #define NEXTFRAME_ACCESSOR_BY_REF_MUTATOR(MemberType, Accessor, MutatorAndMember) \
59 FRAME_ACCESSOR_BY_REF(MemberType, Accessor) \
60 NEXT_FRAME_MUTATOR(MemberType, MutatorAndMember, Accessor)
61 #define CURRENTFRAME_ACCESSOR(MemberType, Accessor, MutatorAndMember) \
62 FRAME_ACCESSOR(MemberType, Accessor)
64 #define CURRENTFRAME_ACCESSOR_BY_REF(MemberType, Accessor, MutatorAndMember) \
65 FRAME_ACCESSOR_BY_REF(MemberType, Accessor)
67 template <
typename T_BaseComponent,
typename V_Data>
79 V_Data& frameState() {
return myData; };
86 template <
typename T_BaseComponent,
typename U_CurrentFrame,
typename V_NextFrame >
94 , myCurrentFrameState(sd)
95 , myNextFrameState(sd)
103 virtual void setIsRemoteComponent(
bool b)
override { myCurrentFrameState.setIsRemoteComponent(b); myNextFrameState.setIsRemoteComponent(b);
108 if (myNextFrameState.isWritable())
110 myCurrentFrameState.advanceFrame(myNextFrameState.frameState());
113 myCurrentFrameState.emitComponentUpdated();
118 myCurrentFrameState.updateStateData(sd);
119 myNextFrameState.updateStateData(sd);
125 myCurrentFrameState.aboutToBeDeleted();
126 myNextFrameState.aboutToBeDeleted();
134 template <
typename T_BaseComponent,
typename V_NextFrame,
typename W_Data >
148 const W_Data& frameState()
const {
return myData; };
virtual const makVrf::DtFrameStateInterface * currentFrameState() const override
Definition: stateComponentImplementationTemplate.h:100
virtual void setIsRemoteComponent(bool b)
Definition: stateComponent.h:136
Definition: stateComponentImplementationTemplate.h:68
virtual const makVrf::DtFrameStateInterface * nextFrameState() const override
Definition: stateComponentImplementationTemplate.h:102
virtual void updateStateData(makVrf::DtStateData *sd) override
Implement to update data storage to the new state data.
Definition: stateComponentImplementationTemplate.h:116
DtStateComponentImplementationTemplate(makVrf::DtStateData *sd)
Definition: stateComponentImplementationTemplate.h:92
makVrf::DtDoubleBufferedStateComponent< T_BaseComponent > ParentType
Definition: stateComponentImplementationTemplate.h:90
void advanceFrame(const W_Data &data)
Definition: stateComponentImplementationTemplate.h:153
DtStateComponentNextFrameTemplate(makVrf::DtStateData *sd)
Definition: stateComponentImplementationTemplate.h:71
W_Data myData
Definition: stateComponentImplementationTemplate.h:159
virtual void updateDataStorage() override
Implement to update data storage. Called from advanceFrame.
Definition: stateComponentImplementationTemplate.h:106
virtual makVrf::DtFrameStateInterface * nextFrameState() override
Definition: stateComponentImplementationTemplate.h:101
Definition: stateComponentImplementationTemplate.h:87
The overall structure of the DtStateData mechanism is: The DtStateData contains a list of double buff...
Definition: stateData.h:398
Subclass from this to indicate that this will be a double buffered state component.
Definition: stateComponent.h:384
virtual void aboutToBeDeleted()
virtual ~DtStateComponentCurrentFrameTemplate()
Definition: stateComponentImplementationTemplate.h:143
const V_Data & frameState() const
Next frame access write access. Ensure this is only used in a single thread (i.e.a controller thread)...
Definition: stateComponentImplementationTemplate.h:78
#define DT_DLL_vrfStateData
This file is used to determine how to build Disable inconsistent dll linkage warning Visual Studio 6...
Definition: vrfStateDataDefines.h:26
virtual void setIsRemoteComponent(bool b) override
Definition: stateComponentImplementationTemplate.h:103
bool isDoubleBuffered()
Definition: stateComponentImplementationTemplate.h:99
DtStateComponentCurrentFrameTemplate(makVrf::DtStateData *sd)
Definition: stateComponentImplementationTemplate.h:138
Contains the DtStateComponent class declaration.
virtual void aboutToBeDeleted() override
Definition: stateComponentImplementationTemplate.h:122
U_CurrentFrame myCurrentFrameState
Definition: stateComponentImplementationTemplate.h:130
This is a simple base class that will be used to return a pointer to current or next frame state...
Definition: stateComponent.h:294
Definition: stateComponentImplementationTemplate.h:135
V_NextFrame myNextFrameState
Definition: stateComponentImplementationTemplate.h:131