00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039 #ifndef _OSGTYPEDFUNCTORS_H_
00040 #define _OSGTYPEDFUNCTORS_H_
00041 #ifdef __sgi
00042 #pragma once
00043 #endif
00044
00045
00046
00047
00048
00049 #include <OSGTypedFunctorBase.h>
00050
00051 #include <OSGTypedFunctors1.h>
00052 #include <OSGTypedFunctors2.h>
00053
00054 OSG_BEGIN_NAMESPACE
00055
00056 #ifndef OSG_MICROSOFT_COMPILER_ALERT
00057
00058
00059
00060
00061
00065 template <class RetT, class Arg1T> inline
00066 TypedFunctionFunctor1<RetT, PtrCallArg<Arg1T> > osgTypedFunctionFunctor1Ptr (
00067 RetT (*pFunc)(Arg1T *));
00068
00072 template <class Arg1T> inline
00073 TypedFunctionVoidFunctor1< PtrCallArg<Arg1T> > osgTypedFunctionVoidFunctor1Ptr(
00074 void (*pFunc)(Arg1T *));
00075
00076
00077
00078
00079
00083 template <class RetT, class Arg1T> inline
00084 TypedFunctionFunctor1<RetT, RefCallArg<Arg1T> > osgTypedFunctionFunctor1Ref (
00085 RetT (*pFunc)(Arg1T &));
00086
00090 template <class Arg1T> inline
00091 TypedFunctionVoidFunctor1< RefCallArg<Arg1T> > osgTypedFunctionVoidFunctor1Ref(
00092 void (*pFunc)(Arg1T &));
00093
00094
00095
00096
00097
00098 template <class RetT, class Arg1T>
00099 inline TypedFunctionFunctor1<RetT, CPtrCallArg<Arg1T> >
00100 osgTypedFunctionFunctor1CPtr(RetT (*pFunc)(Arg1T));
00101
00105 template <class Arg1T> inline
00106 TypedFunctionVoidFunctor1< CPtrCallArg<Arg1T> >
00107 osgTypedFunctionVoidFunctor1CPtr(void (*pFunc)(Arg1T));
00108
00109
00110
00111
00112
00116 template <class RetT, class Arg1T> inline
00117 TypedFunctionFunctor1<RetT, CPtrRefCallArg<Arg1T> >
00118 osgTypedFunctionFunctor1CPtrRef(RetT (*pFunc)(Arg1T &));
00119
00120
00121
00122
00123
00127 template <class Arg1T> inline
00128 TypedFunctionVoidFunctor1< CPtrRefCallArg<Arg1T> >
00129 osgTypedFunctionVoidFunctor1CPtrRef(void (*pFunc)(Arg1T &));
00130
00131
00132
00133
00134
00135
00139 template <class RetT, class Arg1T> inline
00140 TypedObjectFunctor1<RetT, RefCallArg<Arg1T> > osgTypedMethodFunctor1Ref (
00141 RetT (Arg1T::*pFunc)());
00142
00146 template <class Arg1T> inline
00147 TypedObjectVoidFunctor1< RefCallArg<Arg1T> > osgTypedMethodVoidFunctor1Ref(
00148 void (Arg1T::*pFunc)());
00149
00150
00151
00152
00153
00157 template <class RetT, class Arg1T> inline
00158 TypedObjectFunctor1<RetT, PtrCallArg<Arg1T> > osgTypedMethodFunctor1Ptr (
00159 RetT (Arg1T::*pFunc)());
00160
00164 template <class Arg1T> inline
00165 TypedObjectVoidFunctor1< PtrCallArg<Arg1T> > osgTypedMethodVoidFunctor1Ptr(
00166 void (Arg1T::*pFunc)());
00167
00168
00169
00170
00171
00175 template <class RetT, class ObjectT, class Arg1T> inline
00176 TypedStoredObjectFunctor1<RetT,
00177 PtrCallArg<ObjectT>,
00178 PtrCallArg<Arg1T > >
00179 osgTypedMethodFunctor1ObjPtr( ObjectT *pObj,
00180 RetT (ObjectT::*pFunc)(Arg1T *));
00181
00185 template <class ObjectT, class Arg1T> inline
00186 TypedStoredObjectVoidFunctor1<PtrCallArg<ObjectT>,
00187 PtrCallArg<Arg1T > >
00188 osgTypedMethodVoidFunctor1ObjPtr( ObjectT *pObj,
00189 void (ObjectT::*pFunc)(Arg1T *));
00190
00191
00192
00193
00194
00198 template <class RetT, class ObjectT, class Arg1T> inline
00199 TypedStoredObjectFunctor1<RetT,
00200 PtrCallArg <ObjectT>,
00201 CPtrRefCallArg<Arg1T > >
00202 osgTypedMethodFunctor1ObjPtrCPtrRef( ObjectT *pObj,
00203 RetT (ObjectT::*pFunc)(Arg1T &));
00204
00208 template <class ObjectT, class Arg1T> inline
00209 TypedStoredObjectVoidFunctor1<PtrCallArg <ObjectT>,
00210 CPtrRefCallArg<Arg1T > >
00211 osgTypedMethodVoidFunctor1ObjPtrCPtrRef( ObjectT *pObj,
00212 void (ObjectT::*pFunc)(Arg1T &));
00213
00214
00215
00216
00217
00218 template <class RetT, class Arg1T>
00219 inline TypedObjectFunctor1<RetT, CPtrCallArg<Arg1T> >
00220 osgTypedMethodFunctor1CPtr(
00221 typename FunctorBuildFuncType1<RetT,
00222 CPtrCallArg<Arg1T> >::ObjFuncType pFunc);
00223
00224
00228 template <class Arg1T> inline
00229 TypedObjectVoidFunctor1< CPtrCallArg<Arg1T> >
00230 osgTypedMethodVoidFunctor1CPtr(
00231 typename FunctorBuildFuncType1<
00232 void,
00233 CPtrCallArg<Arg1T> >::ObjFuncType pFunc);
00234
00235
00236
00237
00238
00239
00243 template <class Arg1T> inline
00244 TypedObjectVoidFunctor1< CPtrRefCallArg<Arg1T> >
00245 osgTypedMethodVoidFunctor1CPtrRef(
00246 typename FunctorBuildFuncType1<
00247 void,
00248 CPtrRefCallArg<Arg1T> >::ObjFuncType pFunc);
00249
00250 #endif
00251
00252
00253
00254
00255
00260 template<class T1, class T2, class T3>
00261 struct TypedMethodVoidFunctor1ObjCPtrFGen
00262 {
00263 typedef CPtrCallArg<T3> CAT3;
00264
00265 typedef typename CAT3::ArgType Arg1T;
00266
00267 typedef ArgsCollector <Arg1T> ArgColl;
00268
00269 typedef typename ClassMemFunc1<T1,
00270 typename T2::StoredObjectType,
00271 ArgColl >::MemFunc Func;
00272 };
00273
00274
00275 #ifndef OSG_MICROSOFT_COMPILER_ALERT
00276
00280 template <class ObjectT, class Arg1T> inline
00281 TypedStoredObjectVoidFunctor1<
00282 CPtrCallArg<ObjectT>,
00283 CPtrCallArg<Arg1T > > osgTypedMethodVoidFunctor1ObjCPtr(
00284
00285 ObjectT obj,
00286
00287 typename TypedMethodVoidFunctor1ObjCPtrFGen<void,
00288 ObjectT,
00289 Arg1T >::Func pFunc);
00290
00291 #endif
00292
00293
00294
00295
00296
00301 template<class T1, class T2, class T3>
00302 struct TypedMethodVoidFunctor1ObjCPtrRefFGen
00303 {
00304 typedef CPtrRefCallArg<T3> CAT3;
00305
00306 typedef typename CAT3::ArgType Arg1T;
00307
00308 typedef ArgsCollector <Arg1T> ArgColl;
00309
00310 typedef typename ClassMemFunc1<T1,
00311 typename T2::StoredObjectType,
00312 ArgColl >::MemFunc Func;
00313 };
00314
00315 #ifndef OSG_MICROSOFT_COMPILER_ALERT
00316
00320 template <class ObjectT, class Arg1T> inline
00321 TypedStoredObjectVoidFunctor1<
00322 CPtrRefCallArg<ObjectT>,
00323 CPtrRefCallArg<Arg1T > > osgTypedMethodVoidFunctor1ObjCPtrRef(
00324
00325 ObjectT obj,
00326
00327 typename TypedMethodVoidFunctor1ObjCPtrRefFGen<void,
00328 ObjectT,
00329 Arg1T >::Func pFunc);
00330
00331
00332
00333
00334
00335
00339 template <class RetT, class ObjectT, class Arg2T> inline
00340 TypedFunctionFunctor2<RetT,
00341 PtrCallArg<ObjectT>,
00342 ArgsCollector<Arg2T> >
00343 osgTypedFunctionFunctor2Ptr (RetT (*pFunc)(ObjectT *, Arg2T));
00344
00348 template <class ObjectT, class Arg2T> inline
00349 TypedFunctionVoidFunctor2<PtrCallArg <ObjectT>,
00350 ArgsCollector<Arg2T> >
00351 osgTypedFunctionVoidFunctor2Ptr(void (*pFunc)(ObjectT *, Arg2T));
00352
00353
00354
00355
00356
00360 template <class RetT, class ObjectT, class Arg2T> inline
00361 TypedFunctionFunctor2<RetT,
00362 RefCallArg<ObjectT>,
00363 ArgsCollector<Arg2T> >
00364 osgTypedFunctionFunctor2Ref (RetT (*pFunc)(ObjectT &, Arg2T));
00365
00366
00370 template <class ObjectT, class Arg2T> inline
00371 TypedFunctionVoidFunctor2<RefCallArg <ObjectT>,
00372 ArgsCollector<Arg2T> >
00373 osgTypedFunctionVoidFunctor2Ref(void (*pFunc)(ObjectT &, Arg2T));
00374
00375
00376
00377
00378
00379 template <class RetT, class ObjectT, class Arg2T>
00380 inline TypedFunctionFunctor2<RetT, CPtrCallArg<ObjectT>, ArgsCollector<Arg2T> >
00381 osgTypedFunctionFunctor2CPtr (RetT (*pFunc)(ObjectT, Arg2T));
00382
00383 template <class ObjectT, class Arg2T>
00384 inline TypedFunctionVoidFunctor2<CPtrCallArg<ObjectT>, ArgsCollector<Arg2T> >
00385 osgTypedFunctionVoidFunctor2Cptr(void (*pFunc)(ObjectT, Arg2T));
00386
00387
00388
00389
00390
00394 template <class RetT, class ObjectT, class Arg2T> inline
00395 TypedFunctionFunctor2<RetT,
00396 CPtrRefCallArg <ObjectT>,
00397 ArgsCollector <Arg2T> >
00398 osgTypedFunctionFunctor2CPtrRef (RetT (*pFunc)(ObjectT &, Arg2T));
00399
00403 template <class ObjectT, class Arg2T> inline
00404 TypedFunctionVoidFunctor2<CPtrRefCallArg <ObjectT>,
00405 ArgsCollector <Arg2T> >
00406 osgTypedFunctionVoidFunctor2CPtrRef(void (*pFunc)(ObjectT &, Arg2T));
00407
00408
00409
00410
00411
00415 template <class RetT, class Arg1T, class Arg2T> inline
00416 TypedObjectFunctor2<RetT,
00417 RefCallArg <Arg1T>,
00418 ArgsCollector<Arg2T> >
00419 osgTypedMethodFunctor2Ref(RetT (Arg1T::*pFunc)(Arg2T));
00420
00424 template <class Arg1T, class Arg2T> inline
00425 TypedObjectVoidFunctor2<RefCallArg <Arg1T>,
00426 ArgsCollector<Arg2T> >
00427 osgTypedMethodVoidFunctor2Ref(void (Arg1T::*pFunc)(Arg2T));
00428
00429
00430
00431
00432
00436 template <class RetT, class Arg1T, class Arg2T> inline
00437 TypedObjectFunctor2<RetT,
00438 PtrCallArg <Arg1T>,
00439 ArgsCollector<Arg2T> >
00440 osgTypedMethodFunctor2Ptr (RetT (Arg1T::*pFunc)(Arg2T));
00441
00445 template <class Arg1T, class Arg2T> inline
00446 TypedObjectVoidFunctor2<PtrCallArg <Arg1T>,
00447 ArgsCollector<Arg2T> >
00448 osgTypedMethodVoidFunctor2Ptr(void (Arg1T::*pFunc)(Arg2T));
00449
00450
00451
00452
00453
00457 template <class RetT, class ObjectT,
00458 class Arg1T, class Arg2T > inline
00459 TypedStoredObjectFunctor2<RetT,
00460 PtrCallArg <ObjectT>,
00461 PtrCallArg <Arg1T >,
00462 ArgsCollector<Arg2T > >
00463 osgTypedMethodFunctor2ObjPtr ( ObjectT *pObj,
00464 RetT (ObjectT::*pFunc)(Arg1T *, Arg2T));
00465
00469 template <class ObjectT, class Arg1T, class Arg2T> inline
00470 TypedStoredObjectVoidFunctor2<PtrCallArg <ObjectT>,
00471 PtrCallArg <Arg1T >,
00472 ArgsCollector<Arg2T > >
00473 osgTypedMethodVoidFunctor2ObjPtr( ObjectT *pObj,
00474 void (ObjectT::*pFunc)(Arg1T *, Arg2T));
00475
00476
00477
00478
00479
00483 template <class RetT, class ObjectT,
00484 class Arg1T, class Arg2T > inline
00485 TypedStoredObjectFunctor2<RetT,
00486 PtrCallArg <ObjectT>,
00487 CPtrRefCallArg<Arg1T >,
00488 ArgsCollector <Arg2T > >
00489 osgTypedMethodFunctor2ObjPtrCPtrRef(
00490 ObjectT *pObj,
00491 RetT (ObjectT::*pFunc)(Arg1T &, Arg2T));
00492
00496 template <class ObjectT, class Arg1T, class Arg2T> inline
00497 TypedStoredObjectVoidFunctor2<PtrCallArg <ObjectT>,
00498 CPtrRefCallArg<Arg1T >,
00499 ArgsCollector <Arg2T > >
00500 osgTypedMethodVoidFunctor2ObjPtrCPtrRef(
00501 ObjectT *pObj,
00502 void (ObjectT::*pFunc)(Arg1T &, Arg2T));
00503
00504
00505
00506
00507
00508 template <class RetT, class ObjectT, class Arg2T>
00509 inline TypedObjectFunctor2<RetT, CPtrCallArg<ObjectT>, ArgsCollector<Arg2T> >
00510 osgTypedMethodFunctor2CPtr(
00511 typename FunctorBuildFuncType2<RetT,
00512 CPtrCallArg<ObjectT>,
00513 ArgsCollector<Arg2T> >::ObjFuncType pFunc);
00514
00515 template <class ObjectT, class Arg2T>
00516 inline TypedObjectVoidFunctor2<CPtrCallArg<ObjectT>, ArgsCollector<Arg2T> >
00517 osgTypedMethodVoidFunctor2CPtr(
00518 typename FunctorBuildFuncType2<void,
00519 CPtrCallArg<ObjectT>,
00520 ArgsCollector<Arg2T> >::ObjFuncType pFunc);
00521
00522
00523
00524
00525
00529 template <class ObjectT, class Arg1T> inline
00530 TypedObjectVoidFunctor2<CPtrRefCallArg<ObjectT>,
00531 ArgsCollector <Arg1T > >
00532 osgTypedMethodVoidFunctor2CPtrRef(
00533
00534 typename FunctorBuildFuncType2<
00535 void,
00536 CPtrRefCallArg<ObjectT>,
00537 ArgsCollector <Arg1T > >::ObjFuncType pFunc);
00538
00539 #endif
00540
00541
00542
00543
00544
00549 template<class T1, class T2, class T3, class T4>
00550 struct TypedMethodVoidFunctor2ObjCPtrRefFGen
00551 {
00552 typedef CPtrRefCallArg<T3> CAT3;
00553 typedef ArgsCollector <T4> ACT4;
00554
00555 typedef typename CAT3::ArgType Arg1T;
00556 typedef typename ACT4::Arg1T Arg2T;
00557
00558 typedef ArgsCollector2<Arg1T, T4> ArgColl;
00559
00560 typedef typename ClassMemFunc2<T1,
00561 typename T2::StoredObjectType,
00562 ArgColl >::MemFunc Func;
00563
00564 };
00565
00566 #ifndef OSG_MICROSOFT_COMPILER_ALERT
00567
00571 template <class ObjectT,
00572 class Arg1T,
00573 class Arg2T> inline
00574 TypedStoredObjectVoidFunctor2<CPtrRefCallArg<ObjectT>,
00575 CPtrRefCallArg<Arg1T >,
00576 ArgsCollector <Arg2T > >
00577 osgTypedMethodVoidFunctor2ObjCPtrRef(
00578
00579 ObjectT &pObj,
00580
00581 typename TypedMethodVoidFunctor2ObjCPtrRefFGen<void,
00582 ObjectT,
00583 Arg1T,
00584 Arg2T >::Func pFunc);
00585 #endif
00586
00587
00588
00589
00590
00595 template<class T1, class T2, class T3, class T4>
00596 struct TypedMethodVoidFunctor2ObjCPtrPtrFGen
00597 {
00598 typedef PtrCallArg<T3> CAT3;
00599 typedef ArgsCollector <T4> ACT4;
00600
00601 typedef typename CAT3::ArgType Arg1T;
00602 typedef typename ACT4::Arg1T Arg2T;
00603
00604 typedef ArgsCollector2<Arg1T, T4> ArgColl;
00605
00606 typedef typename ClassMemFunc2<T1,
00607 typename T2::StoredObjectType,
00608 ArgColl >::MemFunc Func;
00609
00610 };
00611
00612 #ifndef OSG_MICROSOFT_COMPILER_ALERT
00613
00617 template <class ObjectT,
00618 class Arg1T,
00619 class Arg2T> inline
00620 TypedStoredObjectVoidFunctor2<CPtrRefCallArg<ObjectT>,
00621 PtrCallArg <Arg1T >,
00622 ArgsCollector <Arg2T > >
00623 osgTypedMethodVoidFunctor2ObjCPtrPtr(
00624
00625 ObjectT &pObj,
00626
00627 typename TypedMethodVoidFunctor2ObjCPtrPtrFGen<void,
00628 ObjectT,
00629 Arg1T,
00630 Arg2T >::Func pFunc);
00631
00632 #endif
00633
00634
00635
00636
00637
00642 template<class T1, class T2, class T3>
00643 struct TypedMethodFunctor2BaseCPtrRefFGen
00644 {
00645 typedef ArgsCollector <T3> ArgColl;
00646
00647 typedef typename ClassMemFunc1<T1,
00648 typename T2::StoredObjectType,
00649 ArgColl >::MemFunc Func;
00650 };
00651
00652 #ifndef OSG_MICROSOFT_COMPILER_ALERT
00653
00654 #ifdef __sgi
00655 #pragma set woff 1424
00656 #endif
00657
00661 template <class RetT, class ObjectT,
00662 class Arg1T, class Arg2T> inline
00663 TypedObjectFunctor2<RetT,
00664 CPtrRefCallArg<Arg1T>,
00665 ArgsCollector <Arg2T> >
00666 osgTypedMethodFunctor2BaseCPtrRef(
00667
00668 typename TypedMethodFunctor2BaseCPtrRefFGen<RetT,
00669 ObjectT,
00670 Arg2T >::Func pFunc);
00671
00672 template <class RetT, class ObjectT,
00673 class Arg1T, class Arg2T >
00674 inline TypedObjectFunctor2<RetT, CPtrCallArg<Arg1T>, ArgsCollector<Arg2T> >
00675 osgTypedMethodFunctor2BaseCPtr(
00676 typename TypedMethodFunctor2BaseCPtrRefFGen<RetT,
00677 ObjectT,
00678 Arg2T >::Func pFunc);
00679
00680 #ifdef __sgi
00681 #pragma reset woff 1424
00682 #endif
00683
00684 #endif
00685
00686 OSG_END_NAMESPACE
00687
00688 #include <OSGTypedFunctors.inl>
00689
00690 #endif
00691
00692
00693
00694
00695
00696
00697
00698
00699
00700
00701
00702
00703