2 #ifndef UGDK_SCRIPT_VIRTUALOBJ_H_
3 #define UGDK_SCRIPT_VIRTUALOBJ_H_
14 #include <type_traits>
32 typedef std::list<VirtualObj>
List;
33 typedef std::vector<VirtualObj>
Vector;
34 typedef std::map<VirtualObj,VirtualObj>
Map;
51 result.data_->WrapString(obj);
65 T
value(
bool disown =
false)
const {
74 bool valid()
const {
return static_cast<bool>(data_); }
77 return VirtualObj(data_->GetAttribute(key.data_));
82 data_->SetAttribute(key.data_, value.data_)
86 template<
typename signature>
88 return function_helper<signature>::CreateFunction(*
this);
91 template<
typename ...Args>
94 arguments.reserve(
sizeof...(Args));
95 arguments_helper<Args...>::add_to_vector(arguments, this->
wrapper(), args...);
101 data_vector.reserve(vobj_list.size());
102 for (
const auto& vobj : vobj_list)
103 data_vector.push_back(vobj.data_);
104 return VirtualObj(data_->Execute(data_vector));
109 operator bool()
const {
return valid(); }
112 return data_.get() < rhs.data_.get();
114 template<
typename ...Args>
116 return Call<Args...>(args...);
130 template<
typename ...Args>
131 struct arguments_helper;
133 template<
typename T,
typename ...Args>
134 struct arguments_helper<T, Args...> {
137 vobj.set_value<T>(t);
138 v.emplace_back(vobj.data_);
139 return arguments_helper<Args...>::add_to_vector(v, wrapper, args...);
143 template<
typename ...Args>
144 struct arguments_helper<
VirtualObj, Args...> {
146 if(!t || t.wrapper() !=
wrapper)
return false;
147 v.emplace_back(t.data_);
148 return arguments_helper<Args...>::add_to_vector(v, wrapper, args...);
152 template<
typename signature,
typename Helper =
void>
153 struct function_helper;
155 template<
typename R,
typename ...Args>
156 struct function_helper<R(Args...), typename
std::enable_if<is_virtual_primitive<R>::value>::type> {
157 static std::function< R(Args...)> CreateFunction(
const VirtualObj& data) {
158 return [data](Args... args) -> R {
159 VirtualObj result = data.Call<Args...>(args...);
160 return result.value<R>(
false);
165 template<
typename R,
typename ...Args>
166 struct function_helper<R(Args...), typename
std::enable_if<!is_virtual_primitive<R>::value>::type> {
167 static std::function< R(Args...)> CreateFunction(
const VirtualObj& data) {
168 return [data](Args... args) -> R {
169 VirtualObj result = data.Call<Args...>(args...);
170 return result.value<R*>(
false);
175 template<
typename ...Args>
176 struct function_helper<void(Args...), void> {
177 static std::function<void (Args...)> CreateFunction(
const VirtualObj& data) {
178 return [data](Args... args) {
179 data.Call<Args...>(args...);
188 struct VirtualObj::arguments_helper<> {
195 template <
class T,
class U>
198 typename U::const_iterator it;
199 for (it = data_seq.begin(); it != data_seq.end(); ++it)
204 template <
class T,
class U>
207 typename U::const_iterator it;
208 for (it = data_map.begin(); it != data_map.end(); ++it) {
209 obj_map.insert(std::pair<VirtualObj, VirtualObj>(
218 return ConvertSequence<List>(data_->UnwrapList());
223 return ConvertSequence<Vector>(data_->UnwrapVector());
228 return ConvertTable<Map>(data_->UnwrapMap());
235 template<
typename ...Args>
238 auto callf = std::mem_fn(&VirtualObj::Call<VirtualObj, Args...>);
239 return callf(method, obj_, args...);
250 Bind result(*
this, method_name);
VirtualObj operator()(Args...args) const
Definition: virtualobj.h:236
VirtualObj operator[](const VirtualObj &key) const
Definition: virtualobj.h:118
VirtualObj(VirtualData::Ptr data)
Definition: virtualobj.h:42
VirtualObj(LangWrapper *wrapper)
Definition: virtualobj.h:44
void * unsafe_data() const
Definition: virtualobj.h:62
void set_value(T val, bool disown=false)
Definition: virtualobj.h:70
static bool add_to_vector(VirtualData::Vector &v, LangWrapper *wrapper)
Definition: virtualobj.h:189
Definition: animation.h:11
static VirtualObj Create(const char *obj, LangWrapper *wrapper)
Definition: virtualobj.h:48
std::shared_ptr< VirtualData > Ptr
Definition: virtualdata.h:46
VirtualObj set_attribute(const VirtualObj &key, const VirtualObj &value)
Definition: virtualobj.h:80
Bind(VirtualObj &obj, const std::string &method_name)
~VirtualObj()
Definition: virtualobj.h:46
LangWrapper * wrapper() const
Acessing.
Definition: virtualobj.h:61
T ConvertSequence(const U &data_seq)
Definition: virtualobj.h:196
bool valid() const
Definition: virtualobj.h:74
Definition: virtualprimitive.h:26
static VirtualObj Create(const std::string &str, LangWrapper *wrapper)
Definition: virtualobj.h:55
Bind operator|(const std::string &method_name)
Definition: virtualobj.h:249
Definition: virtualobj.h:231
std::map< VirtualObj, VirtualObj > Map
Definition: virtualobj.h:34
std::list< VirtualObj > List
Definition: virtualobj.h:32
std::vector< VirtualObj > Vector
Definition: virtualobj.h:33
Definition: langwrapper.h:17
VirtualObj attribute(const VirtualObj &key) const
Definition: virtualobj.h:76
VirtualObj Call(Args...args) const
Definition: virtualobj.h:92
T value(bool disown=false) const
Definition: virtualobj.h:65
A proxy class wich represents virtual objects from scripting languages.
Definition: virtualobj.h:30
std::vector< Ptr > Vector
Definition: virtualdata.h:49
T ConvertTable(const U &data_map)
Definition: virtualobj.h:205
VirtualObj()
Builds an empty virtual object.
Definition: virtualobj.h:40
VirtualObj Call(const List &vobj_list) const
Definition: virtualobj.h:99
VirtualObj operator()(Args...args) const
Definition: virtualobj.h:115
std::function< signature > AsFunction() const
Definition: virtualobj.h:87
bool operator<(const VirtualObj &rhs) const
Definition: virtualobj.h:111