summaryrefslogtreecommitdiffstats
path: root/src/boost/libs/python/test/data_members.cpp
blob: 6d2cc7bd4e552bb718e17cf188dccc6df2fda152 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
// Copyright David Abrahams 2002.
// 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/class.hpp>
#include <boost/python/module.hpp>
#include <boost/python/return_value_policy.hpp>
#include <boost/python/return_by_value.hpp>
#include "test_class.hpp"

#if defined(_AIX) && defined(__EDG_VERSION__) && __EDG_VERSION__ < 245
# include <iostream> // works around a KCC intermediate code generation bug
#endif


using namespace boost::python;

typedef test_class<> X;

struct Y : test_class<1>
{
    Y(int v) : test_class<1>(v) {}
    Y& operator=(Y const& rhs) { x = rhs.x; return *this; }
    bool q;
};

double get_fair_value(X const& x) { return x.value(); }


struct VarBase
{
    VarBase(std::string name_) : name(name_) {}
    
    std::string const name;
    std::string get_name1() const { return name; }
    
};

struct Var : VarBase
{
    Var(std::string name_) : VarBase(name_), value(), name2(name.c_str()), y(6) {}
    std::string const& get_name2() const { return name; }
    float value;
    char const* name2;
    Y y;

    static int static1;
    static Y static2;
};

int Var::static1 = 0;
Y Var::static2(0);

// Compilability regression tests
namespace boost_python_test
{
  struct trivial
  {
    trivial() : value(123) {}
    double value;
  };

  struct Color3
  {
    static const Color3 black;
  };

  const Color3 Color3::black
#if !BOOST_WORKAROUND(BOOST_MSVC, <= 1300)
  = {}
#endif 
      ;

  void compilability_test()
  {
    class_<trivial>("trivial")
      .add_property("property", make_getter(&trivial::value, return_value_policy<return_by_value>()))
      .def_readonly("readonly", &trivial::value)
    ;

    class_< Color3 >("Color3", init< const Color3 & >())
        .def_readonly("BLACK", &Color3::black)   // line 17
        ;
  }
}

BOOST_PYTHON_MODULE(data_members_ext)
{
    using namespace boost_python_test;
    class_<X>("X", init<int>())
        .def("value", &X::value)
        .def("set", &X::set)
        .def_readonly("x", &X::x)
        .add_property("fair_value", get_fair_value)
        ;

    class_<Y>("Y", init<int>())
        .def("value", &Y::value)
        .def("set", &Y::set)
        .def_readwrite("x", &Y::x)
        .def_readwrite("q", &Y::q)
        ;

    class_<Var>("Var", init<std::string>())
        .def_readonly("name", &Var::name)
        .def_readonly("name2", &Var::name2)
        .def_readwrite("value", &Var::value)
        .def_readonly("y", &Var::y)
        
        // Test return_by_value for plain values and for
        // pointers... return_by_value was implemented as a
        // side-effect of implementing data member support, so it made
        // sense to add the test here.
        .def("get_name1", &Var::get_name1, return_value_policy<return_by_value>())
        .def("get_name2", &Var::get_name2, return_value_policy<return_by_value>())
        
        .add_property("name3", &Var::get_name1)

        // Test static data members
        .def_readonly("ro1a", &Var::static1)
        .def_readonly("ro1b", Var::static1)
        .def_readwrite("rw1a", &Var::static1)
        .def_readwrite("rw1b", Var::static1)

        .def_readonly("ro2a", &Var::static2)
        .def_readonly("ro2b", Var::static2)
        .def_readwrite("rw2a", &Var::static2)
        .def_readwrite("rw2b", Var::static2)
        ;
}

#include "module_tail.cpp"