generic.hpp 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. #ifndef LUWRA_GENERIC_H_
  2. #define LUWRA_GENERIC_H_
  3. #include "common.hpp"
  4. #include "functions.hpp"
  5. #include "methods.hpp"
  6. #include "fields.hpp"
  7. LUWRA_NS_BEGIN
  8. namespace internal {
  9. template <typename T>
  10. struct GenericWrapper {
  11. static_assert(
  12. sizeof(T) == -1,
  13. "Parameter to GenericWrapper is not a valid type"
  14. );
  15. };
  16. // Functions
  17. template <typename R, typename... A>
  18. struct GenericWrapper<R (A...)>:
  19. FunctionWrapper<R (A...)> {};
  20. template <typename R, typename... A>
  21. struct GenericWrapper<R (*)(A...)>:
  22. FunctionWrapper<R (*)(A...)> {};
  23. // Methods
  24. template <typename T, typename R, typename... A>
  25. struct GenericWrapper<R (T::*)(A...) const volatile>:
  26. MethodWrapper<R (T::*)(A...) const volatile> {};
  27. template <typename T, typename R, typename... A>
  28. struct GenericWrapper<R (T::*)(A...) const>:
  29. MethodWrapper<R (T::*)(A...) const> {};
  30. template <typename T, typename R, typename... A>
  31. struct GenericWrapper<R (T::*)(A...) volatile>:
  32. MethodWrapper<R (T::*)(A...) volatile> {};
  33. template <typename T, typename R, typename... A>
  34. struct GenericWrapper<R (T::*)(A...)>:
  35. MethodWrapper<R (T::*)(A...)> {};
  36. // Fields
  37. template <typename T, typename R>
  38. struct GenericWrapper<R T::*>: FieldWrapper<R T::*> {};
  39. template <typename T, typename R>
  40. struct GenericWrapper<const R T::*>: FieldWrapper<const R T::*> {};
  41. }
  42. LUWRA_NS_END
  43. /**
  44. * Generate a `lua_CFunction` wrapper for a field, method or function.
  45. * \returns Wrapped entity as `lua_CFunction`
  46. */
  47. #define LUWRA_WRAP(entity) \
  48. (&luwra::internal::GenericWrapper<decltype(&entity)>::template invoke<&entity>)
  49. /**
  50. * Generate a user type member manifest (pair).
  51. * \param type Qualified struct/class name
  52. * \param name Member name
  53. * \returns `std::pair<const char*, CFunction>` which can be used to register a user type member
  54. */
  55. #define LUWRA_MEMBER(type, name) \
  56. {__STRING(name), LUWRA_WRAP(type::name)}
  57. #endif