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  {
74  };
75 
78  const V_Data& frameState() const { return myData; };
79  V_Data& frameState() { return myData; };
80 
81 
82 protected:
83  V_Data myData;
84 };
85 
86 template < typename T_BaseComponent, typename U_CurrentFrame, typename V_NextFrame >
88  : public makVrf::DtDoubleBufferedStateComponent<T_BaseComponent>
89 {
91 public:
93  : ParentType(sd)
94  , myCurrentFrameState(sd)
95  , myNextFrameState(sd)
96  {
97  }
98 
99  bool isDoubleBuffered() { return true; };
100  virtual const makVrf::DtFrameStateInterface* currentFrameState() const override { return &myCurrentFrameState; }
101  virtual makVrf::DtFrameStateInterface* nextFrameState() override { return &myNextFrameState; };
102  virtual const makVrf::DtFrameStateInterface* nextFrameState() const override { return &myNextFrameState; };
103  virtual void setIsRemoteComponent(bool b) override { myCurrentFrameState.setIsRemoteComponent(b); myNextFrameState.setIsRemoteComponent(b);
105 
106  virtual void updateDataStorage() override
107  {
108  if (myNextFrameState.isWritable())
109  {
110  myCurrentFrameState.advanceFrame(myNextFrameState.frameState());
111  }
112 
113  myCurrentFrameState.emitComponentUpdated();
114  }
115 
116  virtual void updateStateData(makVrf::DtStateData* sd) override
117  {
118  myCurrentFrameState.updateStateData(sd);
119  myNextFrameState.updateStateData(sd);
120  }
121 
122  virtual void aboutToBeDeleted() override
123  {
125  myCurrentFrameState.aboutToBeDeleted();
126  myNextFrameState.aboutToBeDeleted();
127  }
128 
129 protected:
130  U_CurrentFrame myCurrentFrameState;
131  V_NextFrame myNextFrameState;
132 };
133 
134 template < typename T_BaseComponent, typename V_NextFrame, typename W_Data >
136 {
137 public:
139  : T_BaseComponent(sd)
140  {
141  };
142 
144  {
145  };
146 
148  const W_Data& frameState() const { return myData; };
149 
150 protected:
151 
152  template<typename, typename, typename> friend class DtStateComponentImplementationTemplate;
153  void advanceFrame(const W_Data& data)
154  {
155  myData = data;
156  }
157 
158 protected:
159  W_Data myData;
160 };
161 
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

Document ID: Generated on Thu Oct 23 22:29:17 EDT 2025 from SVN revision 280951
Copyright © 2005-2024 MAK Technologies. All Rights Reserved (www.mak.com)