Go to the documentation of this file.00001
00002
00003
00004
00005
00006 #ifndef BOOST_ABSTRACT_FACTORY_VP_2004_08_25
00007 #define BOOST_ABSTRACT_FACTORY_VP_2004_08_25
00008
00009 #include <boost/mpl/inherit_linearly.hpp>
00010 #include <boost/mpl/list.hpp>
00011 #include <boost/shared_ptr.hpp>
00012
00013 #include <utilmm/plugin/virtual_constructors.hh>
00014
00015 namespace utilmm { namespace plugin {
00016
00017 struct empty_abstract_factory_item {
00018 void create(int*******);
00019 };
00020
00025 template<class BasePlugin, class Parameters>
00026 struct abstract_factory_item_N {
00027 };
00028
00029 template<class BasePlugin>
00030 struct abstract_factory_item_N<BasePlugin, boost::mpl::list<> > {
00031 virtual BasePlugin* create(dll_handle dll) = 0;
00032 };
00033
00034 template<class BasePlugin, class A1>
00035 struct abstract_factory_item_N<BasePlugin, boost::mpl::list<A1> > {
00036 virtual BasePlugin* create(dll_handle dll, A1 a1) = 0;
00037 };
00038
00039 template<class BasePlugin, class A1, class A2>
00040 struct abstract_factory_item_N<BasePlugin, boost::mpl::list<A1, A2> > {
00041 virtual BasePlugin* create(dll_handle dll, A1 a1, A2 a2) = 0;
00042 };
00043
00044
00045 template<class BasePlugin, class Base, class Parameters>
00046 struct abstract_factory_item :
00047 public Base,
00048 public abstract_factory_item_N<BasePlugin, Parameters>
00049 {
00050 using Base::create;
00051 using abstract_factory_item_N<BasePlugin, Parameters>::create;
00052 };
00053
00054 using namespace boost::mpl::placeholders;
00055
00056 template<class BasePlugin>
00057 struct abstract_factory :
00058 public boost::mpl::inherit_linearly<
00059 typename virtual_constructors<BasePlugin>::type,
00060 abstract_factory_item<BasePlugin, _, _>,
00061 empty_abstract_factory_item>::type
00062 {
00063 };
00064
00065 }}
00066
00067 #endif