diff --git a/doc/building.html b/doc/building.html index f066c2f1..b50dcb87 100644 --- a/doc/building.html +++ b/doc/building.html @@ -118,9 +118,9 @@
c:/Python(10*Version), e.g. c:/Python24
/usr/local/usr
- --prefix= directory used
+ --prefix= directory used
to configure Python when it was built and installed.CYGWIN_PYTHON_[DEBUG_]ROOTinclude/ directory
+ include/ directory
containing
python$(CYGWIN_PYTHON_[DEBUG_]VERSION)/python.h.You will need to create a MinGW-compatible version of the Python - library; the one shipped with Python will only work with a +
If you are using a version of Python prior to 2.4.1 with a
+ MinGW prior to 3.0.0 (with binutils-2.13.90-20030111-1), you will
+ need to create a MinGW-compatible version of the Python library;
+ the one shipped with Python will only work with a
Microsoft-compatible linker. Follow the instructions in the
"Non-Microsoft" section of the "Building Extensions: Tips And Tricks"
chapter in The first two variants of the boost_python library are
built by default, and are compatible with the default Python
distribution. The debug-python variant corresponds to a
- specially-built debugging version of Python. On Unix platforms, this
+ specially-built debugging version of Python. On *nix platforms, this
python is built by adding --with-pydebug when configuring
the Python build. On Windows, the debugging version of Python is
generated by the "Win32 Debug" target of the PCBuild.dsw
diff --git a/doc/news.html b/doc/news.html
index f3b82e62..22b0cad3 100644
--- a/doc/news.html
+++ b/doc/news.html
@@ -1,138 +1,171 @@
-
-
-
-
+
+
+
+
-
|
- |
+
+
|
+ |
-
- Boost.Python+ |
+ Boost.Python-News/Change Log- |
-
&) operatorswrapper<T> can now be used as expected with a
+ held type of some-smart-pointer<T>init<optional<> > and
-XXX_FUNCTION_OVERLOADS() for only the last overload.&) operatorsvector<T*> with the indexing suite.std::auto_ptr-like types.python/detail and into boost/detail to improve dependency relationships.init<optional<> > and
+ XXX_FUNCTION_OVERLOADS() for only the last
+ overload.vector<T*> with the
+ indexing suite.std::wstring conversionsstd::out_of_range => Python
- IndexError exception conversion, thanks to Raoul Goughstr'\0') characters.operator()); see the make_function docs for
- more info.properties unit tests contributed by Roman Yakovenko and documented
- add_static_property at his urging.arg class contributed by Nikolay Mladenov which supplies the
- ability to wrap functions that can be called with ommitted arguments
- in the middle:
-+
std::auto_ptr-like types.python/detail and into boost/detail to
+ improve dependency relationships.std::wstring conversionsstd::out_of_range => Python
+ IndexError exception conversion, thanks to Raoul Goughstr'\0') characters.operator()); see the make_function docs for
+ more info.properties unit tests contributed by
+ Roman Yakovenko and
+ documented add_static_property at his urging.arg class contributed by Nikolay Mladenov which supplies the
+ ability to wrap functions that can be called with ommitted arguments in
+ the middle:
+
void f(int x = 0, double y = 3.14, std::string z = std::string("foo"));
BOOST_PYTHON_MODULE(test)
@@ -141,111 +174,104 @@ BOOST_PYTHON_MODULE(test)
, (arg("x", 0), arg("y", 3.14), arg("z", "foo")));
}
-
- And in Python:
-+And in Python: +
>>> import test >>> f(0, z = "bar") >>> f(z = "bar", y = 0.0) -- Thanks, Nikolay! -
return_arg policy from Nikolay Mladenov. Thanks,
- Nikolay!return_arg policy from Nikolay Mladenov. Thanks, Nikolay!boost::shared_ptr. Now
- any wrapped object of C++ class X can be converted
- automatically to shared_ptr<X>, regardless of how it
- was wrapped. The shared_ptr will manage the lifetime of
- the Python object which supplied the X, rather than just
- the X object itself, and when such a
- shared_ptr is converted back to Python, the original
- Python object will be returned.boost::shared_ptr. Now any
+ wrapped object of C++ class X can be converted automatically
+ to shared_ptr<X>, regardless of how it was wrapped.
+ The shared_ptr will manage the lifetime of the Python object
+ which supplied the X, rather than just the X
+ object itself, and when such a shared_ptr is converted back
+ to Python, the original Python object will be returned.staticmethod support from Nikolay Mladenov. Thanks,
- Nikolay!staticmethod support from Nikolay Mladenov. Thanks, Nikolay!enum_ values into enclosing
- scope.signed long.enum_ values into enclosing
+ scope.signed long.make_gettermake_getterstd::auto_ptr<> added.std::auto_ptr<> added.Revised - - 19 November 2004 - -
+Revised + + 19 November 2004 +
-© Copyright Dave - Abrahams 2002-2003.
- +© Copyright Dave + Abrahams 2002-2003.
+ - diff --git a/doc/v2/class.html b/doc/v2/class.html index a6693fcd..3130fa5b 100644 --- a/doc/v2/class.html +++ b/doc/v2/class.html @@ -1,214 +1,219 @@ - - - - + + + + -|
- |
+
+
|
+ |
-
- Boost.Python+ |
+ Boost.Python-Headers <boost/python/class.hpp>, - <boost/python/class_fwd.hpp>- |
-
class_class_class_
- synopsisclass_
+ synopsisclass_
- constructorsclass_
+ constructorsclass_
- modifier functionsclass_
+ modifier functionsbasesbasesbases synopsisbases synopsis<boost/python/class.hpp> defines the interface
- through which users expose their C++ classes to Python. It declares the
- class_ class template, which is parameterized on the class
- type being exposed. It also exposes the init,
- optional and bases utility class templates,
- which are used in conjunction with class_.
<boost/python/class.hpp> defines the interface
+ through which users expose their C++ classes to Python. It declares the
+ class_ class template, which is parameterized on the class
+ type being exposed. It also exposes the init,
+ optional and bases utility class templates, which
+ are used in conjunction with class_.
<boost/python/class_fwd.hpp> contains a forward
- declaration of the class_ class template.
<boost/python/class_fwd.hpp> contains a forward
+ declaration of the class_ class template.
class_<T, Bases, HeldType,
- NonCopyable>class_<T, Bases, HeldType,
+ NonCopyable>Creates a Python class associated with the C++ type passed as its
- first parameter. Although it has four template parameters, only the first
- one is required. The three optional arguments can actually be supplied
- in any order; Boost.Python determines
- the role of the argument from its type.
-
-
Creates a Python class associated with the C++ type passed as its first
+ parameter. Although it has four template parameters, only the first one is
+ required. The three optional arguments can actually be supplied
+ in any order; Boost.Python determines
+ the role of the argument from its type.
+
| Template Parameter | +
|---|
| Template Parameter | -Requirements | +Requirements | -Semantics | +Semantics | -Default | -Default | + -
|---|---|---|---|---|---|
T |
+ |||||
T |
- A class type. | +A class type. | -The class being wrapped | -The class being wrapped | + -|
Bases |
+ |||||
Bases |
- A specialization of bases<...> which
- specifies previously-exposed C++ base classes of T[1]. |
+ A specialization of bases<...> which
+ specifies previously-exposed C++ base classes of T[1]. |
- Registers from_python conversions from wrapped
- T instances to each of its exposed direct and indirect
- bases. For each polymorphic base B, registers
- conversions from indirectly-held wrapped B instances to
- T. |
+ Registers from_python conversions from wrapped
+ T instances to each of its exposed direct and indirect
+ bases. For each polymorphic base B, registers conversions
+ from indirectly-held wrapped B instances to
+ T. |
- bases<> |
- bases<> |
+
-
HeldType |
+ |||||
HeldType |
- Must be T, a class derived from T, or a
- Dereferenceable type for which
- pointee<HeldType>::type
- is T or a class derived from T. |
+ Must be T, a class derived from T, or a
+ Dereferenceable type for which
+ pointee<HeldType>::type is
+ T or a class derived from T. |
- Specifies the type which is actually embedded in a Python object
- wrapping a T instance. More details below. |
+ Specifies the type that is actually embedded in a Python object
+ wrapping a T instance when T's constructor is
+ called or when a T or T* is converted to
+ Python without the use of
+ ptr,
+ ref, or Call Policies
+ such as return_internal_reference.
+ More details below. |
- T |
- T |
+
-
NonCopyable |
+ |||||
NonCopyable |
- If supplied, must be boost::noncopyable. | +If supplied, must be boost::noncopyable. | -Suppresses automatic registration of to_python
- conversions which copy T instances. Required when
- T has no publicly-accessible copy constructor. |
+ Suppresses automatic registration of to_python
+ conversions which copy T instances. Required when
+ T has no publicly-accessible copy constructor. |
- An unspecified type other than
- boost::noncopyable. |
-
boost::noncopyable.HeldType is derived from T, its exposed
- constructor(s) must accept an initial PyObject* argument
- which refers back to the Python object that contains the
- HeldType instance, as shown in this example. This argument is not
- included in the init-expression passed to def(init_expr), below,
- nor is it passed explicitly by users when Python instances of
- T are created. This idiom allows C++ virtual functions
- which will be overridden in Python to access the Python object so the
- Python method can be invoked. Boost.Python automatically registers
- additional converters which allow wrapped instances of T
- to be passed to wrapped C++ functions expecting HeldType
- arguments.HeldType is derived from T, its exposed
+ constructor(s) must accept an initial PyObject* argument
+ which refers back to the Python object that contains the
+ HeldType instance, as shown in this example. This argument is not
+ included in the init-expression passed to def(init_expr), below, nor is
+ it passed explicitly by users when Python instances of T are
+ created. This idiom allows C++ virtual functions which will be overridden
+ in Python to access the Python object so the Python method can be
+ invoked. Boost.Python automatically registers additional converters which
+ allow wrapped instances of T to be passed to wrapped C++
+ functions expecting HeldType arguments.T to be passed in place of HeldType
- arguments, specifying a smart pointer for HeldType allows
- users to pass Python T instances where a smart
- pointer-to-T is expected. Smart pointers such as
- std::auto_ptr<> or boost::shared_ptr<>
- which contain a nested type element_type designating the
- referent type are automatically supported; additional smart pointer
- types can be supported by specializing pointee<HeldType>.T to be passed in place of HeldType arguments,
+ specifying a smart pointer for HeldType allows users to pass
+ Python T instances where a smart pointer-to-T
+ is expected. Smart pointers such as std::auto_ptr<> or
+ boost::shared_ptr<>
+ which contain a nested type element_type designating the
+ referent type are automatically supported; additional smart pointer types
+ can be supported by specializing pointee<HeldType>.HeldType is a smart pointer
- to a class derived from T, the initial
- PyObject* argument must be supplied by all of
- HeldType's exposed constructors.HeldType is a smart pointer to
+ a class derived from T, the initial PyObject*
+ argument must be supplied by all of HeldType's exposed
+ constructors.PyObject* argument
- by specializing has_back_reference<T>.PyObject* argument
+ by specializing has_back_reference<T>.class_
- synopsis+Class + template
+class_synopsisnamespace boost { namespace python { template <class T @@ -272,7 +277,7 @@ namespace boost { namespace python void add_property(char const* name, Get const& fget, char const* doc=0); template <class Get, class Set> void add_property( - char const* name, Get const& fget, Set const& fset, char const* doc=0); + char const* name, Get const& fget, Set const& fset, char const* doc=0); template <class Get> void add_static_property(char const* name, Get const& fget); @@ -287,9 +292,9 @@ namespace boost { namespace python }}-Class template
-class_- constructors+Class template +
+class_constructorsclass_(char const* name); class_(char const* name, char const* docstring); template <class Init> @@ -298,82 +303,80 @@ template <class Init> class_(char const* name, char const* docstring, Init init_spec);-
name is an ntbs which conforms to Python's identifier
- naming rules. If docstring is supplied, it must be an
- ntbs. If init_spec is
- supplied, it must be either the special enumeration constant
- no_init or an init-expression compatible with
- T.name is an ntbs which conforms to Python's identifier
+ naming rules. If docstring is supplied, it must be an
+ ntbs. If init_spec is
+ supplied, it must be either the special enumeration constant
+ no_init or an init-expression compatible with
+ T.class_ object holding a
- Boost.Python extension class named name. The
- named attribute of the current scope is bound to the new
- extension class.class_ object holding a
+ Boost.Python extension class named name. The
+ named attribute of the current scope is bound to the new extension
+ class.docstring is bound to
- the __doc__ attribute of the extension class.docstring is bound to the
+ __doc__ attribute of the extension class.init_spec is no_init, a special
- __init__ function is generated which always raises a
- Python exception. Otherwise, this->def(init_spec)
- is called.init_spec is no_init, a special
+ __init__ function is generated which always raises a
+ Python exception. Otherwise, this->def(init_spec) is
+ called.init_spec is not supplied,
- this->def(init<>()) is called.init_spec is not supplied,
+ this->def(init<>()) is called.class_<> constructor helps her to avoid the
- common run-time errors which result from invoking wrapped member
- functions without having exposed an __init__ function
- which creates the requisite T instance. Types which are
- not default-constructible will cause a compile-time error unless
- Init is supplied. The user must always supply
- name as there is currently no portable method to derive
- the text of the class name from its type.class_<> constructor helps her to avoid the
+ common run-time errors which result from invoking wrapped member
+ functions without having exposed an __init__ function which
+ creates the requisite T instance. Types which are not
+ default-constructible will cause a compile-time error unless
+ Init is supplied. The user must always supply
+ name as there is currently no portable method to derive the
+ text of the class name from its type.class_ modifier functions+Class + template
+class_modifier functionstemplate <class Init> class_& def(Init init_expr);-
init_expr is the result of an init-expression compatible with
- T.init_expr is the result of an init-expression compatible with
+ T.Init, adds an
- __init__(...) function overload to the
- extension class accepting P as arguments. Each overload
- generated constructs an object of HeldType according to
- the semantics described above, using a copy of
- init_expr's call policies.
- If the longest valid prefix of
- Init contains N types and init_expr
- holds M keywords, an initial sequence of the keywords are used
- for all but the first N - M arguments of
- each overload.Init, adds an
+ __init__(...) function overload to the
+ extension class accepting P as arguments. Each overload
+ generated constructs an object of HeldType according to the
+ semantics described above, using a copy of
+ init_expr's call policies.
+ If the longest valid prefix of
+ Init contains N types and init_expr
+ holds M keywords, an initial sequence of the keywords are used
+ for all but the first N - M arguments of each
+ overload.*this*this+
template <class F> class_& def(char const* name, Fn fn); template <class Fn, class A1> @@ -384,363 +387,347 @@ template <class Fn, class A1, class A2, class A3> class_& def(char const* name, Fn fn, A1 const& a1, A2 const& a2, A3 const& a3);-
name is an ntbs which conforms to Python's identifier
- naming rules.name is an ntbs which conforms to Python's identifier
+ naming rules.a1 is the result of an overload-dispatch-expression,
- only the second form is allowed and fn must be a pointer to
- function or pointer to member function whose arity is the same as A1's maximum
- arity.
+ a1 is the result of an overload-dispatch-expression,
+ only the second form is allowed and fn must be a pointer to function
+ or pointer to member function whose
+ arity is the same as A1's maximum
+ arity.
- Fn's sequence of argument types, beginning with
- the one whose length is A1's minimum
- arity, adds a
- name(...) method overload to
- the extension class. Each overload generated invokes
- a1's call-expression with P, using a copy
- of a1's call
- policies. If the longest valid prefix of A1
- contains N types and a1 holds M
- keywords, an initial sequence of the keywords are used for all
- but the first N - M arguments of
- each overload.Fn's sequence of argument types, beginning with the
+ one whose length is A1's minimum
+ arity, adds a
+ name(...) method overload to
+ the extension class. Each overload generated invokes
+ a1's call-expression with P, using a copy
+ of a1's call
+ policies. If the longest valid prefix of A1
+ contains N types and a1 holds M
+ keywords, an initial sequence of the keywords are used for all
+ but the first N - M arguments of each
+ overload.U, U cv&,
- U cv*, or
- U cv* const&, where
- T* is convertible to U*, and
- a1-a3, if supplied, may be selected
- in any order from the table below.U, U cv&, U
+ cv*, or U cv* const&,
+ where T* is convertible to U*, and
+ a1-a3, if supplied, may be selected in
+ any order from the table below.T or one of its public base classes, and
- a1-a3, if supplied, may be selected
- in any order from the table below.T or one of its public base classes, and
+ a1-a3, if supplied, may be selected in
+ any order from the table below.Fn must be [derived from] object, and
- a1-a2, if supplied, may be selcted in any order
- from the first two rows of the table below. To be useful,
- fn should be
- callable.Fn must be [derived from]
+ object, and
+ a1-a2, if supplied, may be selcted in any order from
+ the first two rows of the table below. To be useful,
+ fn should be
+ callable.| Memnonic Name | +
|---|
| Memnonic Name | -Requirements/Type properties | +Requirements/Type properties | -Effects | -Effects | + -
|---|---|---|---|
| docstring | +|||
| docstring | -Any ntbs. | +Any ntbs. | -Value will be bound to the __doc__ attribute
- of the resulting method overload. If an earlier overload
- supplied a docstring, two newline characters and the new
- docstring are appended to it. |
- Value will be bound to the __doc__ attribute
+ of the resulting method overload. If an earlier overload
+ supplied a docstring, two newline characters and the new
+ docstring are appended to it. |
+
-
| policies | +|||
| policies | -A model of CallPolicies | +A model of CallPolicies | -A copy will be used as the call policies of the resulting - method overload. | -A copy will be used as the call policies of the resulting + method overload. | + -
| keywords | +|||
| keywords | -The result of a keyword-expression
- specifying no more arguments than the arity of fn. |
+ The result of a keyword-expression
+ specifying no more arguments than the arity of fn. |
- A copy will be used as the call policies of the resulting - method overload. | -
*this+
*thisclass_& staticmethod(char const* name);-
name is an ntbs which conforms to Python's identifier
- naming rules, and corresponds to a method whose overloads have all
- been defined.name is an ntbs which conforms to Python's identifier
+ naming rules, and corresponds to a method whose overloads have all
+ been defined.staticmethod(x)
- in Python. Specifies that the corresponding method is static and
- therefore no object instance will be passed to it. This is equivalent
- to the Python statement:staticmethod(x)
+ in Python. Specifies that the corresponding method is static and
+ therefore no object instance will be passed to it. This is equivalent to
+ the Python statement:+
setattr(self, name, staticmethod(getattr(self, name)))-
def(name,...) after
- invoking staticmethod(name) will raise a RuntimeError.def(name,...) after
+ invoking staticmethod(name) will raise a RuntimeError.*this+
*thistemplate <unspecified> class_& def(detail::operator_<unspecified>);-
*this+
*thistemplate <class U> class_& setattr(char const* name, U const& u);-
name is an ntbs which conforms to Python's identifier
- naming rules.name is an ntbs which conforms to Python's identifier
+ naming rules.
- PyObject_SetAttrString(this->ptr(), name, object(u).ptr());
-
-
+ PyObject_SetAttrString(this->ptr(),
+ name, object(u).ptr());
+
+ *this+
*thistemplate <class Get> void add_property(char const* name, Get const& fget, char const* doc=0); template <class Get, class Set> void add_property( - char const* name, Get const& fget, Set const& fset, char const* doc=0); + char const* name, Get const& fget, Set const& fset, char const* doc=0);-
name is an ntbs which conform to Python's identifier
- naming rules.name is an ntbs which conform to Python's identifier
+ naming rules.property
- class instance, passing object(fget) (and object(fset) in the
- second form) with an (optional) docstring doc to its constructor,
- then adds that property to the Python class object under construction
- with the given attribute name.property
+ class instance, passing object(fget) (and
+ object(fset) in
+ the second form) with an (optional) docstring doc to its
+ constructor, then adds that property to the Python class object under
+ construction with the given attribute name.*this*this+
template <class Get> void add_static_property(char const* name, Get const& fget); template <class Get, class Set> void add_static_property(char const* name, Get const& fget, Set const& fset);-
name is an ntbs which conforms to Python's identifier
- naming rules.name is an ntbs which conforms to Python's identifier
+ naming rules.object(fget) (and object(fset) in the
- second form) to its constructor, then adds that property to the Python
- class under construction with the given attribute name.
- StaticProperty is a special subclass of Python's property
- class which can be called without an initial self
- argument.object(fget)
+ (and object(fset) in the second
+ form) to its constructor, then adds that property to the Python class
+ under construction with the given attribute name.
+ StaticProperty is a special subclass of Python's property
+ class which can be called without an initial self
+ argument.*this*this+
template <class D> class_& def_readonly(char const* name, D T::*pm, char const* doc=0); template <class D> class_& def_readonly(char const* name, D const& d);-
name is an ntbs which conforms to Python's identifier
- naming rules. doc is also an ntbs.name is an ntbs which conforms to Python's identifier
+ naming rules. doc is also an ntbs.+
this->add_property(name, make_getter(pm), doc); -- and -
+and +
this->add_static_property(name, make_getter(d)); -- respectively.
*this*this+
template <class D> class_& def_readwrite(char const* name, D T::*pm, char const* doc=0); template <class D> class_& def_readwrite(char const* name, D& d);-
+
this->add_property(name, make_getter(pm), make_setter(pm), doc); -- and -
+and +
this->add_static_property(name, make_getter(d), make_setter(d)); -- respectively.
*this*this+
template <typename PickleSuite> class_& def_pickle(PickleSuite const&);-
pickle_suite.pickle_suite.__getinitargs__,
- __getstate__, __setstate__,
- __getstate_manages_dict__,
- __safe_for_unpickling__, __reduce____getinitargs__, __getstate__,
+ __setstate__, __getstate_manages_dict__,
+ __safe_for_unpickling__, __reduce__*this*this+
class_& enable_pickling();-
__reduce__ method and
- the __safe_for_unpickling__ attribute.
+ __reduce__ method and the
+ __safe_for_unpickling__ attribute.*this*thisdef_pickle(). Enables implementation of
- pickle support from Python.def_pickle(). Enables implementation of pickle support from Python.bases<T1, T2,...TN>bases<T1, T2,...TN>An MPL sequence
- which can be used in class_<...>
- instantiations indicate a list of base classes.
An MPL
+ sequence which can be used in
+ class_<...> instantiations indicate a list
+ of base classes.
bases
- synopsis+Class + template
+basessynopsisnamespace boost { namespace python { template <T1 = unspecified,...Tn = unspecified> @@ -749,10 +736,10 @@ namespace boost { namespace python }}-Example(s)
+Example(s)
-Given a C++ class declaration:
-+Given a C++ class declaration:
+class Foo : public Bar, public Baz { public: @@ -766,9 +753,8 @@ class Foo : public Bar, public Baz private: ... }; -- A corresponding Boost.Python extension class can be created with: -+A corresponding Boost.Python extension class can be created with: +using namespace boost::python; class_<Foo,bases<Bar,Baz> >("Foo", @@ -783,22 +769,19 @@ class_<Foo,bases<Bar,Baz> >("Foo", .def_readwrite("value", &Foo::value) ;-
- [1] By "previously-exposed" we mean that the for - eachBinbases, an instance of -class_<B, ...>must have - already been constructed. -+Revised + + 1 November, 2005 -
+ [1] By "previously-exposed" we + mean that the for eachBinbases, an instance of +class_<B, ...>must have + already been constructed. +class_<Base>("Base"); class_<Derived, bases<Base> >("Derived"); -- Revised - - 5 August, 2002 - +© Copyright Dave Abrahams 2002.
- +© Copyright Dave + Abrahams 2002.
+ - diff --git a/include/boost/python/detail/config.hpp b/include/boost/python/detail/config.hpp index 5ca5adb8..3f2a19eb 100644 --- a/include/boost/python/detail/config.hpp +++ b/include/boost/python/detail/config.hpp @@ -29,14 +29,14 @@ # endif # if defined(BOOST_MSVC) -# if _MSC_VER <= 1200 +# if _MSC_VER < 1300 # define BOOST_MSVC6_OR_EARLIER 1 # endif -# pragma warning (disable : 4786) // disable truncated debug symbols -# pragma warning (disable : 4251) // disable exported dll function -# pragma warning (disable : 4800) //'int' : forcing value to bool 'true' or 'false' -# pragma warning (disable : 4275) // non dll-interface class +# pragma warning (disable : 4786) // disable truncated debug symbols +# pragma warning (disable : 4251) // disable exported dll function +# pragma warning (disable : 4800) //'int' : forcing value to bool 'true' or 'false' +# pragma warning (disable : 4275) // non dll-interface class # elif defined(__ICL) && __ICL < 600 // Intel C++ 5 @@ -68,13 +68,13 @@ #if defined(BOOST_PYTHON_DYNAMIC_LIB) -# if !defined(_WIN32) && !defined(__CYGWIN__) \ - && defined(__GNUC__) && __GNUC__ >= 3 && __GNUC_MINOR__ >=5 \ - && !defined(BOOST_PYTHON_GCC_SYMBOL_VISIBILITY) -# define BOOST_PYTHON_USE_GCC_SYMBOL_VISIBILITY +# if !defined(_WIN32) && !defined(__CYGWIN__) \ + && !defined(BOOST_PYTHON_USE_GCC_SYMBOL_VISIBILITY) \ + && BOOST_WORKAROUND(__GNUC__, >= 3) && (__GNUC_MINOR__ >=5 || __GNUC__ > 3) +# define BOOST_PYTHON_USE_GCC_SYMBOL_VISIBILITY 1 # endif -# if defined(BOOST_PYTHON_USE_GCC_SYMBOL_VISIBILITY) +# if BOOST_PYTHON_USE_GCC_SYMBOL_VISIBILITY # if defined(BOOST_PYTHON_SOURCE) # define BOOST_PYTHON_DECL __attribute__ ((visibility("default"))) # define BOOST_PYTHON_BUILD_DLL diff --git a/include/boost/python/detail/wrap_python.hpp b/include/boost/python/detail/wrap_python.hpp index 4921578f..cce01868 100644 --- a/include/boost/python/detail/wrap_python.hpp +++ b/include/boost/python/detail/wrap_python.hpp @@ -22,6 +22,26 @@ #ifdef _DEBUG # ifndef BOOST_DEBUG_PYTHON +# ifdef _MSC_VER + // VC8.0 will complain if system headers are #included both with + // and without _DEBUG defined, so we have to #include all the + // system headers used by pyconfig.h right here. +# include+# include +# include +# include +# include +# include +# include +# include +# include +# include +# include +# include +# include +# include +# include +# endif # undef _DEBUG // Don't let Python force the debug library just because we're debugging. # define DEBUG_UNDEFINED_FROM_WRAP_PYTHON_H # endif @@ -97,7 +117,7 @@ typedef int pid_t; # define HAVE_LONG_LONG 1 # define LONG_LONG long long -# endif +# endif # elif defined(__MWERKS__) @@ -143,6 +163,10 @@ typedef int pid_t; #ifdef DEBUG_UNDEFINED_FROM_WRAP_PYTHON_H # undef DEBUG_UNDEFINED_FROM_WRAP_PYTHON_H # define _DEBUG +# ifdef _CRT_NOFORCE_MANIFEST_DEFINED_FROM_WRAP_PYTHON_H +# undef _CRT_NOFORCE_MANIFEST_DEFINED_FROM_WRAP_PYTHON_H +# undef _CRT_NOFORCE_MANIFEST +# endif #endif #if !defined(PY_MAJOR_VERSION) || PY_MAJOR_VERSION < 2 diff --git a/include/boost/python/module_init.hpp b/include/boost/python/module_init.hpp index 64599a38..7770f531 100644 --- a/include/boost/python/module_init.hpp +++ b/include/boost/python/module_init.hpp @@ -42,7 +42,7 @@ extern "C" \ } \ void init_module_##name() -# elif (defined(__GNUC__) && __GNUC__ >= 3 && __GNUC_MINOR__ >=5) +# elif BOOST_PYTHON_USE_GCC_SYMBOL_VISIBILITY # define BOOST_PYTHON_MODULE_INIT(name) \ void init_module_##name(); \ diff --git a/include/boost/python/object/class_metadata.hpp b/include/boost/python/object/class_metadata.hpp index c29787fb..bf0e2748 100755 --- a/include/boost/python/object/class_metadata.hpp +++ b/include/boost/python/object/class_metadata.hpp @@ -30,6 +30,10 @@ # include # include # include + +# include +# include + # include # include @@ -49,6 +53,12 @@ struct register_base_of template inline void operator()(Base*) const { +# if !BOOST_WORKAROUND(BOOST_MSVC, == 1200) + BOOST_MPL_ASSERT_NOT((is_same )); +# else + BOOST_STATIC_ASSERT(!(is_same ::value)); +# endif + // Register the Base class register_dynamic_id (); @@ -58,7 +68,7 @@ struct register_base_of // Register the down-cast, if appropriate. this->register_downcast((Base*)0, is_polymorphic ()); } - + private: static inline void register_downcast(void*, mpl::false_) {} @@ -186,7 +196,7 @@ struct class_metadata , mpl::if_< use_value_holder , value_holder - , pointer_holder + , pointer_holder > >::type holder; @@ -199,7 +209,8 @@ struct class_metadata template inline static void register_aux(python::wrapper *) { - class_metadata::register_aux2((T2*)0, mpl::true_()); + typedef typename mpl::not_ >::type use_callback; + class_metadata::register_aux2((T2*)0, use_callback()); } inline static void register_aux(void*) @@ -242,6 +253,7 @@ struct class_metadata // inline static void maybe_register_class_to_python(void*, mpl::true_) {} + template inline static void maybe_register_class_to_python(T2*, mpl::false_) { diff --git a/include/boost/python/override.hpp b/include/boost/python/override.hpp index b6fa97a0..93496741 100755 --- a/include/boost/python/override.hpp +++ b/include/boost/python/override.hpp @@ -55,12 +55,15 @@ namespace detail } # endif -# if !defined(BOOST_MSVC) || BOOST_WORKAROUND(_MSC_FULL_VER, > 140040607) +# if defined(BOOST_MSVC) && BOOST_WORKAROUND(_MSC_FULL_VER, <= 140040607) || BOOST_WORKAROUND(BOOST_INTEL_WIN, >= 900) + // No operator T& +# else + template operator T&() const { converter::return_from_python converter; - return converter(m_obj.release()); + return converter(const_cast &>(m_obj).release()); } # endif diff --git a/src/converter/type_id.cpp b/src/converter/type_id.cpp index 39db65d9..3fc64a6f 100644 --- a/src/converter/type_id.cpp +++ b/src/converter/type_id.cpp @@ -21,6 +21,14 @@ # ifdef BOOST_PYTHON_HAVE_GCC_CP_DEMANGLE # if defined(__GNUC__) && __GNUC__ >= 3 + +// http://lists.debian.org/debian-gcc/2003/09/msg00055.html notes +// that, in cxxabi.h of gcc-3.x for x < 4, this type is used before it +// is declared. +# if __GNUC__ == 3 && __GNUC_MINOR__ < 4 +class __class_type_info; +# endif + # include # endif # endif diff --git a/test/polymorphism2.cpp b/test/polymorphism2.cpp index b5c773e0..8aefbc3a 100755 --- a/test/polymorphism2.cpp +++ b/test/polymorphism2.cpp @@ -13,6 +13,14 @@ #include #include +#include + +#ifdef HELD_BY_AUTO_PTR +# define HELD_PTR(X) , std::auto_ptr< X > +#else +# define HELD_PTR(X) +#endif + using namespace boost::python; struct P @@ -123,19 +131,23 @@ C& getCCppObj () A* pass_a(A* x) { return x; } +#ifdef HELD_BY_AUTO_PTR +BOOST_PYTHON_MODULE_INIT(polymorphism2_auto_ptr_ext) +#else BOOST_PYTHON_MODULE_INIT(polymorphism2_ext) +#endif { - class_ ("A") + class_ ("A") .def("f", &A::f, &ACallback::default_f) ; def("getBCppObj", getBCppObj, return_value_policy ()); - class_ ,boost::noncopyable>("C") + class_ ,boost::noncopyable>("C") .def("f", &C::f) ; - class_ ,boost::noncopyable>("D") + class_ ,boost::noncopyable>("D") .def("f", &D::f) .def("g", &D::g) ; @@ -152,7 +164,7 @@ BOOST_PYTHON_MODULE_INIT(polymorphism2_ext) .def("f", pure_virtual(&P::f)) ; - class_ >("Q") + class_>("Q") .def("g", &P::g) // make sure virtual inheritance doesn't interfere ; } diff --git a/test/polymorphism2.py b/test/polymorphism2.py index 01f6f2f2..2690bac9 100644 --- a/test/polymorphism2.py +++ b/test/polymorphism2.py @@ -2,7 +2,7 @@ # Software License, Version 1.0. (See accompanying # file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) import unittest -from polymorphism2_ext import * +import sys class PolymorphTest(unittest.TestCase): @@ -77,11 +77,18 @@ class PolymorphTest(unittest.TestCase): r = R() self.failUnlessEqual ('R.f', r.f()) - -if __name__ == "__main__": - - # remove the option which upsets unittest + +def test(): + # remove the option that upsets unittest import sys sys.argv = [ x for x in sys.argv if x != '--broken-auto-ptr' ] - unittest.main() + +# This nasty hack basically says that if we're loaded by another module, we'll +# be testing polymorphism2_auto_ptr_ext instead of polymorphism2_ext. +if __name__ == "__main__": + from polymorphism2_ext import * + test() +else: + from polymorphism2_auto_ptr_ext import * +