Chris@16
|
1 // Copyright David Abrahams 2003.
|
Chris@16
|
2 // Distributed under the Boost Software License, Version 1.0. (See
|
Chris@16
|
3 // accompanying file LICENSE_1_0.txt or copy at
|
Chris@16
|
4 // http://www.boost.org/LICENSE_1_0.txt)
|
Chris@16
|
5 #ifndef DEF_VISITOR_DWA2003810_HPP
|
Chris@16
|
6 # define DEF_VISITOR_DWA2003810_HPP
|
Chris@16
|
7
|
Chris@16
|
8 # include <boost/python/detail/prefix.hpp>
|
Chris@16
|
9 # include <boost/detail/workaround.hpp>
|
Chris@16
|
10
|
Chris@16
|
11 namespace boost { namespace python {
|
Chris@16
|
12
|
Chris@16
|
13 template <class DerivedVisitor> class def_visitor;
|
Chris@16
|
14 template <class T, class X1, class X2, class X3> class class_;
|
Chris@16
|
15
|
Chris@16
|
16 class def_visitor_access
|
Chris@16
|
17 {
|
Chris@16
|
18 # if defined(BOOST_NO_MEMBER_TEMPLATE_FRIENDS) \
|
Chris@16
|
19 || BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x551))
|
Chris@16
|
20 // Tasteless as this may seem, making all members public allows member templates
|
Chris@16
|
21 // to work in the absence of member template friends.
|
Chris@16
|
22 public:
|
Chris@16
|
23 # else
|
Chris@16
|
24 template <class Derived> friend class def_visitor;
|
Chris@16
|
25 # endif
|
Chris@16
|
26
|
Chris@16
|
27 // unnamed visit, c.f. init<...>, container suites
|
Chris@16
|
28 template <class V, class classT>
|
Chris@16
|
29 static void visit(V const& v, classT& c)
|
Chris@16
|
30 {
|
Chris@16
|
31 v.derived_visitor().visit(c);
|
Chris@16
|
32 }
|
Chris@16
|
33
|
Chris@16
|
34 // named visit, c.f. object, pure_virtual
|
Chris@16
|
35 template <class V, class classT, class OptionalArgs>
|
Chris@16
|
36 static void visit(
|
Chris@16
|
37 V const& v
|
Chris@16
|
38 , classT& c
|
Chris@16
|
39 , char const* name
|
Chris@16
|
40 , OptionalArgs const& options
|
Chris@16
|
41 )
|
Chris@16
|
42 {
|
Chris@16
|
43 v.derived_visitor().visit(c, name, options);
|
Chris@16
|
44 }
|
Chris@16
|
45
|
Chris@16
|
46 };
|
Chris@16
|
47
|
Chris@16
|
48
|
Chris@16
|
49 template <class DerivedVisitor>
|
Chris@16
|
50 class def_visitor
|
Chris@16
|
51 {
|
Chris@16
|
52 friend class def_visitor_access;
|
Chris@16
|
53
|
Chris@16
|
54 # if defined(BOOST_NO_MEMBER_TEMPLATE_FRIENDS) \
|
Chris@16
|
55 || BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x551))
|
Chris@16
|
56 // Tasteless as this may seem, making all members public allows member templates
|
Chris@16
|
57 // to work in the absence of member template friends.
|
Chris@16
|
58 public:
|
Chris@16
|
59 # else
|
Chris@16
|
60 template <class T, class X1, class X2, class X3> friend class class_;
|
Chris@16
|
61 # endif
|
Chris@16
|
62
|
Chris@16
|
63 // unnamed visit, c.f. init<...>, container suites
|
Chris@16
|
64 template <class classT>
|
Chris@16
|
65 void visit(classT& c) const
|
Chris@16
|
66 {
|
Chris@16
|
67 def_visitor_access::visit(*this, c);
|
Chris@16
|
68 }
|
Chris@16
|
69
|
Chris@16
|
70 // named visit, c.f. object, pure_virtual
|
Chris@16
|
71 template <class classT, class OptionalArgs>
|
Chris@16
|
72 void visit(classT& c, char const* name, OptionalArgs const& options) const
|
Chris@16
|
73 {
|
Chris@16
|
74 def_visitor_access::visit(*this, c, name, options);
|
Chris@16
|
75 }
|
Chris@16
|
76
|
Chris@16
|
77 protected:
|
Chris@16
|
78 DerivedVisitor const& derived_visitor() const
|
Chris@16
|
79 {
|
Chris@16
|
80 return static_cast<DerivedVisitor const&>(*this);
|
Chris@16
|
81 }
|
Chris@16
|
82 };
|
Chris@16
|
83
|
Chris@16
|
84 }} // namespace boost::python
|
Chris@16
|
85
|
Chris@16
|
86 #endif // DEF_VISITOR_DWA2003810_HPP
|