ReplicaNet and RNLobby  1
Define_RO.h
1 /* START_LICENSE_HEADER
2 
3 Copyright (C) 2000 Martin Piper, original design and program code
4 Copyright (C) 2001 Replica Software
5 
6 This program file is copyright (C) Replica Software and can only be used under license.
7 For more information visit: http://www.replicanet.com/
8 Or email: info@replicanet.com
9 
10 END_LICENSE_HEADER */
11 #include "RNPlatform/Inc/MemoryTracking.h"
12 #ifndef __DEFINE_RO_H__
13 #define __DEFINE_RO_H__
14 #include "RNReplicaNet/Inc/DataBlock.h"
15 #include "RNReplicaNet/Inc/ROConstants.h"
16 #ifdef REPLICANET_VISUALDEBUGGER
17 #include "RNXPURL/Inc/XPURL.h"
18 #include "RNXPURL/Inc/DebugHandler.h"
19 #include "RNReplicaNet/Inc/RO_RegistryBlock.h"
20 #include "RNReplicaNet/Inc/ReplicaNet.h"
21 #endif
22 
23 #define _MAKE_BASE(x) x
24 #define _MAKE_RO(x) _RO_##x
25 #define _MAKE_RO_ALLOCFUNC(x) _RO_AllocateFunc_##x
26 #define _MAKE_RO_DELETEFUNC(x) _RO_DeleteFunc_##x
27 #define _MAKE_RO_SETCLASSIDFUNC(x) _RO_SetClassIDFunc_##x
28 #define _MAKE_RO_REGISTERFUNC(x) _RO_RegisterFunc_##x
29 
30 #ifdef REPLICANET_VISUALDEBUGGER
31 #define _RO_DODEBUGNAME() \
32  if (RNReplicaNet::XPURL::GetDebugHandler() && GetRegistryBlock() && GetRegistryBlock()->GetName()) \
33  { \
34  _Internal_SetFullyQualifiedName(GetRegistryBlock()->GetName()); \
35  }
36 #else
37 #define _RO_DODEBUGNAME()
38 #endif
39 
40 
41 /* _RO_DO_STD_FRAMEWORK macro starts here */
42 #define _RO_DO_STD_FRAMEWORK(x) \
43 _RO_BEGINCTOR(x) \
44 _Internal_GetUpdateType(); \
45 _Internal_SetupLoadBalance(); \
46 _Internal_SetupLoadBalanceScore(); \
47 _Internal_SetupLoadBalanceDefault(); \
48 _Internal_SetupLoadBalanceScoreDefault(); \
49 _Internal_SetupPropagateToSessionDistanceRecalculationDelay(); \
50 _Internal_SetupPropagateDistance(); \
51 _Internal_SetupPropagateDistanceDefault(); \
52 _Internal_SetupPropagateDistanceInclude(); \
53 _Internal_SetupPropagateDistanceIncludeDefault(); \
54 _Internal_SetupPropagateDistanceExclude(); \
55 _Internal_SetupPropagateDistanceExcludeDefault(); \
56 _Internal_SetupBand(); \
57 _RO_DODEBUGNAME() \
58 _RO_ENDCTOR(x) \
59 _RO_DTOR(x) \
60 _RO_DO_ALLOCATE(x) \
61 _RO_DO_ALLOCATEFUNC(x)
62 /* _RO_DO_STD_FRAMEWORK macro ends here */
63 
64 
65 /* _RO_STD_FRAMEWORK macro starts here */
66 #define _RO_STD_FRAMEWORK(x) \
67 public: \
68 _MAKE_RO(x)(); \
69 virtual ~_MAKE_RO(x)(); \
70 _RO_DEF_ALLOCATE(x) \
71 _RO_DEF_SETUP_TYPE_SPECIFICS(x) \
72 _RO_DO_REGISTER(x) \
73 _RO_DO_IDS(x) \
74 _RO_DO_ALLOW_FRIEND(x) \
75 private:
76 /* _RO_STD_FRAMEWORK macro ends here */
77 
78 /* _RO_BEGINCTOR macro starts here */
79 #define _RO_BEGINCTOR(x) \
80 int _MAKE_RO(x)::mClassID = kReplicaObjectUnknownClassID; \
81 RNReplicaNet::s_RO_RegistryBlock *_MAKE_RO(x)::mBoundRegistryBlock = 0; \
82 bool _MAKE_RO(x)::mRegistered = false; \
83 int _MAKE_RO(x)::mStaticExpectedNumDataBlocks = -1; \
84 _MAKE_RO(x)::_MAKE_RO(x)() \
85 {
86 /* _RO_BEGINCTOR macro ends here */
87 
88 /* _RO_ENDCTOR macro starts here */
89 #define _RO_ENDCTOR(x) \
90 }
91 /* _RO_ENDCTOR macro ends here */
92 
93 /* _RO_DTOR macro starts here */
94 #define _RO_DTOR(x) \
95 _MAKE_RO(x)::~_MAKE_RO(x)() \
96 { \
97 }
98 /* _RO_DTOR macro ends here */
99 
100 /* ReplicaObject reliable macros go here */
101 
102 /* _RO_DO_REPLICAOBJECT_MAKERELIABLE macro starts here */
103 #define _RO_DO_REPLICAOBJECT_MAKERELIABLE() \
104 protected: \
105 virtual void _Internal_GetUpdateType(void) \
106 { \
107  UpdateSetReliable(); \
108 } \
109 public:
110 /* _RO_DO_REPLICAOBJECT_MAKERELIABLE macro ends here */
111 
112 /* _RO_DO_REPLICAOBJECT_MAKECERTAIN macro starts here */
113 #define _RO_DO_REPLICAOBJECT_MAKECERTAIN() \
114 protected: \
115 virtual void _Internal_GetUpdateType(void) \
116 { \
117  UpdateSetCertain(); \
118 } \
119 public:
120 /* _RO_DO_REPLICAOBJECT_MAKECERTAIN macro ends here */
121 
122 /* _RO_DO_REPLICAOBJECT_MAKEUNRELIABLE macro starts here */
123 #define _RO_DO_REPLICAOBJECT_MAKEUNRELIABLE() \
124 protected: \
125 virtual void _Internal_GetUpdateType(void) \
126 { \
127  UpdateSetUnreliable(); \
128 } \
129 public:
130 /* _RO_DO_REPLICAOBJECT_MAKEUNRELIABLE macro ends here */
131 
132 /* _RO_DO_REPLICAOBJECT_MAKEORDERED macro starts here */
133 #define _RO_DO_REPLICAOBJECT_MAKEORDERED() \
134 protected: \
135  virtual void _Internal_GetUpdateType(void) \
136 { \
137  UpdateSetOrdered(); \
138 } \
139 public:
140 /* _RO_DO_REPLICAOBJECT_MAKEORDERED macro ends here */
141 
142 
143 
144 
145 /* _RO_DEF_ALLOCATEFUNC macro starts here */
146 #define _RO_DEF_ALLOCATEFUNC(x) \
147 extern RNReplicaNet::ReplicaObject * _MAKE_RO_ALLOCFUNC(x)(void); \
148 extern void _MAKE_RO_DELETEFUNC(x)(RNReplicaNet::ReplicaObject *object); \
149 extern void _MAKE_RO_SETCLASSIDFUNC(x)(int classid,RNReplicaNet::s_RO_RegistryBlock *theBlock); \
150 extern void _MAKE_RO_REGISTERFUNC(x)(void);
151 /* _RO_DEF_ALLOCATEFUNC macro ends here */
152 
153 /* _RO_DO_ALLOCATEFUNC macro starts here */
154 #define _RO_DO_ALLOCATEFUNC(x) \
155 RNReplicaNet::ReplicaObject * _MAKE_RO_ALLOCFUNC(x)(void) \
156 { \
157  return _MAKE_BASE(x)::AllocateForReplicaNet(); \
158 } \
159 void _MAKE_RO_DELETEFUNC(x)(RNReplicaNet::ReplicaObject *object) \
160 { \
161  _MAKE_BASE(x)::DeleteForReplicaNet(object); \
162 } \
163 void _MAKE_RO_SETCLASSIDFUNC(x)(int classid,RNReplicaNet::s_RO_RegistryBlock *theBlock) \
164 { \
165  _MAKE_RO(x)::StaticSetClassID(classid,theBlock); \
166 } \
167 void _MAKE_RO_REGISTERFUNC(x)(void) \
168 { \
169  _MAKE_RO(x)::StaticSetRegistered(true); \
170 }
171 /* _RO_DO_ALLOCATEFUNC macro ends here */
172 
173 /* _RO_DEF_ALLOCATE macro starts here */
174 #define _RO_DEF_ALLOCATE(x) \
175 static _MAKE_BASE(x)* AllocateForReplicaNet(); \
176 static void DeleteForReplicaNet(RNReplicaNet::ReplicaObject *object);
177 /* _RO_DEF_ALLOCATE macro ends here */
178 
179 /* _RO_DO_ALLOCATE macro starts here */
180 #define _RO_DO_ALLOCATE(x) \
181 _MAKE_BASE(x)* _MAKE_RO(x)::AllocateForReplicaNet() \
182 { \
183  return new _MAKE_BASE(x); \
184 } \
185 void _MAKE_RO(x)::DeleteForReplicaNet(RNReplicaNet::ReplicaObject *object) \
186 { \
187  delete object; \
188 }
189 /* _RO_DO_ALLOCATE macro ends here */
190 
191 /* _RO_REGISTER macro starts here */
192 #define _RO_DO_REGISTER(x) \
193 public: \
194 virtual void SetRegistered(bool flag = true) \
195 { \
196  mRegistered = flag; \
197 } \
198 static void StaticSetRegistered(bool flag = true) \
199 { \
200  mRegistered = flag; \
201 } \
202 virtual bool GetRegistered(void) \
203 { \
204  return mRegistered; \
205 } \
206 private: \
207  static bool mRegistered; \
208 public:
209 /* _RO_REGISTER macro ends here */
210 
211 /* _RO_DO_IDS macro starts here */
212 #define _RO_DO_IDS(x) \
213 static void StaticSetClassID(const int class_id,RNReplicaNet::s_RO_RegistryBlock *theBlock) \
214 { \
215  mClassID = class_id; \
216  mBoundRegistryBlock = theBlock; \
217 } \
218 virtual const int GetClassID(void) \
219 { \
220  return mClassID; \
221 } \
222 RNReplicaNet::s_RO_RegistryBlock *GetRegistryBlock(void) const \
223 { \
224  return mBoundRegistryBlock; \
225 } \
226 static int StaticGetClassID(void) \
227 { \
228  return mClassID; \
229 } \
230 static RNReplicaNet::s_RO_RegistryBlock *StaticGetRegistryBlock(void) \
231 { \
232  return mBoundRegistryBlock; \
233 } \
234 private: \
235  static int mClassID; \
236  static RNReplicaNet::s_RO_RegistryBlock *mBoundRegistryBlock; \
237 public:
238 /* _RO_DO_IDS macro ends here */
239 
240 /* _RO_DO_ALLOW_PUBLIC macro starts here */
241 #define _RO_DO_ALLOW_PUBLIC() \
242 public:
243 /* _RO_DO_ALLOW_PUBLIC macro ends here */
244 
245 /* _RO_DO_MAKE_PRIVATE macro starts here */
246 #define _RO_DO_MAKE_PRIVATE() \
247 private:
248 /* _RO_DO_MAKE_PRIVATE macro ends here */
249 
250 /* _RO_DO_ALLOW_FRIEND macro starts here */
251 #define _RO_DO_ALLOW_FRIEND(x) \
252 friend class _MAKE_BASE(x);
253 /* _RO_DO_ALLOW_FRIEND macro ends here */
254 
255 /* _RO_DO_ALLOW_FRIEND_RO macro starts here */
256 #define _RO_DO_ALLOW_FRIEND_RO(x) \
257 friend class _MAKE_RO(x);
258 /* _RO_DO_ALLOW_FRIEND_RO macro ends here */
259 
260 /* _RO_DO_PUBLIC_RO macro starts here */
261 #define _RO_DO_PUBLIC_RO(x) \
262 public _MAKE_RO(x)
263 /* _RO_DO_PUBLIC_RO macro ends here */
264 
265 /* _RO_DO_APPROVEFAULT macro starts here */
266 #define _RO_DO_APPROVEFAULT() \
267 public: \
268 virtual bool ApproveFault(void) \
269 { \
270  return true; \
271 } \
272 private:
273 /* _RO_DO_APPROVEFAULT macro ends here */
274 
275 /* _RO_DO_APPROVEMIGRATION macro starts here */
276 #define _RO_DO_APPROVEMIGRATION() \
277 public: \
278 virtual bool ApproveMigration(void) \
279 { \
280  return true; \
281 } \
282 private:
283 /* _RO_DO_APPROVEMIGRATION macro ends here */
284 
285 
286 /* _RO_DO_SETUPLOADBALANCE macro starts here */
287 #define _RO_DO_SETUPLOADBALANCE(x) \
288 public: \
289 virtual void _Internal_SetupLoadBalance(void) \
290 { \
291  SetLoadBalancing(x); \
292 } \
293 private:
294 /* _RO_DO_SETUPLOADBALANCE macro ends here */
295 
296 /* _RO_DO_SETUPLOADBALANCEDEFAULT macro starts here */
297 #define _RO_DO_SETUPLOADBALANCEDEFAULT(x) \
298 public: \
299 virtual void _Internal_SetupLoadBalanceDefault(void) \
300 { \
301  SetLoadBalancingDefault(x); \
302 } \
303 private:
304 /* _RO_DO_SETUPLOADBALANCEDEFAULT macro ends here */
305 
306 /* _RO_DO_SETUPLOADBALANCESCORE macro starts here */
307 #define _RO_DO_SETUPLOADBALANCESCORE(x) \
308 public: \
309 virtual void _Internal_SetupLoadBalanceScore(void) \
310 { \
311  SetLoadScore(x); \
312 } \
313 private:
314 /* _RO_DO_SETUPLOADBALANCESCORE macro ends here */
315 
316 /* _RO_DO_SETUPLOADBALANCESCOREDEFAULT macro starts here */
317 #define _RO_DO_SETUPLOADBALANCESCOREDEFAULT(x) \
318 public: \
319 virtual void _Internal_SetupLoadBalanceScoreDefault(void) \
320 { \
321  SetLoadScoreDefault(x); \
322 } \
323 private:
324 /* _RO_DO_SETUPLOADBALANCESCOREDEFAULT macro ends here */
325 
326 
327 // Distance propagate functions
328 /* _RO_DO_SETUPPROPAGATETOSESSIONDISTANCERECALCULATIONDELAY macro starts here */
329 #define _RO_DO_SETUPPROPAGATETOSESSIONDISTANCERECALCULATIONDELAY(x) \
330 public: \
331 virtual void _Internal_SetupPropagateToSessionDistanceRecalculationDelay(void) \
332 { \
333  SetPropagateToSessionDistanceRecalculationDelay(x); \
334 } \
335 private:
336 /* _RO_DO_SETUPPROPAGATETOSESSIONDISTANCERECALCULATIONDELAY macro ends here */
337 
338 /* _RO_DO_SETUPPROPAGATEDISTANCE macro starts here */
339 #define _RO_DO_SETUPPROPAGATEDISTANCE(x) \
340 public: \
341 virtual void _Internal_SetupPropagateDistance(void) \
342 { \
343  SetPropagateToSessionDistance(x); \
344 } \
345 private:
346 /* _RO_DO_SETUPPROPAGATEDISTANCE macro ends here */
347 
348 /* _RO_DO_SETUPPROPAGATEDISTANCEDEFAULT macro starts here */
349 #define _RO_DO_SETUPPROPAGATEDISTANCEDEFAULT(x) \
350 public: \
351 virtual void _Internal_SetupPropagateDistanceDefault(void) \
352 { \
353  SetPropagateToSessionDistanceDefault(x); \
354 } \
355 private:
356 /* _RO_DO_SETUPPROPAGATEDISTANCEDEFAULT macro ends here */
357 
358 /* _RO_DO_SETUPPROPAGATEDISTANCEINCLUDE macro starts here */
359 #define _RO_DO_SETUPPROPAGATEDISTANCEINCLUDE(x) \
360 public: \
361 virtual void _Internal_SetupPropagateDistanceInclude(void) \
362 { \
363  SetPropagateToSessionDistanceInclude(x); \
364 } \
365 private:
366 /* _RO_DO_SETUPPROPAGATEDISTANCEINCLUDE macro ends here */
367 
368 /* _RO_DO_SETUPPROPAGATEDISTANCEINCLUDEDEFAULT macro starts here */
369 #define _RO_DO_SETUPPROPAGATEDISTANCEINCLUDEDEFAULT(x) \
370 public: \
371 virtual void _Internal_SetupPropagateDistanceIncludeDefault(void) \
372 { \
373  SetPropagateToSessionDistanceIncludeDefault(x); \
374 } \
375 private:
376 /* _RO_DO_SETUPPROPAGATEDISTANCEINCLUDEDEFAULT macro ends here */
377 
378 /* _RO_DO_SETUPPROPAGATEDISTANCEEXCLUDE macro starts here */
379 #define _RO_DO_SETUPPROPAGATEDISTANCEEXCLUDE(x) \
380 public: \
381 virtual void _Internal_SetupPropagateDistanceExclude(void) \
382 { \
383  SetPropagateToSessionDistanceExclude(x); \
384 } \
385 private:
386 /* _RO_DO_SETUPPROPAGATEDISTANCEEXCLUDE macro ends here */
387 
388 /* _RO_DO_SETUPPROPAGATEDISTANCEEXCLUDEDEFAULT macro starts here */
389 #define _RO_DO_SETUPPROPAGATEDISTANCEEXCLUDEDEFAULT(x) \
390 public: \
391 virtual void _Internal_SetupPropagateDistanceExcludeDefault(void) \
392 { \
393  SetPropagateToSessionDistanceExcludeDefault(x); \
394 } \
395 private:
396 /* _RO_DO_SETUPPROPAGATEDISTANCEEXCLUDEDEFAULT macro ends here */
397 
398 /* _RO_DO_SETUPBAND macro starts here */
399 #define _RO_DO_SETUPBAND(x) \
400 public: \
401 virtual void _Internal_SetupBand(void) \
402 { \
403  SetBand(x); \
404 } \
405 private:
406 /* _RO_DO_SETUPBAND macro ends here */
407 
408 
409 // Register DataBlocks functions
410 
411 /* _RO_DEF_REGISTERDATABLOCKS macro starts here */
412 #define _RO_DEF_REGISTERDATABLOCKS(x) \
413 void RegisterDataBlocks(void);
414 /* _RO_DEF_REGISTERDATABLOCKS macro ends here */
415 
416 /* _RO_DO_BEGINREGISTERDATABLOCKS macro starts here */
417 #define _RO_DO_BEGINREGISTERDATABLOCKS(x) \
418 void _MAKE_RO(x)::RegisterDataBlocks(void) \
419 { \
420  _MAKE_BASE(x) *basepoint = (_MAKE_BASE(x) *)this; \
421  basepoint = basepoint;
422 /* _RO_DO_BEGINREGISTERDATABLOCKS macro ends here */
423 
424 
425 // Include visual debugger information if required
426 /* _RO_DO_SETDATABLOCKVARIABLENAME macro starts here */
427 #ifdef REPLICANET_VISUALDEBUGGER
428 #define _RO_DO_SETDATABLOCKVARIABLENAME(x) \
429  datablock->SetVariableName(#x);
430 #else
431 #define _RO_DO_SETDATABLOCKVARIABLENAME(x)
432 #endif
433 /* _RO_DO_SETDATABLOCKVARIABLENAME macro starts here */
434 
435 
436 /* _RO_DO_DATABLOCK_MAKERELIABLE macro starts here */
437 #define _RO_DO_DATABLOCK_MAKERELIABLE() \
438 datablock->SetReliableFlag(true);
439 /* _RO_DO_DATABLOCK_MAKERELIABLE macro ends here */
440 
441 /* _RO_DO_DATABLOCK_MAKECERTAIN macro starts here */
442 #define _RO_DO_DATABLOCK_MAKECERTAIN() \
443 datablock->SetCertainFlag(true);
444 /* _RO_DO_DATABLOCK_MAKECERTAIN macro ends here */
445 
446 /* _RO_DO_DATABLOCK_MAKEORDERED macro starts here */
447 #define _RO_DO_DATABLOCK_MAKEORDERED() \
448 datablock->SetOrderedFlag(true);
449 /* _RO_DO_DATABLOCK_MAKEORDERED macro ends here */
450 
451 /* _RO_DO_DATABLOCK_MAKEORDERED macro starts here */
452 #define _RO_DO_DATABLOCK_SETDISCARDOLDER(x) \
453  datablock->SetDiscardOlder(x);
454 /* _RO_DO_DATABLOCK_SETDISCARDOLDER macro ends here */
455 
456 
457 /* _RO_DO_DATABLOCK_MAKEUNRELIABLE macro starts here */
458 #define _RO_DO_DATABLOCK_MAKEUNRELIABLE() \
459 datablock->SetReliableFlag(false); \
460 datablock->SetCertainFlag(false); \
461 datablock->SetOrderedFlag(false);
462 /* _RO_DO_DATABLOCK_MAKEUNRELIABLE macro ends here */
463 
464 /* _RO_DO_DATABLOCK_MAKEAUTOMATIC macro starts here */
465 #define _RO_DO_DATABLOCK_MAKEAUTOMATIC() \
466 datablock->SetAutomaticUpdatesFlag(true);
467 /* _RO_DO_DATABLOCK_MAKEAUTOMATIC macro ends here */
468 
469 /* _RO_DO_DATABLOCK_MAKEMANUAL macro starts here */
470 #define _RO_DO_DATABLOCK_MAKEMANUAL() \
471 datablock->SetAutomaticUpdatesFlag(false);
472 /* _RO_DO_DATABLOCK_MAKEMANUAL macro ends here */
473 
474 /* _RO_DO_DATABLOCK_FORCEREFLECTIONUPDATE macro starts here */
475 #define _RO_DO_DATABLOCK_FORCEREFLECTIONUPDATE() \
476  datablock->SetForceReflectionUpdate(true);
477 /* _RO_DO_DATABLOCK_FORCEREFLECTIONUPDATE macro ends here */
478 
479 
480 /* _RO_DO_DATABLOCK_REFLECTIONMASTERUPDATE macro starts here */
481 #define _RO_DO_DATABLOCK_REFLECTIONMASTERUPDATE() \
482  datablock->SetReflectionMasterUpdate(true);
483 /* _RO_DO_DATABLOCK_REFLECTIONMASTERUPDATE macro ends here */
484 
485 /* _RO_DO_DATABLOCK_SETUPDATEDELAYMINIMUM macro starts here */
486 #define _RO_DO_DATABLOCK_SETUPDATEDELAYMINIMUM(x) \
487 datablock->SetUpdateDelayMinimum(x);
488 /* _RO_DO_DATABLOCK_SETUPDATEDELAYMINIMUM macro ends here */
489 
490 /* _RO_DO_DATABLOCK_SETFORCESENDMAXIMUMUPDATES macro starts here */
491 #define _RO_DO_DATABLOCK_SETFORCESENDMAXIMUMUPDATES(x) \
492 datablock->SetForceSendMaximumUpdates(x);
493 /* _RO_DO_DATABLOCK_SETFORCESENDMAXIMUMUPDATES macro ends here */
494 
495 /* _RO_DO_DATABLOCK_SETFORCESENDTIMEDELAY macro starts here */
496 #define _RO_DO_DATABLOCK_SETFORCESENDTIMEDELAY(x) \
497 datablock->SetForceSendTimeDelay(x);
498 /* _RO_DO_DATABLOCK_SETFORCESENDTIMEDELAY macro ends here */
499 
500 /* _RO_DO_DATABLOCK_SETBAND macro starts here */
501 #define _RO_DO_DATABLOCK_SETBAND(x) \
502 datablock->SetBand(x);
503 /* _RO_DO_DATABLOCK_SETBAND macro ends here */
504 
505 
506 /* _RO_DO_ENDREGISTERDATABLOCKS macro starts here */
507 #define _RO_DO_ENDREGISTERDATABLOCKS(x) \
508 }
509 /* _RO_DO_ENDREGISTERDATABLOCKS macro ends here */
510 
511 // The macros that handle individual data block registrations are in each data block include file
512 
513 /* _RO_DO_DEFBLOCK_FUNCTION_VAR macro starts here */
514 #define _RO_DO_DEFBLOCK_FUNCTION_VAR(x) \
515  void *mDataBlockFunction_##x; \
516  static void x(void *classp,void *opaque_message,void *thisDataBlock);
517 /* _RO_DO_DEFBLOCK_FUNCTION_VAR macro ends here */
518 
519 /* GLOBAL_FUNCTION_CALL macro starts here */
520 #define GLOBAL_FUNCTION_CALL(x) \
521 {x ;} \
522 {Call_##x ;};
523 /* GLOBAL_FUNCTION_CALL macro ends here */
524 
525 /* ALL_REPLICAS_FUNCTION_CALL macro starts here */
526 #define ALL_REPLICAS_FUNCTION_CALL(x) \
527 {Call_##x ;};
528 /* ALL_REPLICAS_FUNCTION_CALL macro ends here */
529 
530 /* MASTER_FUNCTION_CALL macro starts here */
531 #define MASTER_FUNCTION_CALL(x) \
532 {Call_##x ;};
533 /* MASTER_FUNCTION_CALL macro ends here */
534 
535 /* ONLY_MASTER_FUNCTION_CALL macro starts here */
536 #define ONLY_MASTER_FUNCTION_CALL(x) \
537 {if (IsMaster()) \
538 {x ;} else { Call_##x ;}\
539 };
540 /* ONLY_MASTER_FUNCTION_CALL macro ends here */
541 
542 /* NOMINATED_REPLICAS_FUNCTION_CALL macro starts here */
543 #define NOMINATED_REPLICAS_FUNCTION_CALL(a,b,x) \
544 RNReplicaNet::DataBlock_Function::SetSessionIDFilter(a,b); \
545 {Call_##x ;};
546 /* NOMINATED_REPLICAS_FUNCTION_CALL macro ends here */
547 
548 /* Macros used outside of object classes */
549 #ifdef REPLICANET_VISUALDEBUGGER
550 #define _RO_DEF_DO_PREDEFREGBLOCK(x) \
551 theBlock = new RNReplicaNet::s_RO_RegistryBlock(ro_id,objectfuncp,objectfuncp_delete, #x );
552 #else
553 #define _RO_DEF_DO_PREDEFREGBLOCK(x) \
554 theBlock = new RNReplicaNet::s_RO_RegistryBlock(ro_id,objectfuncp,objectfuncp_delete, 0 );
555 #endif // ifdef REPLICANET_VISUALDEBUGGER
556 /* _RO_DEF_DO_PREDEF macro starts here */
557 #define _RO_DEF_DO_PREDEF(x) \
558 _RO_DEF_ALLOCATEFUNC(x); \
559 _RO_DEF_DO_PREDEF2(x)
560 /* _RO_DEF_DO_PREDEF macro ends here */
561 
562 /* _RO_DEF_DO_PREDEF2 macro starts here */
563 #define _RO_DEF_DO_PREDEF2(x) \
564 objectfuncp = _MAKE_RO_ALLOCFUNC(x); \
565 objectfuncp_delete = _MAKE_RO_DELETEFUNC(x); \
566 _RO_DEF_DO_PREDEFREGBLOCK(x); \
567 _MAKE_RO_SETCLASSIDFUNC(x)(ro_id,theBlock); \
568 repNet->AddItem(theBlock); \
569 _MAKE_RO_REGISTERFUNC(x)(); \
570 ro_id++;
571 /* _RO_DEF_DO_PREDEF2 macro ends here */
572 
573 #define _RO_DO_PREREGISTER_FUNC() \
574 static bool doneregister = false; \
575 void _ReplicaNetPreRegisterReplicasFunc(RNReplicaNet::ReplicaNet *repNet) \
576 { \
577  RNReplicaNet::ReplicaNetDLLRegister thing; \
578  thing.Call(repNet); \
579 } \
580 void RNReplicaNet::ReplicaNetDLLRegister::Call(RNReplicaNet::ReplicaNet *repNet) \
581 { \
582  doneregister = true; \
583  RNReplicaNet::s_RO_RegistryBlock *theBlock = 0; \
584  RNReplicaNet::p_RO_Func *objectfuncp = 0; \
585  RNReplicaNet::p_RO_FuncDelete *objectfuncp_delete = 0; \
586  int ro_id = 0; \
587  ro_id = ro_id; \
588  objectfuncp_delete = objectfuncp_delete; \
589  objectfuncp = objectfuncp; \
590  theBlock = theBlock;
591 
592 // The extra bits added above are to avoid the compiler warnings for empty lists of classes to register
593 
594 #define _RO_DO_PREREGISTER_FUNC_END() \
595 }
596 
597 
598 /* _RO_DEF_REPLICAOBJECT_INTERNAL_SETUPOPAQUEPOINTER macro starts here */
599 #define _RO_DEF_REPLICAOBJECT_INTERNAL_SETUPOPAQUEPOINTER() \
600 protected: \
601 virtual void _Internal_SetupOpaquePointer(void); \
602 public:
603 /* _RO_DEF_REPLICAOBJECT_INTERNAL_SETUPOPAQUEPOINTER macro ends here */
604 
605 /* _RO_DO_REPLICAOBJECT_INTERNAL_SETUPOPAQUEPOINTER macro starts here */
606 #define _RO_DO_REPLICAOBJECT_INTERNAL_SETUPOPAQUEPOINTER(x,y) \
607 void _MAKE_RO(x)::_Internal_SetupOpaquePointer(void) \
608 { \
609  SetOpaquePointer((void *)((y *)((_MAKE_BASE(x) *)this))); \
610 }
611 /* _RO_DO_REPLICAOBJECT_INTERNAL_SETUPOPAQUEPOINTER macro ends here */
612 
613 
614 
615 /* _RO_DEF_SETUP_TYPE_SPECIFICS macro starts here */
616 #define _RO_DEF_SETUP_TYPE_SPECIFICS(x) \
617 private: \
618  static int mStaticExpectedNumDataBlocks; \
619 protected: \
620 static void StaticSetExpectedNumDataBlocks(const int expected) {mStaticExpectedNumDataBlocks = expected;} \
621 static int StaticGetExpectedNumDataBlocks(void) { return mStaticExpectedNumDataBlocks; } \
622 virtual void SetNumExpectedDataBlocks(const int expected) { StaticSetExpectedNumDataBlocks(expected); } \
623 virtual int GetNumExpectedDataBlocks(void) { return StaticGetExpectedNumDataBlocks(); } \
624 private:
625 /* _RO_DEF_SETUP_TYPE_SPECIFICS macro ends here */
626 
627 #endif