Nasal cppbind: support more member function types
This commit is contained in:
parent
7dd83dd2d1
commit
e20cc6a90f
@ -357,15 +357,15 @@ namespace nasal
|
|||||||
* @param setter Setter for variable (Pass 0 to prevent write access)
|
* @param setter Setter for variable (Pass 0 to prevent write access)
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
template<class Var>
|
template<class Ret, class Param>
|
||||||
Ghost& member( const std::string& field,
|
Ghost& member( const std::string& field,
|
||||||
Var (raw_type::*getter)() const,
|
Ret (raw_type::*getter)() const,
|
||||||
void (raw_type::*setter)(typename boost::call_traits<Var>::param_type) = 0 )
|
void (raw_type::*setter)(Param) )
|
||||||
{
|
{
|
||||||
member_t m;
|
member_t m;
|
||||||
if( getter )
|
if( getter )
|
||||||
{
|
{
|
||||||
typedef typename boost::call_traits<Var>::param_type param_type;
|
typedef typename boost::call_traits<Ret>::param_type param_type;
|
||||||
naRef (*to_nasal_)(naContext, param_type) = &nasal::to_nasal;
|
naRef (*to_nasal_)(naContext, param_type) = &nasal::to_nasal;
|
||||||
|
|
||||||
// Getter signature: naRef(naContext, raw_type&)
|
// Getter signature: naRef(naContext, raw_type&)
|
||||||
@ -374,7 +374,8 @@ namespace nasal
|
|||||||
|
|
||||||
if( setter )
|
if( setter )
|
||||||
{
|
{
|
||||||
Var (*from_nasal_)(naContext, naRef) = &nasal::from_nasal;
|
typename boost::remove_reference<Param>::type
|
||||||
|
(*from_nasal_)(naContext, naRef) = &nasal::from_nasal;
|
||||||
|
|
||||||
// Setter signature: void(naContext, raw_type&, naRef)
|
// Setter signature: void(naContext, raw_type&, naRef)
|
||||||
m.setter = boost::bind(setter, _2, boost::bind(from_nasal_, _1, _3));
|
m.setter = boost::bind(setter, _2, boost::bind(from_nasal_, _1, _3));
|
||||||
@ -383,6 +384,19 @@ namespace nasal
|
|||||||
return member(field, m.getter, m.setter);
|
return member(field, m.getter, m.setter);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Register a read only member variable.
|
||||||
|
*
|
||||||
|
* @param field Name of member
|
||||||
|
* @param getter Getter for variable
|
||||||
|
*/
|
||||||
|
template<class Ret>
|
||||||
|
Ghost& member( const std::string& field,
|
||||||
|
Ret (raw_type::*getter)() const )
|
||||||
|
{
|
||||||
|
return member<Ret, Ret>(field, getter, 0);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Register a write only member variable.
|
* Register a write only member variable.
|
||||||
*
|
*
|
||||||
@ -393,7 +407,7 @@ namespace nasal
|
|||||||
Ghost& member( const std::string& field,
|
Ghost& member( const std::string& field,
|
||||||
void (raw_type::*setter)(Var) )
|
void (raw_type::*setter)(Var) )
|
||||||
{
|
{
|
||||||
return member<Var>(field, 0, setter);
|
return member<Var, Var>(field, 0, setter);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -23,6 +23,10 @@ struct Base
|
|||||||
|
|
||||||
std::string getString() const { return ""; }
|
std::string getString() const { return ""; }
|
||||||
void setString(const std::string&) {}
|
void setString(const std::string&) {}
|
||||||
|
|
||||||
|
std::string var;
|
||||||
|
const std::string& getVar() const { return var; }
|
||||||
|
void setVar(const std::string v) { var = v; }
|
||||||
};
|
};
|
||||||
struct Derived:
|
struct Derived:
|
||||||
public Base
|
public Base
|
||||||
@ -135,7 +139,10 @@ int main(int argc, char* argv[])
|
|||||||
|
|
||||||
Ghost<BasePtr>::init("BasePtr")
|
Ghost<BasePtr>::init("BasePtr")
|
||||||
.method<&Base::member>("member")
|
.method<&Base::member>("member")
|
||||||
.member("str", &Base::getString, &Base::setString);
|
.member("str", &Base::getString, &Base::setString)
|
||||||
|
.member("var_r", &Base::getVar)
|
||||||
|
.member("var_w", &Base::setVar)
|
||||||
|
.member("var", &Base::getVar, &Base::setVar);
|
||||||
Ghost<DerivedPtr>::init("DerivedPtr")
|
Ghost<DerivedPtr>::init("DerivedPtr")
|
||||||
.bases<BasePtr>()
|
.bases<BasePtr>()
|
||||||
.member("x", &Derived::getX, &Derived::setX)
|
.member("x", &Derived::getX, &Derived::setX)
|
||||||
|
@ -50,7 +50,7 @@ namespace nasal
|
|||||||
}
|
}
|
||||||
|
|
||||||
//----------------------------------------------------------------------------
|
//----------------------------------------------------------------------------
|
||||||
std::string from_nasal_helper(naContext c, naRef ref, std::string*)
|
std::string from_nasal_helper(naContext c, naRef ref, const std::string*)
|
||||||
{
|
{
|
||||||
naRef na_str = naStringValue(c, ref);
|
naRef na_str = naStringValue(c, ref);
|
||||||
return std::string(naStr_data(na_str), naStr_len(na_str));
|
return std::string(naStr_data(na_str), naStr_len(na_str));
|
||||||
@ -63,7 +63,7 @@ namespace nasal
|
|||||||
}
|
}
|
||||||
|
|
||||||
//----------------------------------------------------------------------------
|
//----------------------------------------------------------------------------
|
||||||
Hash from_nasal_helper(naContext c, naRef ref, Hash*)
|
Hash from_nasal_helper(naContext c, naRef ref, const Hash*)
|
||||||
{
|
{
|
||||||
if( !naIsHash(ref) )
|
if( !naIsHash(ref) )
|
||||||
throw bad_nasal_cast("Not a hash");
|
throw bad_nasal_cast("Not a hash");
|
||||||
@ -72,7 +72,7 @@ namespace nasal
|
|||||||
}
|
}
|
||||||
|
|
||||||
//----------------------------------------------------------------------------
|
//----------------------------------------------------------------------------
|
||||||
String from_nasal_helper(naContext c, naRef ref, String*)
|
String from_nasal_helper(naContext c, naRef ref, const String*)
|
||||||
{
|
{
|
||||||
if( !naIsString(ref) )
|
if( !naIsString(ref) )
|
||||||
throw bad_nasal_cast("Not a string");
|
throw bad_nasal_cast("Not a string");
|
||||||
|
@ -71,27 +71,28 @@ namespace nasal
|
|||||||
/**
|
/**
|
||||||
* Simple pass through for unified handling also of naRef.
|
* Simple pass through for unified handling also of naRef.
|
||||||
*/
|
*/
|
||||||
inline naRef from_nasal_helper(naContext, naRef ref, naRef*) { return ref; }
|
inline naRef from_nasal_helper(naContext, naRef ref, const naRef*)
|
||||||
|
{ return ref; }
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Convert Nasal string to std::string
|
* Convert Nasal string to std::string
|
||||||
*/
|
*/
|
||||||
std::string from_nasal_helper(naContext c, naRef ref, std::string*);
|
std::string from_nasal_helper(naContext c, naRef ref, const std::string*);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Convert a Nasal string to an SGPath
|
* Convert a Nasal string to an SGPath
|
||||||
*/
|
*/
|
||||||
SGPath from_nasal_helper(naContext c, naRef ref, SGPath*);
|
SGPath from_nasal_helper(naContext c, naRef ref, const SGPath*);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Convert a Nasal hash to a nasal::Hash
|
* Convert a Nasal hash to a nasal::Hash
|
||||||
*/
|
*/
|
||||||
Hash from_nasal_helper(naContext c, naRef ref, Hash*);
|
Hash from_nasal_helper(naContext c, naRef ref, const Hash*);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Convert a Nasal string to a nasal::String
|
* Convert a Nasal string to a nasal::String
|
||||||
*/
|
*/
|
||||||
String from_nasal_helper(naContext c, naRef ref, String*);
|
String from_nasal_helper(naContext c, naRef ref, const String*);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Convert a Nasal number to a C++ numeric type
|
* Convert a Nasal number to a C++ numeric type
|
||||||
@ -100,7 +101,7 @@ namespace nasal
|
|||||||
typename boost::enable_if< boost::is_arithmetic<T>,
|
typename boost::enable_if< boost::is_arithmetic<T>,
|
||||||
T
|
T
|
||||||
>::type
|
>::type
|
||||||
from_nasal_helper(naContext c, naRef ref, T*)
|
from_nasal_helper(naContext c, naRef ref, const T*)
|
||||||
{
|
{
|
||||||
naRef num = naNumValue(ref);
|
naRef num = naNumValue(ref);
|
||||||
if( !naIsNum(num) )
|
if( !naIsNum(num) )
|
||||||
@ -113,7 +114,8 @@ namespace nasal
|
|||||||
* Convert a Nasal vector to a std::vector
|
* Convert a Nasal vector to a std::vector
|
||||||
*/
|
*/
|
||||||
template<class T>
|
template<class T>
|
||||||
std::vector<T> from_nasal_helper(naContext c, naRef ref, std::vector<T>*)
|
std::vector<T>
|
||||||
|
from_nasal_helper(naContext c, naRef ref, const std::vector<T>*)
|
||||||
{
|
{
|
||||||
if( !naIsVector(ref) )
|
if( !naIsVector(ref) )
|
||||||
throw bad_nasal_cast("Not a vector");
|
throw bad_nasal_cast("Not a vector");
|
||||||
@ -132,7 +134,7 @@ namespace nasal
|
|||||||
*/
|
*/
|
||||||
template<class Vec2>
|
template<class Vec2>
|
||||||
typename boost::enable_if<is_vec2<Vec2>, Vec2>::type
|
typename boost::enable_if<is_vec2<Vec2>, Vec2>::type
|
||||||
from_nasal_helper(naContext c, naRef ref, Vec2*)
|
from_nasal_helper(naContext c, naRef ref, const Vec2*)
|
||||||
{
|
{
|
||||||
std::vector<double> vec =
|
std::vector<double> vec =
|
||||||
from_nasal_helper(c, ref, static_cast<std::vector<double>*>(0));
|
from_nasal_helper(c, ref, static_cast<std::vector<double>*>(0));
|
||||||
|
Loading…
Reference in New Issue
Block a user