siplasplas
attribute.hpp
1 #ifndef SIPLASPLAS_REFLECTION_ATTRIBUTES_ATTRIBUTE_HPP
2 #define SIPLASPLAS_REFLECTION_ATTRIBUTES_ATTRIBUTE_HPP
3 
4 #include <vector>
5 #include <siplasplas/reflection/dynamic/object.hpp>
6 #include <siplasplas/reflection/dynamic/object_manip.hpp>
7 #include <siplasplas/utility/type_variables.hpp>
8 #include <siplasplas/reflection/dynamic/export.hpp>
9 
10 namespace cpp
11 {
12 
13 namespace dynamic_reflection
14 {
15 
16 namespace attributes
17 {
18 
19 class SIPLASPLAS_REFLECTION_DYNAMIC_EXPORT Attribute
20 {
21 public:
22  virtual std::vector<cpp::dynamic_reflection::Object> processArguments(const std::vector<cpp::dynamic_reflection::Object>& args);
23  virtual cpp::dynamic_reflection::Object processReturnValue(const cpp::dynamic_reflection::Object& returnValue);
24 };
25 
26 template<typename AttrClass>
28 {
29 public:
30  std::vector<cpp::dynamic_reflection::Object> processArguments(const std::vector<cpp::dynamic_reflection::Object>& args) override
31  {
32  return cpp::dynamic_reflection::tuple_to_vector(
33  cpp::dynamic_reflection::vector_call(&AttrClass::processArguments, static_cast<AttrClass&>(*this), args)
34  );
35  }
36 
37  cpp::dynamic_reflection::Object processReturnValue(const cpp::dynamic_reflection::Object& returnValue) override
38  {
39  return {static_cast<AttrClass*>(this)->processReturnValue(
40  returnValue.get<cpp::function_argument<0, decltype(&AttrClass::processReturnValue)>>()
41  )};
42  }
43 };
44 
45 template<typename Function>
47 
48 template<typename R, typename Class, typename... Args>
49 class AttributeFor<R(Class::*)(Args...)> : public Attribute
50 {
51 public:
52  virtual std::tuple<Args...> processArguments(Args... args) = 0;
53  virtual R processReturnValue(const R& returnValue) = 0;
54 
55 private:
56  std::vector<cpp::dynamic_reflection::Object> processArguments(const std::vector<cpp::dynamic_reflection::Object>& args) override
57  {
58  return cpp::dynamic_reflection::tuple_to_vector(
59  cpp::dynamic_reflection::vector_call(static_cast<std::tuple<Args...>(AttributeFor::*)(Args...)>(processArguments), args)
60  );
61  }
62 
63  cpp::dynamic_reflection::Object processReturnValue(const cpp::dynamic_reflection::Object& returnValue) override
64  {
65  return processReturnValue(returnValue.get<R>());
66  }
67 };
68 
69 template<template<typename> class Attribute, typename... Args>
70 auto attribute_template_builder(Args&&... args)
71 {
72  return [&](auto function_type)
73  {
74  return Attribute<typename decltype(function_type)::type>{std::forward<Args>(args)...};
75  };
76 }
77 
78 }
79 
80 }
81 
82 }
83 
84 #endif // SIPLASPLAS_REFLECTION_ATTRIBUTES_ATTRIBUTE_HPP
Definition: messaging.hpp:8
Definition: object.hpp:16
Stores dynamic reflection information of a class type.
Definition: class.hpp:20