BeeeOn Gateway  v2020.3.1-2-g6f737dc
Platform to interconnect the IoT world
ClassInfo.h
1 #pragma once
2 
3 #include <string>
4 #include <typeindex>
5 #include <type_traits>
6 
7 namespace BeeeOn {
8 
9 class ClassInfo {
10 private:
11  class NoneType {
12  NoneType() = delete;
13  };
14 
15 public:
16  ClassInfo();
17  ClassInfo(const std::type_index &index);
18  ClassInfo(const std::type_info &info);
19 
20  template <typename T>
21  ClassInfo(const T &t): m_index(typeid(t))
22  {
23  static_assert(!std::is_pointer<T>::value,
24  "for pointers use forPointer() method");
25  }
26 
32  template <typename T>
33  static ClassInfo forPointer(const T *t)
34  {
35  if (t == NULL)
36  return ClassInfo();
37 
38  return ClassInfo(*t);
39  }
40 
41  template <typename T>
42  static ClassInfo forClass()
43  {
44  return ClassInfo(typeid(T));
45  }
46 
47  std::string id() const;
48  std::string name() const;
49  std::type_index index() const;
50 
55  template <typename T>
56  bool is() const
57  {
58  return ClassInfo(typeid(T)) == *this;
59  }
60 
61  bool operator <(const ClassInfo &info) const
62  {
63  return info.index() < m_index;
64  }
65 
66  bool operator ==(const ClassInfo &info) const
67  {
68  return info.index() == m_index;
69  }
70 
71  bool operator !=(const ClassInfo &info) const
72  {
73  return info.index() != m_index;
74  }
75 
76  static ClassInfo byName(const std::string &name);
77 
78  template <typename T>
79  static void registerClass(const std::string &name)
80  {
81  registerClassInfo(name, typeid(T));
82  }
83 
84  template <typename T>
85  static std::string repr(const T *t)
86  {
87  return reprImpl(
89  reinterpret_cast<const void *>(t));
90  }
91 
92 protected:
93  static void registerClassInfo(
94  const std::string &name,
95  const std::type_info &info);
96 
97  static std::string reprImpl(const ClassInfo &c, const void *p);
98 
99 private:
100  std::type_index m_index;
101 };
102 
103 #define BEEEON_CLASS_REGISTER(T, name, reg) \
104 class reg { \
105 public: \
106  reg() \
107  { \
108  ClassInfo:: \
109  registerClass<T>(name); \
110  } \
111 }; \
112 static reg reg##Register;
113 
114 #define BEEEON_CLASS(T) \
115 namespace BeeeOn { \
116 namespace Reflex { \
117 BEEEON_CLASS_REGISTER(T, #T, Class##__COUNTER__)\
118 } \
119 }
120 
121 }
static ClassInfo forPointer(const T *t)
Definition: ClassInfo.h:33
bool is() const
Definition: ClassInfo.h:56
Definition: ClassInfo.h:9