python/test/properties.cpp
2017-09-18 08:21:30 -04:00

101 lines
2.8 KiB
C++

// Copyright David Abrahams 2004. Distributed under the Boost
// Software License, Version 1.0. (See accompanying
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
#include <boost/python.hpp>
using namespace boost::python;
namespace test {
// Hmm. return_internal_reference<>() wants to wrap a real class.
class ret_type
{
public:
ret_type() : i(42.5) {}
double i;
};
class crash_me
{
private:
ret_type i;
public:
ret_type& get_i() { return i; }
};
}
struct X
{
X( int value ) : m_value( value )
{ ++s_count; }
X( const X &other ) : m_value( other.m_value )
{ ++s_count; }
~X()
{ --s_count; }
int get_value() const
{ return m_value; }
void set_value(int new_value)
{ m_value = new_value; }
static int get_instance_count()
{ return s_count; }
int m_value;
static int s_count;
};
int X::s_count = 0;
int get_X_instance_count()
{ return X::get_instance_count(); }
BOOST_PYTHON_MODULE(properties_ext)
{
typedef return_value_policy<return_by_value> return_by_value_t;
typedef return_internal_reference<> return_by_internal_reference_t;
class_<X>("X", init<int>() )
//defining read only property
.add_property( "value_r", &X::get_value )
.add_property( "value_r_ds", &X::get_value, "value_r_ds is read-only")
//defining read \ write property
.add_property( "value_rw", &X::get_value, &X::set_value )
.add_property( "value_rw_ds", &X::get_value, &X::set_value,
"value_rw_ds is read-write")
//defining read \ write property using make_getter and make_setter
.add_property( "value_direct",
make_getter( &X::m_value, return_by_value_t() ),
make_setter( &X::m_value, return_by_internal_reference_t() ) )
//defining read only property for static member
.add_static_property( "instance_count", &X::get_instance_count )
//defining read \ write property for static member using make_getter and make_setter
.add_static_property( "instance_count_direct",
make_getter( &X::s_count, return_by_value_t() ),
make_setter( &X::s_count, return_by_internal_reference_t() ) )
//defining class property using a global function
.add_static_property( "instance_count_injected", &get_X_instance_count );
class_< test::ret_type>( "ret_type")
.add_property( "i", &test::ret_type::i, &test::ret_type::i)
;
class_< test::crash_me> crash_me_wrapper( "crash_me");
crash_me_wrapper
.def( "get_i", &test::crash_me::get_i , return_internal_reference<>())
;
crash_me_wrapper.add_property( "i", crash_me_wrapper.attr("get_i"));
}
#include "module_tail.cpp"