UGDK  0.5.0
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros
virtualprimitive.h
Go to the documentation of this file.
1 #ifndef UGDK_SCRIPT_VIRTUALPRIMITIVE_H_
2 #define UGDK_SCRIPT_VIRTUALPRIMITIVE_H_
3 
5 #include <ugdk/script/type.h>
7 
8 #include <type_traits>
9 
10 namespace ugdk {
11 namespace script {
12 
13 #define TYPENAME_MAP(definition) \
14  definition(const char*, String); \
15  definition(bool, Boolean); \
16  definition(int, Integer); \
17  definition(long, Integer); \
18  definition(short, Integer); \
19  definition(float, Number); \
20  definition(double, Number);
21 
22 template <typename T>
23 struct is_virtual_primitive { static const bool value = false; };
24 
25 template <typename T>
27  public:
28  static_assert(is_virtual_primitive<T>::value, "Unsupported type.");
29 };
30 
31 //================
32 
33 template <typename T>
34 class VirtualPrimitive<T*> {
35  public:
36  static T* value(const VirtualData::Ptr data, bool disown) {
37  return static_cast <T*> (
38  data->Unwrap(TypeRegistry<T>::type(), disown)
39  );
40  }
41  static void set_value(const VirtualData::Ptr data, const T* value, bool disown) {
42  data->Wrap(const_cast<void*>(static_cast<const void*>(value)), TypeRegistry<typename std::remove_const<T>::type>::type(), disown);
43  }
44  private:
45  VirtualPrimitive() {}
46 };
47 
48 template <typename T>
49 struct is_virtual_primitive<T*> { static const bool value = true; };
50 
51 //================
52 
53 template <typename T>
54 class VirtualPrimitive<T&> {
55 public:
56  static T& value(const VirtualData::Ptr data, bool disown) {
57  return *static_cast<T*>(
58  data->Unwrap(TypeRegistry<T>::type(), disown)
59  );
60  }
61  static void set_value(const VirtualData::Ptr data, const T& value, bool disown) {
62  data->Wrap(const_cast<void*>(static_cast<const void*>(&value)), TypeRegistry<typename std::remove_const<T>::type>::type(), disown);
63  }
64 private:
65  VirtualPrimitive() {}
66 };
67 
68 template <typename T>
69 struct is_virtual_primitive<T&> { static const bool value = true; };
70 
71 //================
72 
73 template <typename T>
74 class VirtualPrimitive<std::unique_ptr<T>> {
75 public:
76  static std::unique_ptr<T> value(const VirtualData::Ptr data, bool disown) {
77  system::AssertCondition<system::InvalidOperation>(disown, "Disown must be true when extracting std::unique_ptr");
78  return std::unique_ptr<T>(VirtualPrimitive<T*>::value(data, true));
79  }
80  static void set_value(const VirtualData::Ptr data, std::unique_ptr<T> value, bool disown) {
81  VirtualPrimitive<T*>::set_value(data, value.release(), true);
82  }
83 private:
84  VirtualPrimitive() {}
85 };
86 
87 template <typename T>
88 struct is_virtual_primitive<std::unique_ptr<T>> { static const bool value = true; };
89 
90 //================
91 
92 template <typename T, typename S>
93 inline T CheckAndCast (S value) {
94  return static_cast<T>(value);
95 }
96 
97 template <>
98 inline std::string CheckAndCast<std::string, const char*> (const char* value) {
99  return value ? value : "";
100 }
101 
102 #define DEFINE_SCRIPT_PRIMITIVE_VALUE(type, name, arg) \
103  template <> \
104  class VirtualPrimitive<type> { \
105  public: \
106  static type value(const VirtualData::Ptr data, bool) { \
107  return CheckAndCast<type>(data->Unwrap##name()); \
108  } \
109  static void set_value(const VirtualData::Ptr data, type value, bool) { \
110  data->Wrap##name(arg); \
111  } \
112  private: \
113  VirtualPrimitive() {} \
114  }; \
115  template <> \
116  struct is_virtual_primitive<type> { static const bool value = true; }
117 
118 #define DEFINE_SCRIPT_SIMPLE_PRIMITIVE_VALUE(type, name) \
119  DEFINE_SCRIPT_PRIMITIVE_VALUE(type, name, value)
120 
121 DEFINE_SCRIPT_PRIMITIVE_VALUE(std::string, String, value.c_str());
122 // Because I can!
124 
125 #undef TYPENAME_MAP
126 
127 } /* namespace script */
128 } /* namespace ugdk */
129 
130 #endif /* UGDK_SCRIPT_VIRTUALPRIMITIVE_H_ */
T CheckAndCast(S value)
Definition: virtualprimitive.h:93
#define DEFINE_SCRIPT_SIMPLE_PRIMITIVE_VALUE(type, name)
Definition: virtualprimitive.h:118
Definition: type.h:38
static void set_value(const VirtualData::Ptr data, const T *value, bool disown)
Definition: virtualprimitive.h:41
STL namespace.
Definition: animation.h:11
std::shared_ptr< VirtualData > Ptr
Definition: virtualdata.h:46
static T & value(const VirtualData::Ptr data, bool disown)
Definition: virtualprimitive.h:56
static void set_value(const VirtualData::Ptr data, const T &value, bool disown)
Definition: virtualprimitive.h:61
Definition: virtualprimitive.h:26
#define TYPENAME_MAP(definition)
Definition: virtualprimitive.h:13
static void set_value(const VirtualData::Ptr data, std::unique_ptr< T > value, bool disown)
Definition: virtualprimitive.h:80
static const bool value
Definition: virtualprimitive.h:23
static T * value(const VirtualData::Ptr data, bool disown)
Definition: virtualprimitive.h:36
Definition: virtualprimitive.h:23
DEFINE_SCRIPT_PRIMITIVE_VALUE(std::string, String, value.c_str())
static std::unique_ptr< T > value(const VirtualData::Ptr data, bool disown)
Definition: virtualprimitive.h:76