Initial commit. Base Type factory implementation
This commit is contained in:
74
typefactory/.gitignore
vendored
Normal file
74
typefactory/.gitignore
vendored
Normal file
@@ -0,0 +1,74 @@
|
||||
# This file is used to ignore files which are generated
|
||||
# ----------------------------------------------------------------------------
|
||||
|
||||
*~
|
||||
*.autosave
|
||||
*.a
|
||||
*.core
|
||||
*.moc
|
||||
*.o
|
||||
*.obj
|
||||
*.orig
|
||||
*.rej
|
||||
*.so
|
||||
*.so.*
|
||||
*_pch.h.cpp
|
||||
*_resource.rc
|
||||
*.qm
|
||||
.#*
|
||||
*.*#
|
||||
core
|
||||
!core/
|
||||
tags
|
||||
.DS_Store
|
||||
.directory
|
||||
*.debug
|
||||
Makefile*
|
||||
*.prl
|
||||
*.app
|
||||
moc_*.cpp
|
||||
ui_*.h
|
||||
qrc_*.cpp
|
||||
Thumbs.db
|
||||
*.res
|
||||
*.rc
|
||||
/.qmake.cache
|
||||
/.qmake.stash
|
||||
|
||||
# qtcreator generated files
|
||||
*.pro.user*
|
||||
CMakeLists.txt.user*
|
||||
|
||||
# xemacs temporary files
|
||||
*.flc
|
||||
|
||||
# Vim temporary files
|
||||
.*.swp
|
||||
|
||||
# Visual Studio generated files
|
||||
*.ib_pdb_index
|
||||
*.idb
|
||||
*.ilk
|
||||
*.pdb
|
||||
*.sln
|
||||
*.suo
|
||||
*.vcproj
|
||||
*vcproj.*.*.user
|
||||
*.ncb
|
||||
*.sdf
|
||||
*.opensdf
|
||||
*.vcxproj
|
||||
*vcxproj.*
|
||||
|
||||
# MinGW generated files
|
||||
*.Debug
|
||||
*.Release
|
||||
|
||||
# Python byte code
|
||||
*.pyc
|
||||
|
||||
# Binaries
|
||||
# --------
|
||||
*.dll
|
||||
*.exe
|
||||
|
||||
11
typefactory/CMakeLists.txt
Normal file
11
typefactory/CMakeLists.txt
Normal file
@@ -0,0 +1,11 @@
|
||||
cmake_minimum_required(VERSION 3.5)
|
||||
|
||||
project(typefactory LANGUAGES CXX)
|
||||
|
||||
set(CMAKE_CXX_STANDARD 17)
|
||||
set(CMAKE_CXX_STANDARD_REQUIRED ON)
|
||||
|
||||
add_executable(typefactory main.cpp)
|
||||
|
||||
install(TARGETS typefactory
|
||||
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR})
|
||||
8
typefactory/main.cpp
Normal file
8
typefactory/main.cpp
Normal file
@@ -0,0 +1,8 @@
|
||||
#include <iostream>
|
||||
|
||||
using namespace std;
|
||||
|
||||
int main() {
|
||||
cout << "Hello World!" << endl;
|
||||
return 0;
|
||||
}
|
||||
114
typefactory/typefactory.h
Normal file
114
typefactory/typefactory.h
Normal file
@@ -0,0 +1,114 @@
|
||||
#ifndef TYPEFACTORY_H
|
||||
#define TYPEFACTORY_H
|
||||
#include <map>
|
||||
#include <list>
|
||||
#include <set>
|
||||
#include <memory>
|
||||
|
||||
/**
|
||||
* @brief The TypeFsactory class - base typefactory (abstract factory) template
|
||||
* @param ClassId_T - unique class identification class. For example string, or integer id.
|
||||
* @param BaseClass_T - all objects should have one base class. For example vehicle or parameter
|
||||
* @param Args - constructor arguments
|
||||
*
|
||||
* Usage example:
|
||||
* @code
|
||||
* class Base_T {
|
||||
* public:
|
||||
* virtual int get() = 0;
|
||||
* }
|
||||
*
|
||||
* class Derived1_T : public Base_T {
|
||||
* public:
|
||||
* Derived1_T (int start) : m_start(start){}
|
||||
* int get() override {
|
||||
* return m_start + 1;
|
||||
* }
|
||||
* private:
|
||||
* int m_start = 0;
|
||||
* }
|
||||
*
|
||||
* class Derived2_T : public Base_T {
|
||||
* public:
|
||||
* Derived1_T (int start) : m_start(start){}
|
||||
* int get() override {
|
||||
* return m_start + 2;
|
||||
* }
|
||||
* private:
|
||||
* int m_start = 0;
|
||||
* }
|
||||
* .
|
||||
* .
|
||||
* .
|
||||
* TypeFsactory <std::string, Base_T, int> typefactory;
|
||||
* typefactory.registerType<Derived1>("one");
|
||||
* typefactory.registerType<Derived2>("2");
|
||||
*
|
||||
* auto d1 = typefactory.create ("one")(10);
|
||||
* auto d2 = typefactory.create ("2")(10);
|
||||
*
|
||||
* d1->get();
|
||||
* d2->get();
|
||||
* @endcode
|
||||
*/
|
||||
template<class ClassId_T, class BaseClass_T, class ... Args>
|
||||
class TypeFsactory {
|
||||
public:
|
||||
/**
|
||||
* @brief BaseClass_SP - base class shared pointer type
|
||||
*/
|
||||
typedef std::shared_ptr<BaseClass_T> BaseClass_SP;
|
||||
/**
|
||||
* @brief typefactoryFunction - typefactory function pointer type. Generally speaking it is pointer to constructor.
|
||||
*/
|
||||
typedef BaseClass_SP (*typefactoryFunction) (Args ...);
|
||||
|
||||
TypeFsactory() = default;
|
||||
|
||||
/**
|
||||
* @brief registerType - template function to register class in factory
|
||||
* @param Derived - registering type
|
||||
* @param id - unique class identification
|
||||
*
|
||||
* Usage example:
|
||||
* @code
|
||||
* typefactory.registerType<Derived1>("one");
|
||||
* typefactory.registerType<Derived2>("2");
|
||||
* @endcode
|
||||
*/
|
||||
template<class Derived>
|
||||
void registerType (ClassId_T id) {
|
||||
/// store pointer to constructor of Derived class
|
||||
classes[id] = &typefactory<Derived>;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief create - create class by unique id. Class should be registered before
|
||||
* @param id - unique class identification
|
||||
* @return shared pointer to new class.
|
||||
* @throws std::our_of_range when id not found in map
|
||||
*/
|
||||
typefactoryFunction create (ClassId_T id) const {
|
||||
/// constructor of registered type will call here
|
||||
return classes.at (id);
|
||||
}
|
||||
protected:
|
||||
/**
|
||||
* @brief classes - main storage for pointers to constructors of registered types
|
||||
*/
|
||||
std::map<ClassId_T, typefactoryFunction> classes;
|
||||
|
||||
private:
|
||||
/**
|
||||
* @brief typefactory - main functionality, create registered object
|
||||
* @param Derived - class type
|
||||
* @param args - constructor arguments
|
||||
* @return shared pointer to register Derived class
|
||||
*/
|
||||
template<class Derived>
|
||||
static BaseClass_SP typefactory (Args ... args) {
|
||||
return std::make_shared<Derived> (args ...);
|
||||
}
|
||||
};
|
||||
|
||||
#endif // TYPEFACTORY_H
|
||||
Reference in New Issue
Block a user