Back to home page

EIC code displayed by LXR

 
 

    


File indexing completed on 2025-12-16 10:07:44

0001 // Copyright David Abrahams 2003.
0002 // Distributed under the Boost Software License, Version 1.0. (See
0003 // accompanying file LICENSE_1_0.txt or copy at
0004 // http://www.boost.org/LICENSE_1_0.txt)
0005 #ifndef DEF_VISITOR_DWA2003810_HPP
0006 # define DEF_VISITOR_DWA2003810_HPP
0007 
0008 # include <boost/python/detail/prefix.hpp>
0009 # include <boost/detail/workaround.hpp>
0010 
0011 namespace boost { namespace python { 
0012 
0013 template <class DerivedVisitor> class def_visitor;
0014 template <class T, class X1, class X2, class X3> class class_;
0015 
0016 class def_visitor_access
0017 {
0018 # if defined(BOOST_NO_MEMBER_TEMPLATE_FRIENDS)                  \
0019     || BOOST_WORKAROUND(BOOST_BORLANDC, BOOST_TESTED_AT(0x551))
0020     // Tasteless as this may seem, making all members public allows member templates
0021     // to work in the absence of member template friends.
0022  public:
0023 # else      
0024     template <class Derived> friend class def_visitor;
0025 # endif
0026     
0027     // unnamed visit, c.f. init<...>, container suites
0028     template <class V, class classT>
0029     static void visit(V const& v, classT& c)
0030     {
0031         v.derived_visitor().visit(c);
0032     }
0033 
0034     // named visit, c.f. object, pure_virtual
0035     template <class V, class classT, class OptionalArgs>
0036     static void visit(
0037         V const& v
0038       , classT& c
0039       , char const* name
0040       , OptionalArgs const& options
0041     ) 
0042     {
0043         v.derived_visitor().visit(c, name, options);
0044     }
0045     
0046 };
0047 
0048 
0049 template <class DerivedVisitor>
0050 class def_visitor
0051 {
0052     friend class def_visitor_access;
0053     
0054 # if defined(BOOST_NO_MEMBER_TEMPLATE_FRIENDS)                  \
0055     || BOOST_WORKAROUND(BOOST_BORLANDC, BOOST_TESTED_AT(0x551))
0056     // Tasteless as this may seem, making all members public allows member templates
0057     // to work in the absence of member template friends.
0058  public:
0059 # else      
0060     template <class T, class X1, class X2, class X3> friend class class_;
0061 # endif
0062     
0063     // unnamed visit, c.f. init<...>, container suites
0064     template <class classT>
0065     void visit(classT& c) const
0066     {
0067         def_visitor_access::visit(*this, c);
0068     }
0069 
0070     // named visit, c.f. object, pure_virtual
0071     template <class classT, class OptionalArgs>
0072     void visit(classT& c, char const* name, OptionalArgs const& options) const
0073     {
0074         def_visitor_access::visit(*this, c, name, options);
0075     }
0076     
0077  protected:
0078     DerivedVisitor const& derived_visitor() const
0079     {
0080         return static_cast<DerivedVisitor const&>(*this);
0081     }
0082 };
0083 
0084 }} // namespace boost::python
0085 
0086 #endif // DEF_VISITOR_DWA2003810_HPP