os/ossrv/ossrv_pub/boost_apis/boost/python/scope.hpp
author sl
Tue, 10 Jun 2014 14:32:02 +0200
changeset 1 260cb5ec6c19
permissions -rw-r--r--
Update contrib.
     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