$search
00001 #ifndef TYPELIB_IOPLUGINS_HH 00002 #define TYPELIB_IOPLUGINS_HH 00003 00004 #include <boost/type_traits/is_base_and_derived.hpp> 00005 #include <boost/mpl/if.hpp> 00006 00007 namespace Typelib 00008 { 00009 class ExportPlugin; 00010 class ImportPlugin; 00011 class Exporter; 00012 class Importer; 00013 00014 template<typename Type> 00015 struct plugin_traits 00016 { 00017 typedef typename boost::mpl::if_ 00018 < boost::is_base_and_derived<Exporter, Type> 00019 , ExportPlugin 00020 , ImportPlugin >::type plugin_base; 00021 00022 typedef typename boost::mpl::if_ 00023 < boost::is_base_and_derived<Exporter, Type> 00024 , Exporter 00025 , Importer >::type object_base; 00026 }; 00027 00028 template<typename Type> 00029 class GenericIOPlugin 00030 : public plugin_traits<Type>::plugin_base 00031 { 00032 public: 00033 GenericIOPlugin(char const* name) 00034 : plugin_traits<Type>::plugin_base(name) {} 00035 typename plugin_traits<Type>::object_base* create() 00036 { return new Type; } 00037 }; 00038 00039 class TypeDefinitionPlugin 00040 { 00041 public: 00042 virtual void registerTypes(Typelib::Registry& registry) = 0; 00043 }; 00044 } 00045 00046 #define TYPELIB_REGISTER_IO2(name, klass1, klass2) extern "C" void registerPlugins(Typelib::PluginManager& manager) {\ 00047 manager.add(new Typelib::GenericIOPlugin<klass1>(#name)); \ 00048 manager.add(new Typelib::GenericIOPlugin<klass2>(#name)); \ 00049 } 00050 00051 #define TYPELIB_REGISTER_IO1(name, klass1) extern "C" void registerPlugins(Typelib::PluginManager& manager) {\ 00052 manager.add(new Typelib::GenericIOPlugin<klass1>(#name)); \ 00053 } 00054 00055 #endif 00056