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 _OSGCONCEPTPROPERTYCHECKS_H_
00040 #define _OSGCONECPTPROPERTYCHECKS_H_
00041 #ifdef __sgi
00042 #pragma once
00043 #endif
00044
00045 #include <OSGBaseTypes.h>
00046
00047 OSG_BEGIN_NAMESPACE
00048
00052 template <class TypeT>
00053 void osgSinkUnusedWarning(TypeT) { }
00054
00058 #define OSG_PROPERTY_DECL(OSGPROP) \
00059 enum OSG##OSGPROP##Prop { osg##OSGPROP##Prop }
00060
00064 #define OSG_PROPERTY_SPEC(OSGPROPERTYNAMESPACE, OSGPROP) \
00065 template<class T1> \
00066 struct _OSG_##OSGPROP##_Property_Spec \
00067 { \
00068 static void _OSG_##OSGPROP##_Property_violation(T1 t1) \
00069 { \
00070 OSGPROPERTYNAMESPACE:: \
00071 __OSG_##OSGPROP##_Property_violation(t1); \
00072 } \
00073 }
00074
00078 #define OSG_PROPERTY_VIOLATION(OSGPROP) \
00079 template<class T1> \
00080 static void __OSG_##OSGPROP##_Property_violation(T1) \
00081 { \
00082 while(0) \
00083 { \
00084 typename T1::OSG##OSGPROP##Prop v1 = T1::osg##OSGPROP##Prop; \
00085 \
00086 osgSinkUnusedWarning(v1); \
00087 } \
00088 }
00089
00090 #ifdef OSG_NO_CONCEPT_CHECKS
00091 #define OSG_PROPERTY_REQUIREMENT(OSGCLASS, OSGPROP)
00092 #else
00093
00097 #define OSG_PROPERTY_REQUIREMENT(OSGCLASS, OSGPROP) \
00098 typedef void (* _OSG##OSGPROP##PropReqDummyFuncFor##OSGCLASS)(OSGCLASS); \
00099 \
00100 template<_OSG##OSGPROP##PropReqDummyFuncFor##OSGCLASS FuncTypeT> \
00101 struct _OSG##OSGPROP##PropReqDummyStructFor##OSGCLASS \
00102 { \
00103 }; \
00104 \
00105 static _OSG##OSGPROP##PropReqDummyStructFor##OSGCLASS< \
00106 _OSG_##OSGPROP##_Property_Spec<OSGCLASS>:: \
00107 _OSG_##OSGPROP##_Property_violation> \
00108 _OSG##OSGPROP##PropReqDummyStructInstFor##OSGCLASS
00109 #endif
00110
00111 OSG_END_NAMESPACE
00112
00113 #endif