VR-Forces Developer's Guide
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Groups Pages
stateComponentImplementationTemplate.h
Go to the documentation of this file.
1 /*******************************************************************************
2 ** Copyright (c) 2023 MAK Technologies, Inc.
3 ** All rights reserved.
4 *******************************************************************************/
5 
6 #pragma once
7 
11 #include <tbb/spin_rw_mutex.h>
12 
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;
20 
21 #define DEFINE_FIELD(MemberType, Member) \
22 protected: \
23  MemberType my##Member;
24 
25 #define ACCESSOR_MUTATOR_MEMBER(MemberType, Accessor, MutatorAndMember) \
26 public: \
27  DEFINE_REF_ACCESSORS(MemberType, Accessor, MutatorAndMember); \
28  DEFINE_MUTATOR(MemberType, MutatorAndMember); \
29  DEFINE_FIELD(MemberType, MutatorAndMember)
30 
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); };
37 
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; };
42 
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); } };
45 
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 } };
48 
49 #define NEXTFRAME_ACCESSOR_MUTATOR(MemberType, Accessor, MutatorAndMember) \
50  public: \
51  FRAME_ACCESSOR(MemberType, Accessor) \
52  NEXT_FRAME_MUTATOR(MemberType, MutatorAndMember, Accessor)
53 #define NEXTFRAME_ACCESSOR_MUTATOR_WITHLOCK(MemberType, Accessor, MutatorAndMember) \
54  public: \
55  FRAME_ACCESSOR_WITHLOCK(MemberType, Accessor) \
56  NEXT_FRAME_MUTATOR_WITHLOCK(MemberType, MutatorAndMember, Accessor)
57 #define NEXTFRAME_ACCESSOR_BY_REF_MUTATOR(MemberType, Accessor, MutatorAndMember) \
58  public: \
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)
63 
64 #define CURRENTFRAME_ACCESSOR_BY_REF(MemberType, Accessor, MutatorAndMember) \
65  FRAME_ACCESSOR_BY_REF(MemberType, Accessor)
66 
67 template < typename T_BaseComponent, typename V_Data>
69 {
70 public:
72  : T_BaseComponent(sd)
73  , myStateData(sd)
74  {
75  };
76 
79  const V_Data& frameState() const { return myData; };
80  V_Data& frameState() { return myData; };
81 
82 
83 protected:
84  makVrf::DtStateData* myStateData;
85  V_Data myData;
86 };
87 
88 template < typename T_BaseComponent, typename U_CurrentFrame, typename V_NextFrame >
90  : public makVrf::DtDoubleBufferedStateComponent<T_BaseComponent>
91 {
93 public:
95  : ParentType(sd)
96  , myCurrentFrameState(sd)
97  , myNextFrameState(sd)
98  {
99  }
100 
101  bool isDoubleBuffered() { return true; };
102  const makVrf::DtFrameStateInterface* currentFrameState() const { return &myCurrentFrameState; }
103  virtual makVrf::DtFrameStateInterface* nextFrameState() { return &myNextFrameState; };
104  virtual const makVrf::DtFrameStateInterface* nextFrameState() const { return &myNextFrameState; };
105  virtual void setIsRemoteComponent(bool b) override { myCurrentFrameState.setIsRemoteComponent(b); myNextFrameState.setIsRemoteComponent(b);
107 
109  {
110  if (myNextFrameState.isWritable())
111  {
112  myCurrentFrameState.advanceFrame(myNextFrameState.frameState());
113  }
114 
115  myCurrentFrameState.emitComponentUpdated();
116  }
117 
118  virtual void updateStateData(makVrf::DtStateData* sd) override
119  {
120  myCurrentFrameState.updateStateData(sd);
121  myNextFrameState.updateStateData(sd);
122  }
123 
124  virtual void aboutToBeDeleted() override
125  {
127  myCurrentFrameState.aboutToBeDeleted();
128  myNextFrameState.aboutToBeDeleted();
129  }
130 
131 protected:
132  U_CurrentFrame myCurrentFrameState;
133  V_NextFrame myNextFrameState;
134 };
135 
136 template < typename T_BaseComponent, typename V_NextFrame, typename W_Data >
138 {
139 public:
141  : T_BaseComponent(sd)
142  , myStateData(sd)
143  {
144  };
145 
147  {
148  };
149 
151  const W_Data& frameState() const { return myData; };
152 
153 protected:
154 
155  template<typename, typename, typename> friend class DtStateComponentImplementationTemplate;
156  void advanceFrame(const W_Data& data)
157  {
158  myData = data;
159  }
160 
161 protected:
163  W_Data myData;
164 };
165 
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

Document ID: Generated on Wed Mar 27 22:49:11 EDT 2024 from SVN revision 264633
Copyright © 2005-2024 MAK Technologies. All Rights Reserved (www.mak.com)