shared_ptr.cpp
来自「Boost provides free peer-reviewed portab」· C++ 代码 · 共 218 行
CPP
218 行
// Copyright David Abrahams 2002.// 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)#include <boost/python/module.hpp>#include <boost/python/class.hpp>#include <boost/python/call_method.hpp>#include <boost/python/extract.hpp>#include <boost/python/def.hpp>#include <boost/shared_ptr.hpp>#include "test_class.hpp"#include <memory>using namespace boost::python;using boost::shared_ptr;typedef test_class<> X;typedef test_class<1> Y;template <class T>struct functions{ static int look(shared_ptr<T> const& x) { return (x.get()) ? x->value() : -1; } static void store(shared_ptr<T> x) { storage = x; } static void release_store() { store(shared_ptr<T>()); } static void modify(shared_ptr<T>& x) { x.reset(); } static shared_ptr<T> get() { return storage; } static shared_ptr<T> &get1() { return storage; } static int look_store() { return look(get()); } template <class C> static void expose(C const& c) { def("look", &look); def("store", &store); def("modify", &modify); def("identity", &identity); def("null", &null); const_cast<C&>(c) .def("look", &look) .staticmethod("look") .def("store", &store) .staticmethod("store") .def("modify", &modify) .staticmethod("modify") .def("look_store", &look_store) .staticmethod("look_store") .def("identity", &identity) .staticmethod("identity") .def("null", &null) .staticmethod("null") .def("get1", &get1, return_internal_reference<>()) .staticmethod("get1") .def("get", &get) .staticmethod("get") .def("count", &T::count) .staticmethod("count") .def("release", &release_store) .staticmethod("release") ; } static shared_ptr<T> identity(shared_ptr<T> x) { return x; } static shared_ptr<T> null(T const&) { return shared_ptr<T>(); } static shared_ptr<T> storage;};template <class T> shared_ptr<T> functions<T>::storage;struct Z : test_class<2>{ Z(int x) : test_class<2>(x) {} virtual int v() { return this->value(); }};struct ZWrap : Z{ ZWrap(PyObject* self, int x) : Z(x), m_self(self) {} virtual int v() { return call_method<int>(m_self, "v"); } int default_v() { return Z::v(); } PyObject* m_self;};struct YY : Y{ YY(int n) : Y(n) {}};struct YYY : Y{ YYY(int n) : Y(n) {}};shared_ptr<Y> factory(int n){ return shared_ptr<Y>(n < 42 ? new Y(n) : new YY(n));}// regressions from Nicodemus struct A { virtual ~A() {}; // silence compiler warnings virtual int f() = 0; static int call_f(shared_ptr<A>& a) { return a->f(); } }; struct B: A { int f() { return 1; } }; boost::shared_ptr<A> New(bool make) { return boost::shared_ptr<A>( make ? new B() : 0 ); } struct A_Wrapper: A { A_Wrapper(PyObject* self_): A(), self(self_) {} int f() { return call_method< int >(self, "f"); } PyObject* self; };// ------// from Neal Beckerstruct Test { boost::shared_ptr<X> x;};// ------BOOST_PYTHON_MODULE(shared_ptr_ext){ class_<A, boost::shared_ptr<A_Wrapper>, boost::noncopyable>("A") .def("call_f", &A::call_f) .staticmethod("call_f") ; // This is the ugliness required to register a to-python converter // for shared_ptr<A>. objects::class_value_wrapper< shared_ptr<A> , objects::make_ptr_instance<A, objects::pointer_holder<shared_ptr<A>,A> > >(); def("New", &New); def("factory", factory); functions<X>::expose( class_<X, boost::noncopyable>("X", init<int>()) .def("value", &X::value) ); functions<Y>::expose( class_<Y, boost::shared_ptr<Y> >("Y", init<int>()) .def("value", &Y::value) ); class_<YY, bases<Y>, boost::noncopyable>("YY", init<int>()) ; class_<YYY, shared_ptr<YYY>, bases<Y> >("YYY", init<int>()) ; functions<Z>::expose( class_<Z, ZWrap>("Z", init<int>()) .def("value", &Z::value) .def("v", &Z::v, &ZWrap::default_v) );// from Neal Becker class_<Test> ("Test") .def_readonly ("x", &Test::x, "x") ;// ------}#include "module_tail.cpp"
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?