87 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
		
		
			
		
	
	
			87 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
|   | // Copyright David Abrahams 2003. | ||
|  | // 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) | ||
|  | #ifndef DEF_VISITOR_DWA2003810_HPP | ||
|  | # define DEF_VISITOR_DWA2003810_HPP | ||
|  | 
 | ||
|  | # include <boost/python/detail/prefix.hpp> | ||
|  | # include <boost/detail/workaround.hpp> | ||
|  | 
 | ||
|  | namespace boost { namespace python {  | ||
|  | 
 | ||
|  | template <class DerivedVisitor> class def_visitor; | ||
|  | template <class T, class X1, class X2, class X3> class class_; | ||
|  | 
 | ||
|  | class def_visitor_access | ||
|  | { | ||
|  | # if defined(BOOST_NO_MEMBER_TEMPLATE_FRIENDS)                  \ | ||
|  |     || BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x551)) | ||
|  |     // Tasteless as this may seem, making all members public allows member templates | ||
|  |     // to work in the absence of member template friends. | ||
|  |  public: | ||
|  | # else       | ||
|  |     template <class Derived> friend class def_visitor; | ||
|  | # endif | ||
|  |      | ||
|  |     // unnamed visit, c.f. init<...>, container suites | ||
|  |     template <class V, class classT> | ||
|  |     static void visit(V const& v, classT& c) | ||
|  |     { | ||
|  |         v.derived_visitor().visit(c); | ||
|  |     } | ||
|  | 
 | ||
|  |     // named visit, c.f. object, pure_virtual | ||
|  |     template <class V, class classT, class OptionalArgs> | ||
|  |     static void visit( | ||
|  |         V const& v | ||
|  |       , classT& c | ||
|  |       , char const* name | ||
|  |       , OptionalArgs const& options | ||
|  |     )  | ||
|  |     { | ||
|  |         v.derived_visitor().visit(c, name, options); | ||
|  |     } | ||
|  |      | ||
|  | }; | ||
|  | 
 | ||
|  | 
 | ||
|  | template <class DerivedVisitor> | ||
|  | class def_visitor | ||
|  | { | ||
|  |     friend class def_visitor_access; | ||
|  |      | ||
|  | # if defined(BOOST_NO_MEMBER_TEMPLATE_FRIENDS)                  \ | ||
|  |     || BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x551)) | ||
|  |     // Tasteless as this may seem, making all members public allows member templates | ||
|  |     // to work in the absence of member template friends. | ||
|  |  public: | ||
|  | # else       | ||
|  |     template <class T, class X1, class X2, class X3> friend class class_; | ||
|  | # endif | ||
|  |      | ||
|  |     // unnamed visit, c.f. init<...>, container suites | ||
|  |     template <class classT> | ||
|  |     void visit(classT& c) const | ||
|  |     { | ||
|  |         def_visitor_access::visit(*this, c); | ||
|  |     } | ||
|  | 
 | ||
|  |     // named visit, c.f. object, pure_virtual | ||
|  |     template <class classT, class OptionalArgs> | ||
|  |     void visit(classT& c, char const* name, OptionalArgs const& options) const | ||
|  |     { | ||
|  |         def_visitor_access::visit(*this, c, name, options); | ||
|  |     } | ||
|  |      | ||
|  |  protected: | ||
|  |     DerivedVisitor const& derived_visitor() const | ||
|  |     { | ||
|  |         return static_cast<DerivedVisitor const&>(*this); | ||
|  |     } | ||
|  | }; | ||
|  | 
 | ||
|  | }} // namespace boost::python | ||
|  | 
 | ||
|  | #endif // DEF_VISITOR_DWA2003810_HPP |