Registry.h 1.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. /*
  2. * Registry.h, part of VCMI engine
  3. *
  4. * Authors: listed in file AUTHORS in main folder
  5. *
  6. * License: GNU General Public License v2.0 or later
  7. * Full text of license available in license.txt file, in main folder
  8. *
  9. */
  10. #pragma once
  11. #include "Effect.h"
  12. #define VCMI_REGISTER_SPELL_EFFECT(Type, Name) \
  13. namespace\
  14. {\
  15. RegisterEffect<Type> register ## Type(Name);\
  16. }\
  17. \
  18. namespace spells
  19. {
  20. namespace effects
  21. {
  22. class DLL_LINKAGE IEffectFactory
  23. {
  24. public:
  25. IEffectFactory() = default;
  26. virtual ~IEffectFactory() = default;
  27. virtual Effect * create() const = 0;
  28. };
  29. class DLL_LINKAGE Registry
  30. {
  31. public:
  32. using FactoryPtr = std::shared_ptr<IEffectFactory>;
  33. Registry();
  34. virtual ~Registry();
  35. virtual const IEffectFactory * find(const std::string & name) const = 0;
  36. virtual void add(const std::string & name, FactoryPtr item) = 0;
  37. };
  38. class DLL_LINKAGE GlobalRegistry
  39. {
  40. GlobalRegistry() = default;
  41. public:
  42. static Registry * get();
  43. };
  44. template<typename E>
  45. class EffectFactory : public IEffectFactory
  46. {
  47. public:
  48. EffectFactory() = default;
  49. virtual ~EffectFactory() = default;
  50. Effect * create() const override
  51. {
  52. return new E();
  53. }
  54. };
  55. template<typename E>
  56. class RegisterEffect
  57. {
  58. public:
  59. RegisterEffect(const std::string & name)
  60. {
  61. auto f = std::make_shared<EffectFactory<E>>();
  62. GlobalRegistry::get()->add(name, f);
  63. }
  64. };
  65. }
  66. }