RepDef.h

Go to the documentation of this file.
00001 /*---------------------------------------------------------------------\
00002 |                                                                      |
00003 |                      __   __    ____ _____ ____                      |
00004 |                      \ \ / /_ _/ ___|_   _|___ \                     |
00005 |                       \ V / _` \___ \ | |   __) |                    |
00006 |                        | | (_| |___) || |  / __/                     |
00007 |                        |_|\__,_|____/ |_| |_____|                    |
00008 |                                                                      |
00009 |                               core system                            |
00010 |                                                        (C) SuSE GmbH |
00011 \----------------------------------------------------------------------/
00012 
00013   File:       RepDef.h
00014 
00015   Author:     Michael Andres <ma@suse.de>
00016   Maintainer: Michael Andres <ma@suse.de>
00017 
00018   Purpose: Provides a set of macros to define data and pointer classes.
00019   See class RepPtrStore in Rep.h.
00020 
00021 /-*/
00022 #ifndef RepDef_h
00023 #define RepDef_h
00024 
00025 #include <y2util/Rep.h>
00026 
00028 //
00029 // NOTE: Data classes must inherit class Rep:
00030 //
00031 // class CLNAME : public Rep {
00032 //   REP_BODY(CLNAME);
00033 //   ...
00034 // };
00035 //
00037 
00038 #define REP_BODY(NAME)         GEN_REP_BODY( NAME, #NAME )
00039 
00041 
00042 #define GEN_REP_BODY(CLNAME,STRNAME)                    \
00043   CLNAME( const CLNAME & );            /* no copy */    \
00044   CLNAME & operator=(const CLNAME & ); /* no assign */  \
00045   public:                                               \
00046     virtual const char * repName() const                \
00047       { return STRNAME; }                               \
00048     virtual size_t mem_size () const { return sizeof (CLNAME); }\
00049   private:
00050 
00052 
00053 #define DEFINE_BASE_POINTER(NAME)                               \
00054   class NAME;                                                   \
00055   typedef Ptr<NAME>      NAME##Ptr;                             \
00056   typedef constPtr<NAME> const##NAME##Ptr;                      \
00057   extern template class RepPtrStore<NAME>;                      \
00058   extern template class RepPtrStore<const NAME>;
00059 
00060 #define DEFINE_BASE_POINTER_IN_NAMESPACE(NS,NAME)               \
00061   namespace NS {                                                \
00062   class NAME;                                                   \
00063   typedef Ptr<NAME>      NAME##Ptr;                             \
00064   typedef constPtr<NAME> const##NAME##Ptr;                      \
00065   }                                                             \
00066   extern template class RepPtrStore<NS::NAME>;                  \
00067   extern template class RepPtrStore<const NS::NAME>;
00068 
00069 #define DEFINE_DERIVED_POINTER(NAME,BASE)                       \
00070   class NAME;                                                   \
00071   typedef Ptr<NAME,BASE>      NAME##Ptr;                        \
00072   typedef constPtr<NAME,BASE> const##NAME##Ptr;                 \
00073   extern template class RepPtrStore<NAME,BASE>;                 \
00074   extern template class RepPtrStore<const NAME,const BASE>;
00075 
00076 #define DEFINE_DERIVED_POINTER_IN_NAMESPACE(NS,NAME,BASE)       \
00077   namespace NS {                                                \
00078   class NAME;                                                   \
00079   typedef Ptr<NAME,BASE>      NAME##Ptr;                        \
00080   typedef constPtr<NAME,BASE> const##NAME##Ptr;                 \
00081   }                                                             \
00082   extern template class RepPtrStore<NS::NAME,BASE>;             \
00083   extern template class RepPtrStore<const NS::NAME,const BASE>;
00084 
00086 
00087 #define IMPL_BASE_POINTER(NAME)                                 \
00088 template class RepPtrStore<NAME>;                               \
00089 template class RepPtrStore<const NAME>;
00090 
00091 #define IMPL_BASE_POINTER_IN_NAMESPACE(NS,NAME)                 \
00092 template class RepPtrStore<NS::NAME>;                           \
00093 template class RepPtrStore<const NS::NAME>;
00094 
00095 #define IMPL_DERIVED_POINTER(NAME,BASE)                         \
00096 template class RepPtrStore<NAME,BASE>;                          \
00097 template class RepPtrStore<const NAME,const BASE>;
00098 
00099 #define IMPL_DERIVED_POINTER_IN_NAMESPACE(NS,NAME,BASE)         \
00100 template class RepPtrStore<NS::NAME,BASE>;                      \
00101 template class RepPtrStore<const NS::NAME,const BASE>;
00102 
00104 
00105 #endif // RepDef_h

Generated on Fri Jun 16 15:51:35 2006 for liby2util by  doxygen 1.4.6