ifndef Rice__to_from_ruby_defn__hpp_ define Rice__to_from_ruby_defn__hpp_
include “Object_defn.hpp” include “detail/from_ruby.hpp” include “detail/to_ruby.hpp”
include <typeinfo> include <string> include <stdexcept>
// ———————————————————————
//! Convert a Ruby object to C++.
! If the Ruby object can be converted to an immediate value, returns a
copy of the Ruby object. If the Ruby object is holding a C++
object and the type specified is a pointer to that type, returns a
pointer to that object.
Conversions from ruby to a pointer type are automatically generated
when a type is bound using Data_Type. If no conversion exists an
exception is thrown.
\param T the C++ type to which to convert.
\param x the Ruby object to convert.
\return a C++ representation of the Ruby object.
Example:
\code
Object x = INT2NUM(42);
std::cout << from_ruby<int>(x);
Data_Object<Foo> foo(new Foo);
Object obj(foo);
std::cout << *from_ruby<Foo *>(obj) << std::endl;
\endcode
template<typename T> inline typename Rice::detail::from_ruby_<T>::Retval_T from_ruby(Rice::Object x) {
return Rice::detail::from_ruby_<T>::convert(x);
}
//! Convert a C++ object to Ruby. /*! If x is a pointer, wraps the pointee as a Ruby object. If x is an
Object, returns x.
If no conversion exists a compile-time error is generated.
\param x the object to convert.
\return a Ruby representation of the C++ object.
Example:
\code
rb_p(to_ruby(42));
Foo * p_foo = new Foo();
rb_p(to_ruby(p_foo));
\endcode
/
template<typename T> inline Rice::Object to_ruby(T const & x) {
return Rice::detail::to_ruby_<T>::convert(x);
}
endif // Rice__to_from_ruby_defn__hpp_