Go to the documentation of this file.00001 #ifndef OPENTISSUE_UTILITY_UTILITY_CLASS_ID_H
00002 #define OPENTISSUE_UTILITY_UTILITY_CLASS_ID_H
00003
00004
00005
00006
00007
00008
00009
00010 #include <OpenTissue/configuration.h>
00011
00012 namespace OpenTissue
00013 {
00014 namespace utility
00015 {
00016
00023 class BaseIDGenerator
00024 {
00025
00026 template < class T >
00027 friend class ClassID;
00028
00029 private:
00030
00031 BaseIDGenerator();
00032
00038 static size_t const generate_id()
00039 {
00040 static size_t id = 0;
00041 return id++;
00042 }
00043
00044 };
00045
00046
00049 class ClassIDInterface
00050 {
00051 public:
00052
00055 virtual ~ClassIDInterface(){}
00056
00062 virtual size_t const class_id() const = 0;
00063 };
00064
00065
00066
00084 template < class T >
00085 class ClassID
00086 : virtual public ClassIDInterface
00087 {
00088 public:
00089
00096 static size_t const id()
00097 {
00098 static size_t my_id = BaseIDGenerator::generate_id();
00099 return my_id;
00100 }
00101
00104 virtual size_t const class_id() const
00105 {
00106 return id();
00107 }
00108 };
00109
00136 template < class Base, class Self >
00137 class ClassIDCompositor
00138 : public Base
00139 , public ClassID<Self>
00140 {
00141 public:
00142
00145 static size_t const id()
00146 {
00147 return ClassID<Self>::id();
00148 }
00149
00152 virtual size_t const class_id() const
00153 {
00154 return ClassID<Self>::id();
00155 }
00156 };
00157
00158 }
00159 }
00160
00161 #endif
00162