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>
80 V_Data& frameState() {
return myData; };
88 template <
typename T_BaseComponent,
typename U_CurrentFrame,
typename V_NextFrame >
96 , myCurrentFrameState(sd)
97 , myNextFrameState(sd)
105 virtual void setIsRemoteComponent(
bool b)
override { myCurrentFrameState.setIsRemoteComponent(b); myNextFrameState.setIsRemoteComponent(b);
110 if (myNextFrameState.isWritable())
112 myCurrentFrameState.advanceFrame(myNextFrameState.frameState());
115 myCurrentFrameState.emitComponentUpdated();
120 myCurrentFrameState.updateStateData(sd);
121 myNextFrameState.updateStateData(sd);
127 myCurrentFrameState.aboutToBeDeleted();
128 myNextFrameState.aboutToBeDeleted();
136 template <
typename T_BaseComponent,
typename V_NextFrame,
typename W_Data >
151 const W_Data& frameState()
const {
return myData; };
virtual void setIsRemoteComponent(bool b)
Definition: stateComponent.h:133
Definition: stateComponentImplementationTemplate.h:68
void updateDataStorage()
Implement to update data storage. Called from advanceFrame.
Definition: stateComponentImplementationTemplate.h:108
virtual void updateStateData(makVrf::DtStateData *sd) override
Implement to update data storage to the new state data.
Definition: stateComponentImplementationTemplate.h:118
virtual makVrf::DtFrameStateInterface * nextFrameState()
Definition: stateComponentImplementationTemplate.h:103
DtStateComponentImplementationTemplate(makVrf::DtStateData *sd)
Definition: stateComponentImplementationTemplate.h:94
makVrf::DtStateData * myStateData
Definition: stateComponentImplementationTemplate.h:162
makVrf::DtDoubleBufferedStateComponent< T_BaseComponent > ParentType
Definition: stateComponentImplementationTemplate.h:92
V_Data myData
Definition: stateComponentImplementationTemplate.h:85
void advanceFrame(const W_Data &data)
Definition: stateComponentImplementationTemplate.h:156
DtStateComponentNextFrameTemplate(makVrf::DtStateData *sd)
Definition: stateComponentImplementationTemplate.h:71
W_Data myData
Definition: stateComponentImplementationTemplate.h:163
Definition: stateComponentImplementationTemplate.h:89
The overall structure of the DtStateData mechanism is: The DtStateData contains a list of double buff...
Definition: stateData.h:339
Subclass from this to indicate that this will be a double buffered state component.
Definition: stateComponent.h:379
virtual void aboutToBeDeleted()
virtual const makVrf::DtFrameStateInterface * nextFrameState() const
Definition: stateComponentImplementationTemplate.h:104
virtual ~DtStateComponentCurrentFrameTemplate()
Definition: stateComponentImplementationTemplate.h:146
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:79
#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:105
bool isDoubleBuffered()
Definition: stateComponentImplementationTemplate.h:101
DtStateComponentCurrentFrameTemplate(makVrf::DtStateData *sd)
Definition: stateComponentImplementationTemplate.h:140
Contains the DtStateComponent class declaration.
const makVrf::DtFrameStateInterface * currentFrameState() const
Definition: stateComponentImplementationTemplate.h:102
virtual void aboutToBeDeleted() override
Definition: stateComponentImplementationTemplate.h:124
U_CurrentFrame myCurrentFrameState
Definition: stateComponentImplementationTemplate.h:132
This is a simple base class that will be used to return a pointer to current or next frame state...
Definition: stateComponent.h:291
Definition: stateComponentImplementationTemplate.h:137
V_NextFrame myNextFrameState
Definition: stateComponentImplementationTemplate.h:133