11 #ifndef smtk_common_Generator_h
12 #define smtk_common_Generator_h
14 #include "smtk/common/CompilerInformation.h"
21 #define DEBUG_GENERATOR 0
23 #if !defined(NDEBUG) && DEBUG_GENERATOR
105 template<
class Input,
class Output,
class Base = detail::NullGeneratorBase>
109 template<
typename... T>
111 : Base(std::forward<T>(all)...)
122 virtual bool valid(
const Input&)
const = 0;
136 template<
class Input,
class Output,
class Base = detail::NullGeneratorBase>
139 template<
class U,
class V,
class W,
class X>
143 template<
typename... T>
151 bool valid(
const Input&)
const override;
164 static std::weak_ptr<std::set<GeneratorBase<Input, Output, Base>*>>
generators();
167 template<
class Input,
class Output,
class Base>
168 std::weak_ptr<std::set<GeneratorBase<Input, Output, Base>*>>
171 static std::shared_ptr<std::set<GeneratorBase<Input, Output, Base>*>> generators =
172 std::make_shared<std::set<GeneratorBase<Input, Output, Base>*>>(
173 std::set<GeneratorBase<Input, Output, Base>*>());
177 template<
class Input,
class Output,
class Base>
187 return gen->valid(input);
191 template<
class Input,
class Output,
class Base>
200 for (
auto gen : *gens)
202 if (!gen->valid(input))
209 output = (*gen)(input);
212 catch (std::exception& e)
214 #if !defined(NDEBUG) && DEBUG_GENERATOR
215 std::cerr <<
"Exception caught: " << e.what() << std::endl;
227 template<
class Input,
class Output,
class Self,
class Base = detail::NullGeneratorBase>
239 : m_generators(generators)
242 if (
auto gens = m_generators.lock())
244 gens->insert(m_self);
249 if (
auto gens = m_generators.lock())
255 std::weak_ptr<std::set<GeneratorBase<Input, Output, Base>*>> m_generators;
262 static bool registerClass();
265 template<
typename... T>
272 static bool s_registered;
275 template<
class Input,
class Output,
class Self,
class Base>
278 static bool registered =
false;
287 template<
class Input,
class Output,
class Self,
class Base>
288 bool GeneratorType<Input, Output, Self, Base>::s_registered =
289 GeneratorType<Input, Output, Self, Base>::registerClass();