-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathObject.h
More file actions
143 lines (134 loc) · 5.82 KB
/
Copy pathObject.h
File metadata and controls
143 lines (134 loc) · 5.82 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
#pragma once
#include <memory>
#include <variant>
#include "TypeID.h"
#include "MetaMethods.h"
class ObjectPtr;
class SharedObject;
#define DEFOPS(T) \
BIDEF(T, +) \
BIDEF(T, -) \
BIDEF(T, *) \
BIDEF(T, /) \
BIDEF(T, %) \
BIDEF(T, ^) \
BIDEF(T, ==) \
BIDEF(T, !=) \
BIDEF(T, <) \
BIDEF(T, <=) \
BIDEF(T, >) \
BIDEF(T, >=) \
SharedObject operator - () const; \
SharedObject operator [] (ObjectPtr idx) const; \
SharedObject operator () (const std::vector<ObjectPtr>& args) const; \
SharedObject tostring() const; \
void ctor(const std::vector<ObjectPtr>& args) const; \
void dtor() const; \
SharedObject begin(); \
SharedObject end(); \
SharedObject operator ++ (int); \
SharedObject operator -- (int); \
SharedObject operator ++ (); \
SharedObject operator -- (); \
SharedObject operator * (); \
SharedObject assign(const ObjectPtr& other) const; \
#define BIDEF(T, op) \
SharedObject operator op (const T& other) const;
template<typename T> struct ToObject;
template<typename T> struct ToShared;
class ObjectPtr {
private:
TypeID id;
void* ptr;
public:
DEFOPS(ObjectPtr)
static const ObjectPtr Null;
ObjectPtr();
ObjectPtr(const ObjectPtr& other);
ObjectPtr(TypeID id, void* ptr);
ObjectPtr(const SharedObject& obj);
TypeID GetType() const;
void* GetPtr() const;
void* GetRawPtr() const;
SharedObject ToSharedPtr() const;
ObjectPtr GetField(std::string_view member) const;
SharedObject Invoke(std::string_view method, const std::vector<ObjectPtr>& params = {}) const;
SharedObject TryInvoke(std::string_view method, const std::vector<ObjectPtr>& params = {}) const;
template<typename T> T& As() { return *(T*)ptr; }
template<typename T> const T& Get() const { return *(T*)ptr; }
friend class SharedObject;
friend struct ToShared<ObjectPtr>;
friend std::ostream& operator << (std::ostream& out, const ObjectPtr& ptr);
template<typename T> ObjectPtr& operator = (const T& other) {
*this = ToObject<T>()(other);
return *this;
}
ObjectPtr& ForceTypeTo(TypeID to);
operator bool() const;
};
class SharedObject {
private:
TypeID id;
std::shared_ptr<void> ptr;
void* objPtr;
public:
template<typename T, typename... Args>
static SharedObject New(Args&&... args) {
return SharedObject{TypeID::get<T>(), std::make_shared<T>(std::forward<Args&&>(args)...)};
}
template<typename T>
static SharedObject New(const T& val) {
return SharedObject{TypeID::get<T>(), std::make_shared<T>(val)};
}
DEFOPS(SharedObject)
static const SharedObject Null;
SharedObject();
SharedObject(const SharedObject& other);
SharedObject(TypeID id, void* objPtr);
SharedObject(TypeID id, std::shared_ptr<void> ptr, bool call_ctor = true);
bool isObjectPtr() const;
TypeID GetType() const;
std::shared_ptr<void> GetPtr() const;
void* GetRawPtr() const;
ObjectPtr GetField(std::string_view member) const;
SharedObject Invoke(std::string_view method, const std::vector<ObjectPtr>& params = {}) const;
SharedObject TryInvoke(std::string_view method, const std::vector<ObjectPtr>& params = {}) const;
template<typename T> T& As() { return *(T*)GetRawPtr(); }
template<typename T> const T& Get() const { return *(T*)GetRawPtr(); }
ObjectPtr ToObjectPtr() const;
~SharedObject();
friend class ObjectPtr;
friend std::ostream& operator << (std::ostream& out, const SharedObject& ptr);
template<typename T> SharedObject& operator = (const T& other) {
*this = ToShared<T>()(other);
return *this;
}
SharedObject& ForceTypeTo(TypeID to);
operator bool() const;
};
template<typename T>
struct ToObject { ObjectPtr operator()(const T& other) { return SharedObject::New<T>(other).ToObjectPtr(); } };
template<>
struct ToObject<SharedObject> { ObjectPtr operator()(const SharedObject& other) { return other.ToObjectPtr(); }};
template<>
struct ToObject<ObjectPtr> { ObjectPtr operator()(const ObjectPtr& other) { return other; }};
template<typename T>
struct ToShared { SharedObject operator()(const T& other) { return SharedObject::New<T>(other); }};
template<>
struct ToShared<SharedObject> { SharedObject operator()(const SharedObject& other) { return other; }};
template<>
struct ToShared<ObjectPtr> { SharedObject operator()(const ObjectPtr& other) { return SharedObject{other.id, other.ptr}; }};
class Namespace {
private:
TypeID space;
SharedObject vObj;
public:
TypeID Type() const;
static const Namespace Global;
Namespace(std::string_view space);
Namespace getNamespace(std::string_view subSpace) const;
TypeID getClass(std::string_view clsName) const;
SharedObject Invoke(std::string_view method, const std::vector<ObjectPtr>& params) const;
};
#undef DEFOPS
#undef BIDEF