reg_s11n_traits_template4.hpp

Go to the documentation of this file.
00001 ////////////////////////////////////////////////////////////////////////
00002 // A supermacro to generate some partial template specializations for
00003 // s11n-proxying class templates taking four parameterized types.
00004 // See the various proxy files, like std/map.hpp and
00005 // std/pair.hpp, for how to use it.
00006 //
00007 // Achtung: only suitable for monomorphic or base-most template types.
00008 ////////////////////////////////////////////////////////////////////////
00009 
00010 #ifndef S11N_TEMPLATE_TYPE
00011 #error "You must define S11N_TEMPLATE_TYPE before including this file. e.g., to std::map or std::multimap."
00012 #endif
00013 
00014 #ifndef S11N_TEMPLATE_TYPE_NAME
00015 #error "You must define S11N_TEMPLATE_TYPE_NAME before including this file. e.g., to \"map\" or \"multimap\"."
00016 #endif
00017 
00018 #ifndef S11N_TEMPLATE_TYPE_PROXY
00019 #  error "You must define S11N_TEMPLATE_TYPE_PROXY before including this file. e.g., ::s11n::map::map_serializable_proxy"
00020 #endif
00021 
00022 #ifndef S11N_TEMPLATE_TYPE_DESER_PROXY
00023 #  define S11N_TEMPLATE_TYPE_DESER_PROXY S11N_TEMPLATE_TYPE_PROXY
00024 #endif
00025 
00026 ////////////////////////////////////////////////////////////////////////
00027 // The S11N_TEMPLATE_TYPENAME_Tn macros are used when one or more of
00028 // the template parameters are concrete types, as opposed to typenames.
00029 // Define any of S11N_TEMPLATE_TYPENAME_Tn to a type name, e.g.:
00030 // #  define S11N_TEMPLATE_TYPENAME_T3 unsigned int
00031 ////////////////////////////////////////////////////////////////////////
00032 
00033 #ifndef S11N_TEMPLATE_TYPENAME_T1
00034 #  define S11N_TEMPLATE_TYPENAME_T1 typename
00035 #endif
00036 
00037 #ifndef S11N_TEMPLATE_TYPENAME_T2
00038 #  define S11N_TEMPLATE_TYPENAME_T2 typename
00039 #endif
00040 
00041 #ifndef S11N_TEMPLATE_TYPENAME_T3
00042 #  define S11N_TEMPLATE_TYPENAME_T3 typename
00043 #endif
00044 
00045 #ifndef S11N_TEMPLATE_TYPENAME_T4
00046 #  define S11N_TEMPLATE_TYPENAME_T4 typename
00047 #endif
00048 
00049 #define S11N_TEMPLATE_TYPE_Q S11N_TEMPLATE_TYPE< T1, T2, T3, T4 >
00050 
00051 #ifndef S11N_BASE_TYPE
00052 #define S11N_BASE_TYPE S11N_TEMPLATE_TYPE_Q
00053 #endif
00054 
00055 namespace s11n {
00056 
00057     /**
00058        s11n_traits<> specialization for template types taking four
00059        template parameters.
00060     */
00061     template <S11N_TEMPLATE_TYPENAME_T1 T1, S11N_TEMPLATE_TYPENAME_T2 T2, S11N_TEMPLATE_TYPENAME_T3 T3, S11N_TEMPLATE_TYPENAME_T4 T4>
00062     struct S11N_EXPORT_API s11n_traits < S11N_TEMPLATE_TYPE_Q, S11N_BASE_TYPE >
00063     {
00064     typedef S11N_TEMPLATE_TYPE_Q serializable_type;
00065     typedef S11N_BASE_TYPE serializable_interface_type;
00066     typedef S11N_TEMPLATE_TYPE_PROXY serialize_functor;
00067     typedef S11N_TEMPLATE_TYPE_DESER_PROXY deserialize_functor;
00068     typedef ::s11n::default_cleanup_functor< S11N_TEMPLATE_TYPE_Q > cleanup_functor;
00069     typedef ::s11n::cl::object_factory<serializable_interface_type> factory_type;
00070     static bool cl_reg_placeholder; 
00071     static const std::string class_name( const serializable_type * )
00072     {
00073         if( cl_reg_placeholder == true ); // just to reference it. w/o this cl reg never happens :(
00074         return S11N_TEMPLATE_TYPE_NAME;
00075     }
00076     };
00077     template <
00078     S11N_TEMPLATE_TYPENAME_T1 T1,
00079     S11N_TEMPLATE_TYPENAME_T2 T2,
00080     S11N_TEMPLATE_TYPENAME_T3 T3,
00081     S11N_TEMPLATE_TYPENAME_T4 T4
00082     >
00083     bool s11n_traits<
00084     S11N_TEMPLATE_TYPE_Q, S11N_BASE_TYPE
00085     >::cl_reg_placeholder = (
00086                  ::s11n::cl::classloader_register_base< S11N_TEMPLATE_TYPE_Q >(S11N_TEMPLATE_TYPE_NAME),
00087                  true
00088                  );
00089 
00090 } // namespace s11n
00091 
00092 
00093 #undef S11N_TEMPLATE_TYPE_Q
00094 #undef S11N_TEMPLATE_TYPE_PROXY
00095 #undef S11N_TEMPLATE_TYPE_DESER_PROXY
00096 #undef S11N_TEMPLATE_TYPE_NAME
00097 #undef S11N_TEMPLATE_TYPE
00098 #undef S11N_TEMPLATE_TYPENAME_T1
00099 #undef S11N_TEMPLATE_TYPENAME_T2
00100 #undef S11N_TEMPLATE_TYPENAME_T3
00101 #undef S11N_TEMPLATE_TYPENAME_T4
00102 #undef S11N_BASE_TYPE

Generated on Wed Jun 4 21:45:18 2008 for libs11n by  doxygen 1.5.3