ossrv_pub/boost_apis/boost/python/scope.hpp
changeset 0 e4d67989cc36
equal deleted inserted replaced
-1:000000000000 0:e4d67989cc36
       
     1 // Copyright David Abrahams 2002.
       
     2 // Distributed under the Boost Software License, Version 1.0. (See
       
     3 // accompanying file LICENSE_1_0.txt or copy at
       
     4 // http://www.boost.org/LICENSE_1_0.txt)
       
     5 #ifndef SCOPE_DWA2002724_HPP
       
     6 # define SCOPE_DWA2002724_HPP
       
     7 
       
     8 # include <boost/python/detail/prefix.hpp>
       
     9 # include <boost/python/object.hpp>
       
    10 # include <boost/python/refcount.hpp>
       
    11 # include <boost/utility.hpp>
       
    12 
       
    13 namespace boost { namespace python { 
       
    14 
       
    15 namespace detail
       
    16 {
       
    17   // Making this a namespace-scope variable to avoid Cygwin issues.
       
    18   // Use a PyObject* to avoid problems with static destruction after Py_Finalize
       
    19   extern BOOST_PYTHON_DECL PyObject* current_scope;
       
    20 }
       
    21 
       
    22 class scope
       
    23   : public object
       
    24 {
       
    25  public:
       
    26     inline scope(scope const&);
       
    27     inline scope(object const&);
       
    28     inline scope();
       
    29     inline ~scope();
       
    30     
       
    31  private: // data members
       
    32     PyObject* m_previous_scope;
       
    33 
       
    34  private: // unimplemented functions
       
    35     void operator=(scope const&);
       
    36 };
       
    37 
       
    38 inline scope::scope(object const& new_scope)
       
    39     : object(new_scope)
       
    40     , m_previous_scope(detail::current_scope)
       
    41 {
       
    42     detail::current_scope = python::incref(new_scope.ptr());
       
    43 }
       
    44 
       
    45 inline scope::scope()
       
    46     : object(detail::borrowed_reference(
       
    47                  detail::current_scope ? detail::current_scope : Py_None
       
    48                  ))
       
    49     , m_previous_scope(python::xincref(detail::current_scope))
       
    50 {
       
    51 }
       
    52 
       
    53 inline scope::~scope()
       
    54 {
       
    55     python::xdecref(detail::current_scope);
       
    56     detail::current_scope = m_previous_scope;
       
    57 }
       
    58 
       
    59 namespace converter
       
    60 {
       
    61   template <>
       
    62   struct object_manager_traits<scope>
       
    63       : object_manager_traits<object>
       
    64   {
       
    65   };
       
    66 }
       
    67 
       
    68 // Placing this after the specialization above suppresses a CWPro8.3 bug
       
    69 inline scope::scope(scope const& new_scope)
       
    70     : object(new_scope)
       
    71     , m_previous_scope(detail::current_scope)
       
    72 {
       
    73     detail::current_scope = python::incref(new_scope.ptr());
       
    74 }
       
    75 
       
    76 }} // namespace boost::python
       
    77 
       
    78 #endif // SCOPE_DWA2002724_HPP