summaryrefslogtreecommitdiff
path: root/libadhocutil/factory.impl.h
blob: bd4ed38be05afafaded79e25529da74279d8b4df (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#ifndef ADHOCUTIL_FACTORY_IMPL_H
#define ADHOCUTIL_FACTORY_IMPL_H

#include "factory.h"
#include "plugins.impl.h"

namespace AdHoc {
	template <typename Base, typename ... Params>
	Factory<Base, Params ...>::~Factory() = default;

	template <typename Base, typename ... Params>
	std::shared_ptr<const Factory<Base, Params...>>
	Factory<Base, Params...>::get(const std::string & name)
	{
		return PluginManager::getDefault()->get<Factory>(name)->implementation();
	}

	template <typename Base, typename ... Params>
	std::shared_ptr<Base>
	Factory<Base, Params...>::createNew(const std::string & name, const Params & ... p)
	{
		return get(name)->create(p...);
	}
}

#define INSTANTIATEVOIDFACTORY(Base) \
	template class AdHoc::Factory<Base>; \
	INSTANTIATEPLUGINOF(AdHoc::Factory<Base>)

#define INSTANTIATEFACTORY(Base, ...) \
	template class AdHoc::Factory<Base, __VA_ARGS__>; \
	INSTANTIATEPLUGINOF(AdHoc::Factory<Base, __VA_ARGS__>)

#endif