Comments (7)
Not possible for fast userdata type check.
from kaguya.
for example, In C++:
SharedPtr<Resource> GetResource(const char* resource_type, const char* resource_path)
{
...
}
// Push code.
{
typedef Urho3DSharedPtrWrapper<Resource> wrapper_type;
void *storage = lua_newuserdata(l, sizeof(wrapper_type));
new(storage) wrapper_type(p);
const char* class_name = p->GetTypeName().CString();
class_userdata::setmetatable(l, class_name);
}
And in Lua I want to call like this:
local font = resourceCache:GetResource('Font', path_to_font);
-- font is a Font object, not a Resource object.
local image = resourceCache:GetResource('Image', path_to_font);
-- image is a Image object, not a Resource object.
from kaguya.
ummm... How about this?
namespace kaguya
{
// Urho3D::SharedPtr<Urho3D::Resource>
template<> struct lua_type_traits<Urho3D::SharedPtr<Urho3D::Resource>>
{
typedef const Urho3D::SharedPtr<Urho3D::Resource>& push_type;
template<typename CastType>
static int downcast_and_push(lua_State* l, push_type p)
{
Urho3D::SharedPtr<CastType> s;
s.StaticCast(p);
return util::push_args(l, s);
}
static int push(lua_State* l, push_type p)
{
const Urho3D::String& typeName = p->GetTypeName();
//Resource types...
if (typeName == "JSONFile") { return downcast_and_push<Urho3D::JSONFile>(l, p); }
if (typeName == "Image") { return downcast_and_push<Urho3D::Image>(l, p); }
//unknown resource...
typedef Urho3DSharedPtrWrapper<Urho3D::Resource> wrapper_type;
void *storage = lua_newuserdata(l, sizeof(wrapper_type));
new(storage) wrapper_type(p);
class_userdata::setmetatable<Urho3D::Resource>(l);
return 1;
}
};
}
from kaguya.
I have add a virtual function to object.
virtual const std::type_info& GetStdTypeInfo() const;
template<> struct lua_type_traits<Urho3D::SharedPtr<Urho3D::Resource>>
{
typedef const Urho3D::SharedPtr<Urho3D::Resource>& push_type;
static int push(lua_State* l, push_type p)
{
if (!p)
{
lua_pushnil(l);
}
else
{
typedef Urho3DSharedPtrWrapper<Urho3D::Resource> wrapper_type;
void *storage = lua_newuserdata(l, sizeof(wrapper_type));
new(storage) wrapper_type(p);
class_userdata::setmetatable(l, p->GetStdTypeInfo());
}
return 1;
}
};
from kaguya.
Maybe Urho3DSharedPtrWrapper::type() also need to return the same type info.
from kaguya.
template<class T>
struct Urho3DSharedPtrWrapper : ObjectWrapperBase
{
~
virtual const std::type_info& type()
{
return object_->GetStdTypeInfo();
}
~
};
Or Urho3DSharedPtrWrapper has member std::type_info reference.
from kaguya.
template<class T>
struct Urho3DSharedPtrWrapper : ObjectWrapperBase
{
// ...
virtual const std::type_info& type()
{
Urho3D::Object* object = dynamic_cast<Urho3D::Object*>(object_);
if (object)
{
return object->GetStdTypeInfo();
}
return metatableType<T>();
}
// ...
}
// SharedPtr<T> type traits.
template<typename T>
struct lua_type_traits<Urho3D::SharedPtr<T>>
{
typedef const Urho3D::SharedPtr<T>& push_type;
static int push(lua_State* l, push_type p)
{
if (!p)
{
lua_pushnil(l);
}
else
{
typedef Urho3DSharedPtrWrapper<T> wrapper_type;
void *storage = lua_newuserdata(l, sizeof(wrapper_type));
T* o = p;
new(storage) wrapper_type(o);
Urho3D::Object* object = dynamic_cast<Urho3D::Object*>(o);
if (object)
{
class_userdata::setmetatable(l, object->GetStdTypeInfo());
}
else
{
class_userdata::setmetatable<T>(l);
}
}
return 1;
}
};
from kaguya.
Related Issues (20)
- Kaguya does not work properly with dynamic libraries
- Generate kaguya.hpp and check your error! HOT 2
- Copy constructor
- Result of checkErrorAndThrow is ignored
- Possible to add overloaded constructors at runtime?
- How to register class static member function with default arguments? HOT 1
- An object is not automatically casted into a function parameter HOT 1
- error: type mismatch in diferent dynamic lib HOT 1
- Can't bind functor returned by std::bind HOT 1
- About class inheritance
- std::function and self HOT 3
- Check range of integral when converting from number
- how can I check function has timeout HOT 1
- Reject extra arguments to .new(), etc.
- Returning reference to class needs a copy constructor?
- can not assign a table from lua to a class member attribute
- Returning nil in multiple returns HOT 2
- get Current File/Line of Lua Code HOT 3
- How do I use a variable number of parameters HOT 2
- kaguya call lua HOT 1
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from kaguya.