diff --git a/examples/Factory.cpp b/examples/Factory.cpp new file mode 100755 index 0000000..df1e0e2 --- /dev/null +++ b/examples/Factory.cpp @@ -0,0 +1,232 @@ +//////////////////////////////////////////////////////////////////////////////// +// The Loki Library +// Copyright (c) 2005 by Peter Kuemmel +// +// Code covered by the MIT License +// The authors make no representations about the suitability of this software +// for any purpose. It is provided "as is" without express or implied warranty. +//////////////////////////////////////////////////////////////////////////////// + +// $Header$ + +//#define CLASS_LEVEL_THERADING + +#include +#include "loki/Factory.h" +#include "loki/Functor.h" + +using Loki::Functor; +using Loki::Factory; +using Loki::SingletonHolder; +using std::cout; +using std::endl; + + +//////////////////////////////////////////// +// Object to create: Product +// Constructor with 0 and 2 arguments +//////////////////////////////////////////// + +class AbstractProduct{}; + +class Product : public AbstractProduct +{ +public: + Product(){} + Product( int, int ){} +}; + +/////////////////////////////////////////////////////////// +// Factory for creation a Product object without parameters +/////////////////////////////////////////////////////////// + +typedef SingletonHolder +< + Factory< AbstractProduct, int > +> +PFactoryNull; + +///////////////////////////////////////////////////////////// +// Factory for creation a Product object with 2 parameters +///////////////////////////////////////////////////////////// + +typedef SingletonHolder +< + Factory< AbstractProduct, int, TYPELIST_2( int, int ) > +> +PFactory; + +//////////////////////////////////////////////////// +// Creator functions with different names +//////////////////////////////////////////////////// + +Product* createProductNull() +{ + cout << "createProductNull()" << endl; + return new Product; +} +Product* createProductParm( int a, int b ) +{ + cout << "createProductParm( int a, int b ) " << endl; + return new Product( a, b ); +} + +/////////////////////////////////////////////////// +// Overloaded creator functions +/////////////////////////////////////////////////// +Product* createProductOver() +{ + cout << "createProductOver()" << endl; + return new Product; +} +Product* createProductOver( int a, int b ) +{ + cout << "createProductOver( int a, int b )" << endl; + return new Product( a, b ); +} + + + +/////////////////////////////////////////////////// +// Creator functions are polymorphic member functions +/////////////////////////////////////////////////// + +class AbstractCreator{ +public: + virtual AbstractProduct* create() = 0; + virtual AbstractProduct* createParm( int, int ) = 0; +}; + +class Creator : public AbstractCreator{ +public: + Creator(){}; + AbstractProduct* create() + { + cout << "Creator::create()" << endl; + return new Product; + } + AbstractProduct* createParm( int a, int b ) + { + cout << "Creator::create( int a, int b )" << endl; + return new Product( a,b ); + } +}; + +/////////////////////////////////////////////////////////////// +// Creator functions are member functions of a template class +/////////////////////////////////////////////////////////////// + +template< class T> +class CreatorT{ +public: + CreatorT(){}; + T* create() + { + cout << "CreatorT::create()" << endl; + return new T; + } + T* createParm( int a, int b ) + { + cout << "CreatorT::create( int a, int b )" << endl; + return new T( a,b ); + } +}; + + /////////////////////////////////////////////////////////////// +// get creator functions on runntime +/////////////////////////////////////////////////////////////// + +typedef Functor CreateFunctor; + +typedef +SingletonHolder +< + Factory< AbstractProduct, int,TYPELIST_3(CreateFunctor,int,int) > +> +PFactoryFunctorParm; + +Product* createProductRuntime(CreateFunctor func, int a, int b) +{ + Product *p = func( a, b ); + cout << " called by createProductRuntime(CreateFunctor func, int a, int b) " << endl; + return p; +} + + + + + +/////////////////////////////////////// +// Register creator functions +// No additional typdefs are necessary! +////////////////////////////////////// + +AbstractCreator* c = new Creator; +CreatorT cT; + +bool reg() +{ + bool const ok1 = PFactoryNull::Instance().Register( 1, createProductNull ); + bool const ok2 = PFactoryNull::Instance().Register( 2, (Product*(*)()) createProductOver ); + bool const ok3 = PFactoryNull::Instance().Register( 3, c, &AbstractCreator::create ); + bool const ok4 = PFactoryNull::Instance().Register( 4, &cT, &CreatorT::create ); + + bool const ok5 = PFactory::Instance().Register( 1, createProductParm ); + bool const ok6 = PFactory::Instance().Register( 2, (Product*(*)(int,int))createProductOver ); + bool const ok7 = PFactory::Instance().Register( 3, c, &AbstractCreator::createParm ); + bool const ok8 = PFactory::Instance().Register( 4, &cT, &CreatorT::createParm ); + + bool const ok9 = PFactoryFunctorParm::Instance().Register( 1, createProductRuntime ); + + return ok1 && ok2 && ok3 && ok4 && ok5 && ok6 && ok7 && ok8 && ok9; +} + +int main(int argc, char *argv[]) +{ + reg(); + + AbstractProduct* p; + + cout << endl << "creator function is a simple function:" << endl; + p= PFactoryNull::Instance().CreateObject( 1 ); + delete p; + p= PFactory::Instance().CreateObject( 1, 64,64 ); + delete p; + + cout << endl << "creator function is a overloaded function:" << endl; + p= PFactoryNull::Instance().CreateObject( 2 ); + delete p; + p= PFactory::Instance().CreateObject( 2, 64,64 ); + delete p; + + cout << endl << "creator function is a member function:" << endl; + p= PFactoryNull::Instance().CreateObject( 3 ); + delete p; + p= PFactory::Instance().CreateObject( 3, 64,64 ); + delete p; + + cout << endl << "creator function is a template member function" << endl; + p= PFactoryNull::Instance().CreateObject( 4 ); + delete p; + p= PFactory::Instance().CreateObject( 4, 64,64 ); + delete p; + + CreateFunctor func1(createProductParm); + CreateFunctor func2(&cT, &CreatorT::createParm); + cout << endl << "creator function is a functor parameter" << endl; + p= PFactoryFunctorParm::Instance().CreateObject( 1, func1, 64,64 ); + delete p; + p= PFactoryFunctorParm::Instance().CreateObject( 1, func2, 64,64 ); + delete p; + + cout << endl; + cout << endl; + system("PAUSE"); + return EXIT_SUCCESS; +} + +// $Log$ +// Revision 1.1 2005/07/28 14:27:12 syntheticpp +// add Factory example +// + diff --git a/examples/Factory.dev b/examples/Factory.dev new file mode 100755 index 0000000..2f93889 --- /dev/null +++ b/examples/Factory.dev @@ -0,0 +1,89 @@ +[Project] +FileName=Factory.dev +Name=Factory +UnitCount=3 +Type=1 +Ver=1 +ObjFiles= +Includes=..\include +Libs= +PrivateResource= +ResourceIncludes= +MakeIncludes= +Compiler= +CppCompiler=-Wall -pedantic_@@_ +Linker= +IsCpp=1 +Icon= +ExeOutput= +ObjectOutput= +OverrideOutput=0 +OverrideOutputName=Factory.exe +HostApplication= +Folders= +CommandLine= +UseCustomMakefile=0 +CustomMakefile=Makefile.loki +IncludeVersionInfo=0 +SupportXPThemes=0 +CompilerSet=0 +CompilerSettings=0000000000000001000000 + +[VersionInfo] +Major=0 +Minor=1 +Release=1 +Build=1 +LanguageID=1033 +CharsetID=1252 +CompanyName= +FileVersion= +FileDescription=Developed using the Dev-C++ IDE +InternalName= +LegalCopyright= +LegalTrademarks= +OriginalFilename= +ProductName= +ProductVersion= +AutoIncBuildNr=0 + +[Unit4] +FileName=..\include\loki\Factory.h +CompileCpp=1 +Folder=Factory +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit3] +FileName=Factory.cpp +CompileCpp=1 +Folder=Factory +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit1] +FileName=..\src\SmallObj.cpp +CompileCpp=1 +Folder=Factory +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit2] +FileName=..\include\loki\Factory.h +CompileCpp=1 +Folder=Factory +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= +