diff --git a/build/Jamfile.v2 b/build/Jamfile.v2 deleted file mode 100644 index 32bffb0f..00000000 --- a/build/Jamfile.v2 +++ /dev/null @@ -1,151 +0,0 @@ -# Copyright David Abrahams 2001-2006. 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) - -import os ; -import indirect ; -import modules ; -import feature ; - -import python ; - -if ! [ python.configured ] && ! ( --without-python in [ modules.peek : ARGV ] ) -{ - # Attempt default configuration of python - import toolset : using ; - using python ; -} - -if [ python.configured ] || ( --without-python in [ modules.peek : ARGV ] ) -{ - alias config-warning ; -} -else -{ - message config-warning - : "warning: No python installation configured and autoconfiguration" - : "note: failed. See http://www.boost.org/libs/python/doc/building.html" - : "note: for configuration instructions or pass --without-python to" - : "note: suppress this message and silently skip all Boost.Python targets" - ; -} - -rule find-py3-version -{ - local versions = [ feature.values python ] ; - local py3ver ; - for local v in $(versions) - { - if $(v) >= 3.0 - { - py3ver = $(v) ; - } - } - return $(py3ver) ; -} - -py3-version = [ find-py3-version ] ; - -project boost/python - : source-location ../src - : requirements - -@$(BOOST_JAMROOT_MODULE)%$(BOOST_JAMROOT_MODULE).tag - @$(__name__).tag - ; - -rule tag ( name : type ? : property-set ) -{ - local result = $(name) ; - if $(type) in STATIC_LIB SHARED_LIB IMPORT_LIB - { - if $(name) = boost_python && $(PYTHON_ID) - { - result = $(result)-$(PYTHON_ID) ; - } - } - - # forward to the boost tagging rule - return [ indirect.call $(BOOST_JAMROOT_MODULE)%$(BOOST_JAMROOT_MODULE).tag - $(result) : $(type) : $(property-set) ] ; -} - -rule cond ( test ? : yes * : no * ) { if $(test) { return $(yes) ; } else { return $(no) ; } } -rule unless ( test ? : yes * : no * ) { if ! $(test) { return $(yes) ; } else { return $(no) ; } } - -rule lib_boost_python ( is-py3 ? ) -{ - - lib [ cond $(is-py3) : boost_python3 : boost_python ] - : # sources - numeric.cpp - list.cpp - long.cpp - dict.cpp - tuple.cpp - str.cpp - slice.cpp - - converter/from_python.cpp - converter/registry.cpp - converter/type_id.cpp - object/enum.cpp - object/class.cpp - object/function.cpp - object/inheritance.cpp - object/life_support.cpp - object/pickle_support.cpp - errors.cpp - module.cpp - converter/builtin_converters.cpp - converter/arg_to_python_base.cpp - object/iterator.cpp - object/stl_iterator.cpp - object_protocol.cpp - object_operators.cpp - wrapper.cpp - import.cpp - exec.cpp - object/function_doc_signature.cpp - : # requirements - static:BOOST_PYTHON_STATIC_LIB - BOOST_PYTHON_SOURCE - - # On Windows, all code using Python has to link to the Python - # import library. - # - # On *nix we never link libboost_python to libpython. When - # extending Python, all Python symbols are provided by the - # Python interpreter executable. When embedding Python, the - # client executable is expected to explicitly link to - # /python//python (the target representing libpython) itself. - # - # python_for_extensions is a target defined by Boost.Build to - # provide the Python include paths, and on Windows, the Python - # import library, as usage requirements. - [ cond [ python.configured ] : /python//python_for_extensions ] - - # we prevent building when there is no python available - # as it's not possible anyway, and to cause dependents to - # fail to build - [ unless [ python.configured ] : no ] - config-warning - - on:BOOST_DEBUG_PYTHON - [ cond $(is-py3) : $(py3-version) ] - : # default build - shared - : # usage requirements - static:BOOST_PYTHON_STATIC_LIB - on:BOOST_DEBUG_PYTHON - ; - -} - -lib_boost_python ; -boost-install boost_python ; - -if $(py3-version) -{ - lib_boost_python yes ; - boost-install boost_python3 ; -} diff --git a/build/python_v1.zip b/build/python_v1.zip deleted file mode 100644 index 0377a07b..00000000 Binary files a/build/python_v1.zip and /dev/null differ diff --git a/doc/Jamfile b/doc/Jamfile deleted file mode 100644 index 48a10c14..00000000 --- a/doc/Jamfile +++ /dev/null @@ -1,47 +0,0 @@ -# Copyright (c) 2006 Joel de Guzman -# Copyright (c) 2015 Stefan Seefeld -# -# 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) - -path-constant here : . ; -path-constant images : html/images ; - - -project python/doc - : requirements html:boost.defaults=none - html:toc.max.depth=3 - html:toc.section.depth=2 - html:chunk.section.depth=1 - ; - -import boostbook ; -import quickbook ; -import docutils ; - -boostbook python : python.qbk - : html:$(here)/html - html:generate.toc="library nop; chapter toc; section toc;" - html:html.stylesheet=boostbook.css - html:boost.image.src=images/boost.png - html:boost.graphics.root=images/ - ; - -boostbook tutorial : tutorial.qbk - : html:$(here)/html/tutorial - html:html.stylesheet=../boostbook.css - html:boost.image.src=../images/boost.png - html:boost.graphics.root=../images/ - ; - -boostbook reference : reference.qbk - : html:$(here)/html/reference - html:html.stylesheet=../boostbook.css - html:boost.image.src=../images/boost.png - html:boost.graphics.root=../images/ - ; - -html article : article.rst - : html - "--link-stylesheet --traceback --trim-footnote-reference-space --footnote-references=superscript --stylesheet=rst.css" - ; diff --git a/doc/article.rst b/doc/article.rst deleted file mode 100644 index 521f04f4..00000000 --- a/doc/article.rst +++ /dev/null @@ -1,947 +0,0 @@ -+++++++++++++++++++++++++++++++++++++++++++ - Building Hybrid Systems with Boost.Python -+++++++++++++++++++++++++++++++++++++++++++ - -:Author: David Abrahams -:Contact: dave@boost-consulting.com -:organization: `Boost Consulting`_ -:date: 2003-05-14 - -:Author: Ralf W. Grosse-Kunstleve - -:copyright: Copyright David Abrahams and Ralf W. Grosse-Kunstleve 2003. All rights reserved - -.. contents:: Table of Contents - -.. _`Boost Consulting`: http://www.boost-consulting.com - -========== - Abstract -========== - -Boost.Python is an open source C++ library which provides a concise -IDL-like interface for binding C++ classes and functions to -Python. Leveraging the full power of C++ compile-time introspection -and of recently developed metaprogramming techniques, this is achieved -entirely in pure C++, without introducing a new syntax. -Boost.Python's rich set of features and high-level interface make it -possible to engineer packages from the ground up as hybrid systems, -giving programmers easy and coherent access to both the efficient -compile-time polymorphism of C++ and the extremely convenient run-time -polymorphism of Python. - -============== - Introduction -============== - -Python and C++ are in many ways as different as two languages could -be: while C++ is usually compiled to machine-code, Python is -interpreted. Python's dynamic type system is often cited as the -foundation of its flexibility, while in C++ static typing is the -cornerstone of its efficiency. C++ has an intricate and difficult -compile-time meta-language, while in Python, practically everything -happens at runtime. - -Yet for many programmers, these very differences mean that Python and -C++ complement one another perfectly. Performance bottlenecks in -Python programs can be rewritten in C++ for maximal speed, and -authors of powerful C++ libraries choose Python as a middleware -language for its flexible system integration capabilities. -Furthermore, the surface differences mask some strong similarities: - -* 'C'-family control structures (if, while, for...) - -* Support for object-orientation, functional programming, and generic - programming (these are both *multi-paradigm* programming languages.) - -* Comprehensive operator overloading facilities, recognizing the - importance of syntactic variability for readability and - expressivity. - -* High-level concepts such as collections and iterators. - -* High-level encapsulation facilities (C++: namespaces, Python: modules) - to support the design of re-usable libraries. - -* Exception-handling for effective management of error conditions. - -* C++ idioms in common use, such as handle/body classes and - reference-counted smart pointers mirror Python reference semantics. - -Given Python's rich 'C' interoperability API, it should in principle -be possible to expose C++ type and function interfaces to Python with -an analogous interface to their C++ counterparts. However, the -facilities provided by Python alone for integration with C++ are -relatively meager. Compared to C++ and Python, 'C' has only very -rudimentary abstraction facilities, and support for exception-handling -is completely missing. 'C' extension module writers are required to -manually manage Python reference counts, which is both annoyingly -tedious and extremely error-prone. Traditional extension modules also -tend to contain a great deal of boilerplate code repetition which -makes them difficult to maintain, especially when wrapping an evolving -API. - -These limitations have lead to the development of a variety of wrapping -systems. SWIG_ is probably the most popular package for the -integration of C/C++ and Python. A more recent development is SIP_, -which was specifically designed for interfacing Python with the Qt_ -graphical user interface library. Both SWIG and SIP introduce their -own specialized languages for customizing inter-language bindings. -This has certain advantages, but having to deal with three different -languages (Python, C/C++ and the interface language) also introduces -practical and mental difficulties. The CXX_ package demonstrates an -interesting alternative. It shows that at least some parts of -Python's 'C' API can be wrapped and presented through a much more -user-friendly C++ interface. However, unlike SWIG and SIP, CXX does -not include support for wrapping C++ classes as new Python types. - -The features and goals of Boost.Python_ overlap significantly with -many of these other systems. That said, Boost.Python attempts to -maximize convenience and flexibility without introducing a separate -wrapping language. Instead, it presents the user with a high-level -C++ interface for wrapping C++ classes and functions, managing much of -the complexity behind-the-scenes with static metaprogramming. -Boost.Python also goes beyond the scope of earlier systems by -providing: - -* Support for C++ virtual functions that can be overridden in Python. - -* Comprehensive lifetime management facilities for low-level C++ - pointers and references. - -* Support for organizing extensions as Python packages, - with a central registry for inter-language type conversions. - -* A safe and convenient mechanism for tying into Python's powerful - serialization engine (pickle). - -* Coherence with the rules for handling C++ lvalues and rvalues that - can only come from a deep understanding of both the Python and C++ - type systems. - -The key insight that sparked the development of Boost.Python is that -much of the boilerplate code in traditional extension modules could be -eliminated using C++ compile-time introspection. Each argument of a -wrapped C++ function must be extracted from a Python object using a -procedure that depends on the argument type. Similarly the function's -return type determines how the return value will be converted from C++ -to Python. Of course argument and return types are part of each -function's type, and this is exactly the source from which -Boost.Python deduces most of the information required. - -This approach leads to *user guided wrapping*: as much information is -extracted directly from the source code to be wrapped as is possible -within the framework of pure C++, and some additional information is -supplied explicitly by the user. Mostly the guidance is mechanical -and little real intervention is required. Because the interface -specification is written in the same full-featured language as the -code being exposed, the user has unprecedented power available when -she does need to take control. - -.. _Python: http://www.python.org/ -.. _SWIG: http://www.swig.org/ -.. _SIP: http://www.riverbankcomputing.co.uk/sip/index.php -.. _Qt: http://www.trolltech.com/ -.. _CXX: http://cxx.sourceforge.net/ -.. _Boost.Python: http://www.boost.org/libs/python/doc - -=========================== - Boost.Python Design Goals -=========================== - -The primary goal of Boost.Python is to allow users to expose C++ -classes and functions to Python using nothing more than a C++ -compiler. In broad strokes, the user experience should be one of -directly manipulating C++ objects from Python. - -However, it's also important not to translate all interfaces *too* -literally: the idioms of each language must be respected. For -example, though C++ and Python both have an iterator concept, they are -expressed very differently. Boost.Python has to be able to bridge the -interface gap. - -It must be possible to insulate Python users from crashes resulting -from trivial misuses of C++ interfaces, such as accessing -already-deleted objects. By the same token the library should -insulate C++ users from low-level Python 'C' API, replacing -error-prone 'C' interfaces like manual reference-count management and -raw ``PyObject`` pointers with more-robust alternatives. - -Support for component-based development is crucial, so that C++ types -exposed in one extension module can be passed to functions exposed in -another without loss of crucial information like C++ inheritance -relationships. - -Finally, all wrapping must be *non-intrusive*, without modifying or -even seeing the original C++ source code. Existing C++ libraries have -to be wrappable by third parties who only have access to header files -and binaries. - -========================== - Hello Boost.Python World -========================== - -And now for a preview of Boost.Python, and how it improves on the raw -facilities offered by Python. Here's a function we might want to -expose:: - - char const* greet(unsigned x) - { - static char const* const msgs[] = { "hello", "Boost.Python", "world!" }; - - if (x > 2) - throw std::range_error("greet: index out of range"); - - return msgs[x]; - } - -To wrap this function in standard C++ using the Python 'C' API, we'd -need something like this:: - - extern "C" // all Python interactions use 'C' linkage and calling convention - { - // Wrapper to handle argument/result conversion and checking - PyObject* greet_wrap(PyObject* args, PyObject * keywords) - { - int x; - if (PyArg_ParseTuple(args, "i", &x)) // extract/check arguments - { - char const* result = greet(x); // invoke wrapped function - return PyString_FromString(result); // convert result to Python - } - return 0; // error occurred - } - - // Table of wrapped functions to be exposed by the module - static PyMethodDef methods[] = { - { "greet", greet_wrap, METH_VARARGS, "return one of 3 parts of a greeting" } - , { NULL, NULL, 0, NULL } // sentinel - }; - - // module initialization function - DL_EXPORT init_hello() - { - (void) Py_InitModule("hello", methods); // add the methods to the module - } - } - -Now here's the wrapping code we'd use to expose it with Boost.Python:: - - #include - using namespace boost::python; - BOOST_PYTHON_MODULE(hello) - { - def("greet", greet, "return one of 3 parts of a greeting"); - } - -and here it is in action:: - - >>> import hello - >>> for x in range(3): - ... print hello.greet(x) - ... - hello - Boost.Python - world! - -Aside from the fact that the 'C' API version is much more verbose, -it's worth noting a few things that it doesn't handle correctly: - -* The original function accepts an unsigned integer, and the Python - 'C' API only gives us a way of extracting signed integers. The - Boost.Python version will raise a Python exception if we try to pass - a negative number to ``hello.greet``, but the other one will proceed - to do whatever the C++ implementation does when converting an - negative integer to unsigned (usually wrapping to some very large - number), and pass the incorrect translation on to the wrapped - function. - -* That brings us to the second problem: if the C++ ``greet()`` - function is called with a number greater than 2, it will throw an - exception. Typically, if a C++ exception propagates across the - boundary with code generated by a 'C' compiler, it will cause a - crash. As you can see in the first version, there's no C++ - scaffolding there to prevent this from happening. Functions wrapped - by Boost.Python automatically include an exception-handling layer - which protects Python users by translating unhandled C++ exceptions - into a corresponding Python exception. - -* A slightly more-subtle limitation is that the argument conversion - used in the Python 'C' API case can only get that integer ``x`` in - *one way*. PyArg_ParseTuple can't convert Python ``long`` objects - (arbitrary-precision integers) which happen to fit in an ``unsigned - int`` but not in a ``signed long``, nor will it ever handle a - wrapped C++ class with a user-defined implicit ``operator unsigned - int()`` conversion. Boost.Python's dynamic type conversion - registry allows users to add arbitrary conversion methods. - -================== - Library Overview -================== - -This section outlines some of the library's major features. Except as -neccessary to avoid confusion, details of library implementation are -omitted. - ------------------- - Exposing Classes ------------------- - -C++ classes and structs are exposed with a similarly-terse interface. -Given:: - - struct World - { - void set(std::string msg) { this->msg = msg; } - std::string greet() { return msg; } - std::string msg; - }; - -The following code will expose it in our extension module:: - - #include - BOOST_PYTHON_MODULE(hello) - { - class_("World") - .def("greet", &World::greet) - .def("set", &World::set) - ; - } - -Although this code has a certain pythonic familiarity, people -sometimes find the syntax bit confusing because it doesn't look like -most of the C++ code they're used to. All the same, this is just -standard C++. Because of their flexible syntax and operator -overloading, C++ and Python are great for defining domain-specific -(sub)languages -(DSLs), and that's what we've done in Boost.Python. To break it down:: - - class_("World") - -constructs an unnamed object of type ``class_`` and passes -``"World"`` to its constructor. This creates a new-style Python class -called ``World`` in the extension module, and associates it with the -C++ type ``World`` in the Boost.Python type conversion registry. We -might have also written:: - - class_ w("World"); - -but that would've been more verbose, since we'd have to name ``w`` -again to invoke its ``def()`` member function:: - - w.def("greet", &World::greet) - -There's nothing special about the location of the dot for member -access in the original example: C++ allows any amount of whitespace on -either side of a token, and placing the dot at the beginning of each -line allows us to chain as many successive calls to member functions -as we like with a uniform syntax. The other key fact that allows -chaining is that ``class_<>`` member functions all return a reference -to ``*this``. - -So the example is equivalent to:: - - class_ w("World"); - w.def("greet", &World::greet); - w.def("set", &World::set); - -It's occasionally useful to be able to break down the components of a -Boost.Python class wrapper in this way, but the rest of this article -will stick to the terse syntax. - -For completeness, here's the wrapped class in use: :: - - >>> import hello - >>> planet = hello.World() - >>> planet.set('howdy') - >>> planet.greet() - 'howdy' - -Constructors -============ - -Since our ``World`` class is just a plain ``struct``, it has an -implicit no-argument (nullary) constructor. Boost.Python exposes the -nullary constructor by default, which is why we were able to write: :: - - >>> planet = hello.World() - -However, well-designed classes in any language may require constructor -arguments in order to establish their invariants. Unlike Python, -where ``__init__`` is just a specially-named method, In C++ -constructors cannot be handled like ordinary member functions. In -particular, we can't take their address: ``&World::World`` is an -error. The library provides a different interface for specifying -constructors. Given:: - - struct World - { - World(std::string msg); // added constructor - ... - -we can modify our wrapping code as follows:: - - class_("World", init()) - ... - -of course, a C++ class may have additional constructors, and we can -expose those as well by passing more instances of ``init<...>`` to -``def()``:: - - class_("World", init()) - .def(init()) - ... - -Boost.Python allows wrapped functions, member functions, and -constructors to be overloaded to mirror C++ overloading. - -Data Members and Properties -=========================== - -Any publicly-accessible data members in a C++ class can be easily -exposed as either ``readonly`` or ``readwrite`` attributes:: - - class_("World", init()) - .def_readonly("msg", &World::msg) - ... - -and can be used directly in Python: :: - - >>> planet = hello.World('howdy') - >>> planet.msg - 'howdy' - -This does *not* result in adding attributes to the ``World`` instance -``__dict__``, which can result in substantial memory savings when -wrapping large data structures. In fact, no instance ``__dict__`` -will be created at all unless attributes are explicitly added from -Python. Boost.Python owes this capability to the new Python 2.2 type -system, in particular the descriptor interface and ``property`` type. - -In C++, publicly-accessible data members are considered a sign of poor -design because they break encapsulation, and style guides usually -dictate the use of "getter" and "setter" functions instead. In -Python, however, ``__getattr__``, ``__setattr__``, and since 2.2, -``property`` mean that attribute access is just one more -well-encapsulated syntactic tool at the programmer's disposal. -Boost.Python bridges this idiomatic gap by making Python ``property`` -creation directly available to users. If ``msg`` were private, we -could still expose it as attribute in Python as follows:: - - class_("World", init()) - .add_property("msg", &World::greet, &World::set) - ... - -The example above mirrors the familiar usage of properties in Python -2.2+: :: - - >>> class World(object): - ... __init__(self, msg): - ... self.__msg = msg - ... def greet(self): - ... return self.__msg - ... def set(self, msg): - ... self.__msg = msg - ... msg = property(greet, set) - -Operator Overloading -==================== - -The ability to write arithmetic operators for user-defined types has -been a major factor in the success of both languages for numerical -computation, and the success of packages like NumPy_ attests to the -power of exposing operators in extension modules. Boost.Python -provides a concise mechanism for wrapping operator overloads. The -example below shows a fragment from a wrapper for the Boost rational -number library:: - - class_ >("rational_int") - .def(init()) // constructor, e.g. rational_int(3,4) - .def("numerator", &rational::numerator) - .def("denominator", &rational::denominator) - .def(-self) // __neg__ (unary minus) - .def(self + self) // __add__ (homogeneous) - .def(self * self) // __mul__ - .def(self + int()) // __add__ (heterogenous) - .def(int() + self) // __radd__ - ... - -The magic is performed using a simplified application of "expression -templates" [VELD1995]_, a technique originally developed for -optimization of high-performance matrix algebra expressions. The -essence is that instead of performing the computation immediately, -operators are overloaded to construct a type *representing* the -computation. In matrix algebra, dramatic optimizations are often -available when the structure of an entire expression can be taken into -account, rather than evaluating each operation "greedily". -Boost.Python uses the same technique to build an appropriate Python -method object based on expressions involving ``self``. - -.. _NumPy: http://www.pfdubois.com/numpy/ - -Inheritance -=========== - -C++ inheritance relationships can be represented to Boost.Python by adding -an optional ``bases<...>`` argument to the ``class_<...>`` template -parameter list as follows:: - - class_ >("Derived") - ... - -This has two effects: - -1. When the ``class_<...>`` is created, Python type objects - corresponding to ``Base1`` and ``Base2`` are looked up in - Boost.Python's registry, and are used as bases for the new Python - ``Derived`` type object, so methods exposed for the Python ``Base1`` - and ``Base2`` types are automatically members of the ``Derived`` - type. Because the registry is global, this works correctly even if - ``Derived`` is exposed in a different module from either of its - bases. - -2. C++ conversions from ``Derived`` to its bases are added to the - Boost.Python registry. Thus wrapped C++ methods expecting (a - pointer or reference to) an object of either base type can be - called with an object wrapping a ``Derived`` instance. Wrapped - member functions of class ``T`` are treated as though they have an - implicit first argument of ``T&``, so these conversions are - neccessary to allow the base class methods to be called for derived - objects. - -Of course it's possible to derive new Python classes from wrapped C++ -class instances. Because Boost.Python uses the new-style class -system, that works very much as for the Python built-in types. There -is one significant detail in which it differs: the built-in types -generally establish their invariants in their ``__new__`` function, so -that derived classes do not need to call ``__init__`` on the base -class before invoking its methods : :: - - >>> class L(list): - ... def __init__(self): - ... pass - ... - >>> L().reverse() - >>> - -Because C++ object construction is a one-step operation, C++ instance -data cannot be constructed until the arguments are available, in the -``__init__`` function: :: - - >>> class D(SomeBoostPythonClass): - ... def __init__(self): - ... pass - ... - >>> D().some_boost_python_method() - Traceback (most recent call last): - File "", line 1, in ? - TypeError: bad argument type for built-in operation - -This happened because Boost.Python couldn't find instance data of type -``SomeBoostPythonClass`` within the ``D`` instance; ``D``'s ``__init__`` -function masked construction of the base class. It could be corrected -by either removing ``D``'s ``__init__`` function or having it call -``SomeBoostPythonClass.__init__(...)`` explicitly. - -Virtual Functions -================= - -Deriving new types in Python from extension classes is not very -interesting unless they can be used polymorphically from C++. In -other words, Python method implementations should appear to override -the implementation of C++ virtual functions when called *through base -class pointers/references from C++*. Since the only way to alter the -behavior of a virtual function is to override it in a derived class, -the user must build a special derived class to dispatch a polymorphic -class' virtual functions:: - - // - // interface to wrap: - // - class Base - { - public: - virtual int f(std::string x) { return 42; } - virtual ~Base(); - }; - - int calls_f(Base const& b, std::string x) { return b.f(x); } - - // - // Wrapping Code - // - - // Dispatcher class - struct BaseWrap : Base - { - // Store a pointer to the Python object - BaseWrap(PyObject* self_) : self(self_) {} - PyObject* self; - - // Default implementation, for when f is not overridden - int f_default(std::string x) { return this->Base::f(x); } - // Dispatch implementation - int f(std::string x) { return call_method(self, "f", x); } - }; - - ... - def("calls_f", calls_f); - class_("Base") - .def("f", &Base::f, &BaseWrap::f_default) - ; - -Now here's some Python code which demonstrates: :: - - >>> class Derived(Base): - ... def f(self, s): - ... return len(s) - ... - >>> calls_f(Base(), 'foo') - 42 - >>> calls_f(Derived(), 'forty-two') - 9 - -Things to notice about the dispatcher class: - -* The key element which allows overriding in Python is the - ``call_method`` invocation, which uses the same global type - conversion registry as the C++ function wrapping does to convert its - arguments from C++ to Python and its return type from Python to C++. - -* Any constructor signatures you wish to wrap must be replicated with - an initial ``PyObject*`` argument - -* The dispatcher must store this argument so that it can be used to - invoke ``call_method`` - -* The ``f_default`` member function is needed when the function being - exposed is not pure virtual; there's no other way ``Base::f`` can be - called on an object of type ``BaseWrap``, since it overrides ``f``. - -Deeper Reflection on the Horizon? -================================= - -Admittedly, this formula is tedious to repeat, especially on a project -with many polymorphic classes. That it is neccessary reflects some -limitations in C++'s compile-time introspection capabilities: there's -no way to enumerate the members of a class and find out which are -virtual functions. At least one very promising project has been -started to write a front-end which can generate these dispatchers (and -other wrapping code) automatically from C++ headers. - -Pyste_ is being developed by Bruno da Silva de Oliveira. It builds on -GCC_XML_, which generates an XML version of GCC's internal program -representation. Since GCC is a highly-conformant C++ compiler, this -ensures correct handling of the most-sophisticated template code and -full access to the underlying type system. In keeping with the -Boost.Python philosophy, a Pyste interface description is neither -intrusive on the code being wrapped, nor expressed in some unfamiliar -language: instead it is a 100% pure Python script. If Pyste is -successful it will mark a move away from wrapping everything directly -in C++ for many of our users. It will also allow us the choice to -shift some of the metaprogram code from C++ to Python. We expect that -soon, not only our users but the Boost.Python developers themselves -will be "thinking hybrid" about their own code. - -.. _`GCC_XML`: http://www.gccxml.org/HTML/Index.html -.. _`Pyste`: http://www.boost.org/libs/python/pyste - ---------------- - Serialization ---------------- - -*Serialization* is the process of converting objects in memory to a -form that can be stored on disk or sent over a network connection. The -serialized object (most often a plain string) can be retrieved and -converted back to the original object. A good serialization system will -automatically convert entire object hierarchies. Python's standard -``pickle`` module is just such a system. It leverages the language's strong -runtime introspection facilities for serializing practically arbitrary -user-defined objects. With a few simple and unintrusive provisions this -powerful machinery can be extended to also work for wrapped C++ objects. -Here is an example:: - - #include - - struct World - { - World(std::string a_msg) : msg(a_msg) {} - std::string greet() const { return msg; } - std::string msg; - }; - - #include - using namespace boost::python; - - struct World_picklers : pickle_suite - { - static tuple - getinitargs(World const& w) { return make_tuple(w.greet()); } - }; - - BOOST_PYTHON_MODULE(hello) - { - class_("World", init()) - .def("greet", &World::greet) - .def_pickle(World_picklers()) - ; - } - -Now let's create a ``World`` object and put it to rest on disk:: - - >>> import hello - >>> import pickle - >>> a_world = hello.World("howdy") - >>> pickle.dump(a_world, open("my_world", "w")) - -In a potentially *different script* on a potentially *different -computer* with a potentially *different operating system*:: - - >>> import pickle - >>> resurrected_world = pickle.load(open("my_world", "r")) - >>> resurrected_world.greet() - 'howdy' - -Of course the ``cPickle`` module can also be used for faster -processing. - -Boost.Python's ``pickle_suite`` fully supports the ``pickle`` protocol -defined in the standard Python documentation. Like a __getinitargs__ -function in Python, the pickle_suite's getinitargs() is responsible for -creating the argument tuple that will be use to reconstruct the pickled -object. The other elements of the Python pickling protocol, -__getstate__ and __setstate__ can be optionally provided via C++ -getstate and setstate functions. C++'s static type system allows the -library to ensure at compile-time that nonsensical combinations of -functions (e.g. getstate without setstate) are not used. - -Enabling serialization of more complex C++ objects requires a little -more work than is shown in the example above. Fortunately the -``object`` interface (see next section) greatly helps in keeping the -code manageable. - ------------------- - Object interface ------------------- - -Experienced 'C' language extension module authors will be familiar -with the ubiquitous ``PyObject*``, manual reference-counting, and the -need to remember which API calls return "new" (owned) references or -"borrowed" (raw) references. These constraints are not just -cumbersome but also a major source of errors, especially in the -presence of exceptions. - -Boost.Python provides a class ``object`` which automates reference -counting and provides conversion to Python from C++ objects of -arbitrary type. This significantly reduces the learning effort for -prospective extension module writers. - -Creating an ``object`` from any other type is extremely simple:: - - object s("hello, world"); // s manages a Python string - -``object`` has templated interactions with all other types, with -automatic to-python conversions. It happens so naturally that it's -easily overlooked:: - - object ten_Os = 10 * s[4]; // -> "oooooooooo" - -In the example above, ``4`` and ``10`` are converted to Python objects -before the indexing and multiplication operations are invoked. - -The ``extract`` class template can be used to convert Python objects -to C++ types:: - - double x = extract(o); - -If a conversion in either direction cannot be performed, an -appropriate exception is thrown at runtime. - -The ``object`` type is accompanied by a set of derived types -that mirror the Python built-in types such as ``list``, ``dict``, -``tuple``, etc. as much as possible. This enables convenient -manipulation of these high-level types from C++:: - - dict d; - d["some"] = "thing"; - d["lucky_number"] = 13; - list l = d.keys(); - -This almost looks and works like regular Python code, but it is pure -C++. Of course we can wrap C++ functions which accept or return -``object`` instances. - -================= - Thinking hybrid -================= - -Because of the practical and mental difficulties of combining -programming languages, it is common to settle a single language at the -outset of any development effort. For many applications, performance -considerations dictate the use of a compiled language for the core -algorithms. Unfortunately, due to the complexity of the static type -system, the price we pay for runtime performance is often a -significant increase in development time. Experience shows that -writing maintainable C++ code usually takes longer and requires *far* -more hard-earned working experience than developing comparable Python -code. Even when developers are comfortable working exclusively in -compiled languages, they often augment their systems by some type of -ad hoc scripting layer for the benefit of their users without ever -availing themselves of the same advantages. - -Boost.Python enables us to *think hybrid*. Python can be used for -rapidly prototyping a new application; its ease of use and the large -pool of standard libraries give us a head start on the way to a -working system. If necessary, the working code can be used to -discover rate-limiting hotspots. To maximize performance these can -be reimplemented in C++, together with the Boost.Python bindings -needed to tie them back into the existing higher-level procedure. - -Of course, this *top-down* approach is less attractive if it is clear -from the start that many algorithms will eventually have to be -implemented in C++. Fortunately Boost.Python also enables us to -pursue a *bottom-up* approach. We have used this approach very -successfully in the development of a toolbox for scientific -applications. The toolbox started out mainly as a library of C++ -classes with Boost.Python bindings, and for a while the growth was -mainly concentrated on the C++ parts. However, as the toolbox is -becoming more complete, more and more newly added functionality can be -implemented in Python. - -.. image:: images/python_cpp_mix.png - -This figure shows the estimated ratio of newly added C++ and Python -code over time as new algorithms are implemented. We expect this -ratio to level out near 70% Python. Being able to solve new problems -mostly in Python rather than a more difficult statically typed -language is the return on our investment in Boost.Python. The ability -to access all of our code from Python allows a broader group of -developers to use it in the rapid development of new applications. - -===================== - Development history -===================== - -The first version of Boost.Python was developed in 2000 by Dave -Abrahams at Dragon Systems, where he was privileged to have Tim Peters -as a guide to "The Zen of Python". One of Dave's jobs was to develop -a Python-based natural language processing system. Since it was -eventually going to be targeting embedded hardware, it was always -assumed that the compute-intensive core would be rewritten in C++ to -optimize speed and memory footprint [#proto]_. The project also wanted to -test all of its C++ code using Python test scripts [#test]_. The only -tool we knew of for binding C++ and Python was SWIG_, and at the time -its handling of C++ was weak. It would be false to claim any deep -insight into the possible advantages of Boost.Python's approach at -this point. Dave's interest and expertise in fancy C++ template -tricks had just reached the point where he could do some real damage, -and Boost.Python emerged as it did because it filled a need and -because it seemed like a cool thing to try. - -This early version was aimed at many of the same basic goals we've -described in this paper, differing most-noticeably by having a -slightly more cumbersome syntax and by lack of special support for -operator overloading, pickling, and component-based development. -These last three features were quickly added by Ullrich Koethe and -Ralf Grosse-Kunstleve [#feature]_, and other enthusiastic contributors arrived -on the scene to contribute enhancements like support for nested -modules and static member functions. - -By early 2001 development had stabilized and few new features were -being added, however a disturbing new fact came to light: Ralf had -begun testing Boost.Python on pre-release versions of a compiler using -the EDG_ front-end, and the mechanism at the core of Boost.Python -responsible for handling conversions between Python and C++ types was -failing to compile. As it turned out, we had been exploiting a very -common bug in the implementation of all the C++ compilers we had -tested. We knew that as C++ compilers rapidly became more -standards-compliant, the library would begin failing on more -platforms. Unfortunately, because the mechanism was so central to the -functioning of the library, fixing the problem looked very difficult. - -Fortunately, later that year Lawrence Berkeley and later Lawrence -Livermore National labs contracted with `Boost Consulting`_ for support -and development of Boost.Python, and there was a new opportunity to -address fundamental issues and ensure a future for the library. A -redesign effort began with the low level type conversion architecture, -building in standards-compliance and support for component-based -development (in contrast to version 1 where conversions had to be -explicitly imported and exported across module boundaries). A new -analysis of the relationship between the Python and C++ objects was -done, resulting in more intuitive handling for C++ lvalues and -rvalues. - -The emergence of a powerful new type system in Python 2.2 made the -choice of whether to maintain compatibility with Python 1.5.2 easy: -the opportunity to throw away a great deal of elaborate code for -emulating classic Python classes alone was too good to pass up. In -addition, Python iterators and descriptors provided crucial and -elegant tools for representing similar C++ constructs. The -development of the generalized ``object`` interface allowed us to -further shield C++ programmers from the dangers and syntactic burdens -of the Python 'C' API. A great number of other features including C++ -exception translation, improved support for overloaded functions, and -most significantly, CallPolicies for handling pointers and -references, were added during this period. - -In October 2002, version 2 of Boost.Python was released. Development -since then has concentrated on improved support for C++ runtime -polymorphism and smart pointers. Peter Dimov's ingenious -``boost::shared_ptr`` design in particular has allowed us to give the -hybrid developer a consistent interface for moving objects back and -forth across the language barrier without loss of information. At -first, we were concerned that the sophistication and complexity of the -Boost.Python v2 implementation might discourage contributors, but the -emergence of Pyste_ and several other significant feature -contributions have laid those fears to rest. Daily questions on the -Python C++-sig and a backlog of desired improvements show that the -library is getting used. To us, the future looks bright. - -.. _`EDG`: http://www.edg.com - -============= - Conclusions -============= - -Boost.Python achieves seamless interoperability between two rich and -complimentary language environments. Because it leverages template -metaprogramming to introspect about types and functions, the user -never has to learn a third syntax: the interface definitions are -written in concise and maintainable C++. Also, the wrapping system -doesn't have to parse C++ headers or represent the type system: the -compiler does that work for us. - -Computationally intensive tasks play to the strengths of C++ and are -often impossible to implement efficiently in pure Python, while jobs -like serialization that are trivial in Python can be very difficult in -pure C++. Given the luxury of building a hybrid software system from -the ground up, we can approach design with new confidence and power. - -=========== - Citations -=========== - -.. [VELD1995] T. Veldhuizen, "Expression Templates," C++ Report, - Vol. 7 No. 5 June 1995, pp. 26-31. - http://osl.iu.edu/~tveldhui/papers/Expression-Templates/exprtmpl.html - -=========== - Footnotes -=========== - -.. [#proto] In retrospect, it seems that "thinking hybrid" from the - ground up might have been better for the NLP system: the - natural component boundaries defined by the pure python - prototype turned out to be inappropriate for getting the - desired performance and memory footprint out of the C++ core, - which eventually caused some redesign overhead on the Python - side when the core was moved to C++. - -.. [#test] We also have some reservations about driving all C++ - testing through a Python interface, unless that's the only way - it will be ultimately used. Any transition across language - boundaries with such different object models can inevitably - mask bugs. - -.. [#feature] These features were expressed very differently in v1 of - Boost.Python diff --git a/doc/building.qbk b/doc/building.qbk deleted file mode 100644 index c19ba7cf..00000000 --- a/doc/building.qbk +++ /dev/null @@ -1,566 +0,0 @@ -[chapter Building and Testing - [quickbook 1.7] - [authors [Abrahams, David]] - [copyright 2002 - 2015 David Abrahams, Stefan Seefeld] - [id building] -] -[/ Copyright David Abrahams 2006. 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) - /] - -[section Requirements] - -Boost.Python requires [@http://www.python.org/2.2 Python 2.2] -[footnote Note that although we tested earlier versions of Boost.Python - with Python 2.2, and we don't *think* we've done anything to break - compatibility, this release of Boost.Python may not have been tested - with versions of Python earlier than 2.4, so we're not 100% sure that - python 2.2 and 2.3 are supported.] *or* [@http://www.python.org newer]. - -[endsect] -[section Background] - -There are two basic models for combining C++ and Python: - -* [@http://www.python.org/doc/current/ext/intro.html extending], - in which the end-user launches the Python interpreter - executable and imports Python “extension modules” written in C++. - Think of taking a library written in C++ and giving it a Python - interface so Python programmers can use it. From Python, these - modules look just like regular Python modules. - -* [@http://www.python.org/doc/current/ext/embedding.html embedding], - in which the end-user launches a program written - in C++ that in turn invokes the Python interpreter as a library - subroutine. Think of adding scriptability to an existing - application. - -The key distinction between extending and embedding is the location -of the C++ `main()` function: in the Python interpreter executable, -or in some other program, respectively. Note that even when -embedding Python in another program, [@http://www.python.org/doc/current/ext/extending-with-embedding.html extension modules are often -the best way to make C/C++ functionality accessible to Python -code], so the use of extension modules is really at the heart of -both models. - -Except in rare cases, extension modules are built as -dynamically-loaded libraries with a single entry point, which means -you can change them without rebuilding either the other extension -modules or the executable containing `main()`. - -[endsect] -[section No-Install Quickstart] - -There is no need to “install Boost” in order to get started using -Boost.Python. These instructions use _bb_ projects, -which will build those binaries as soon as they're needed. Your -first tests may take a little longer while you wait for -Boost.Python to build, but doing things this way will save you from -worrying about build intricacies like which library binaries to use -for a specific compiler configuration and figuring out the right -compiler options to use yourself. - -[note Of course it's possible to use other build systems to - build Boost.Python and its extensions, but they are not - officially supported by Boost. Moreover *99% of all “I can't - build Boost.Python” problems come from trying to use another - build system* without first following these instructions. - - If you want to use another system anyway, we suggest that you - follow these instructions, and then invoke `bjam` with the - - `-a -o`\ /filename/ - - options to dump the build commands it executes to a file, so - you can see what your alternate build system needs to do.] - -[section Basic Procedure] - -1. Get Boost; see sections 1 and 2 of the _gsg_. - -2. Get the `bjam` build driver. See section 5 of the _gsg_. - -3. cd into the `example/quickstart/` directory of your - Boost.Python installation, which contains a small example project. - -4. Invoke `bjam`. Replace the “\ `stage`\ “ argument from the - example invocation from section 5 of the _gsg_ with “\ `test`\ ,“ to - build all the test targets. Also add the argument “\ `--verbose-test`\ ” - to see the output generated by the tests when they are run. - On Windows, your `bjam` invocation might look something like: - `` - C:\\...\\quickstart> bjam toolset=msvc --verbose-test test - `` - and on Unix variants, perhaps, - `` - .../quickstart$ bjam toolset=gcc --verbose-test test - `` - -[note For the sake of concision, the rest of this guide will use - unix-style forward slashes in pathnames instead of the - backslashes with which Windows users may be more familiar. The forward - slashes should work everywhere except in - [@http://www.boost.org/more/getting_started/windows.html#command-prompt - Command Prompt] windows, where you should use backslashes.] - -If you followed this procedure successfully, you will have built an -extension module called `extending` and tested it by running a -Python script called `test_extending.py`. You will also have -built and run a simple application called `embedding` that embeds -python. - -[endsect] -[section In Case of Trouble] - -If you're seeing lots of compiler and/or linker error messages, -it's probably because Boost.Build is having trouble finding your -Python installation. You might want to pass the -`--debug-configuration` option to `bjam` the first few times -you invoke it, to make sure that Boost.Build is correctly locating -all the parts of your Python installation. If it isn't, consider -[link building.configuring_boost_build Configuring Boost.Build] -as detailed below. - -If you're still having trouble, Someone on one of the following -mailing lists may be able to help: - -* The _bb_list_ for issues related to Boost.Build -* The _bp_list_ for issues specifically related to Boost.Python - -[endsect] -[section In Case Everything Seemed to Work] - -Rejoice! If you're new to Boost.Python, at this point it might be -a good idea to ignore build issues for a while and concentrate on -learning the library by going through the _tutorial_ and perhaps -some of the _reference_, trying out what you've -learned about the API by modifying the quickstart project. - -[endsect] -[section Modifying the Example Project] - -If you're content to keep your extension module forever in one -source file called `extending.cpp`, inside your Boost.Python -distribution, and import it forever as `extending`, then you can -stop here. However, it's likely that you will want to make a few -changes. There are a few things you can do without having to learn -_bb_ in depth. - -The project you just built is specified in two files in the current -directory: `boost-build.jam`, which tells `bjam` where it can -find the interpreted code of the Boost build system, and -`Jamroot`, which describes the targets you just built. These -files are heavily commented, so they should be easy to modify. -Take care, however, to preserve whitespace. Punctuation such as -`;` will not be recognized as intended by `bjam` if it is not -surrounded by whitespace. - -[section Relocate the Project] - -You'll probably want to copy this project elsewhere so you can -change it without modifying your Boost distribution. To do that, -simply - -a. copy the entire `example/quickstart/` directory - into a new directory. - -b. In the new copies of `boost-build.jam` and `Jamroot`, locate - the relative path near the top of the file that is clearly - marked by a comment, and edit that path so that it refers to the - same directory your Boost distribution as it referred to when - the file was in its original location in the - `example/quickstart/` directory. - -For example, if you moved the project from -`/home/dave/boost_1_34_0/libs/python/example/quickstart` to -`/home/dave/my-project`, you could change the first path in -`boost-build.jam` from -`` - ../../../../tools/build/src -`` -to -`` - /home/dave/boost_1_34_0/tools/build/src -`` -and change the first path in `Jamroot` from -`` - ../../../.. -`` -to -`` - /home/dave/boost_1_34_0 -`` - -[endsect] -[section Add New or Change Names of Existing Source Files] - -The names of additional source files involved in building your -extension module or embedding application can be listed in -`Jamroot` right alongside `extending.cpp` or `embedding.cpp` -respectively. Just be sure to leave whitespace around each -filename: -`` - … file1.cpp file2.cpp file3.cpp … -`` -Naturally, if you want to change the name of a source file you can -tell Boost.Build about it by editing the name in `Jamroot`. - -[endsect] -[section Change the Name of your Extension Module] - -The name of the extension module is determined by two things: - -# the name in `Jamroot` immediately following `python-extension`, and -# the name passed to `BOOST_PYTHON_MODULE` in `extending.cpp`. - -To change the name of the extension module from `extending` to -`hello`, you'd edit `Jamroot`, changing -`` - python-extension extending : extending.cpp ; -`` -to -`` - python-extension hello : extending.cpp ; -`` -and you'd edit extending.cpp, changing - -`` - BOOST_PYTHON_MODULE(extending) -`` -to -`` - BOOST_PYTHON_MODULE(hello) -`` -[endsect] -[endsect] -[endsect] -[section Installing Boost.Python on your System] - -Since Boost.Python is a separately-compiled (as opposed to -`header-only`) library, its user relies on the services of a -Boost.Python library binary. - -If you need a regular installation of the Boost.Python library -binaries on your system, the _gsg_ will -walk you through the steps of creating one. If building binaries -from source, you might want to supply the `--with-python` -argument to `bjam` (or the `--with-libraries=python` argument -to `configure`), so only the Boost.Python binary will be built, -rather than all the Boost binaries. - -[endsect] -[section Configuring Boost.Build] - -As described in the [@http://www.boost.org/build/doc/html/bbv2/overview/configuration.html Boost.Build Reference Manual], a file called -`user-config.jam` in your home directory is used to -specify the tools and libraries available to the build system. You -may need to create or edit `user-config.jam` to tell Boost.Build -how to invoke Python, `#include` its headers, and link with its -libraries. - -[note If you are using a unix-variant OS and you ran Boost's - `configure` script, it may have generated a - `user-config.jam` for you. [footnote `configure` overwrites the existing - `user-config.jam` in your home directory (if any) after making a backup of - the old version.] If your `configure`\ /\ `make` sequence was successful and - Boost.Python binaries were built, your `user-config.jam` file is probably already - correct.] - -If you have one fairly “standard” python installation for your -platform, you might not need to do anything special to describe it. If -you haven't configured python in `user-config.jam` (and you don't -specify `--without-python` on the Boost.Build command line), -Boost.Build will automatically execute the equivalent of - -`` - import toolset : using ; - using python ; -`` -which automatically looks for Python in the most likely places. -However, that only happens when using the Boost.Python project file -(e.g. when referred to by another project as in the quickstart -method). If instead you are linking against separately-compiled -Boost.Python binaries, you should set up a `user-config.jam` file -with at least the minimal incantation above. - -[section Python Configuration Parameters] - -If you have several versions of Python installed, or Python is -installed in an unusual way, you may want to supply any or all of -the following optional parameters to `using python`. - -[variablelist - [[version] - - [the version of Python to use. Should be in Major.Minor - format, for example, `2.3`. Do not include the subminor - version (i.e. *not* `2.5.1`). If you have multiple Python - versions installed, the version will usually be the only - configuration argument required.]] - - [[cmd-or-prefix] - - [preferably, a command that invokes a Python interpreter. - Alternatively, the installation prefix for Python libraries and - header files. Only use the alternative formulation if there is - no appropriate Python executable available.]] - - [[*includes*] - - [the `#include` paths for Python headers. Normally the correct - path(s) will be automatically deduced from `version` and/or - `cmd-or-prefix`.]] - - [[*libraries*] - - [the path to Python library binaries. On MacOS/Darwin, - you can also pass the path of the Python framework. Normally the - correct path(s) will be automatically deduced from `version` - and/or `cmd-or-prefix`.]] - - [[*condition*] - - [if specified, should be a set of Boost.Build - properties that are matched against the build configuration when - Boost.Build selects a Python configuration to use. See examples - below for details.]] - - [[*extension-suffix*] - - [A string to append to the name of extension - modules before the true filename extension. You almost certainly - don't need to use this. Usually this suffix is only used when - targeting a Windows debug build of Python, and will be set - automatically for you based on the value of the - [link building.python_debugging_builds ] feature. - However, at least one Linux distribution (Ubuntu Feisty Fawn) has - a specially configured [@https://wiki.ubuntu.com/PyDbgBuilds ] - package that claims to use such a suffix.]] - ] - -[endsect] -[section Examples] - -Note that in the examples below, case and *especially whitespace* are -significant. - -* If you have both python 2.5 and python 2.4 installed, - `user-config.jam` might contain - - `` - using python : 2.5 ; # Make both versions of Python available - using python : 2.4 ; # To build with python 2.4, add python=2.4 - # to your command line. - `` - The first version configured (2.5) becomes the default. To build - against python 2.4, add `python=2.4` to the `bjam` command line. - -* If you have python installed in an unusual location, you might - supply the path to the interpreter in the `cmd-or-prefix` - parameter: - - `` - using python : : /usr/local/python-2.6-beta/bin/python ; - `` - -* If you have a separate build of Python for use with a particular - toolset, you might supply that toolset in the `condition` - parameter: - - `` - using python ; # use for most toolsets - - # Use with Intel C++ toolset - using python - : # version - : c:\\Devel\\Python-2.5-IntelBuild\\PCBuild\\python # cmd-or-prefix - : # includes - : # libraries - : intel # condition - ; - `` - -* If you have downloaded the Python sources and built both the - normal and the [link building.python_debugging_builds "python debugging"] - builds from source on Windows, you might see: - - `` - using python : 2.5 : C:\\src\\Python-2.5\\PCBuild\\python ; - using python : 2.5 : C:\\src\\Python-2.5\\PCBuild\\python_d - : # includes - : # libs - : on ; - `` -* You can set up your user-config.jam so a bjam built under Windows - can build/test both Windows and Cygwin_ python extensions. Just pass - `cygwin` in the `condition` parameter - for the cygwin python installation: - - `` - # windows installation - using python ; - - # cygwin installation - using python : : c:\\cygwin\\bin\\python2.5 : : : cygwin ; - `` - when you put target-os=cygwin in your build request, it should build - with the cygwin version of python: [#flavor]_ - - `` - bjam target-os=cygwin toolset=gcc - `` - This is supposed to work the other way, too (targeting windows - python with a [@http://cygwin.com Cygwin] bjam) but it seems as though the support in - Boost.Build's toolsets for building that way is broken at the - time of this writing. - -* Note that because of [@http://zigzag.cs.msu.su/boost.build/wiki/AlternativeSelection - the way Boost.Build currently selects target alternatives], you might have be very - explicit in your build requests. For example, given: - - `` - using python : 2.5 ; # a regular windows build - using python : 2.4 : : : : cygwin ; - `` - building with - `` - bjam target-os=cygwin - `` - - will yield an error. Instead, you'll need to write - - `` - bjam target-os=cygwin/python=2.4 - `` - -[endsect] -[endsect] -[section Choosing a Boost.Python Library Binary] - -If—instead of letting Boost.Build construct and link with the right -libraries automatically—you choose to use a pre-built Boost.Python -library, you'll need to think about which one to link with. The -Boost.Python binary comes in both static and dynamic flavors. Take -care to choose the right flavor for your application. [footnote -Information about how to identify the static and dynamic builds of Boost.Python on -[@http://boost.org/more/getting_started/windows.html#library-naming Windows] / -[@http://boost.org/more/getting_started/unix-variants.html#library-naming Unix variants]] - -[section The Dynamic Binary] - -The dynamic library is the safest and most-versatile choice: - -* A single copy of the library code is used by all extension - modules built with a given toolset. [footnote Because of the way most \*nix platforms - share symbols among dynamically-loaded objects, I'm not certain - that extension modules built with different compiler toolsets - will always use different copies of the Boost.Python library - when loaded into the same Python instance. Not using different - libraries could be a good thing if the compilers have compatible - ABIs, because extension modules built with the two libraries - would be interoperable. Otherwise, it could spell disaster, - since an extension module and the Boost.Python library would - have different ideas of such things as class layout. I would - appreciate someone doing the experiment to find out what - happens.] - -* The library contains a type conversion registry. Because one - registry is shared among all extension modules, instances of a - class exposed to Python in one dynamically-loaded extension - module can be passed to functions exposed in another such module. - -[endsect] -[section The Static Binary] - -It might be appropriate to use the static Boost.Python library in -any of the following cases: - -* You are _extending_ python and the types exposed in your - dynamically-loaded extension module don't need to be used by any - other Boost.Python extension modules, and you don't care if the - core library code is duplicated among them. - -* You are _embedding_ python in your application and either: - - * You are targeting a Unix variant OS other than MacOS or AIX, - where the dynamically-loaded extension modules can “see” the - Boost.Python library symbols that are part of the executable. - - * Or, you have statically linked some Boost.Python extension - modules into your application and you don't care if any - dynamically-loaded Boost.Python extension modules are able to - use the types exposed by your statically-linked extension - modules (and vice-versa). - -[endsect] -[endsect] -[section `#include` Issues] - -1. If you should ever have occasion to `#include "python.h"` - directly in a translation unit of a program using Boost.Python, - use `#include "boost/python/detail/wrap_python.hpp"` instead. - It handles several issues necessary for use with Boost.Python, - one of which is mentioned in the next section. - -2. Be sure not to `#include` any system headers before - `wrap_python.hpp`. This restriction is actually imposed by - Python, or more properly, by Python's interaction with your - operating system. See - [@http://docs.python.org/ext/simpleExample.html] for details. - -[endsect] -[section Python Debugging Builds] - -Python can be built in a special “python debugging” configuration -that adds extra checks and instrumentation that can be very useful -for developers of extension modules. The data structures used by -the debugging configuration contain additional members, so *a -Python executable built with python debugging enabled cannot be -used with an extension module or library compiled without it, and -vice-versa.* - -Since pre-built “python debugging” versions of the Python -executable and libraries are not supplied with most distributions -of Python, [footnote On Unix and similar platforms, a debugging python and associated libraries are 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 Visual Studio project in the PCBuild subdirectory of a full Python source code distribution.] and we didn't want to force our users -to build them, Boost.Build does not automatically enable python -debugging in its `debug` build variant (which is the default). -Instead there is a special build property called -`python-debugging` that, when used as a build property, will -define the right preprocessor symbols and select the right -libraries to link with. - -On unix-variant platforms, the debugging versions of Python's data -structures will only be used if the symbol `Py_DEBUG` is defined. -On many windows compilers, when extension modules are built with -the preprocessor symbol `_DEBUG`, Python defaults to force -linking with a special debugging version of the Python DLL. Since -that symbol is very commonly used even when Python is not present, -Boost.Python temporarily undefines `_DEBUG` when `Python.h` -is #included from `boost/python/detail/wrap_python.hpp` - unless -`BOOST_DEBUG_PYTHON` is defined. The upshot is that if you want -“python debugging”and you aren't using Boost.Build, you should make -sure `BOOST_DEBUG_PYTHON` is defined, or python debugging will be -suppressed. - -[endsect] -[section Testing Boost.Python] - -To run the full test suite for Boost.Python, invoke `bjam` in the -`test` subdirectory of your Boost.Python distribution. - -[endsect] -[section Notes for MinGW (and Cygwin with -mno-cygwin) GCC Users] - -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 -[@https://docs.python.org/2/install/index.html Installing Python Modules] -to create `libpythonXX.a`, where `XX` corresponds to the major and minor -version numbers of your Python installation. - -[endsect] diff --git a/doc/configuration.qbk b/doc/configuration.qbk deleted file mode 100644 index 49b97de0..00000000 --- a/doc/configuration.qbk +++ /dev/null @@ -1,83 +0,0 @@ -[chapter Configuration - [quickbook 1.7] - [authors [Abrahams, David]] - [copyright 2002 - 2015 David Abrahams, Stefan Seefeld] - [id configuration] -] - - -[section Configuration] - -[section Introduction] -[*Boost.Python] uses several configuration macros in ``, as well as configuration macros meant to be supplied by the application. These macros are documented here. - -[endsect] -[section Application Defined Macros] - -These are the macros that may be defined by an application using Boost.Python. Note that if you extend a strict interpretation of the C++ standard to cover dynamic libraries, using different values of these macros when compiling different libraries (including extension modules and the Boost.Python library itself) is a violation of the [link odr ODR]. However, we know of no C++ implementations on which this particular violation is detectable or causes any problems. - -[table - [[Macro][Default][Meaning]] - [[BOOST_PYTHON_MAX_ARITY] - [15] - [The maximum arity of any function, member function, - or constructor to be wrapped, invocation of a - Boost.Python function wich is specified as taking - arguments x1, x2,...Xn. This includes, in particular, - callback mechanisms such as object::operator()(...) or call_method(... ).]] - [[BOOST_PYTHON_MAX_BASES][10] - [The maximum number of template arguments to the - `bases<...>` class template, which is used to specify - the bases of a wrapped C++ class..]] - [[BOOST_PYTHON_STATIC_MODULE] - [ /not defined/ ] - [If defined, prevents your module initialization - function from being treated as an exported symbol - on platforms which support that distinction in-code]] - [[BOOST_PYTHON_ENABLE_CDECL] - [ /not defined/ ] - [If defined, allows functions using the `__cdecl` - calling convention to be wrapped.]] - [[BOOST_PYTHON_ENABLE_STDCALL] - [ /not defined/ ] - [If defined, allows functions using the `__stdcall` - calling convention to be wrapped.]] - [[BOOST_PYTHON_ENABLE_FASTCALL] - [ /not defined/ ] - [If defined, allows functions using the `__fastcall` - calling convention to be wrapped.]] -] -[endsect] -[section Library Defined Defined Macros] -These macros are defined by *Boost.Python* and are implementation details of interest only to implementors and those porting to new platforms. -[table - [[Macro][Default][Meaning]] - [[BOOST_PYTHON_TYPE_ID_NAME][ /not defined/ ] - [If defined, this indicates that the type_info comparison across - shared library boundaries does not work on this platform. - In other words, if shared-lib-1 passes `typeid(T)` to a function - in shared-lib-2 which compares it to `typeid(T)`, that comparison - may return `false`. If this macro is #defined, Boost.Python uses - and compares `typeid(T).name()` instead of using and comparing - the `std::type_info` objects directly.]] - [[BOOST_PYTHON_NO_PY_SIGNATURES][ /not defined/ ] - [If defined for a module no pythonic signatures are generated for - the docstrings of the module functions, and no python type is - associated with any of the converters registered by the module. - This also reduces the binary size of the module by about 14% - (gcc compiled). - If defined for the boost_python runtime library, the default for - the `docstring_options.enable_py_signatures()` is set to `false`.]] - [[BOOST_PYTHON_SUPPORTS_PY_SIGNATURES] - [ /defined/ if `BOOST_PYTHON_NO_PY_SIGNATURES` is /undefined/ ] - [This macro is defined to enable a smooth transition from older - Boost.Python versions which do not support pythonic signatures. - For example usage see here.]] - [[BOOST_PYTHON_PY_SIGNATURES_PROPER_INIT_SELF_TYPE][ /not defined/ ] - [If defined the python type of `__init__` method "self" parameters - is properly generated, otherwise object is used. It is undefined by - default because it increases the binary size of the module by about - 14% (gcc compiled).]] -] -[endsect] -[endsect] diff --git a/doc/faq.qbk b/doc/faq.qbk deleted file mode 100644 index fce67dce..00000000 --- a/doc/faq.qbk +++ /dev/null @@ -1,736 +0,0 @@ -[chapter Frequently Asked Questions (FAQs) - [quickbook 1.7] - [id faq] -] - -[section How can I wrap a function which takes a function pointer as an argument?] - -If what you're trying to do is something like this: -`` - typedef boost::function funcptr; - - void foo(funcptr fp) - { - fp("hello,world!"); - } - - BOOST_PYTHON_MODULE(test) - { - def("foo",foo); - } -`` - -And then: - -`` ->>> def hello(s): -... print s -... ->>> foo(hello) -hello, world! -`` -The short answer is: "you can't". This is not a -Boost.Python limitation so much as a limitation of C++. The -problem is that a Python function is actually data, and the only -way of associating data with a C++ function pointer is to store it -in a static variable of the function. The problem with that is -that you can only associate one piece of data with every C++ -function, and we have no way of compiling a new C++ function -on-the-fly for every Python function you decide to pass -to `foo`. In other words, this could work if the C++ -function is always going to invoke the /same/ Python -function, but you probably don't want that. - -If you have the luxury of changing the C++ code you're -wrapping, pass it an `object` instead and call that; -the overloaded function call operator will invoke the Python -function you pass it behind the `object`. - -[endsect] -[section I'm getting the "attempt to return dangling reference" error. - What am I doing wrong?] - -That exception is protecting you from causing a nasty crash. It usually -happens in response to some code like this: -`` - period const &get_floating_frequency() const - { - return boost::python::call_method( - m_self,"get_floating_frequency"); - } -`` -And you get: -`` - ReferenceError: Attempt to return dangling reference to object of type: - class period -`` - -In this case, the Python method invoked by `call_method` -constructs a new Python object. You're trying to return a reference to a -C++ object (an instance of `class period`) contained within -and owned by that Python object. Because the called method handed back a -brand new object, the only reference to it is held for the duration of -`get_floating_frequency()` above. When the function returns, -the Python object will be destroyed, destroying the instance of -`class period`, and leaving the returned reference dangling. -That's already undefined behavior, and if you try to do anything with -that reference you're likely to cause a crash. Boost.Python detects this -situation at runtime and helpfully throws an exception instead of letting -you do that. - -[endsect] -[section Is `return_internal_reference` efficient?] - -[*Q:] /I have an object composed of 12 doubles. A `const&` to -this object is returned by a member function of another class. From the -viewpoint of using the returned object in Python I do not care if I get -a copy or a reference to the returned object. In Boost.Python I have the -choice of using `copy_const_reference` or `return_internal_reference`. -Are there considerations that would lead me to prefer one over the other, -such as size of generated code or memory overhead?/ - -[*A:] `copy_const_reference` will make an instance with storage -for one of your objects, `size = base_size + 12 * sizeof(double)`. -`return_internal_reference` will make an instance with storage for a -pointer to one of your objects, `size = base_size + sizeof(void*)`. -However, it will also create a weak reference object which goes in the -source object's weakreflist and a special callback object to manage the -lifetime of the internally-referenced object. My guess? -`copy_const_reference` is your friend here, resulting in less overall -memory use and less fragmentation, also probably fewer total -cycles. - -[endsect] -[section How can I wrap functions which take C++ containers as arguments?] - -Ralf W. Grosse-Kunstleve provides these notes: - -# Using the regular `class_<>` wrapper: - `` - class_ >("std_vector_double") - .def(...) - ... - ; - `` - This can be moved to a template so that several types (`double`, `int`, - `long`, etc.) can be wrapped with the same code. This technique is used - in the file `scitbx/include/scitbx/array_family/boost_python/flex_wrapper.h` - in the "scitbx" package. The file could easily be modified for - wrapping `std::vector<>` instantiations. - This type of C++/Python binding is most suitable for containers - that may contain a large number of elements (>10000). - -# Using custom rvalue converters. Boost.Python "rvalue converters" - match function signatures such as: - `` - void foo(std::vector const &array); // pass by const-reference - void foo(std::vector array); // pass by value - `` - Some custom rvalue converters are implemented in the file - `scitbx/include/scitbx/boost_python/container_conversions.h` - This code can be used to convert from C++ container types such as - `std::vector<>` or `std::list<>` to Python tuples and vice - versa. A few simple examples can be found in the file - `scitbx/array_family/boost_python/regression_test_module.cpp` - Automatic C++ container <-> Python tuple conversions are most - suitable for containers of moderate size. These converters generate - significantly less object code compared to alternative 1 above. - -A disadvantage of using alternative 2 is that operators such as -arithmetic +,-,*,/,% are not available. It would be useful to have custom -rvalue converters that convert to a "math_array" type instead of tuples. -This is currently not implemented but is possible within the framework of -Boost.Python V2 as it will be released in the next couple of weeks. [ed.: -this was posted on 2002/03/10] - -It would also be useful to also have "custom lvalue converters" such -as `std::vector<>` <-> Python list. These converters would -support the modification of the Python list from C++. For example: - -C++: -`` - void foo(std::vector &array) - { - for(std::size_t i=0;i<array.size();i++) { - array[i] *= 2; - } - } -`` -Python: [python] -`` - >>> l = [1, 2, 3] - >>> foo(l) - >>> print l - [2, 4, 6] -`` -Custom lvalue converters require changes to the Boost.Python core library -and are currently not available. - -P.S.: - -The "scitbx" files referenced above are available via anonymous -CVS: -`` - cvs -d:pserver:anonymous@cvs.cctbx.sourceforge.net:/cvsroot/cctbx login - cvs -d:pserver:anonymous@cvs.cctbx.sourceforge.net:/cvsroot/cctbx co scitbx -`` - -[endsect] -[section fatal error C1204:Compiler limit:internal structure overflow] - -[*Q:] /I get this error message when compiling a large source file. What can I do?/ - -[*A:] You have two choices: - -# Upgrade your compiler (preferred) - -# Break your source file up into multiple translation units. - - `my_module.cpp`: [c++] - - `` - ... - void more_of_my_module(); - BOOST_PYTHON_MODULE(my_module) - { - def("foo", foo); - def("bar", bar); - ... - more_of_my_module(); - } - `` - `more_of_my_module.cpp`: - `` - void more_of_my_module() - { - def("baz", baz); - ... - } - `` - If you find that a `class_<...>` declaration - can't fit in a single source file without triggering the error, you - can always pass a reference to the `class_` object to a - function in another source file, and call some of its member - functions (e.g. `.def(...)`) in the auxilliary source - file: - - `more_of_my_class.cpp`: - `` - void more_of_my_class(class<my_class>& x) - { - x - .def("baz", baz) - .add_property("xx", &my_class::get_xx, &my_class::set_xx) - ; - ... - } - `` - -[endsect] -[section How do I debug my Python extensions?] - -Greg Burley gives the following answer for Unix GCC users: - -[:Once you have created a boost python extension for your c++ library or - class, you may need to debug the code. Afterall this is one of the - reasons for wrapping the library in python. An expected side-effect or - benefit of using BPL is that debugging should be isolated to the c++ - library that is under test, given that python code is minimal and - boost::python either works or it doesn't. (ie. While errors can occur - when the wrapping method is invalid, most errors are caught by the - compiler ;-). - - The basic steps required to initiate a gdb session to debug a c++ - library via python are shown here. Note, however that you should start - the gdb session in the directory that contains your BPL my_ext.so - module. - - `` - (gdb) target exec python - (gdb) run - >>> from my_ext import * - >>> [C-c] - (gdb) break MyClass::MyBuggyFunction - (gdb) cont - >>> pyobj = MyClass() - >>> pyobj.MyBuggyFunction() - Breakpoint 1, MyClass::MyBuggyFunction ... - Current language: auto; currently c++ - (gdb) do debugging stuff - `` -] - -Greg's approach works even better using Emacs' "gdb" -command, since it will show you each line of source as you step through it. - -On *Windows*, my favorite debugging solution is the debugger that -comes with Microsoft Visual C++ 7. This debugger seems to work with code -generated by all versions of Microsoft and Metrowerks toolsets; it's rock -solid and "just works" without requiring any special tricks from the -user. - -Raoul Gough has provided the following for gdb on Windows: - -[:gdb support for Windows DLLs has improved lately, so it is - now possible to debug Python extensions using a few - tricks. Firstly, you will need an up-to-date gdb with support - for minimal symbol extraction from a DLL. Any gdb from version 6 - onwards, or Cygwin gdb-20030214-1 and onwards should do. A - suitable release will have a section in the gdb.info file under - Configuration - Native - Cygwin Native - - Non-debug DLL symbols. Refer to that info section for more - details of the procedures outlined here. - - Secondly, it seems necessary to set a breakpoint in the - Python interpreter, rather than using ^C to break execution. A - good place to set this breakpoint is PyOS_Readline, which will - stop execution immediately before reading each interactive - Python command. You have to let Python start once under the - debugger, so that it loads its own DLL, before you can set the - breakpoint: - - `` - $ gdb python - GNU gdb 2003-09-02-cvs (cygwin-special) - [...] - - (gdb) run - Starting program: /cygdrive/c/Python22/python.exe - Python 2.2.2 (#37, Oct 14 2002, 17:02:34) [MSC 32 bit (Intel)] on win32 - Type "help", "copyright", "credits" or "license" for more information. - >>> ^Z - - - Program exited normally. - (gdb) break *&PyOS_Readline - Breakpoint 1 at 0x1e04eff0 - (gdb) run - Starting program: /cygdrive/c/Python22/python.exe - Python 2.2.2 (#37, Oct 14 2002, 17:02:34) [MSC 32 bit (Intel)] on win32 - Type "help", "copyright", "credits" or "license" for more information. - - Breakpoint 1, 0x1e04eff0 in python22!PyOS_Readline () - from /cygdrive/c/WINNT/system32/python22.dll - (gdb) cont - Continuing. - >>> from my_ext import * - - Breakpoint 1, 0x1e04eff0 in python22!PyOS_Readline () - from /cygdrive/c/WINNT/system32/python22.dll - (gdb) # my_ext now loaded (with any debugging symbols it contains) - `` -] - -[h2 Debugging extensions through Boost.Build] - -If you are launching your extension module tests with _bb_ using the -`boost-python-runtest` rule, you can ask it to launch your -debugger for you by adding "--debugger=/debugger/" to your bjam -command-line: -`` - bjam -sTOOLS=vc7.1 "--debugger=devenv /debugexe" test - bjam -sTOOLS=gcc -sPYTHON_LAUNCH=gdb test -`` -It can also be extremely useful to add the `-d+2` option when -you run your test, because Boost.Build will then show you the exact -commands it uses to invoke it. This will invariably involve setting up -PYTHONPATH and other important environment variables such as -LD_LIBRARY_PATH which may be needed by your debugger in order to get -things to work right. - -[endsect] -[section Why doesn't my `*=` operator work?] - -[*Q:] ['I have exported my class to python, with many overloaded -operators. it works fine for me except the `*=` -operator. It always tells me "can't multiply sequence with non int -type". If I use `p1.__imul__(p2)` instead of -`p1 *= p2`, it successfully executes my code. What's -wrong with me?] - -[*A:] There's nothing wrong with you. This is a bug in Python - 2.2. You can see the same effect in Pure Python (you can learn a lot - about what's happening in Boost.Python by playing with new-style - classes in Pure Python). -`` ->>> class X(object): -... def __imul__(self, x): -... print 'imul' -... ->>> x = X() ->>> x *= 1 -`` -To cure this problem, all you need to do is upgrade your Python to -version 2.2.1 or later. - -[endsect] -[section Does Boost.Python work with Mac OS X?] - -It is known to work under 10.2.8 and 10.3 using -Apple's gcc 3.3 compiler: -``gcc (GCC) 3.3 20030304 (Apple Computer, Inc. build 1493)`` -Under 10.2.8 get the August 2003 gcc update (free at [@http://connect.apple.com]). -Under 10.3 get the Xcode Tools v1.0 (also free). - -Python 2.3 is required. The Python that ships with 10.3 is -fine. Under 10.2.8 use these commands to install Python -as a framework: -``./configure --enable-framework -make -make frameworkinstall`` - -The last command requires root privileges because the target -directory is `/Library/Frameworks/Python.framework/Versions/2.3`. -However, the installation does not interfere with the Python -version that ships with 10.2.8. - -It is also crucial to increase the `stacksize` before -starting compilations, e.g.: -``limit stacksize 8192k`` -If the `stacksize` is too small the build might crash with -internal compiler errors. - -Sometimes Apple's compiler exhibits a bug by printing an error -like the following while compiling a -`boost::python::class_` -template instantiation: -`` - .../inheritance.hpp:44: error: cannot - dynamic_cast `p' (of type `struct cctbx::boost_python::::add_pair* - ') to type `void*' (source type is not polymorphic) -`` - -We do not know a general workaround, but if the definition of -`your_type` can be modified the following was found -to work in all cases encountered so far: -`` - struct your_type - { - // before defining any member data - #if defined(__MACH__) && defined(__APPLE_CC__) && __APPLE_CC__ == 1493 - bool dummy_; - #endif - // now your member data, e.g. - double x; - int j; - // etc. - }; -`` -[endsect] -[section How can I find the existing PyObject that holds a C++ object?] - -[: "I am wrapping a function that always returns a pointer to an - already-held C++ object."] - -One way to do that is to hijack the mechanisms used for wrapping a class -with virtual functions. If you make a wrapper class with an initial -PyObject* constructor argument and store that PyObject* as "self", you -can get back to it by casting down to that wrapper type in a thin wrapper -function. For example: -`` - class X { X(int); virtual ~X(); ... }; - X* f(); // known to return Xs that are managed by Python objects - - - // wrapping code - - struct X_wrap : X - { - X_wrap(PyObject* self, int v) : self(self), X(v) {} - PyObject* self; - }; - - handle<> f_wrap() - { - X_wrap* xw = dynamic_cast(f()); - assert(xw != 0); - return handle<>(borrowed(xw->self)); - } - - ... - - def("f", f_wrap()); - class_("X", init()) - ... - ; -`` - -Of course, if X has no virtual functions you'll have to use -`static_cast` instead of `dynamic_cast` with no -runtime check that it's valid. This approach also only works if the -`X` object was constructed from Python, because -`X`\ s constructed from C++ are of course never -`X_wrap` objects. - -Another approach to this requires you to change your C++ code a bit; -if that's an option for you it might be a better way to go. work we've -been meaning to get to anyway. When a `shared_ptr` is -converted from Python, the shared_ptr actually manages a reference to the -containing Python object. When a shared_ptr is converted back to -Python, the library checks to see if it's one of those "Python object -managers" and if so just returns the original Python object. So you could -just write `object(p)` to get the Python object back. To -exploit this you'd have to be able to change the C++ code you're wrapping -so that it deals with shared_ptr instead of raw pointers. - -There are other approaches too. The functions that receive the Python -object that you eventually want to return could be wrapped with a thin -wrapper that records the correspondence between the object address and -its containing Python object, and you could have your f_wrap function -look in that mapping to get the Python object out. - -[endsect] -[section How can I wrap a function which needs to take ownership of a raw pointer?] - -[*Q:] Part of an API that I'm wrapping goes something like this: - -`` - struct A {}; struct B { void add( A* ); } - where B::add() takes ownership of the pointer passed to it. -`` - -However: - -`` - a = mod.A() - b = mod.B() - b.add( a ) - del a - del b - # python interpreter crashes - # later due to memory corruption. -`` - -Even binding the lifetime of a to b via `with_custodian_and_ward` doesn't prevent -the python object a from ultimately trying to delete the object it's pointing to. -Is there a way to accomplish a 'transfer-of-ownership' of a wrapped C++ object? - ---Bruce Lowery - -Yes: Make sure the C++ object is held by auto_ptr: -`` - class_ >("A") - ... - ; -`` -Then make a thin wrapper function which takes an auto_ptr parameter: -`` - void b_insert(B &b, std::auto_ptr a) - { - b.insert(a.get()); - a.release(); - } -`` -Wrap that as B.add. Note that pointers returned via `manage_new_object` -will also be held by `auto_ptr`, so this transfer-of-ownership -will also work correctly. - -[endsect] -[section Compilation takes too much time and eats too much memory! - What can I do to make it faster?] - -Please refer to the `Reducing Compiling Time` section in the _tutorial_. - -[endsect] -[section How do I create sub-packages using Boost.Python?] - -Please refer to the `Creating Packages` section in the _tutorial_. - -[endsect] -[section error C2064: term does not evaluate to a function taking 2 arguments] - -/Niall Douglas provides these notes:/ - -If you see Microsoft Visual C++ 7.1 (MS Visual Studio .NET 2003) issue -an error message like the following it is most likely due to a bug -in the compiler: -`` - boost\boost\python\detail\invoke.hpp(76): - error C2064: term does not evaluate to a function taking 2 arguments" -`` -This message is triggered by code like the following: -`` - #include - - using namespace boost::python; - - class FXThread - { - public: - bool setAutoDelete(bool doso) throw(); - }; - - void Export_FXThread() - { - class_< FXThread >("FXThread") - .def("setAutoDelete", &FXThread::setAutoDelete) - ; - } -`` -The bug is related to the `throw()` modifier. -As a workaround cast off the modifier. E.g.: -`` - .def("setAutoDelete", (bool (FXThread::*)(bool)) &FXThread::setAutoDelete) -`` -(The bug has been reported to Microsoft.) - -[endsect] -[section How can I automatically convert my custom string type to and from a Python string?] - -/Ralf W. Grosse-Kunstleve provides these notes:/ - -Below is a small, self-contained demo extension module that shows -how to do this. Here is the corresponding trivial test: -`` - import custom_string - assert custom_string.hello() == "Hello world." - assert custom_string.size("california") == 10 -`` -If you look at the code you will find: - -* A custom `to_python` converter (easy): - `custom_string_to_python_str` - -*A custom lvalue converter (needs more code): - `custom_string_from_python_str` - -The custom converters are registered in the global Boost.Python -registry near the top of the module initialization function. Once -flow control has passed through the registration code the automatic -conversions from and to Python strings will work in any module -imported in the same process. - -`` - #include - #include - #include - - namespace sandbox { namespace { - - class custom_string - { - public: - custom_string() {} - custom_string(std::string const &value) : value_(value) {} - std::string const &value() const { return value_; } - private: - std::string value_; - }; - - struct custom_string_to_python_str - { - static PyObject* convert(custom_string const &s) - { - return boost::python::incref(boost::python::object(s.value()).ptr()); - } - }; - - struct custom_string_from_python_str - { - custom_string_from_python_str() - { - boost::python::converter::registry::push_back( - &convertible, - &construct, - boost::python::type_id()); - } - - static void* convertible(PyObject* obj_ptr) - { - if (!PyString_Check(obj_ptr)) return 0; - return obj_ptr; - } - - static void construct( - PyObject* obj_ptr, - boost::python::converter::rvalue_from_python_stage1_data* data) - { - const char* value = PyString_AsString(obj_ptr); - if (value == 0) boost::python::throw_error_already_set(); - void* storage = ( - (boost::python::converter::rvalue_from_python_storage*) - data)->storage.bytes; - new (storage) custom_string(value); - data->convertible = storage; - } - }; - - custom_string hello() { return custom_string("Hello world."); } - - std::size_t size(custom_string const &s) { return s.value().size(); } - - void init_module() - { - using namespace boost::python; - - boost::python::to_python_converter< - custom_string, - custom_string_to_python_str>(); - - custom_string_from_python_str(); - - def("hello", hello); - def("size", size); - } - - }} // namespace sandbox:: - - BOOST_PYTHON_MODULE(custom_string) - { - sandbox::init_module(); - } -`` -[endsect] -[section Why is my automatic to-python conversion not being found?] - -/Niall Douglas provides these notes:/ - -If you define custom converters similar to the ones -shown above the `def_readonly()` and `def_readwrite()` -member functions provided by `boost::python::class_` for -direct access to your member data will not work as expected. -This is because `def_readonly("bar",&foo::bar)` is -equivalent to: - -`` - .add_property("bar", make_getter(&foo::bar, return_internal_reference())) -`` -Similarly, `def_readwrite("bar",&foo::bar)` is -equivalent to: - -`` - .add_property("bar", make_getter(&foo::bar, return_internal_reference()), - make_setter(&foo::bar, return_internal_reference()) -`` -In order to define return value policies compatible with the -custom conversions replace `def_readonly()` and -`def_readwrite()` by `add_property()`. E.g.: - -`` - .add_property("bar", make_getter(&foo::bar, return_value_policy()), - make_setter(&foo::bar, return_value_policy())) -`` - -[endsect] -[section Is Boost.Python thread-aware/compatible with multiple interpreters?] - -/Niall Douglas provides these notes:/ - -The quick answer to this is: no. - -The longer answer is that it can be patched to be so, but it's -complex. You will need to add custom lock/unlock wrapping of every -time your code enters Boost.Python (particularly every virtual -function override) plus heavily modify -`boost/python/detail/invoke.hpp` with custom unlock/lock -wrapping of every time Boost.Python enters your code. You must -furthermore take care to /not/ unlock/lock when Boost.Python -is invoking iterator changes via `invoke.hpp`. - -There is a patched `invoke.hpp` posted on the C++-SIG -mailing list archives and you can find a real implementation of all -the machinery necessary to fully implement this in the TnFOX -project at [@http://sourceforge.net/projects/tnfox/ this] -SourceForge project location. - -[endsect] \ No newline at end of file diff --git a/doc/glossary.qbk b/doc/glossary.qbk deleted file mode 100644 index eaea9709..00000000 --- a/doc/glossary.qbk +++ /dev/null @@ -1,38 +0,0 @@ -[chapter Glossary - [quickbook 1.7] - [id glossary] -] - -[variablelist -[[arity [#arity]] - [The number of argumnts accepted by a function or member function. - Unless otherwise specified, the hidden `this` argument to member - functions is not counted when specifying arity.]] -[[ntbs [#ntbs]] - [Null-Terminated Byte String, or 'C'-string. C++ string literals are *ntbs*\ es. - An *ntbs* must never be null.]] -[[raise [#raise]] - [Exceptions in Python are "raised", not "thrown", as they are in C++. - When this documentation says that some Python exception is "raised" in - the context of C++ code, it means that the corresponding Python exception - is set via the [@http://www.python.org/doc/current/api/exceptionHandling.html Python/'C' API], - and `throw_error_already_set()` is called.]] -[[POD [#pod]] - [A technical term from the C++ standard. Short for "Plain Ol'Data": - A POD-struct is an aggregate class that has no non-static data members - of type pointer to member, non-POD-struct, non-POD-union (or array of such - types) or reference, and has no user-defined copy assign- ment operator and - no user-defined destructor. Similarly, a POD-union is an aggregate union that - has no non-static data members of type pointer to member, non-POD-struct, - non-POD-union (or array of such types) or reference, and has no - user-defined copy assignment operator and no user-defined destructor. A - POD class is a class that is either a POD-struct or a POD-union. An - aggregate is an array or a class (clause 9) with no user-declared - constructors (12.1), no private or protected non-static data members - (clause 11), no base classes (clause 10), and no virtual functions - (10.3).]] -[[ODR [#odr]] - [The "One Definition Rule", which says that any entity in a C++ program must have - the same definition in all translation units (object files) which make up a program.]] -] - diff --git a/doc/index.qbk b/doc/index.qbk deleted file mode 100644 index eaf0df9c..00000000 --- a/doc/index.qbk +++ /dev/null @@ -1,19 +0,0 @@ -[library Boost.Python - [quickbook 1.3] - [authors [Abrahams, David], [Seefeld, Stefan]] - [copyright 2002 2003 2004 2005 2015 David Abrahams, Stefan Seefeld] - [category inter-language support] - [id python] - [purpose - Reflects C++ classes and functions into Python - ] - [license - 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]) - ] -] - -[/ QuickBook Document version 1.3 ] - -[include preface.qbk] diff --git a/doc/internals.html b/doc/internals.html deleted file mode 100755 index 2f7d7607..00000000 --- a/doc/internals.html +++ /dev/null @@ -1,186 +0,0 @@ - - - - - - -Boost.Python Internals Boost - - - - - - - - diff --git a/doc/internals.rst b/doc/internals.rst deleted file mode 100755 index 2438d5ff..00000000 --- a/doc/internals.rst +++ /dev/null @@ -1,182 +0,0 @@ -=================================== - Boost.Python_ Internals |(logo)|__ -=================================== - -.. |(logo)| image:: ../../../boost.png - :alt: Boost - :class: boost-logo - -__ ../../../index.htm - -.. _`Boost.Python`: index.html - -.. _license: ../../../LICENSE_1_0.txt - - -------------------------------------------------------- -A conversation between Brett Calcott and David Abrahams -------------------------------------------------------- - -:copyright: Copyright David Abrahams and Brett Calcott 2003. See - accompanying license_ for terms of use. - -In both of these cases, I'm quite capable of reading code - but the -thing I don't get from scanning the source is a sense of the -architecture, both structurally, and temporally (er, I mean in what -order things go on). - -1) What happens when you do the following:: - - struct boring {}; - ...etc... - class_("boring") - ; - -There seems to be a fair bit going on. - - - Python needs a new ClassType to be registered. - - We need to construct a new type that can hold our boring struct. - - Inward and outward converters need to be registered for the type. - -Can you gesture in the general direction where these things are done? - - I only have time for a "off-the-top-of-my-head" answer at the moment; - I suggest you step through the code with a debugger after reading this - to see how it works, fill in details, and make sure I didn't forget - anything. - - A new (Python) subclass of Boost.Python.Instance (see - libs/python/src/object/class.cpp) is created by invoking - Boost.Python.class, the metatype:: - - >>> boring = Boost.Python.class( - ... 'boring' - ... , bases_tuple # in this case, just () - ... , { - ... '__module__' : module_name - ... , '__doc__' : doc_string # optional - ... } - ... ) - - A handle to this object is stuck in the m_class_object field - of the registration associated with ``typeid(boring)``. The - registry will keep that object alive forever, even if you - wipe out the 'boring' attribute of the extension module - (probably not a good thing). - - Because you didn't specify ``class``, a to-python converter for boring is registered which - copies its argument into a value_holder held by the the - Python boring object. - - Because you didn't specify ``class(no_init)``, - an ``__init__`` function object is added to the class - dictionary which default-constructs a boring in a - value_holder (because you didn't specify some smart pointer - or derived wrapper class as a holder) held by the Python - boring object. - - ``register_class_from_python`` is used to register a - from-python converter for ``shared_ptr``. - ``boost::shared_ptr``\ s are special among smart pointers - because their Deleter argument can be made to manage the - whole Python object, not just the C++ object it contains, no - matter how the C++ object is held. - - If there were any ``bases<>``, we'd also be registering the - relationship between these base classes and boring in the - up/down cast graph (``inheritance.[hpp/cpp]``). - - In earlier versions of the code, we'd be registering lvalue - from-python converters for the class here, but now - from-python conversion for wrapped classes is handled as a - special case, before consulting the registry, if the source - Python object's metaclass is the Boost.Python metaclass. - - Hmm, that from-python converter probably ought to be handled - the way class converters are, with no explicit conversions - registered. - -2) Can you give a brief overview of the data structures that are - present in the registry - - The registry is simple: it's just a map from typeid -> - registration (see boost/python/converter/registrations.hpp). - ``lvalue_chain`` and ``rvalue_chain`` are simple endogenous - linked lists. - - If you want to know more, just ask. - - If you want to know about the cast graph, ask me something specific in - a separate message. - - and an overview of the process that happens as a type makes its - way from c++ to python and back again. - - Big subject. I suggest some background reading: look for relevant - info in the LLNL progress reports and the messages they link to. - Also, - - http://mail.python.org/pipermail/c++-sig/2002-May/001023.html - - http://mail.python.org/pipermail/c++-sig/2002-December/003115.html - - http://aspn.activestate.com/ASPN/Mail/Message/1280898 - - http://mail.python.org/pipermail/c++-sig/2002-July/001755.html - - from c++ to python: - - It depends on the type and the call policies in use or, for - ``call<>(...)``, ``call_method<>(...)``, or ``object(...)``, if - ``ref`` or ``ptr`` is used. There are also two basic - categories to to-python conversion, "return value" conversion - (for Python->C++ calls) and "argument" conversion (for - C++->Python calls and explicit ``object()`` conversions). The - behavior of these two categories differs subtly in various ways - whose details I forget at the moment. You can probably find - the answers in the above references, and certainly in the code. - - The "default" case is by-value (copying) conversion, which uses - to_python_value as a to-python converter. - - Since there can sensibly be only one way to convert any type - to python (disregarding the idea of scoped registries for the - moment), it makes sense that to-python conversions can be - handled by specializing a template. If the type is one of - the types handled by a built-in conversion - (builtin_converters.hpp), the corresponding template - specialization of to_python_value gets used. - - Otherwise, to_python_value uses the ``m_to_python`` - function in the registration for the C++ type. - - Other conversions, like by-reference conversions, are only - available for wrapped classes, and are requested explicitly by - using ``ref(...)``, ``ptr(...)``, or by specifying different - CallPolicies for a call, which can cause a different to-python - converter to be used. These conversions are never registered - anywhere, though they do need to use the registration to find - the Python class corresponding to the C++ type being referred - to. They just build a new Python instance and stick the - appropriate Holder instance in it. - - - from python to C++: - - Once again I think there is a distinction between "return value" - and "argument" conversions, and I forget exactly what that is. - - What happens depends on whether an lvalue conversion is needed - (see http://mail.python.org/pipermail/c++-sig/2002-May/001023.html) - All lvalue conversions are also registered in a type's rvalue - conversion chain, since when an rvalue will do, an lvalue is - certainly good enough. - - An lvalue conversion can be done in one step (just get me the - pointer to the object - it can be ``NULL`` if no conversion is - possible) while an rvalue conversion requires two steps to - support wrapped function overloading and multiple converters for - a given C++ target type: first tell me if a conversion is - possible, then construct the converted object as a second step. - diff --git a/doc/polymorphism.txt b/doc/polymorphism.txt deleted file mode 100644 index 38e2f691..00000000 --- a/doc/polymorphism.txt +++ /dev/null @@ -1,222 +0,0 @@ -.. Copyright David Abrahams 2006. 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) - -How Runtime Polymorphism is expressed in Boost.Python: ------------------------------------------------------ - - struct A { virtual std::string f(); virtual ~A(); }; - - std::string call_f(A& x) { return x.f(); } - - struct B { virtual std::string f() { return "B"; } }; - - struct Bcb : B - { - Bcb(PyObject* self) : m_self(self) {} - - virtual std::string f() { return call_method(m_sef, "f"); } - static std::string f_default(B& b) { return b.B::f(); } - - PyObject* m_self; - }; - - struct C : B - { - virtual std::string f() { return "C"; } - }; - - >>> class D(B): - ... def f(): - ... return 'D' - ... - >>> class E(B): pass - ... - - -When we write, "invokes B::f non-virtually", we mean: - - void g(B& x) { x.B::f(); } - -This will call B::f() regardless of the dynamic type of x. Any other -way of invoking B::f, including through a function pointer, is a -"virtual invocation", and will call the most-derived override of f(). - -Case studies - - C++\Python class - \___A_____B_____C_____D____E___ - | - A | 1 - | - B | 2 3 - | - Bcb | 4 5 6 - | - C | 7 8 - | - - -1. Simple case - -2. Python A holds a B*. Probably won't happen once we have forced - downcasting. - - Requires: - x.f() -> 'B' - call_f(x) -> 'B' - - Implies: A.f invokes A::f() (virtually or otherwise) - -3. Python B holds a B*. - - Requires: - x.f() -> 'B' - call_f(x) -> 'B' - - Implies: B.f invokes B::f (virtually or otherwise) - - -4. B constructed from Python - - Requires: - - x.f() -> 'B' - call_f(x) -> 'B' - - Implies: B.f invokes B::f non-virtually. Bcb::f invokes B::f - non-virtually. - - Question: Does it help if we arrange for Python B construction to - build a true B object? Then this case doesn't arise. - - -5. D is a Python class derived from B - - Requires: - - x.f() -> 'D' - call_f(x) -> 'D' - - Implies: Bcb::f must invoke call_method to look up the Python - method override, otherwise call_f wouldn't work. - -6. E is like D, but doesn't override f - - Requires: - - x.f() -> 'B' - call_f(x) -> 'B' - - Implies: B.f invokes B::f non-virtually. If it were virtual, x.f() - would cause infinite recursion, because we've already - determined that Bcb::f must invoke call_method to look up - the Python method override. - -7. Python B object holds a C* - - Requires: - - x.f() -> 'C' - call_f(x) -> 'C' - - Implies: B.f invokes B::f virtually. - -8. C object constructed from Python - - Requires: - - x.f() -> 'C' - call_f(x) -> 'C' - - Implies: nothing new. - ------- - -Total implications: - -2: A.f invokes A::f() (virtually or otherwise) -3: B.f invokes B::f (virtually or otherwise) -4: B.f invokes B::f non-virtually. Bcb::f invokes B::f non-virtually -6: B.f invokes B::f non-virtually. -7: B.f invokes B::f virtually. - -5: Bcb::f invokes call_method to look up the Python method - -Though (4) is avoidable, clearly 6 and 7 are not, and they -conflict. The implication is that B.f must choose its behavior -according to the type of the contained C++ object. If it is Bcb, a -non-virtual call to B::f must occur. Otherwise, a virtual call to B::f -must occur. This is essentially the same scheme we had with -Boost.Python v1. - -Note: in early versions of Boost.Python v1, we solved this problem by -introducing a new Python class in the hierarchy, so that D and E -actually derive from a B', and B'.f invokes B::f non-virtually, while -B.f invokes B::f virtually. However, people complained about the -artificial class in the hierarchy, which was revealed when they tried -to do normal kinds of Python introspection. - -------- - -Assumption: we will have a function which builds a virtual function -dispatch callable Python object. - - make_virtual_function(pvmf, default_impl, call_policies, dispatch_type) - -Pseudocode: - - Get first argument from Python arg tuple - if it contains dispatch_type - call default_impl - else - call through pvmf - - -Open questions: - - 1. What about Python multiple inheritance? Do we have the right - check in the if clause above? - - A: Not quite. The correct test looks like: - - Deduce target type of pvmf, i.e. T in R(T::*)(A1...AN). - Find holder in first argument which holds T - if it holds dispatch_type... - - 2. Can we make this more efficient? - - The current "returning" mechanism will look up a holder for T - again. I don't know if we know how to avoid that. - - - OK, the solution involves reworking the call mechanism. This is - neccesary anyway in order to enable wrapping of function objects. - - It can result in a reduction in the overall amount of source code, - because returning<> won't need to be specialized for every - combination of function and member function... though it will still - need a void specialization. We will still need a way to dispatch to - member functions through a regular function interface. mem_fn is - almost the right tool, but it only goes up to 8 - arguments. Forwarding is tricky if you don't want to incur copies. - I think the trick is to use arg_from_python::result_type for each - argument to the forwarder. - - Another option would be to use separate function, function object, - and member function dispatchers. Once you know you have a member - function, you don't need cv-qualified overloads to call it. - - Hmm, while we're at this, maybe we should solve the write-back - converter problem. Can we do it? Maybe not. Ralf doesn't want to - write special write-back functions here, does he? He wants the - converter to do the work automatically. We could add - cleanup/destructor registration. That would relieve the client from - having accessible destructors for types which are being converted by - rvalue. I'm not sure that this will really save any code, - however. It rather depends on the linker, doesn't it? I wonder if - this can be done in a backwards-compatible fashion by generating the - delete function when it's not supplied? - - diff --git a/doc/preface.qbk b/doc/preface.qbk deleted file mode 100644 index b04d88e7..00000000 --- a/doc/preface.qbk +++ /dev/null @@ -1,26 +0,0 @@ -[preface Introduction -[quickbook 1.6] -] - -[section Synopsis] - -Welcome to version 2 of Boost.Python, a C++ library which enables seamless interoperability between C++ and the Python programming language. The new version has been rewritten from the ground up, with a more convenient and flexible interface, and many new capabilities, including support for: - - * References and Pointers - * Globally Registered Type Coercions - * Automatic Cross-Module Type Conversions - * Efficient Function Overloading - * C++ to Python Exception Translation - * Default Arguments - * Keyword Arguments - * Manipulating Python objects in C++ - * Exporting C++ Iterators as Python Iterators - * Documentation Strings - -The development of these features was funded in part by grants to Boost Consulting from the Lawrence Livermore National Laboratories and by the Computational Crystallography Initiative at Lawrence Berkeley National Laboratories. - -[endsect] -[section Articles] - -"Building Hybrid Systems With Boost Python", by Dave Abrahams and Ralf W. Grosse-Kunstleve (PDF) -[endsect] diff --git a/doc/python.qbk b/doc/python.qbk deleted file mode 100644 index b3e7eceb..00000000 --- a/doc/python.qbk +++ /dev/null @@ -1,64 +0,0 @@ -[book Boost.Python - [quickbook 1.7] - [authors [Abrahams, David], [Seefeld, Stefan]] - [copyright 2002 - 2015 David Abrahams, Stefan Seefeld] - [category inter-language support] - [id python] - [purpose - Reflects C++ classes and functions into Python - ] - [license - 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]) - ] -] - -[def _boost_ [@http://www.boost.org Boost]] -[def _bb_ [@http://www.boost.org/build Boost.Build]] -[def _bb_list_ [@http://www.boost.org/more/mailing_lists.htm#jamboost Boost.Build mailing list]] -[def _bp_list_ [@http://www.boost.org/more/mailing_lists.htm#cplussig Boost.Python mailing list]] -[def _tutorial_ [@tutorial/index.html Tutorial]] -[def _reference_ [@reference/index.html Reference Manual]] -[def _gsg_ Boost [@http://www.boost.org/more/getting_started/ Getting Started Guide]] -[def _extending_ [@https://docs.python.org/2/extending/extending.html extending]] -[def _embedding_ [@https://docs.python.org/2/extending/embedding.html embedding]] - -[h2 Synopsis] - -Welcome to Boost.Python, a C++ library which enables seamless interoperability between C++ and the Python programming language. The library includes support for: - -* References and Pointers -* Globally Registered Type Coercions -* Automatic Cross-Module Type Conversions -* Efficient Function Overloading -* C++ to Python Exception Translation -* Default Arguments -* Keyword Arguments -* Manipulating Python objects in C++ -* Exporting C++ Iterators as Python Iterators -* Documentation Strings - -The development of these features was funded in part by grants to `Boost Consulting` from the [@http://www.llnl.gov Lawrence Livermore National Laboratories] and by the [@http://cci.lbl.gov Computational Crystallography Initiative] at Lawrence Berkeley National Laboratories. - -[section Contents] - -* _tutorial_ -* [link building Building and Testing] -* _reference_ -* [link configuration Configuration Information] -* [link glossary Glossary] -* [link support Support Resources] -* [link faq Frequently Asked Questions (FAQs)] - -[endsect] - -[h2 Articles] - -[@article.html Building Hybrid Systems With Boost Python], by Dave Abrahams and Ralf W. Grosse-Kunstleve - -[include building.qbk] -[include configuration.qbk] -[include support.qbk] -[include faq.qbk] -[include glossary.qbk] \ No newline at end of file diff --git a/doc/reference.qbk b/doc/reference.qbk deleted file mode 100644 index bc5ecf6e..00000000 --- a/doc/reference.qbk +++ /dev/null @@ -1,21 +0,0 @@ -[book Boost.Python Reference Manual - [quickbook 1.7] - [authors [Abrahams, David], [Seefeld, Stefan]] - [copyright 2002 2003 2004 2005 2015 David Abrahams, Stefan Seefeld] - [id reference] - [license - 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 reference/concepts.qbk] -[include reference/components.qbk] -[include reference/objects.qbk] -[include reference/functions.qbk] -[include reference/conversion.qbk] -[include reference/embedding.qbk] -[include reference/utility.qbk] -[include reference/topics.qbk] -[include glossary.qbk] diff --git a/doc/reference/args.qbk b/doc/reference/args.qbk deleted file mode 100644 index 253b165c..00000000 --- a/doc/reference/args.qbk +++ /dev/null @@ -1,62 +0,0 @@ -[section boost/python/args.hpp] -[section Introduction] -Supplies a family of overloaded functions for specifying argument keywords for wrapped C++ functions. -[section keyword-expressions] -A keyword-expression results in an object which holds a sequence of [link ntbs]\ es, and whose type encodes the number of keywords specified. The keyword-expression may contain default values for some or all of the keywords it holds -[endsect] -[endsect] -[section Class `arg`] -The objects of class arg are keyword-expressions holding one keyword ( size one ) -`` -namespace boost { namespace python -{ - struct arg - { - template - arg &operator = (T const &value); - explicit arg (char const *name){elements[0].name = name;} - }; - -}} -`` -[endsect] -[section Class `arg` constructor] -``arg(char const* name);`` -[variablelist -[[Requires][The argument must be a [link ntbs].]] -[[Effects][Constructs an arg object holding a keyword with name name.]] -] -[endsect] -[section Class `arg` operator=] -``template arg &operator = (T const &value);`` -[variablelist -[[Requires][The argument must convertible to python.]] -[[Effects][Assigns default value for the keyword.]] -[[Returns][Reference to `this`.]] -] -[endsect] -[section Keyword-expression operator,] -`` -keyword-expression operator , (keyword-expression, const arg &kw) const -keyword-expression operator , (keyword-expression, const char *name) const; -`` -[variablelist -[[Requires][The argument name must be a [link ntbs].]] -[[Effects][Extends the keyword-expression argument with one more keyword.]] -[[Returns][The extended keyword-expression.]] -] -[endsect] -[section Example] -`` -#include -using namespace boost::python; - -int f(double x, double y, double z=0.0, double w=1.0); - -BOOST_PYTHON_MODULE(xxx) -{ - def("f", f, (arg("x"), "y", arg("z")=0.0, arg("w")=1.0)); -} -`` -[endsect] -[endsect] diff --git a/doc/reference/call.qbk b/doc/reference/call.qbk deleted file mode 100644 index 4003529e..00000000 --- a/doc/reference/call.qbk +++ /dev/null @@ -1,26 +0,0 @@ -[section boost/python/call.hpp] -[section Introduction] - defines the call family of overloaded function templates, used to invoke Python callable objects from C++. -[endsect] -[section Function `call`] -`` -template -R call(PyObject* callable, A1 const&, A2 const&, ... An const&) -`` -[variablelist -[[Requires][R is a pointer type, reference type, or a complete type with an accessible copy constructor]] -[[Effects][Invokes callable(a1, a2, ...an) in Python, where a1...an are the arguments to call(), converted to Python objects. ]] -[[Returns][The result of the Python call, converted to the C++ type R.]] -[[Rationale][For a complete semantic description and rationale, see this page. ]] -] -[endsect] -[section Example] -The following C++ function applies a Python callable object to its two arguments and returns the result. If a Python exception is raised or the result can't be converted to a double, an exception is thrown. -`` -double apply2(PyObject* func, double x, double y) -{ - return boost::python::call(func, x, y); -} -`` -[endsect] -[endsect] diff --git a/doc/reference/call_method.qbk b/doc/reference/call_method.qbk deleted file mode 100644 index 926763ce..00000000 --- a/doc/reference/call_method.qbk +++ /dev/null @@ -1,80 +0,0 @@ -[section boost/python/call_method.hpp] -[section Introduction] - defines the call_method family of overloaded function templates, used to invoke callable attributes of Python objects from C++. -[endsect] -[section Function `call_method`] -`` -template -R call_method(PyObject* self, char const* method, A1 const&, A2 const&, ... An const&) -`` -[variablelist -[[Requires][`R` is a pointer type, reference type, or a complete type with an accessible copy constructor]] -[[Effects][Invokes `self.method(a1, a2, ...an)` in Python, where `a1...an` are the arguments to `call_method()`, converted to Python objects. For a complete semantic description, see this page.]] -[[Returns][The result of the Python call, converted to the C++ type `R`.]] -[[Rationale][`call_method` is critical to implementing C++ virtual functions which are overridable in Python, as shown by the example below.]] -] -[endsect] -[section Example] -The following C++ illustrates the use of `call_method` in wrapping a class with a virtual function that can be overridden in Python: -C++ Module Definition -`` -#include -#include -#include -#include - -// class to be wrapped -class Base -{ - public: - virtual char const* class_name() const { return "Base"; } - virtual ~Base(); -}; - -bool is_base(Base* b) -{ - return !std::strcmp(b->class_name(), "Base"); -} - -// Wrapper code begins here -using namespace boost::python; - -// Callback class -class Base_callback : public Base -{ - public: - Base_callback(PyObject* self) : m_self(self) {} - - char const* class_name() const { return call_method(m_self, "class_name"); } - char const* Base_name() const { return Base::class_name(); } - private: - PyObject* const m_self; -}; - -using namespace boost::python; -BOOST_PYTHON_MODULE(my_module) -{ - def("is_base", is_base); - - class_("Base") - .def("class_name", &Base_callback::Base_name) - ; - -} -`` -Python code: -`` ->>> from my_module import * ->>> class Derived(Base): -... def __init__(self): -... Base.__init__(self) -... def class_name(self): -... return self.__class__.__name__ -... ->>> is_base(Base()) # calls the class_name() method from C++ -1 ->>> is_base(Derived()) -0 -`` -[endsect] -[endsect] diff --git a/doc/reference/calling.qbk b/doc/reference/calling.qbk deleted file mode 100644 index 5be05d4e..00000000 --- a/doc/reference/calling.qbk +++ /dev/null @@ -1,65 +0,0 @@ -[section Calling Python Functions and Methods] -[section Introduction] -The simplest way to call a Python function from C++, given an [link object_wrappers.boost_python_object_hpp.class_object `object`] instance f holding the function, is simply to invoke its function call operator. -``f("tea", 4, 2) // In Python: f('tea', 4, 2)`` - And of course, a method of an [link object_wrappers.boost_python_object_hpp.class_object `object`] instance `x` can be invoked by using the function-call operator of the corresponding attribute: -``x.attr("tea")(4, 2); // In Python: x.tea(4, 2)`` -If you don't have an [link object_wrappers.boost_python_object_hpp.class_object `object`] instance, `Boost.Python` provides two families of function templates, [link function_invocation_and_creation.boost_python_call_hpp.function_call `call`] and [link function_invocation_and_creation.boost_python_call_method_hpp.function_call_method `call_method`], for invoking Python functions and methods respectively on `PyObject*`\ s. The interface for calling a Python function object (or any Python callable object) looks like: -``call(callable_object, a1, a2... aN);`` -Calling a method of a Python object is similarly easy: -``call_method(self_object, "method-name", a1, a2... aN);`` - This comparitively low-level interface is the one you'll use when implementing C++ virtual functions that can be overridden in Python. -[endsect] -[section Argument Handling] -Arguments are converted to Python according to their type. By default, the arguments `a1...aN` are copied into new Python objects, but this behavior can be overridden by the use of [link function_invocation_and_creation.boost_python_ptr_hpp.functions `ptr()`] and `ref()`: -`` -class X : boost::noncopyable -{ - ... -}; - -void apply(PyObject* callable, X& x) -{ - // Invoke callable, passing a Python object which holds a reference to x - boost::python::call(callable, boost::ref(x)); -} -`` - In the table below, x denotes the actual argument object and cv denotes an optional cv-qualification: "const", "volatile", or "const volatile". - -[table -[[Argument Type][Behavior]] -[[`T cv &` -`T cv`][The Python argument is created by the same means used for the return value of a wrapped C++ function returning T. When T is a class type, that normally means *x is copy-constructed into the new Python object.]] -[[T*][If x == 0, the Python argument will be None. Otherwise, the Python argument is created by the same means used for the return value of a wrapped C++ function returning T. When T is a class type, that normally means *x is copy-constructed into the new Python object.]] -[[boost::reference_wrapper][The Python argument contains a pointer to, rather than a copy of, x.get(). Note: failure to ensure that no Python code holds a reference to the resulting object beyond the lifetime of *x.get() may result in a crash!]] -[[pointer_wrapper][If x.get() == 0, the Python argument will be None. Otherwise, the Python argument contains a pointer to, rather than a copy of, *x.get(). Note: failure to ensure that no Python code holds a reference to the resulting object beyond the lifetime of *x.get() may result in a crash!]] -] -[endsect] -[section Result Handling] -In general, `call()` and call_method() return ResultType by exploiting all lvalue and rvalue from_python converters registered for ResultType and returning a copy of the result. However, when ResultType is a pointer or reference type, Boost.Python searches only for lvalue converters. To prevent dangling pointers and references, an exception will be thrown if the Python result object has only a single reference count. -[endsect] -[section Rationale] -In general, to get Python arguments corresponding to a1...aN, a new Python object must be created for each one; should the C++ object be copied into that Python object, or should the Python object simply hold a reference/pointer to the C++ object? In general, the latter approach is unsafe, since the called function may store a reference to the Python object somewhere. If the Python object is used after the C++ object is destroyed, we'll crash Python. - -In keeping with the philosophy that users on the Python side shouldn't have to worry about crashing the interpreter, the default behavior is to copy the C++ object, and to allow a non-copying behavior only if the user writes boost::ref(a1) instead of a1 directly. At least this way, the user doesn't get dangerous behavior "by accident". It's also worth noting that the non-copying ("by-reference") behavior is in general only available for class types, and will fail at runtime with a Python exception if used otherwise[1]. - -However, pointer types present a problem: one approach is to refuse to compile if any aN has pointer type: after all, a user can always pass *aN to pass "by-value" or ref(*aN) to indicate a pass-by-reference behavior. However, this creates a problem for the expected null pointer to None conversion: it's illegal to dereference a null pointer value. - -The compromise I've settled on is this: - -# The default behavior is pass-by-value. If you pass a non-null pointer, the pointee is copied into a new Python object; otherwise the corresponding Python argument will be None. -# if you want by-reference behavior, use ptr(aN) if aN is a pointer and ref(aN) otherwise. If a null pointer is passed to ptr(aN), the corresponding Python argument will be None. - -As for results, we have a similar problem: if ResultType is allowed to be a pointer or reference type, the lifetime of the object it refers to is probably being managed by a Python object. When that Python object is destroyed, our pointer dangles. The problem is particularly bad when the ResultType is char const* - the corresponding Python String object is typically uniquely-referenced, meaning that the pointer dangles as soon as call(...) returns. - -The old Boost.Python v1 deals with this issue by refusing to compile any uses of call(), but this goes both too far and not far enough. It goes too far because there are cases where the owning Python string object survives beyond the call (just for instance, when it's the name of a Python class), and it goes not far enough because we might just as well have the same problem with a returned pointer or reference of any other type. - -In Boost.Python this is dealt with by: - -# lifting the compile-time restriction on `char const *` callback returns -# detecting the case when the reference count on the result Python object is 1 and throwing an - exception inside of `call(...)` when `U` is a pointer or reference type. - -This should be acceptably safe because users have to explicitly specify a pointer/reference for `U` in `call`, and they will be protected against dangles at runtime, at least long enough to get out of the `call(...)` invocation. -[endsect] -[endsect] diff --git a/doc/reference/class.qbk b/doc/reference/class.qbk deleted file mode 100644 index 2cdf4299..00000000 --- a/doc/reference/class.qbk +++ /dev/null @@ -1,308 +0,0 @@ -[section boost/python/class.hpp] -[section Introduction] -`` 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_`. - -`` contains a forward declaration of the `class_` class template. -[endsect] -[section Class template `class_`] -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. -[table - [[Template Parameter][Requirements][Semantics][Default]] - [[`T`][A class type.][The class being wrapped][]] - [[Bases] - [A specialization of [link high_level_components.boost_python_class_hpp.class_template_bases_t1_t2_tn bases<...>] which specifies previously-exposed C++ base classes of `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`.][[link high_level_components.boost_python_class_hpp.class_template_bases_t1_t2_tn bases<>]]] - [[HeldType][Must be `T`, a class derived from `T`, or a [link concepts.dereferenceable.concept_requirements Dereferenceable] type for which `pointee::type` is `T` or a class derived from `T`.][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 [link function_invocation_and_creation.boost_python_ptr_hpp.functions ptr], `ref`, or [link concepts.callpolicies Call Policies] such as [link function_invocation_and_creation.models_of_callpolicies.boost_python_return_internal_ref.class_template_return_internal_r return_internal_reference]. More details below.][`T`]] - [[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.][An unspecified type other than boost::noncopyable.]] -] -[section HeldType Semantics] - -# If 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 [link high_level_components.boost_python_init_hpp.introduction.init_expressions init-expression] passed to [link high_level_components.boost_python_class_hpp.class_template_class_t_bases_hel.class_template_class_modifier_fu 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. -# Because Boost.Python will always allow wrapped instances of `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`. -# As in case 1 above, when 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. -# Except in cases 1 and 3, users may optionally specify that T itself gets initialized with a similar initial `PyObject*` argument by specializing [link utility_and_infrastructure.boost_python_has_back_reference_.class_template_has_back_referenc has_back_reference]. - -[endsect] -[section Class template `class_` synopsis] -`` - namespace boost { namespace python - { - template - , class HeldType = T - , class NonCopyable = unspecified - > - class class_ : public object - { - // Constructors with default __init__ - class_(char const* name); - class_(char const* name, char const* docstring); - - // Constructors, specifying non-default __init__ - template - class_(char const* name, Init); - template - class_(char const* name, char const* docstring, Init); - - // Exposing additional __init__ functions - template - class_& def(Init); - - // defining methods - template - class_& def(char const* name, F f); - template - class_& def(char const* name, Fn fn, A1 const&); - template - class_& def(char const* name, Fn fn, A1 const&, A2 const&); - template - class_& def(char const* name, Fn fn, A1 const&, A2 const&, A3 const&); - - // declaring method as static - class_& staticmethod(char const* name); - - // exposing operators - template - class_& def(detail::operator_); - - // Raw attribute modification - template - class_& setattr(char const* name, U const&); - - // exposing data members - template - class_& def_readonly(char const* name, D T::*pm); - - template - class_& def_readwrite(char const* name, D T::*pm); - - // exposing static data members - template - class_& def_readonly(char const* name, D const& d); - template - class_& def_readwrite(char const* name, D& d); - - // property creation - template - void add_property(char const* name, Get const& fget, char const* doc=0); - template - void add_property( - char const* name, Get const& fget, Set const& fset, char const* doc=0); - - template - void add_static_property(char const* name, Get const& fget); - template - void add_static_property(char const* name, Get const& fget, Set const& fset); - - // pickle support - template - self& def_pickle(PickleSuite const&); - self& enable_pickling(); - }; - }} -`` -[endsect] -[section Class template `class_` constructors] -`` - class_(char const* name); - class_(char const* name, char const* docstring); - template - class_(char const* name, Init init_spec); - template - class_(char const* name, char const* docstring, Init init_spec); -`` - -[variablelist - [[Requires][name is an [link ntbs] which conforms to Python's [@http://www.python.org/doc/current/ref/identifiers.html identifier naming rules]. If docstring is supplied, it must be an [link ntbs]. If `init_spec` is supplied, it must be either the special enumeration constant `no_init` or an [link high_level_components.boost_python_init_hpp.introduction.init_expressions init-expression] compatible with `T`.]] - [[Effects][Constructs a `class_` object holding a Boost.Python extension class named name. The named attribute of the [link high_level_components.boost_python_scope_hpp.introduction current scope] is bound to the new extension class. - -* If supplied, the value of docstring is bound to the `__doc__` attribute of the extension class. -* If `init_spec` is `no_init`, a special `__init__` function is generated which always raises a Python exception. Otherwise, `this->def(init_spec)` is called. -* If `init_spec` is not supplied, `this->def(init<>())` is called.]] - [[Rationale][Allowing the user to specify constructor arguments in the `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.]] -] -[endsect] -[section Class template `class_` modifier functions] -`` - template - class_& def(Init init_expr); -`` - -[variablelist - [[Requires][`init_expr` is the result of an [link high_level_components.boost_python_init_hpp.introduction.init_expressions init-expression] compatible with `T`.]] - [[Effects][For each [link high_level_components.boost_python_init_hpp.introduction.init_expressions valid prefix] `P` of `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 [link high_level_components.boost_python_init_hpp.introduction.init_expressions 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.]] - [[Returns][`*this`]] - [[Rationale][Allows users to easily expose a class' constructor to Python.]] -] -`` - template - class_& def(char const* name, Fn fn); - template - class_& def(char const* name, Fn fn, A1 const& a1); - template - class_& def(char const* name, Fn fn, A1 const& a1, A2 const& a2); - template - class_& def(char const* name, Fn fn, A1 const& a1, A2 const& a2, A3 const& a3); -`` -[variablelist - [[Requires][name is an [link ntbs] which conforms to Python's [@http://www.python.org/doc/current/ref/identifiers.html identifier naming rules]. - * If a1 is the result of an [link function_invocation_and_creation.boost_python_overloads_hpp.introduction.overload_dispatch_expressions overload-dispatch-expression], only the second form is allowed and fn must be a pointer to function or pointer to member function whose [link arity] is the same as A1's [link function_invocation_and_creation.boost_python_overloads_hpp.introduction.overload_dispatch_expressions maximum arity]. - - [*Effects:] For each prefix `P` of `Fn`\ 's sequence of argument types, beginning with the one whose length is `A1`\ 's [link function_invocation_and_creation.boost_python_overloads_hpp.introduction.overload_dispatch_expressions 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. - -* Otherwise, a single method overload is built around fn, which must not be null: - - * If fn is a function pointer, its first argument must be of the form 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. - * Otherwise, if fn is a member function pointer, its target must be T or one of its public base classes, and a1-a3, if supplied, may be selected in any order from the table below. - * Otherwise, Fn must be [derived from] [link object_wrappers.boost_python_object_hpp.class_object 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 [@http://www.python.org/doc/current/lib/built-in-funcs.html#l2h-6 callable]. - [table - [[Mnemonic Name][Requirements/Type properties][Effects]] - [[docstring][Any [link 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.]] - [[policies][A model of [link concepts.callpolicies CallPolicies]][A copy will be used as the call policies of the resulting method overload.]] - [[keywords][The result of a [link function_invocation_and_creation.boost_python_args_hpp.introduction.keyword_expressions keyword-expression] specifying no more arguments than the [link arity] of fn.][A copy will be used as the call policies of the resulting method overload.]] - ] -]] - [[Returns][`*this`]] -] -``class_& staticmethod(char const* name);`` -[variablelist - [[Requires][name is an [link ntbs] which conforms to Python's [@http://www.python.org/doc/current/ref/identifiers.html identifier naming rules], and corresponds to a method whose overloads have all been defined.]] - [[Effects][Replaces the existing named attribute `x` with the result of invoking `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)))`` -[variablelist - [[Note][Attempting to invoke def(name,...) after invoking staticmethod(name) will [link raise] a RuntimeError.]] - [[Returns][`*this`]] -] -`` -template -class_& def(detail::operator_); -`` -[variablelist - [[Effects][Adds a Python [@http://www.python.org/doc/ref/specialnames.html special method] as described [link high_level_components.boost_python_operators_hpp here].]] - [[Returns][`*this`]] -] - -`` - template - class_& setattr(char const* name, U const& u); -`` -[variablelist - [[Requires][name is an [link ntbs] which conforms to Python's [@http://www.python.org/doc/current/ref/identifiers.html identifier naming rules].]] - [[Effects][Converts `u` to Python and adds it to the attribute dictionary of the extension class: - ``PyObject_SetAttrString(this->ptr(), name, object(u).ptr());``]] - [[Returns][`*this`]] -] -`` - template - void add_property(char const* name, Get const& fget, char const* doc=0); - template - void add_property( - char const* name, Get const& fget, Set const& fset, char const* doc=0); -`` -[variablelist - [[Requires][name is an [link ntbs] which conform to Python's [@http://www.python.org/doc/current/ref/identifiers.html identifier naming rules].]] - [[Effects][Creates a new Python [@http://www.python.org/2.2.2/descrintro.html#property 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.]] - [[Returns][`*this`]] - [[Rationale][Allows users to easily expose functions that can be invoked from Python with attribute access syntax.]] -] -`` - template - void add_static_property(char const* name, Get const& fget); - template - void add_static_property(char const* name, Get const& fget, Set const& fset); -`` -[variablelist - [[Requires][name is an [link ntbs] which conforms to Python's [@http://www.python.org/doc/current/ref/identifiers.html identifier naming rules].]] - [[Effects][Creates a Boost.Python.StaticProperty object, passing `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.]] - [[Returns][`*this`]] - [[Rationale][Allows users to easily expose functions that can be invoked from Python with static attribute access syntax.]] -] -`` - template - class_& def_readonly(char const* name, D T::*pm, char const* doc=0); - template - class_& def_readonly(char const* name, D const& d); -`` -[variablelist - [[Requires][name is an [link ntbs] which conforms to Python's [@http://www.python.org/doc/current/ref/identifiers.html identifier naming rules]. `doc` is also an [link ntbs].]] - [[Effects][``this->add_property(name, make_getter(pm), doc);`` and ``this->add_static_property(name, make_getter(d));`` respectively.]] - [[Returns][`*this`]] - [[Rationale][Allows users to easily expose a class' data member or free variable such that it can be inspected from Python with a natural syntax.]] -] -`` - template - class_& def_readwrite(char const* name, D T::*pm, char const* doc=0); - template - class_& def_readwrite(char const* name, D& d); -`` -[variablelist -[[Effects][``this->add_property(name, make_getter(pm), make_setter(pm), doc);`` and ``this->add_static_property(name, make_getter(d), make_setter(d));`` respectively.]] -[[Returns][`*this`]] -[[Rationale][Allows users to easily expose a class' data or free variable member such that it can be inspected and set from Python with a natural syntax.]] -] -`` - template - class_& def_pickle(PickleSuite const&); -`` -[variablelist -[[Requires][PickleSuite must be publically derived from [link topics.pickle_support.the_pickle_interface pickle_suite].]] -[[Effects][Defines a legal combination of the special attributes and methods: __getinitargs__, __getstate__, __setstate__, __getstate_manages_dict__, __safe_for_unpickling__, __reduce__]] -[[Returns][`*this`]] -[[Rationale][Provides an [link topics.pickle_support.the_pickle_interface easy to use high-level interface] for establishing complete [link topics.pickle_support.the_pickle_interface pickle support] for the wrapped class. The user is protected by compile-time consistency checks.]] -] -``class_& enable_pickling();`` -[variablelist -[[Effects][Defines the __reduce__ method and the __safe_for_unpickling__ attribute.]] -[[Returns][`*this`]] -[[Rationale][Light-weight alternative to def_pickle(). Enables implementation of pickle support from Python.]] -] -[endsect] -[endsect] -[section Class template bases] -An MPL sequence which can be used in class_<...> instantiations indicate a list of base classes. -[section Class template bases synopsis] -`` -namespace boost { namespace python -{ - template - struct bases - {}; -}} -`` -[endsect] -[endsect] -[section Examples] -Given a C++ class declaration: -`` -class Foo : public Bar, public Baz -{ - public: - Foo(int x, char const* y); - Foo(double); - - std::string const& name() { return m_name; } - void name(char const*); - - double value; // public data - private: - ... -}; -`` -A corresponding Boost.Python extension class can be created with: -`` -using namespace boost::python; - -class_ >("Foo", - "This is Foo's docstring." - "It describes our Foo extension class", - - init(args("x","y"), "__init__ docstring") - ) - .def(init()) - .def("get_name", &Foo::get_name, return_internal_reference<>()) - .def("set_name", &Foo::set_name) - .def_readwrite("value", &Foo::value); -`` -[endsect] -[endsect] diff --git a/doc/reference/components.qbk b/doc/reference/components.qbk deleted file mode 100644 index 70a2969a..00000000 --- a/doc/reference/components.qbk +++ /dev/null @@ -1,18 +0,0 @@ -[chapter High Level Components - [quickbook 1.7] -] - -[include class.qbk] -[include def.qbk] -[include def_visitor.qbk] -[include docstring_options.qbk] -[include enum.qbk] -[include errors.qbk] -[include exception_translator.qbk] -[include init.qbk] -[include iterator.qbk] -[include module.qbk] -[include operators.qbk] -[include scope.qbk] -[include stl_iterator.qbk] -[include wrapper.qbk] diff --git a/doc/reference/concepts.qbk b/doc/reference/concepts.qbk deleted file mode 100644 index bb5db53c..00000000 --- a/doc/reference/concepts.qbk +++ /dev/null @@ -1,134 +0,0 @@ -[chapter Concepts - [quickbook 1.7] -] - -[section CallPolicies] -[section Introduction] - -Models of the CallPolicies concept are used to specialize the behavior of Python callable objects -generated by Boost.Python to wrapped C++ objects like function and member function pointers, -providing three behaviors: - -# `precall` - Python argument tuple management before the wrapped object is invoked -# `result_converter` - C++ return value handling -# `postcall` - Python argument tuple and result management after the wrapped object is invoked -# `extract_return_type` - metafunction for extracting the return type from a given signature type sequence - -[endsect] -[section CallPolicies Composition] - -In order to allow the use of multiple models of CallPolicies in the same callable object, -Boost.Python's CallPolicies class templates provide a chaining interface which allows them to be -recursively composed. This interface takes the form of an optional template parameter, `Base`, which -defaults to `default_call_policies`. By convention, the `precall` function of the `Base` is invoked after -the `precall` function supplied by the `outer` template, and the `postcall` function of the `Base` is invoked -before the `postcall` function of the `outer` template. If a `result_converter` is supplied by the `outer` -template, it replaces any `result_converter` supplied by the `Base`. For an example, see -`return_internal_reference`. - -[endsect] -[section Concept Requirements] -[table - [[Expression][Type][Result/Semantics]] - [[`x.precall(a)`][convertible to `bool`] - [returns `false` and `PyErr_Occurred() != 0` upon failure, `true` otherwise.]] - [[`P::result_converter`][A model of `ResultConverterGenerator`.] - [An MPL unary Metafunction Class used produce the "preliminary" result object.]] - [[`x.postcall(a, r)`][convertible to `PyObject*`] - [`0` and `PyErr_Occurred() != 0` upon failure. Must "conserve references" even in the event of an exception. In other words, if `r` is not returned, its reference count must be decremented; if another existing object is returned, its reference count must be incremented.]] - [[`P::extract_return_type`][A model of Metafunction.] - [An MPL unary Metafunction used extract the return type from a given signature. By default it is derived from `mpl::front`.]] -] -[endsect] -[endsect] -[section Dereferenceable] -[section Introduction] -Instances of a `Dereferenceable` type can be used like a pointer to access an lvalue. -[endsect] -[section Concept Requirements] -In the table below, `T` is a model of Dereferenceable, and `x` denotes an object of type `T`. In addition, all pointers are `Dereferenceable`. -[table - [[Expression][Result][Operational Semantics]] - [[`get_pointer(x)`][convertible to `pointee::type*`] - [`&*x`, or a null pointer ]] -] -[endsect] -[endsect] -[section Extractor] -[section Introduction] -An Extractor is a class which Boost.Python can use to extract C++ objects from Python objects, and is typically used by facilities that define `from_python` conversions for "traditional" Python extension types. -[endsect] -[section Concept Requirements] -In the table below, `X` denotes a model of `Extractor` and `a` denotes an instance of a Python object type. -[table - [[Expression][Type][Semantics]] - [[`X::execute(a)`][non-void] - [Returns the C++ object being extracted. The execute function must not be overloaded.]] - [[`&a.ob_type`][`PyTypeObject**`] - [Points to the `ob_type` field of an object which is layout-compatible with `PyObject`]] -] -[endsect] -[section Notes] -Informally, an Extractor's execute member must be a non-overloaded static function whose single argument is a Python object type. Acceptable Python object types include those publicly (and unambiguously) derived from PyObject, and POD types which are layout-compatible with PyObject. -[endsect] -[endsect] -[section HolderGenerator] -[section Introduction] -A HolderGenerator is a unary metafunction class which returns types suitable for holding instances of its argument in a wrapped C++ class instance. -[endsect] -[section Concept Requirements] -In the table below, `G` denotes an type which models `HolderGenerator`, and `X` denotes a class type. -[table - [[Expression][Requirements]] - [[`G::apply::type`][A concrete subclass of `instance_holder` which can hold objects of type `X`. ]] -] -[endsect] -[endsect] -[section ResultConverter] -[section Introduction] -A ResultConverter for a type `T` is a type whose instances can be used to convert C++ return values of type `T` `to_python`. A ResultConverterGenerator is an MPL unary metafunction class which, given the return type of a C++ function, returns a ResultConverter for that type. ResultConverters in Boost.Python generally inspect library's registry of converters to find a suitable converter, but converters which don't use the registry are also possible. -[endsect] -[section ResultConverter Concept Requirements] -In the table below, `C` denotes a ResultConverter type for a type `R`, `c` denotes an object of type `C`, and `r` denotes an object of type `R`. -[table - [[Expression][Type][Semantics]] - [[`C c`][] - [Constructs a `c` object.]] - [[`c.convertible()`][convertible to `bool`] - [`false` iff no conversion from any `R` value to a Python object is possible.]] - [[`c(r)`][convertible to `PyObject*`] - [A pointer to a Python object corresponding to `r`, or `0` iff `r` could not be converted `to_python`, in which case `PyErr_Occurred` should return non-zero.]] - [[`c.get_pytype()`][`PyTypeObject const *`] - [A pointer to a Python Type object corresponding to result of the conversion, or `0`. Used for documentation generation. If `0` is returned the generated type in the documentation will be object.]] -] -[endsect] -[section ResultConverterGenerator Concept Requirements] -In the table below, `G` denotes a ResultConverterGenerator type and `R` denotes a possible C++ function return type. -[table - [[Expression][Requirements]] - [[`G::apply::type`][A ResultConverter type for `R`.]] -] -[endsect] -[endsect] -[section ObjectWrapper] -[section Introduction] -This page defines two concepts used to describe classes which manage a Python objects, and which are intended to support usage with a Python-like syntax. -[endsect] -[section ObjectWrapper Concept Requirements] -Models of the ObjectWrapper concept have [link object_wrappers.boost_python_object_hpp.class_object object] as a publicly-accessible base class, and are used to supply special construction behavior and/or additional convenient functionality through (often templated) member functions. Except when the return type R is itself an [link concepts.objectwrapper.typewrapper_concept_requirements TypeWrapper], a member function invocation of the form ``x.some_function(a1, a2,...an)`` always has semantics equivalent to: -``extract(x.attr("some_function")(object(a1), object(a2),...object(an)))()`` (see [link concepts.objectwrapper.caveat caveat] below). -[endsect] -[section TypeWrapper Concept Requirements] -TypeWrapper is a refinement of [link concepts.objectwrapper.objectwrapper_concept_requiremen ObjectWrapper] which is associated with a particular Python type `X`. For a given TypeWrapper `T`, a valid constructor expression ``T(a1, a2,...an)`` builds a new T object managing the result of invoking X with arguments corresponding to ``object(a1), object(a2),...object(an)``. -When used as arguments to wrapped C++ functions, or as the template parameter to [link to_from_python_type_conversion.boost_python_extract_hpp.class_template_extract extract<>], only instances of the associated Python type will be considered a match. -[endsect] -[section Caveat] -The upshot of the special member function invocation rules when the return type is a TypeWrapper is that it is possible for the returned object to manage a Python object of an inappropriate type. This is not usually a serious problem; the worst-case result is that errors will be detected at runtime a little later than they might otherwise be. For an example of how this can occur, note that the [link object_wrappers.boost_python_dict_hpp.class_dict dict] member function `items` returns an object of type [link object_wrappers.boost_python_list_hpp.class_list list]. Now suppose the user defines this `dict` subclass in Python: -`` - >>> class mydict(dict): - ... def items(self): - ... return tuple(dict.items(self)) # return a tuple -`` -Since an instance of `mydict` is also an instance of `dict`, when used as an argument to a wrapped C++ function, [link object_wrappers.boost_python_dict_hpp.class_dict boost::python::dict] can accept objects of Python type `mydict`. Invoking `items()` on this object can result in an instance of [link object_wrappers.boost_python_list_hpp.class_list boost::python::list] which actually holds a Python `tuple`. Subsequent attempts to use `list` methods (e.g. `append`, or any other mutating operation) on this object will raise the same exception that would occur if you tried to do it from Python. -[endsect] -[endsect] diff --git a/doc/reference/conversion.qbk b/doc/reference/conversion.qbk deleted file mode 100644 index 6f6268b4..00000000 --- a/doc/reference/conversion.qbk +++ /dev/null @@ -1,10 +0,0 @@ -[chapter To/From Python Type Conversion - [quickbook 1.7] -] - -[include extract.qbk] -[include implicit.qbk] -[include lvalue_from_pytype.qbk] -[include opaque_pointer_converter.qbk] -[include to_python_converter.qbk] -[include register_ptr_to_python.qbk] diff --git a/doc/reference/copy_const_reference.qbk b/doc/reference/copy_const_reference.qbk deleted file mode 100644 index 9217a296..00000000 --- a/doc/reference/copy_const_reference.qbk +++ /dev/null @@ -1,58 +0,0 @@ -[section boost/python/copy_const_reference.hpp] -[section Class `copy_const_reference`] -`copy_const_reference` is a model of [link concepts.resultconverter.resultconvertergenerator_concept ResultConverterGenerator] which can be used to wrap C++ functions returning a reference-to-const type such that the referenced value is copied into a new Python object. -`` -namespace boost { namespace python -{ - struct copy_const_reference - { - template struct apply; - }; -}} -`` -[endsect] -[section Class `copy_const_reference` metafunctions] -``template struct apply`` -[variablelist -[[Requires][`T` is `U const&` for some `U`.]] -[[Returns][`typedef to_python_value type;`]] -] -[endsect] -[section Example] -C++ module definition: -`` -#include -#include -#include -#include - -// classes to wrap -struct Bar { int x; } - -struct Foo { - Foo(int x) : { b.x = x; } - Bar const& get_bar() const { return b; } - private: - Bar b; -}; - -// Wrapper code -using namespace boost::python; -BOOST_PYTHON_MODULE(my_module) -{ - class_("Bar"); - - class_("Foo", init()) - .def("get_bar", &Foo::get_bar - , return_value_policy()) - ; -} -`` -Python code: -`` ->>> from my_module import * ->>> f = Foo(3) # create a Foo object ->>> b = f.get_bar() # make a copy of the internal Bar object -`` -[endsect] -[endsect] diff --git a/doc/reference/copy_non_const_reference.qbk b/doc/reference/copy_non_const_reference.qbk deleted file mode 100644 index a12d4cfb..00000000 --- a/doc/reference/copy_non_const_reference.qbk +++ /dev/null @@ -1,58 +0,0 @@ -[section boost/python/copy_non_const_reference.hpp] -[section Class `copy_non_const_reference`] -`copy_non_const_reference` is a model of [link concepts.resultconverter.resultconvertergenerator_concept ResultConverterGenerator] which can be used to wrap C++ functions returning a reference-to-non-const type such that the referenced value is copied into a new Python object. -`` -namespace boost { namespace python -{ - struct copy_non_const_reference - { - template struct apply; - }; -}} -`` -[endsect] -[section Class `copy_non_const_reference` metafunctions] -``template struct apply`` -[variablelist -[[Requires][`T` is `U &` for some non-const `U`.]] -[[Returns][`typedef to_python_value type`;]] -] -[endsect] -[section Example] -C++ module definition: -`` -#include -#include -#include -#include - -// classes to wrap -struct Bar { int x; } - -struct Foo { - Foo(int x) : { b.x = x; } - Bar& get_bar() { return b; } - private: - Bar b; -}; - -// Wrapper code -using namespace boost::python; -BOOST_PYTHON_MODULE(my_module) -{ - class_("Bar"); - - class_("Foo", init()) - .def("get_bar", &Foo::get_bar - , return_value_policy()) - ; -} -`` -Python code: -`` ->>> from my_module import * ->>> f = Foo(3) # create a Foo object ->>> b = f.get_bar() # make a copy of the internal Bar object -`` -[endsect] -[endsect] diff --git a/doc/reference/data_members.qbk b/doc/reference/data_members.qbk deleted file mode 100644 index 8cc9bb78..00000000 --- a/doc/reference/data_members.qbk +++ /dev/null @@ -1,98 +0,0 @@ -[section boost/python/data_members.hpp] -[section Introduction] -`make_getter()` and `make_setter()` are the functions used internally by [link high_level_components.boost_python_class_hpp.class_template_class_t_bases_hel.class_template_class_modifier_fu `class_<>::def_readonly`] and [link high_level_components.boost_python_class_hpp.class_template_class_t_bases_hel.class_template_class_modifier_fu `class_<>::def_readwrite`] to produce Python callable objects which wrap C++ data members. -[endsect] -[section Functions] -`` -template -object make_getter(D C::*pm); - -template -object make_getter(D C::*pm, Policies const& policies); -`` -[variablelist -[[Requires][Policies is a model of [link concepts.callpolicies `CallPolicies`].]] -[[Effects][Creates a Python callable object which accepts a single argument that can be converted from_python to C*, and returns the corresponding member D member of the C object, converted to_python. If policies is supplied, it will be applied to the function as described here. Otherwise, the library attempts to determine whether D is a user-defined class type, and if so uses return_internal_reference<> -for Policies. Note that this test may inappropriately choose return_internal_reference<> in some cases when D is a smart pointer type. This is a known defect.]] -[[Returns][An instance of object which holds the new Python callable object.]] -] -`` -template -object make_getter(D const& d); -template -object make_getter(D const& d, Policies const& policies); - -template -object make_getter(D const* p); -template -object make_getter(D const* p, Policies const& policies); -`` -[variablelist -[[Requires][Policies is a model of CallPolicies.]] -[[Effects][Creates a Python callable object which accepts no arguments and returns d or *p, converted to_python on demand. If policies is supplied, it will be applied to the function as described here. Otherwise, the library attempts to determine whether D is a user-defined class type, and if so uses reference_existing_object for Policies.]] -[[Returns][An instance of object which holds the new Python callable object.]] -] -`` -template -object make_setter(D C::*pm); - -template -object make_setter(D C::*pm, Policies const& policies); -`` -[variablelist -[[Requires][Policies is a model of CallPolicies.]] -[[Effects][Creates a Python callable object which, when called from Python, expects two arguments which can be converted from_python to C* and D const&, respectively, and sets the corresponding D member of the C object. If policies is supplied, it will be applied to the function as described here.]] -[[Returns][An instance of object which holds the new Python callable object.]] -] -`` -template -object make_setter(D& d); -template -object make_setter(D& d, Policies const& policies); - -template -object make_setter(D* p); -template -object make_setter(D* p, Policies const& policies); -`` -[variablelist -[[Requires][Policies is a model of CallPolicies.]] -[[Effects][Creates a Python callable object which accepts one argument, which is converted from Python to D const& and written into d or *p, respectively. If policies is supplied, it will be applied to the function as described here.]] -[[Returns][An instance of object which holds the new Python callable object.]] -] -[endsect] -[section Example] -The code below uses make_getter and make_setter to expose a data member as functions: -`` -#include -#include -#include - -struct X -{ - X(int x) : y(x) {} - int y; -}; - -using namespace boost::python; - -BOOST_PYTHON_MODULE_INIT(data_members_example) -{ - class_("X", init()) - .def("get", make_getter(&X::y)) - .def("set", make_setter(&X::y)) - ; -} -`` -It can be used this way in Python: -`` ->>> from data_members_example import * ->>> x = X(1) ->>> x.get() -1 ->>> x.set(2) ->>> x.get() -2 -`` -[endsect] -[endsect] diff --git a/doc/reference/def.qbk b/doc/reference/def.qbk deleted file mode 100644 index bf92e17c..00000000 --- a/doc/reference/def.qbk +++ /dev/null @@ -1,54 +0,0 @@ -[section boost/python/def.hpp] -[section Introduction] -`def()` is the function which can be used to expose C++ functions and callable objects as Python functions in the [link high_level_components.boost_python_scope_hpp.introduction current scope]. -[endsect] -[section Functions] -`` -template -void def(char const* name, F f); - -template -void def(char const* name, Fn fn, A1 const&); - -template -void def(char const* name, Fn fn, A1 const&, A2 const&); - -template -void def(char const* name, Fn fn, A1 const&, A2 const&, A3 const&); -`` -[variablelist -[[Requires][name is an [link ntbs] which conforms to Python's [@http://www.python.org/doc/current/ref/identifiers.html identifier naming rules]. - -* If `Fn` is [derived from] [link object_wrappers.boost_python_object_hpp.class_object object], it will be added to the [link high_level_components.boost_python_scope_hpp.introduction current scope] as a single overload. To be useful, `fn` should be [@http://www.python.org/doc/current/lib/built-in-funcs.html#l2h-6 callable]. -* If `a1` is the result of an [link function_invocation_and_creation.boost_python_overloads_hpp.introduction.overload_dispatch_expressions overload-dispatch-expression], only the second form is allowed and `fn` must be a pointer to function or pointer to member function whose [link arity] is the same as A1's [link function_invocation_and_creation.boost_python_overloads_hpp.introduction.overload_dispatch_expressions maximum arity]. - - [*Effects:] For each prefix `P` of `Fn`\ 's sequence of argument types, beginning with the one whose length is `A1`\ 's [link function_invocation_and_creation.boost_python_overloads_hpp.introduction.overload_dispatch_expressions minimum arity], adds a `name(...)` function overload to the [link high_level_components.boost_python_scope_hpp.introduction current scope]. 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. - -* Otherwise, fn must be a non-null function or member function pointer, and a single function overload built around fn is added to the current scope. If any of a1-a3 are supplied, they may be selected in any order from the table below. - - [table - [[Mnemonic Name][Requirements/Type properties][Effects]] - [[docstring][Any [link ntbs]][Value will be bound to the `__doc__` attribute of the resulting method overload.]] - [[policies][A model of [link concepts.callpolicies CallPolicies]][A copy will be used as the call policies of the resulting method overload.]] - [[keywords][The result of a [link function_invocation_and_creation.boost_python_args_hpp.introduction.keyword_expressions keyword-expression] specifying no more arguments than the [link arity] of `fn`.][A copy will be used as the call policies of the resulting method overload.]] -] -]] -] -[endsect] -[section Example] -`` -#include -#include -#include - -using namespace boost::python; - -char const* foo(int x, int y) { return "foo"; } - -BOOST_PYTHON_MODULE(def_test) -{ - def("foo", foo, args("x", "y"), "foo's docstring"); -} -`` -[endsect] -[endsect] diff --git a/doc/reference/def_visitor.qbk b/doc/reference/def_visitor.qbk deleted file mode 100644 index 773402a3..00000000 --- a/doc/reference/def_visitor.qbk +++ /dev/null @@ -1,58 +0,0 @@ -[section boost/python/def_visitor.hpp] -[section Introduction] - provides a generic visitation interface through which the [link high_level_components.boost_python_class_hpp.class_template_class_t_bases_hel class_] def member functionality can be extended non-intrusively to avoid cluttering the [link high_level_components.boost_python_class_hpp.class_template_class_t_bases_hel class_] interface. It declares the `def_visitor` class template, which is parameterized on the derived type `DerivedVisitor`, which provides the actual `def` functionality through its `visit` member functions. -[endsect] -[section Class `def_visitor`] -The class `def_visitor` is a base class paramaterized by its derived class. The `def_visitor` class is a protocol class. Its derived class, DerivedVisitor, is expected to have a member function `visit`. The `def_visitor` class is never instantiated directly. Instead, an instance of its subclass, DerivedVisitor, is passed on as an argument to the [link high_level_components.boost_python_class_hpp.class_template_class_t_bases_hel class_] `def` member function. - -`` -namespace boost { namespace python { - - template - class def_visitor {}; -} -`` - -[variablelist - [[Requires][The client supplied class DerivedVisitor template parameter is expected to: - * be privately derived from def_visitor - * grant friend access to class def_visitor_access - * define either or both visit member functions listed in the table below: - [table - [[Expression][Return Type][Requirements][Effects]] - [[`visitor.visit(cls)`][`void`] - [`cls` is an instance of a [link high_level_components.boost_python_class_hpp.class_template_class_t_bases_hel class_] being wrapped to Python. `visitor` is a `def_visitor` derived class.] - [A call to `cls.def(visitor)` forwards to this member function.]] - [[`visitor.visit(cls, name, options)`][`void`] - [`cls` is a [link high_level_components.boost_python_class_hpp.class_template_class_t_bases_hel class_] instance, name is a C string. `visitor` is a `def_visitor` derived class. options is a context specific optional argument.] - [A call to `cls.def(name, visitor)` or `cls.def(name, visitor, options)` forwards to this member function. ]]] - ]] - ] -[endsect] -[section Example] -`` -class X {/*...*/}; - -class my_def_visitor : boost::python::def_visitor -{ - friend class def_visitor_access; - - template - void visit(classT& c) const - { - c.def("foo", &my_def_visitor::foo); - c.def("bar", &my_def_visitor::bar); - } - - static void foo(X& self); - static void bar(X& self); -}; - -BOOST_PYTHON_MODULE(my_ext) -{ - class_("X") - .def(my_def_visitor()); -} -`` -[endsect] -[endsect] diff --git a/doc/reference/default_call_policies.qbk b/doc/reference/default_call_policies.qbk deleted file mode 100644 index 99b969be..00000000 --- a/doc/reference/default_call_policies.qbk +++ /dev/null @@ -1,58 +0,0 @@ -[section boost/python/default_call_policies.hpp] -[section Class `default_call_policies`] -`default_call_policies` is a model of [link concepts.callpolicies `CallPolicies`] with no `precall` or `postcall` behavior and a `result_converter` which handles by-value returns. Wrapped C++ functions and member functions `use default_call_policies` unless otherwise specified. You may find it convenient to derive new models of [link concepts.callpolicies `CallPolicies`] from `default_call_policies`. -`` -namespace boost { namespace python -{ - struct default_call_policies - { - static bool precall(PyObject*); - static PyObject* postcall(PyObject*, PyObject* result); - typedef default_result_converter result_converter; - template struct extract_return_type : mpl::front{}; - }; -}} -`` -[endsect] -[section Class `default_call_policies` static functions] -``bool precall(PyObject*);`` -[variablelist -[[Returns][true]] -[[Throws][nothing]] -] -``PyObject* postcall(PyObject*, PyObject* result);`` -[variablelist -[[Returns][result]] -[[Throws][nothing]] -] -[endsect] -[section Class `default_result_converter`] -default_result_converter is a model of [link concepts.resultconverter.resultconvertergenerator_concept `ResultConverterGenerator`] which can be used to wrap C++ functions returning non-pointer types, `char const*`, and `PyObject*`, by-value. -`` -namespace boost { namespace python -{ - struct default_result_converter - { - template struct apply; - }; -}} -`` -[endsect] -[section Class `default_result_converter` metafunctions] -``template struct apply`` -[variablelist -[[Requires][T is not a reference type. If T is a pointer type, T is const char* or PyObject*. ]] -[[Returns][typedef to_python_value type;]] -] -[endsect] -[section Example] -This example comes from the Boost.Python implementation itself. Because the return_value_policy class template does not implement precall or postcall behavior, its default base class is default_call_policies: -`` -template -struct return_value_policy : Base -{ - typedef Handler result_converter; -}; -`` -[endsect] -[endsect] diff --git a/doc/reference/dict.qbk b/doc/reference/dict.qbk deleted file mode 100644 index e32d35e4..00000000 --- a/doc/reference/dict.qbk +++ /dev/null @@ -1,71 +0,0 @@ -[section boost/python/dict.hpp] -[section Introduction] -Exposes a [link concepts.objectwrapper.typewrapper_concept_requirements TypeWrapper] for the Python [@http://www.python.org/dev/doc/devel/lib/typesmapping.html `dict`] type. -[endsect] -[section Class `dict`] -Exposes the [@http://www.python.org/dev/doc/devel/lib/typesmapping.html mapping protocol] of Python's built-in `dict` type. The semantics of the constructors and member functions defined below can be fully understood by reading the [link concepts.objectwrapper.typewrapper_concept_requirements TypeWrapper] concept definition. Since `dict` is publicly derived from [link object_wrappers.boost_python_object_hpp.class_object `object`], the public `object` interface applies to `dict` instances as well. -`` -namespace boost { namespace python -{ - class dict : public object - { - dict(); - - template< class T > - dict(T const & data); - - // modifiers - void clear(); - dict copy(); - - template - tuple popitem(); - - template - object setdefault(T const &k); - - template - object setdefault(T1 const & k, T2 const & d); - - void update(object_cref E); - - template< class T > - void update(T const & E); - - // observers - list values() const; - - object get(object_cref k) const; - - template - object get(T const & k) const; - - object get(object_cref k, object_cref d) const; - object get(T1 const & k, T2 const & d) const; - - bool has_key(object_cref k) const; - - template< class T > - bool has_key(T const & k) const; - - list items() const; - object iteritems() const; - object iterkeys() const; - object itervalues() const; - list keys() const; - }; -}} -`` -[endsect] -[section Example] -`` -using namespace boost::python; -dict swap_object_dict(object target, dict d) -{ - dict result = extract(target.attr("__dict__")); - target.attr("__dict__") = d; - return result; -} -`` -[endsect] -[endsect] diff --git a/doc/reference/docstring_options.qbk b/doc/reference/docstring_options.qbk deleted file mode 100644 index 00b52282..00000000 --- a/doc/reference/docstring_options.qbk +++ /dev/null @@ -1,213 +0,0 @@ -[section boost/python/docstring_options.hpp] -[section Introduction] -Boost.Python supports user-defined docstrings with automatic appending of C++ signatures. These features are enabled by default. The class docstring_options is available to selectively suppress the user-defined docstrings, signatures, or both. -[endsect] -[section Class `docstring_options`] -Controls the appearance of docstrings of wrapped functions and member functions for the life-time of the instance. The instances are noncopyable to eliminate the possibility of surprising side effects. - -``namespace boost { namespace python { - - class docstring_options : boost::noncopyable - { - public: - docstring_options(bool show_all=true); - docstring_options(bool show_user_defined, bool show_signatures); - docstring_options(bool show_user_defined, bool show_py_signatures, bool show_cpp_signatures); - ~docstring_options(); - void disable_user_defined(); - void enable_user_defined(); - void disable_signatures(); - void enable_signatures(); - void disable_py_signatures(); - void enable_py_signatures(); - void disable_cpp_signatures(); - void enable_cpp_signatures(); - void disable_all(); - void enable_all(); - }; -}} - -`` -[endsect] -[section Class dostring_options constructors] -`` -docstring_options(bool show_all=true); -`` -[variablelist -[[Effects][Constructs a docstring_options object which controls the appearance of function and member-function docstrings defined in the code that follows. If show_all is true, both the user-defined docstrings and the automatically generated Python and C++ signatures are shown. If show_all is false the `__doc__` attributes are `None`.]] -] -`` -docstring_options(bool show_user_defined, bool show_signatures); -`` -[variablelist -[[Effects][Constructs a `docstring_options` object which controls the appearance of function and member-function docstrings defined in the code that follows. Iff `show_user_defined` is `true`, the user-defined docstrings are shown. Iff `show_signatures` is `true`, Python and C++ signatures are automatically added. If both `show_user_defined` and `show_signatures` are `false`, the `__doc__` attributes are `None`.]] -] -`` -docstring_options(bool show_user_defined, bool show_py_signatures, bool show_cpp_signatures); -`` -[variablelist -[[Effects][Constructs a `docstring_options` object which controls the appearance of function and member-function docstrings defined in the code that follows. Iff `show_user_defined` is `true`, the user-defined docstrings are shown. Iff `show_py_signatures` is `true`, Python signatures are automatically added. Iff `show_cpp_signatures` is true, C++ signatures are automatically added. If all parameters are `false`, the `__doc__` attributes are `None`.]] -] -[endsect] -[section Class docstring_options destructor] -``~docstring_options();`` -[variablelist -[[Effects][Restores the previous state of the docstring options. In particular, if `docstring_options` instances are in nested C++ scopes the settings effective in the enclosing scope are restored. If the last `docstring_options` instance goes out of scope the default "all on" settings are restored.]]] -[endsect] -[section Class `docstring_options` modifier functions] -`` -void disable_user_defined(); -void enable_user_defined(); -void disable_signatures(); -void enable_signatures(); -void disable_py_signatures(); -void enable_py_signatures(); -void disable_cpp_signatures(); -void enable_cpp_signatures(); -void disable_all(); -void enable_all(); -`` -These member functions dynamically change the appearance of docstrings in the code that follows. The `*_user_defined()` and `*_signatures()` member functions are provided for fine-grained control. The `*_all()` member functions are convenient shortcuts to manipulate all settings simultaneously. -[endsect] -[section Example] -[section Docstring options defined at compile time] -`` -#include -#include -#include - -void foo() {} - -BOOST_PYTHON_MODULE(demo) -{ - using namespace boost::python; - docstring_options doc_options(DEMO_DOCSTRING_SHOW_ALL); - def("foo", foo, "foo doc"); -} -`` -If compiled with `-DDEMO_DOCSTRING_SHOW_ALL=true`: -`` ->>> import demo ->>> print demo.foo.__doc__ -foo() -> None : foo doc -C++ signature: - foo(void) -> void -`` -If compiled with `-DDEMO_DOCSTRING_SHOW_ALL=false`: -`` ->>> import demo ->>> print demo.foo.__doc__ -None -`` -[endsect] -[section Selective suppressions] -`` -#include -#include -#include -#include - -int foo1(int i) { return i; } -int foo2(long l) { return static_cast(l); } -int foo3(float f) { return static_cast(f); } -int foo4(double d) { return static_cast(d); } - -BOOST_PYTHON_MODULE(demo) -{ - using namespace boost::python; - docstring_options doc_options; - def("foo1", foo1, arg("i"), "foo1 doc"); - doc_options.disable_user_defined(); - def("foo2", foo2, arg("l"), "foo2 doc"); - doc_options.disable_signatures(); - def("foo3", foo3, arg("f"), "foo3 doc"); - doc_options.enable_user_defined(); - def("foo4", foo4, arg("d"), "foo4 doc"); - doc_options.enable_py_signatures(); - def("foo5", foo4, arg("d"), "foo5 doc"); - doc_options.disable_py_signatures(); - doc_options.enable_cpp_signatures(); - def("foo6", foo4, arg("d"), "foo6 doc"); -} -`` -Python code: -`` ->>> import demo ->>> print demo.foo1.__doc__ -foo1( (int)i) -> int : foo1 doc -C++ signature: - foo1(int i) -> int ->>> print demo.foo2.__doc__ -foo2( (int)l) -> int : -C++ signature: - foo2(long l) -> int ->>> print demo.foo3.__doc__ -None ->>> print demo.foo4.__doc__ -foo4 doc ->>> print demo.foo5.__doc__ -foo5( (float)d) -> int : foo5 doc ->>> print demo.foo6.__doc__ -foo6 doc -C++ signature: - foo6(double d) -> int -`` -[endsect] -[section Wrapping from multiple C++ scopes] -`` -#include -#include -#include -#include - -int foo1(int i) { return i; } -int foo2(long l) { return static_cast(l); } - -int bar1(int i) { return i; } -int bar2(long l) { return static_cast(l); } - -namespace { - - void wrap_foos() - { - using namespace boost::python; - // no docstring_options here - // -> settings from outer C++ scope are in effect - def("foo1", foo1, arg("i"), "foo1 doc"); - def("foo2", foo2, arg("l"), "foo2 doc"); - } - - void wrap_bars() - { - using namespace boost::python; - bool show_user_defined = true; - bool show_signatures = false; - docstring_options doc_options(show_user_defined, show_signatures); - def("bar1", bar1, arg("i"), "bar1 doc"); - def("bar2", bar2, arg("l"), "bar2 doc"); - } -} - -BOOST_PYTHON_MODULE(demo) -{ - boost::python::docstring_options doc_options(false); - wrap_foos(); - wrap_bars(); -} -`` -Python code: -`` ->>> import demo ->>> print demo.foo1.__doc__ -None ->>> print demo.foo2.__doc__ -None ->>> print demo.bar1.__doc__ -bar1 doc ->>> print demo.bar2.__doc__ -bar2 doc -`` - -[endsect] -[endsect] -[endsect] diff --git a/doc/reference/embedding.qbk b/doc/reference/embedding.qbk deleted file mode 100644 index 77461b9b..00000000 --- a/doc/reference/embedding.qbk +++ /dev/null @@ -1,6 +0,0 @@ -[chapter Embedding - [quickbook 1.7] -] - -[include exec.qbk] -[include import.qbk] diff --git a/doc/reference/enum.qbk b/doc/reference/enum.qbk deleted file mode 100644 index ece2d298..00000000 --- a/doc/reference/enum.qbk +++ /dev/null @@ -1,107 +0,0 @@ -[section boost/python/enum.hpp] -[section Introduction] - defines the interface through which users expose their C++ enumeration types to Python. It declares the `enum_` class template, which is parameterized on the enumeration type being exposed. -[endsect] -[section Class template `enum_`] -Creates a Python class derived from Python's `int` type which is associated with the C++ type passed as its first parameter. -`` -namespace boost { namespace python -{ - template - class enum_ : public object - { - enum_(char const* name, char const* doc = 0); - enum_& value(char const* name, T); - enum_& export_values(); - }; -}} -`` -[endsect] -[section Class template `enum_` constructors] -``enum_(char const* name, char const* doc=0);`` -[variablelist -[[Requires][name is an [link ntbs] which conforms to Python's [@http://www.python.org/doc/current/ref/identifiers.html identifier naming rules].]] -[[Effects][Constructs an `enum_` object holding a Python extension type derived from `int` which is named `name`. The named attribute of the [link high_level_components.boost_python_scope_hpp current scope] is bound to the new extension type.]] -] -[endsect] -[section Class template `enum_` modifier functions] -``enum_& value(char const* name, T x);`` -[variablelist -[[Requires][name is an [link ntbs] which conforms to Python's [@http://www.python.org/doc/current/ref/identifiers.html identifier naming rules].]] -[[Effects][adds an instance of the wrapped enumeration type with value x to the type's dictionary as the named attribute.]] -[[Returns][`*this`]] -] -``enum_& export_values();`` -[variablelist -[[Effects][sets attributes in the [link high_level_components.boost_python_scope_hpp current scope] with the same names and values as all enumeration values exposed so far by calling value().]] -[[Returns][`*this`]] -] -[endsect] -[section Example] -C++ module definition -`` -#include -#include -#include - -using namespace boost::python; - -enum color { red = 1, green = 2, blue = 4 }; - -color identity_(color x) { return x; } - -BOOST_PYTHON_MODULE(enums) -{ - enum_("color") - .value("red", red) - .value("green", green) - .export_values() - .value("blue", blue) - ; - - def("identity", identity_); -} -`` -Interactive Python: -`` ->>> from enums import * - ->>> identity(red) -enums.color.red - ->>> identity(color.red) -enums.color.red - ->>> identity(green) -enums.color.green - ->>> identity(color.green) -enums.color.green - ->>> identity(blue) -Traceback (most recent call last): - File "", line 1, in ? -NameError: name 'blue' is not defined - ->>> identity(color.blue) -enums.color.blue - ->>> identity(color(1)) -enums.color.red - ->>> identity(color(2)) -enums.color.green - ->>> identity(color(3)) -enums.color(3) - ->>> identity(color(4)) -enums.color.blue - ->>> identity(1) -Traceback (most recent call last): - File "", line 1, in ? -TypeError: bad argument type for built-in operation -`` -[endsect] -[endsect] diff --git a/doc/reference/errors.qbk b/doc/reference/errors.qbk deleted file mode 100644 index 2103017c..00000000 --- a/doc/reference/errors.qbk +++ /dev/null @@ -1,142 +0,0 @@ -[section boost/python/errors.hpp] -[section Introduction] - provides types and functions for managing and translating between Python and C++ exceptions. This is relatively low-level functionality that is mostly used internally by Boost.Python. Users should seldom need it. -[endsect] -[section Class `error_already_set`] -error_already_set is an exception type which can be thrown to indicate that a Python error has occurred. If thrown, the precondition is that [@http://www.python.org/doc/2.2/api/exceptionHandling.html#l2h-71 PyErr_Occurred()] returns a value convertible to `true`. Portable code shouldn't throw this exception type directly, but should instead use [link high_level_components.boost_python_errors_hpp.functions throw_error_already_set()], below. -`` -namespace boost { namespace python -{ - class error_already_set {}; -}} -`` -[endsect] -[section Functions] -`` -template bool handle_exception(T f) throw(); -void handle_exception() throw(); -`` -[variablelist -[[Requires][The first form requires that the expression function0(f) is valid. The second form requires that a C++ exception is currently being handled (see section 15.1 in the C++ standard).]] -[[Effects][The first form calls f() inside a try block which first attempts to use all registered [link high_level_components.boost_python_exception_translato exception translators]. If none of those translates the exception, the catch clauses then set an appropriate Python exception for the C++ exception caught, returning true if an exception was thrown, false otherwise. The second form passes a function which rethrows the exception currently being handled to the first form.]] -[[Postconditions][No exception is being handled]] -[[Throws][nothing]] -[[Rationale][At inter-language boundaries it is important to ensure that no C++ exceptions escape, since the calling language usually doesn't have the equipment necessary to properly unwind the stack. Use handle_exception to manage exception translation whenever your C++ code is called directly from the Python API. This is done for you automatically by the usual function wrapping facilities: [link function_invocation_and_creation.boost_python_make_function_hpp.functions make_function()], [link function_invocation_and_creation.boost_python_make_function_hpp.functions make_constructor()], [link high_level_components.boost_python_def_hpp.functions def()] and [link high_level_components.boost_python_class_hpp.class_template_class_t_bases_hel.class_template_class_modifier_fu class_::def()]. The second form can be more convenient to use (see the example below), but various compilers have problems when exceptions are rethrown from within an enclosing try block.]] -] -``template T* expect_non_null(T* x);`` -[variablelist -[[Returns][x]] -[[Throws][error_already_set() iff x == 0.]] -[[Rationale][Simplifies error-handling when calling functions in the Python/C API which return 0 on error.]] -] -``void throw_error_already_set();`` -[variablelist -[[Effects][throw error_already_set();]] -[[Rationale][Simplifies error-handling when calling functions in the Python/C API which return 0 on error.]] -] -``void throw_error_already_set();`` -[variablelist -[[Effects][throw error_already_set();]] -[[Rationale][Many platforms and compilers are not able to consistently catch exceptions thrown across shared library boundaries. Using this function from the Boost.Python library ensures that the appropriate catch block in handle_exception() can catch the exception.]] -] -[endsect] -[section Example] -`` -#include -#include -#include -#include - -// Returns a std::string which has the same value as obj's "__name__" -// attribute. -std::string get_name(boost::python::object obj) -{ - // throws if there's no __name__ attribute - PyObject* p = boost::python::expect_non_null( - PyObject_GetAttrString(obj.ptr(), "__name__")); - - char const* s = PyString_AsString(p); - if (s != 0) - Py_DECREF(p); - - // throws if it's not a Python string - std::string result( - boost::python::expect_non_null( - PyString_AsString(p))); - - Py_DECREF(p); // Done with p - - return result; -} - -// -// Demonstrate form 1 of handle_exception -// - -// Place into result a Python Int object whose value is 1 if a and b have -// identical "__name__" attributes, 0 otherwise. -void same_name_impl(PyObject*& result, boost::python::object a, boost::python::object b) -{ - result = PyInt_FromLong( - get_name(a) == get_name(a2)); -} - -object borrowed_object(PyObject* p) -{ - return boost::python::object( - boost::python::handle<>( - boost::python::borrowed(a1))); -} - -// This is an example Python 'C' API interface function -extern "C" PyObject* -same_name(PyObject* args, PyObject* keywords) -{ - PyObject* a1; - PyObject* a2; - PyObject* result = 0; - - if (!PyArg_ParseTuple(args, const_cast("OO"), &a1, &a2)) - return 0; - - // Use boost::bind to make an object compatible with - // boost::Function0 - if (boost::python::handle_exception( - boost::bind(same_name_impl, boost::ref(result), borrowed_object(a1), borrowed_object(a2)))) - { - // an exception was thrown; the Python error was set by - // handle_exception() - return 0; - } - - return result; -} - -// -// Demonstrate form 2 of handle_exception. Not well-supported by all -// compilers. -// -extern "C" PyObject* -same_name2(PyObject* args, PyObject* keywords) -{ - PyObject* a1; - PyObject* a2; - PyObject* result = 0; - - if (!PyArg_ParseTuple(args, const_cast("OO"), &a1, &a2)) - return 0; - - try { - return PyInt_FromLong( - get_name(borrowed_object(a1)) == get_name(borrowed_object(a2))); - } - catch(...) - { - // If an exception was thrown, translate it to Python - boost::python::handle_exception(); - return 0; - } -} -`` -[endsect] -[endsect] diff --git a/doc/reference/exception_translator.qbk b/doc/reference/exception_translator.qbk deleted file mode 100644 index e9fb0a89..00000000 --- a/doc/reference/exception_translator.qbk +++ /dev/null @@ -1,51 +0,0 @@ -[section boost/python/exception_translator.hpp] -[section Introduction] -As described [link high_level_components.boost_python_errors_hpp.introduction here], it is important to make sure that exceptions thrown by C++ code do not pass into the Python interpreter core. By default, Boost.Python translates all C++ exceptions thrown by wrapped functions and module init functions into Python, but the default translators are extremely limited: most C++ exceptions will appear in Python as a [@http://www.python.org/doc/current/lib/module-exceptions.html RuntimeError] exception whose representation is 'Unidentifiable C++ Exception'. To produce better error messages, users can register additional exception translators as described below. -[endsect] -[section Function `register_exception_translator`] -`` -template -void register_exception_translator(Translate translate); -`` -[variablelist -[[Requires][Translate is CopyConstructible, and the following code must be well-formed: -``void f(ExceptionType x) { translate(x); }``. -The expression `translate(x)` must either throw a C++ exception, or a subsequent call to `PyErr_Occurred()` must return 1. ]] -[[Effects][Adds a copy of translate to the sequence of exception translators tried when Boost.Python catches an exception that is about to pass into Python's core interpreter. The new translator will get "first shot" at translating all exceptions matching the catch clause shown above. Any subsequently-registered translators will be allowed to translate the exception earlier. A translator which cannot translate a given C++ exception can re-throw it, and it will be handled by a translator which was registered earlier (or by the default translator).]] -] -[endsect] -[section Example] -`` -#include -#include -#include -#include - -struct my_exception : std::exception -{ - char const* what() throw() { return "One of my exceptions"; } -}; - -void translate(my_exception const& e) -{ - // Use the Python 'C' API to set up an exception object - PyErr_SetString(PyExc_RuntimeError, e.what()); -} - -void something_which_throws() -{ - ... - throw my_exception(); - ... -} - -BOOST_PYTHON_MODULE(exception_translator_ext) -{ - using namespace boost::python; - register_exception_translator(&translate); - - def("something_which_throws", something_which_throws); -} -`` -[endsect] -[endsect] diff --git a/doc/reference/exec.qbk b/doc/reference/exec.qbk deleted file mode 100644 index 2cd46c45..00000000 --- a/doc/reference/exec.qbk +++ /dev/null @@ -1,84 +0,0 @@ -[section boost/python/exec.hpp] -[section Introduction] -Exposes a mechanism for embedding the python interpreter into C++ code. -[endsect] -[section Function `eval`] -`` -object eval(str expression, - object globals = object(), - object locals = object()); -`` -[variablelist -[[Effects][Evaluate Python expression from expression in the context specified by the dictionaries globals and locals. ]] -[[Returns][An instance of object which holds the value of the expression.]] -] -[endsect] -[section Function `exec`] -`` -object exec(str code, - object globals = object(), - object locals = object()); -`` -[variablelist -[[Effects][Execute Python source code from code in the context specified by the dictionaries globals and locals. ]] -[[Returns][ An instance of object which holds the result of executing the code. ]] -] -[endsect] -[section Function `exec_file`] -`` -object exec_file(str filename, - object globals = object(), - object locals = object()); -`` -[variablelist -[[Effects][Execute Python source code from the file named by filename in the context specified by the dictionaries globals and locals.]] -[[Returns][An instance of object which holds the result of executing the code. ]] -] -[endsect] -[section Examples] -The following example demonstrates the use of import and exec to define a function in python, and later call it from within C++. - -`` -#include -#include - -using namespace boost::python; - -void greet() -{ - // Retrieve the main module. - object main = import("__main__"); - - // Retrieve the main module's namespace - object global(main.attr("__dict__")); - - // Define greet function in Python. - object result = exec( - "def greet(): \n" - " return 'Hello from Python!' \n", - global, global); - - // Create a reference to it. - object greet = global["greet"]; - - // Call it. - std::string message = extract(greet()); - std::cout << message << std::endl; -} - `` - Instead of embedding the python script into a string, we could also store it in an a file... -`` -def greet(): - return 'Hello from Python!' -`` - ... and execute that instead. - -`` - // ... - // Load the greet function from a file. - object result = exec_file(script, global, global); - // ... -} -`` -[endsect] -[endsect] diff --git a/doc/reference/extract.qbk b/doc/reference/extract.qbk deleted file mode 100644 index 2c8ffcdb..00000000 --- a/doc/reference/extract.qbk +++ /dev/null @@ -1,99 +0,0 @@ -[section boost/python/extract.hpp] -[section Introduction] -Exposes a mechanism for extracting C++ object values from generalized Python objects. Note that `extract<...>` can also be used to "downcast" an [link object_wrappers.boost_python_object_hpp.class_object `object`] to some specific [link concepts.objectwrapper ObjectWrapper]. Because invoking a mutable python type with an argument of the same type (e.g. `list([1,2]`) typically makes a copy of the argument object, this may be the only way to access the [link concepts.objectwrapper ObjectWrapper]\ 's interface on the original object. -[endsect] -[section Class template `extract`] -`extract` can be used to extract a value of an arbitrary C++ type from an instance of [link object_wrappers.boost_python_object_hpp.class_object object]. Two usages are supported: - -# `extract(o)` is a temporary object which is implicitly convertible to `T` (explicit conversion is also available through the object's function-call operator). However, if no conversion is available which can convert o to an object of type `T`, a Python TypeError exception will be raised. -# `extract x(o);` constructs an extractor whose `check()` member function can be used to ask whether a conversion is available without causing an exception to be thrown. - -`` -namespace boost { namespace python -{ - template - struct extract - { - typedef unspecified result_type; - - extract(PyObject*); - extract(object const&); - - result_type operator()() const; - operator result_type() const; - - bool check() const; - }; -}} -`` -[endsect] -[section Class template `extract` constructors and destructor] -`` -extract(PyObject* p); -extract(object const&); -`` -[variablelist -[[Requires][The first form requires that p is non-null.]] -[[Effects][Stores a pointer to the Python object managed by its constructor argument. In particular, the reference count of the object is not incremented. The onus is on the user to be sure it is not destroyed before the extractor's conversion function is called.]] -] -[endsect] -[section Class template `extract` observer functions] -`` -result_type operator()() const; -operator result_type() const; -`` -[variablelist -[[Effects][Converts the stored pointer to result_type, which is either T or T const&. ]] -[[Returns][An object of result_type corresponding to the one referenced by the stored pointer.]] -[[Throws][[link high_level_components.boost_python_errors_hpp.class_error_already_set `error_already_set`] and sets a `TypeError` if no such conversion is available. May also emit other unspecified exceptions thrown by the converter which is actually used.]] -] -`` bool check() const;`` -[variablelist -[[Postconditions][None. In particular, note that a return value of true does not preclude an exception being thrown from operator result_type() or operator()().]] -[[Returns][false only if no conversion from the stored pointer to T is available.]] -] -[endsect] -[section Example] -`` -#include -using namespace boost::python; -int Print(str s) -{ - // extract a C string from the Python string object - char const* c_str = extract(s); - - // Print it using printf - std::printf("%s\n", c_str); - - // Get the Python string's length and convert it to an int - return extract(s.attr("__len__")()) -} -`` - The following example shows how extract can be used along with [link high_level_components.boost_python_class_hpp.class_template_class_t_bases_hel `class_<...>`] to create and access an instance of a wrapped C++ class. -`` -struct X -{ - X(int x) : v(x) {} - int value() { return v; } - private: - int v; -}; - -BOOST_PYTHON_MODULE(extract_ext) -{ - object x_class( - class_("X", init()) - .def("value", &X::value)) - ; - - // Instantiate an X object through the Python interface. - // Its lifetime is now managed by x_obj. - object x_obj = x_class(3); - - // Get a reference to the C++ object out of the Python object - X& x = extract(x_obj); - assert(x.value() == 3); -} -`` -[endsect] -[endsect] diff --git a/doc/reference/function_doc_signature.qbk b/doc/reference/function_doc_signature.qbk deleted file mode 100644 index 992f478c..00000000 --- a/doc/reference/function_doc_signature.qbk +++ /dev/null @@ -1,129 +0,0 @@ -[section boost/python/function_doc_signature.hpp] -[section Introduction] -Boost.Python supports docstrings with automatic appending of Pythonic and C++ signatures. This feature is implemented by class `function_doc_signature_generator`. The class uses all of the overloads, supplied arg names and default values, as well as the user-defined docstrings, to generate documentation for a given function. -[endsect] -[section Class `function_doc_signature_generator`] -The class has only one public function which returns a list of strings documenting the overloads of a function. -`` -namespace boost { namespace python { namespace objects { - - class function_doc_signature_generator - { - public: - static list function_doc_signatures(function const *f); - }; - -}}} -`` -[endsect] -[section Example] -`` -#include -#include -#include -#include -#include -#include -#include - -using namespace boost::python; - -tuple f(int x = 1, double y = 4.25, char const* z = "wow") -{ - return make_tuple(x, y, z); -} - -BOOST_PYTHON_FUNCTION_OVERLOADS(f_overloads, f, 0, 3) - - -struct X -{ - tuple f(int x = 1, double y = 4.25, char const* z = "wow") - { - return make_tuple(x, y, z); - } -}; - -BOOST_PYTHON_MEMBER_FUNCTION_OVERLOADS(X_f_overloads, X::f, 0, 3) - -tuple raw_func(tuple args, dict kw) -{ - return make_tuple(args, kw); -} - -BOOST_PYTHON_MODULE(args_ext) -{ - def("f", f, (arg("x")=1, arg("y")=4.25, arg("z")="wow") - , "This is f's docstring" - ); - - def("raw", raw_function(raw_func)); - - def("f1", f, f_overloads("f1's docstring", args("x", "y", "z"))); - - - class_("X", "This is X's docstring", init<>(args("self"))) - .def("f", &X::f - , "This is X.f's docstring" - , args("self","x", "y", "z")) - - ; - -} -`` -Python code: [python] -`` ->>> import args_ext ->>> help(args_ext) -Help on module args_ext: - -NAME - args_ext - -FILE - args_ext.pyd - -CLASSES - Boost.Python.instance(__builtin__.object) - X - - class X(Boost.Python.instance) - | This is X's docstring - | - | Method resolution order: - | X - | Boost.Python.instance - | __builtin__.object - | - | Methods defined here: - | - | __init__(...) - | __init__( (object)self) -> None : - | C++ signature: - | void __init__(struct _object *) - | - | f(...) - | f( (X)self, (int)x, (float)y, (str)z) -> tuple : This is X.f's docstring - | C++ signature: - | class boost::python::tuple f(struct X {lvalue},int,double,char const *) - | - | ................. - | -FUNCTIONS - f(...) - f([ (int)x=1 [, (float)y=4.25 [, (str)z='wow']]]) -> tuple : This is f's docstring - C++ signature: - class boost::python::tuple f([ int=1 [,double=4.25 [,char const *='wow']]]) - - f1(...) - f1([ (int)x [, (float)y [, (str)z]]]) -> tuple : f1's docstring - C++ signature: - class boost::python::tuple f1([ int [,double [,char const *]]]) - - raw(...) - object raw(tuple args, dict kwds) : - C++ signature: - object raw(tuple args, dict kwds) -`` -[endsect] -[endsect] diff --git a/doc/reference/functions.qbk b/doc/reference/functions.qbk deleted file mode 100644 index 40b220cd..00000000 --- a/doc/reference/functions.qbk +++ /dev/null @@ -1,35 +0,0 @@ -[chapter Function Invocation and Creation - [quickbook 1.7] -] - -[include args.qbk] -[include call.qbk] -[include call_method.qbk] -[include data_members.qbk] -[include make_function.qbk] -[include overloads.qbk] -[include ptr.qbk] -[include raw_function.qbk] -[section Function documentation] -[include function_doc_signature.qbk] -[include pytype_function.qbk] -[endsect] -[section Models of CallPolicies] -[include default_call_policies.qbk] -[include return_arg.qbk] -[include return_internal_reference.qbk] -[include return_value_policy.qbk] -[include with_custodian_and_ward.qbk] -[endsect] -[section Models of ResultConverter] -[include to_python_indirect.qbk] -[include to_python_value.qbk] -[endsect] -[section Models of ResultConverterGenerator] -[include copy_const_reference.qbk] -[include copy_non_const_reference.qbk] -[include manage_new_object.qbk] -[include reference_existing_object.qbk] -[include return_by_value.qbk] -[include return_opaque_pointer.qbk] -[endsect] diff --git a/doc/reference/handle.qbk b/doc/reference/handle.qbk deleted file mode 100644 index c7c63abc..00000000 --- a/doc/reference/handle.qbk +++ /dev/null @@ -1,190 +0,0 @@ -[section boost/python/handle.hpp] -[section Introduction] - provides class template `handle`, a smart pointer for managing reference-counted Python objects. -[endsect] -[section Class template `handle`] -`handle` is a smart pointer to a Python object type; it holds a pointer of type `T*`, where `T` is its template parameter. T must be either a type derived from `PyObject` or a [link pod POD] type whose initial `sizeof(PyObject)` bytes are layout-compatible with `PyObject`. Use `handle<>` at the boundary between the Python/'C' API and high-level code; prefer object for a generalized interface to Python objects. - -In this document, the term "upcast" refers to an operation which converts a pointer `Y*` to a base class `pointer T*` via `static_cast` if `Y` is derived from `T`, or via C-style cast (`T*`) if it is not. However, in the latter case the "upcast" is ill-formed if the initial `sizeof(PyObject)` bytes of `Y` are not layout-compatible with `PyObject`. - -`` -namespace boost { namespace python -{ - template - class handle - { - typedef unspecified-member-function-pointer bool_type; - - public: // types - typedef T element_type; - - public: // member functions - ~handle(); - - template - explicit handle(detail::borrowed >* p); - - template - explicit handle(null_ok >* p); - - template - explicit handle(detail::borrowed* p); - - template - explicit handle(null_ok* p); - - template - explicit handle(Y* p); - - handle(); - - handle& operator=(handle const& r); - - template - handle& operator=(handle const & r); // never throws - - - template - handle(handle const& r); - - handle(handle const& r); - - T* operator-> () const; - T& operator* () const; - T* get() const; - void reset(); - T* release(); - - operator bool_type() const; // never throws - private: - T* m_p; - }; - - template struct null_ok; - namespace detail { template struct borrowed; } -}} -`` -[section Class template `handle` constructors and destructor] -``virtual ~handle();`` -[variablelist -[[Effects][`Py_XDECREF(upcast(m_p))`]] -] -``template -explicit handle(detail::borrowed >* p); -`` -[variablelist -[[Effects][ -``Py_XINCREF(upcast(p)); -m_p = upcast(p); -`` -]] -] -``template -explicit handle(null_ok >* p);`` -[variablelist -[[Effects][ -``Py_XINCREF(upcast(p)); - m_p = upcast(p); -`` -]] -] -``template -explicit handle(detail::borrowed* p);`` -[variablelist -[[Effects][ -``Py_XINCREF(upcast(p)); - m_p = upcast(expect_non_null(p)); -`` -]] -] -``template -explicit handle(null_ok* p); -`` -[variablelist -[[Effects][`m_p = upcast(p);`]] -] -`` -template -explicit handle(Y* p); -`` -[variablelist -[[Effects][`m_p = upcast(expect_non_null(p));`]] -] -`` -handle(); -`` -[variablelist -[[Effects][`m_p = 0;`]] -] -`` -template -handle(handle const& r); -handle(handle const& r); -`` -[variablelist -[[Effects][m_p = r.m_p; Py_XINCREF(upcast(m_p));]] -] -[endsect] -[section Class template `handle` modifiers] -`` -handle& operator=(handle const& r); -template -handle& operator=(handle const & r); // never throws -`` -[variablelist -[[Effects][`Py_XINCREF(upcast(r.m_p)); Py_XDECREF( upcast(m_p)); m_p = r.m_p;`]] -] -`` -T* release(); -`` -[variablelist -[[Effects][`T* x = m_p; m_p = 0; return x;`]] -] -`` -void reset(); -`` -[variablelist -[[Effects][`*this = handle();`]] -] -[endsect] -[section Class template `handle` observers] -`` -T* operator-> () const; -T* get() const; -`` -[variablelist -[[Returns][`m_p;`]] -] -`` -T& operator* () const; -`` -[variablelist -[[Returns][`*m_p;`]] -] -`` -operator bool_type() const; // never throws -`` -[variablelist -[[Returns][`0` if `m_p == 0`, a pointer convertible to true otherwise.]] -] -[endsect] -[endsect] -[section Function `borrowed`] -`` -template -detail::borrowed* borrowed(T* p) -{ - return (detail::borrowed*)p; -} -`` -[endsect] -[section Function `allow_null`] -`` -template -null_ok* allow_null(T* p) -{ - return (null_ok*)p; -} -`` -[endsect] -[endsect] diff --git a/doc/reference/has_back_reference.qbk b/doc/reference/has_back_reference.qbk deleted file mode 100644 index f34fc56e..00000000 --- a/doc/reference/has_back_reference.qbk +++ /dev/null @@ -1,115 +0,0 @@ -[section boost/python/has_back_reference.hpp] -[section Introduction] - defines the predicate metafunction `has_back_reference<>`, which can be specialized by the user to indicate that a wrapped class instance holds a `PyObject*` corresponding to a Python object. -[endsect] -[section Class template `has_back_reference`] -A unary metafunction whose value is true iff its argument is a `pointer_wrapper<>`. -`` -namespace boost { namespace python -{ - template class has_back_reference - { - typedef mpl::false_ type; - }; -}} -`` - -A metafunction that is inspected by Boost.Python to determine how wrapped classes can be constructed. - -`type::value` is an integral constant convertible to bool of unspecified type. -Specializations may substitute a true-valued integral constant wrapper for type iff for each invocation of `class_::def(init< type-sequence...>())` and the implicitly wrapped copy constructor (unless it is noncopyable), there exists a corresponding constructor `WrappedClass::WrappedClass(PyObject*, type-sequence...)`. If such a specialization exists, the WrappedClass constructors will be called with a "back reference" pointer to the corresponding Python object whenever they are invoked from Python. The easiest way to provide this nested type is to derive the specialization from `mpl::true_`. - -[endsect] -[section Examples] -In C++: -`` -#include -#include -#include -#include -#include - -using namespace boost::python; -using boost::shared_ptr; - -struct X -{ - X(PyObject* self) : m_self(self), m_x(0) {} - X(PyObject* self, int x) : m_self(self), m_x(x) {} - X(PyObject* self, X const& other) : m_self(self), m_x(other.m_x) {} - - handle<> self() { return handle<>(borrowed(m_self)); } - int get() { return m_x; } - void set(int x) { m_x = x; } - - PyObject* m_self; - int m_x; -}; - -// specialize has_back_reference for X -namespace boost { namespace python -{ - template <> - struct has_back_reference - : mpl::true_ - {}; -}} - -struct Y -{ - Y() : m_x(0) {} - Y(int x) : m_x(x) {} - int get() { return m_x; } - void set(int x) { m_x = x; } - - int m_x; -}; - -shared_ptr -Y_self(shared_ptr self) { return self; } - -BOOST_PYTHON_MODULE(back_references) -{ - class_("X") - .def(init()) - .def("self", &X::self) - .def("get", &X::get) - .def("set", &X::set) - ; - - class_ >("Y") - .def(init()) - .def("get", &Y::get) - .def("set", &Y::set) - .def("self", Y_self) - ; -} -`` - The following Python session illustrates that x.self() returns the same Python object on which it is invoked, while y.self() must create a new Python object which refers to the same Y instance. - -In Python: -`` ->>> from back_references import * ->>> x = X(1) ->>> x2 = x.self() ->>> x2 is x -1 ->>> (x.get(), x2.get()) -(1, 1) ->>> x.set(10) ->>> (x.get(), x2.get()) -(10, 10) ->>> ->>> ->>> y = Y(2) ->>> y2 = y.self() ->>> y2 is y -0 ->>> (y.get(), y2.get()) -(2, 2) ->>> y.set(20) ->>> (y.get(), y2.get()) -(20, 20) -`` -[endsect] -[endsect] diff --git a/doc/reference/implicit.qbk b/doc/reference/implicit.qbk deleted file mode 100644 index 67ce162e..00000000 --- a/doc/reference/implicit.qbk +++ /dev/null @@ -1,69 +0,0 @@ -[section boost/python/implicit.hpp] -[section Introduction] -`implicitly_convertible` allows Boost.Python to implicitly take advantage of a C++ implicit or explicit conversion when matching Python objects to C++ argument types. -[endsect] -[section Function template `implicit_convertible`] -`` -template -void implicitly_convertible(); -`` -[table -[[Parameter][Description]] -[[Source][The source type of the implicit conversion]] -[[Target][The target type of the implicit conversion]] -] -[variablelist -[[Requires][The declaration `Target t(s);`, where s is of type Source, is valid.]] -[[Effects][registers an rvalue `from_python` converter to Target which can succeed for any `PyObject* p` iff there exists any registered converter which can produce Source rvalues]] -[[Rationale][C++ users expect to be able to take advantage of the same sort of interoperability in Python as they do in C++.]] -] -[endsect] -[section Example] -In C++: -`` -#include -#include -#include - -using namespace boost::python; - -struct X -{ - X(int x) : v(x) {} - operator int() const { return v; } - int v; -}; - -int x_value(X const& x) -{ - return x.v; -} - -X make_x(int n) { return X(n); } - -BOOST_PYTHON_MODULE(implicit_ext) -{ - def("x_value", x_value); - def("make_x", make_x); - - class_("X", - init()) - ; - - implicitly_convertible(); - implicitly_convertible(); -} -`` -In Python: -`` ->>> from implicit_ext import * ->>> x_value(X(42)) -42 ->>> x_value(42) -42 ->>> x = make_x(X(42)) ->>> x_value(x) -42 -`` -[endsect] -[endsect] diff --git a/doc/reference/import.qbk b/doc/reference/import.qbk deleted file mode 100644 index 44e3d1ca..00000000 --- a/doc/reference/import.qbk +++ /dev/null @@ -1,31 +0,0 @@ -[section boost/python/import.hpp] -[section Introduction] -Exposes a mechanism for importing python modules. -[endsect] -[section Function `import`] -``object import(str name);`` -[variablelist -[[Effects][Imports the module named by name.]] -[[Returns][An instance of object which holds a reference to the imported module.]] -] -[endsect] -[section Examples] -The following example demonstrates the use of import to access a function in python, and later call it from within C++. -`` -#include -#include - -using namespace boost::python; - -void print_python_version() -{ - // Load the sys module. - object sys = import("sys"); - - // Extract the python version. - std::string version = extract(sys.attr("version")); - std::cout << version << std::endl; -} -`` -[endsect] -[endsect] diff --git a/doc/reference/indexing.qbk b/doc/reference/indexing.qbk deleted file mode 100644 index 0cfc7c7f..00000000 --- a/doc/reference/indexing.qbk +++ /dev/null @@ -1,271 +0,0 @@ -[section Indexing support] -[section Introduction] -Indexing is a `Boost Python` facility for easy exportation of indexable C++ containers to Python. Indexable containers are containers that allow random access through the `operator[]` (e.g. `std::vector`). - -While `Boost Python` has all the facilities needed to expose indexable C++ containers such as the ubiquitous std::vector to Python, the procedure is not as straightforward as we'd like it to be. Python containers do not map easily to C++ containers. Emulating Python containers in C++ (see Python Reference Manual, [@http://www.python.org/doc/current/ref/sequence-types.html Emulating container types]) using `Boost.Python` is non trivial. There are a lot of issues to consider before we can map a C++ container to Python. These involve implementing wrapper functions for the methods `__len__`, `__getitem__`, `__setitem__`, `__delitem__`, `__iter__` and `__contains__`. - -The goals: - -* Make indexable C++ containers behave exactly as one would expect a Python container to behave. -* Provide default reference semantics for container element indexing (`__getitem__`) such that c[i] can be mutable. Require: - - `` - val = c[i] - c[i].m() - val == c[i] - `` - - where m is a non-const (mutating) member function (method). -* Return safe references from `__getitem__` such that subsequent adds and deletes to and from the container will not result in dangling references (will not crash Python). -* Support slice indexes. -* Accept Python container arguments (e.g. `lists`, `tuples`) wherever appropriate. -* Allow for extensibility through re-definable policy classes. -* Provide predefined support for the most common STL and STL-like indexable containers. - -[endsect] -[section The Indexing Interface] -The `indexing_suite` class is the base class for the management of C++ containers intended to be integrated to Python. The objective is make a C++ container look and feel and behave exactly as we'd expect a Python container. The class automatically wraps these special Python methods (taken from the Python reference: Emulating container types): - -[variablelist -[[__len__(self)] - [Called to implement the built-in function `len()`. Should return the length of the object, an integer `>= 0`. Also, an object that doesn't define a `__nonzero__()` method and whose `__len__()` method returns zero is considered to be false in a Boolean context.]] -[[__getitem__(self, key)] -[Called to implement evaluation of `self[key]`. For sequence types, the accepted keys should be integers and slice objects. Note that the special interpretation of negative indexes (if the class wishes to emulate a sequence type) is up to the `__getitem__()` method. If key is of an inappropriate type, `TypeError` may be raised; if of a value outside the set of indexes for the sequence (after any special interpretation of negative values), IndexError should be raised. [Note: for loops expect that an IndexError will be raised for illegal indexes to allow proper detection of the end of the sequence.]]] -[[__setitem__(self, key, value)] - [Called to implement assignment to self[key]. Same note as for __getitem__(). This should only be implemented for mappings if the objects support changes to the values for keys, or if new keys can be added, or for sequences if elements can be replaced. The same exceptions should be raised for improper key values as for the __getitem__() method.]] -[[__delitem__(self, key)] - [Called to implement deletion of self[key]. Same note as for __getitem__(). This should only be implemented for mappings if the objects support removal of keys, or for sequences if elements can be removed from the sequence. The same exceptions should be raised for improper key values as for the __getitem__() method.]] -[[__iter__(self)] - [This method is called when an iterator is required for a container. This method should return a new iterator object that can iterate over all the objects in the container. For mappings, it should iterate over the keys of the container, and should also be made available as the method iterkeys(). - -Iterator objects also need to implement this method; they are required to return themselves. For more information on iterator objects, see [@http://www.python.org/doc/current/lib/typeiter.html Iterator Types] in the [@http://www.python.org/doc/current/lib/lib.html Python Library Reference].]] - -[[__contains__(self, item)] - [Called to implement membership test operators. Should return true if item is in self, false otherwise. For mapping objects, this should consider the keys of the mapping rather than the values or the key-item pairs.]] - ] -[endsect] -[section index_suite sub-classes] -The `indexing_suite` is not meant to be used as is. A couple of policy functions must be supplied by subclasses of `indexing_suite`. However, a set of indexing_suite subclasses for the standard indexable STL containers will be provided, In most cases, we can simply use the available predefined suites. In some cases, we can refine the predefined suites to suit our needs. -[section vector_index_suite] -The `vector_indexing_suite` class is a predefined `indexing_suite` derived class designed to wrap `std::vector` (and `std::vector`-like [i.e. a class with `std::vector` interface]) classes. It provides all the policies required by the `indexing_suite`. - -Example usage: -`` -class X {...}; -... -class_ >("XVec") - .def(vector_indexing_suite >()) -; -`` - -XVec is now a full-fledged Python container (see the example in full, along with its python test). -[endsect] -[section map_index_suite] -The `map_indexing_suite` class is a predefined `indexing_suite` derived class designed to wrap `std::map` (and `std::map`-like [i.e. a class with `std::map` interface]) classes. It provides all the policies required by the `indexing_suite`. - -Example usage: - -`` -class X {...}; -... - -class_ >("XMap") - .def(map_indexing_suite >()) -; -`` - -By default indexed elements are returned by proxy. This can be disabled by supplying `true` in the `NoProxy` template parameter. XMap is now a full-fledged Python container (see the example in full, along with its python test). -[endsect] -[endsect] -[section `indexing_suite` class] -[table -[[Template Parameter][Requirements][Semantics][Default]] -[[Container][A class type][ The container type to be wrapped to Python. ][]] -[[DerivedPolicies][A subclass of indexing_suite][ Derived classes provide the policy hooks. See DerivedPolicies below. ][]] -[[NoProxy][A boolean][ By default indexed elements have Python reference semantics and are returned by proxy. This can be disabled by supplying true in the NoProxy template parameter. ][false]] -[[NoSlice][A boolean][ Do not allow slicing. ][false]] -[[Data][][The container's data type.][Container::value_type]] -[[Index][][The container's index type.][Container::size_type]] -[[Key][][The container's key type.][Container::value_type]] -] -`` -template -class indexing_suite : unspecified -{ -public: - indexing_suite(); // default constructor -} -`` -[section DerivedPolicies] - -Derived classes provide the hooks needed by the indexing_suite: -`` -data_type& -get_item(Container& container, index_type i); - -static object -get_slice(Container& container, index_type from, index_type to); - -static void -set_item(Container& container, index_type i, data_type const& v); - -static void -set_slice( - Container& container, index_type from, - index_type to, data_type const& v -); - -template -static void -set_slice(Container& container, index_type from, - index_type to, Iter first, Iter last -); - -static void -delete_item(Container& container, index_type i); - -static void -delete_slice(Container& container, index_type from, index_type to); - -static size_t -size(Container& container); - -template -static bool -contains(Container& container, T const& val); - -static index_type -convert_index(Container& container, PyObject* i); - -static index_type -adjust_index(index_type current, index_type from, - index_type to, size_type len); -`` - -Most of these policies are self explanatory. However, convert_index and adjust_index deserve some explanation. - -convert_index converts a Python index into a C++ index that the container can handle. For instance, negative indexes in Python, by convention, start counting from the right(e.g. C[-1] indexes the rightmost element in C). convert_index should handle the necessary conversion for the C++ container (e.g. convert -1 to C.size()-1). convert_index should also be able to convert the type of the index (A dynamic Python type) to the actual type that the C++ container expects. - -When a container expands or contracts, held indexes to its elements must be adjusted to follow the movement of data. For instance, if we erase 3 elements, starting from index 0 from a 5 element vector, what used to be at index 4 will now be at index 1: - -`` - [a][b][c][d][e] ---> [d][e] - ^ ^ - 4 1 -`` - -adjust_index takes care of the adjustment. Given a current index, the function should return the adjusted index when data in the container at index from..to is replaced by len elements. -[endsect] -[endsect] -[section class `vector_indexing_suite`] -[table -[[Template Parameter][Requirements][Semantics][Default]] -[[Container][A class type][ The container type to be wrapped to Python. ][]] -[[NoProxy][A boolean][ By default indexed elements have Python reference semantics and are returned by proxy. This can be disabled by supplying true in the NoProxy template parameter. ][false]] -[[DerivedPolicies][A subclass of indexing_suite][ The vector_indexing_suite may still be derived to further tweak any of the predefined policies. Static polymorphism through CRTP (James Coplien. "Curiously Recurring Template Pattern". C++ Report, Feb. 1995) enables the base indexing_suite class to call policy function of the most derived class ][]] -] -`` -template -class vector_indexing_suite : unspecified_base -{ -public: - - typedef typename Container::value_type data_type; - typedef typename Container::value_type key_type; - typedef typename Container::size_type index_type; - typedef typename Container::size_type size_type; - typedef typename Container::difference_type difference_type; - - data_type& - get_item(Container& container, index_type i); - - static object - get_slice(Container& container, index_type from, index_type to); - - static void - set_item(Container& container, index_type i, data_type const& v); - - static void - set_slice(Container& container, index_type from, - index_type to, data_type const& v); - - template - static void - set_slice(Container& container, index_type from, - index_type to, Iter first, Iter last); - - static void - delete_item(Container& container, index_type i); - - static void - delete_slice(Container& container, index_type from, index_type to); - - static size_t - size(Container& container); - - static bool - contains(Container& container, key_type const& key); - - static index_type - convert_index(Container& container, PyObject* i); - - static index_type - adjust_index(index_type current, index_type from, - index_type to, size_type len); -}; -`` -[endsect] -[section class `map_indexing_suite`] -[table -[[Template Parameter][Requirements][Semantics][Default]] -[[Container][ A class type ][ The container type to be wrapped to Python. ][]] -[[NoProxy][ A boolean ][ By default indexed elements have Python reference semantics and are returned by proxy. This can be disabled by supplying true in the NoProxy template parameter. ][ false ]] -[[DerivedPolicies][ A subclass of indexing_suite ][ The vector_indexing_suite may still be derived to further tweak any of the predefined policies. Static polymorphism through CRTP (James Coplien. "Curiously Recurring Template Pattern". C++ Report, Feb. 1995) enables the base indexing_suite class to call policy function of the most derived class ][]] -] -`` -template -class map_indexing_suite : unspecified_base -{ -public: - - typedef typename Container::value_type value_type; - typedef typename Container::value_type::second_type data_type; - typedef typename Container::key_type key_type; - typedef typename Container::key_type index_type; - typedef typename Container::size_type size_type; - typedef typename Container::difference_type difference_type; - - static data_type& - get_item(Container& container, index_type i); - - static void - set_item(Container& container, index_type i, data_type const& v); - - static void - delete_item(Container& container, index_type i); - - static size_t - size(Container& container); - - static bool - contains(Container& container, key_type const& key); - - static bool - compare_index(Container& container, index_type a, index_type b); - - static index_type - convert_index(Container& container, PyObject* i); -}; -`` -[endsect] -[endsect] diff --git a/doc/reference/init.qbk b/doc/reference/init.qbk deleted file mode 100644 index 7b5a7c11..00000000 --- a/doc/reference/init.qbk +++ /dev/null @@ -1,91 +0,0 @@ -[section boost/python/init.hpp] -[section Introduction] - defines the interface for exposing C++ constructors to Python as extension class `__init__` functions. -[section init-expressions] -An init-expression is used to describe a family of `__init__` methods to be generated for an extension class, and the result has the following properties: -[variablelist -[[docstring][An [link ntbs] whose value will bound to the method's `__doc__` attribute]] -[[keywords][A [link function_invocation_and_creation.boost_python_args_hpp.introduction.keyword_expressions keyword-expression] which will be used to name (a trailing subsequence of) the arguments to the generated `__init__` function(s).]] -[[call_policies][An instance of a model of [link concepts.callpolicies CallPolicies].]] -[[argument_types][An MPL sequence of C++ argument types which will be used to construct the wrapped C++ object. An init expression has one or more valid prefixes which are given by a sequence of prefixes of its argument types.]] -] -[endsect] -[endsect] -[section Class template `init`] -A MPL sequence which can be used to specify a family of one or more __init__ functions. Only the last Ti supplied may be an instantiation of optional<...>. - -`` -namespace boost { namespace python -{ - template - struct init - { - init(char const* doc = 0); - template init(Keywords const& kw, char const* doc = 0); - template init(char const* doc, Keywords const& kw); - - template - unspecified operator[](CallPolicies const& policies) const - }; -}} -`` -[section Class template `init` constructors] -`` -init(char const* doc = 0); -template init(Keywords const& kw, char const* doc = 0); -template init(char const* doc, Keywords const& kw); -`` -[variablelist -[[Requires][If supplied, doc is an [link ntbs]. If supplied, kw is the result of a ]] -[[Effects][The result is an init-expression whose docstring is doc and whose keywords are a reference to kw. If the first form is used, the resulting expression's keywords are empty. The expression's call policies are an instance of [link function_invocation_and_creation.models_of_callpolicies.boost_python_default_call_polici default_call_policies]. If Tn is [link high_level_components.boost_python_init_hpp.class_template_optional optional], the expression's valid prefixes are given by: ``(T1, T2,...Tn-1), (T1, T2,...Tn-1 , U1), (T1, T2,...Tn-1 , U1, U2), ...(T1, T2,...Tn-1 , U1, U2,...Um)``. -Otherwise, the expression has one valid prefix given by the template arguments the user specified. ]] -] -[endsect] -[section Class template `init` observer functions] -`` -template -unspecified operator[](Policies const& policies) const -`` -[variablelist -[[Requires][Policies is a model of [link concepts.callpolicies CallPolicies].]] -[[Effects][Returns a new [link high_level_components.boost_python_init_hpp.introduction.init_expressions init-expression] with all the same properties as the init object except that its call policies are replaced by a reference to policies.]] -] -[endsect] -[endsect] -[section Class template `optional` ] -A MPL sequence which can be used to specify the optional arguments to an __init__ function. -`` -namespace boost { namespace python -{ - template - struct optional {}; -}} -`` -[endsect] -[section Example] -Given the C++ declarations: -`` -class Y; -class X -{ - public: - X(int x, Y* y) : m_y(y) {} - X(double); - private: - Y* m_y; -}; -`` -A corresponing Boost.Python extension class can be created with: -`` -using namespace boost::python; - -class_("X", "This is X's docstring.", - init(args("x","y"), "X.__init__'s docstring")[ - with_custodian_and_ward<1,3>()] - ) - .def(init()) - ; - -`` -[endsect] -[endsect] diff --git a/doc/reference/instance_holder.qbk b/doc/reference/instance_holder.qbk deleted file mode 100644 index c7c53343..00000000 --- a/doc/reference/instance_holder.qbk +++ /dev/null @@ -1,92 +0,0 @@ -[section boost/python/instance_holder.hpp] -[section Introduction] - provides class `instance_holder`, the base class for types which hold C++ instances of wrapped classes. -[endsect] -[section Class template `instance_holder`] -`instance_holder` is an abstract base class whose concrete derived classes hold C++ class instances within their Python object wrappers. To allow multiple inheritance in Python from C++ class wrappers, each such Python object contains a chain of instance_holders. When an `__init__` function for a wrapped C++ class is invoked, a new `instance_holder` instance is created and installed in the Python object using its `install()` function. Each concrete class derived from `instance_holder` must provide a `holds()` implementation which allows Boost.Python to query it for the type(s) it is holding. In order to support the held type's wrapped constructor(s), the class must also provide constructors that can accept an initial `PyObject*` argument referring to the owning Python object, and which forward the rest of their arguments to the constructor of the held type. The initial argument is needed to enable virtual function overriding in Python, and may be ignored, depending on the specific `instance_holder` subclass. -`` -namespace boost { namespace python -{ - class instance_holder : noncopyable - { - public: - // destructor - virtual ~instance_holder(); - - // instance_holder modifiers - void install(PyObject* inst) throw(); - - // instance_holder observers - virtual void* holds(type_info) = 0; - }; -}} -`` -[section Class `intance_holder` destructor] -``virtual ~instance_holder();`` -[variablelist -[[Effects][destroys the object]] -] -[endsect] -[section Class `intance_holder` modifiers] -``void install(PyObject* inst) throw();`` -[variablelist -[[Requires][`inst` is a Python instance of a wrapped C++ class type, or is a type derived from a wrapped C++ class type. ]] -[[Effects][installs the new instance at the head of the Python object's chain of held instances. ]] -[[Throws][nothing]] -] -[endsect] -[section Class `intance_holder` observers] -``virtual void *holds(type_info x) = 0;`` -[variablelist -[[Returns][A pointer to an object of the type described by `x` if `*this` contains such an object, 0 otherwise. ]] -] -[endsect] -[endsect] -[section Examples] -The following is a simplified version of the instance holder template used by Boost.Python to wrap classes held by smart pointers: - -`` -template -struct pointer_holder : instance_holder -{ - // construct from the SmartPtr type - pointer_holder(SmartPtr p) - :m_p(p) - - // Forwarding constructors for the held type - pointer_holder(PyObject*) - :m_p(new Value()) - { - } - - template - pointer_holder(PyObject*,A0 a0) - :m_p(new Value(a0)) - { - } - - template - pointer_holder(PyObject*,A0 a0,A1 a1) - :m_p(new Value(a0,a1)) - { - } - ... - - private: // required holder implementation - void* holds(type_info dst_t) - { - // holds an instance of the SmartPtr type... - if (dst_t == python::type_id()) - return &this->m_p; - - // ...and an instance of the SmartPtr's element_type, if the - // pointer is non-null - return python::type_id() == dst_t ? &*this->m_p : 0; - } - - private: // data members - SmartPtr m_p; -}; - `` -[endsect] -[endsect] diff --git a/doc/reference/iterator.qbk b/doc/reference/iterator.qbk deleted file mode 100644 index c4ee68e0..00000000 --- a/doc/reference/iterator.qbk +++ /dev/null @@ -1,111 +0,0 @@ -[section boost/python/iterator.hpp] -[section Introduction] - provides types and functions for creating [@http://www.python.org/doc/current/lib/typeiter.html Python iterators] from C++ Containers and Iterators. Note that if your `class_` supports random-access iterators, implementing [@http://www.python.org/doc/current/ref/sequence-types.html#l2h-128 __getitem__] (also known as the Sequence Protocol) may serve you better than using this facility: Python will automatically create an iterator type for you (see [@http://www.python.org/doc/current/lib/built-in-funcs.html#l2h-35 `iter()`]), and each access can be range-checked, leaving no possiblity of accessing through an invalidated C++ iterator. -[endsect] -[section Class template `iterator`] -Instances of `iterator` hold a reference to a callable Python object which, when invoked from Python, expects a single argument c convertible to C and creates a Python iterator that traverses `[c.begin(), c.end())`. The optional [link concepts.callpolicies CallPolicies] `P` can be used to control how elements are returned during iteration. - -In the table below, c is an instance of Container. - -[table -[[Template Parameter][Requirements][Semantics][Default]] -[[Container][`[c.begin(),c.end()`) is a valid Iterator range.][The result will convert its argument to c and call c.begin() and c.end() to acquire iterators. To invoke Container's const `begin()` and `end()` functions, make it const.][ ]] -[[NextPolicies][A default-constructible model of [link concepts.callpolicies CallPolicies].][Applied to the resulting iterators' `next()` method.][An unspecified model of [link concepts.callpolicies CallPolicies] which always makes a copy of the result of deferencing the underlying C++ iterator]] -] - -`` -namespace boost { namespace python - { - template - struct iterator : object - { - iterator(); - }; - }} -`` -[endsect] -[section Class template iterator constructors] -``iterator()`` - -[variablelist -[[Effects][Initializes its base class with the result of: -``range(&iterators::begin, &iterators::end)``]] -[[Postconditions][`this->get()` points to a Python callable object which creates a Python iterator as described above.]] -[[Rationale][Provides an easy way to create iterators for the common case where a C++ class being wrapped provides `begin()` and `end()`.]] -] -[endsect] -[section Class template `iterators`] -A utility class template which provides a way to reliably call its argument's `begin()` and `end()` member functions. Note that there is no portable way to take the address of a member function of a C++ standard library container, so `iterators<>` can be particularly helpful when wrapping them. - -In the table below, x is an instance of C. -[table -[[Required Valid Expression][Type]] -[[x.begin()][Convertible to C::const_iterator if C is a const type; convertible to C::iterator otherwise.]] -[[x.end()][Convertible to C::const_iterator if C is a const type; convertible to C::iterator otherwise.]] -] -`` -namespace boost { namespace python -{ - template - struct iterators - { - typedef typename C::const_iterator iterator; - static iterator begin(C& x); - static iterator end(C& x); - }; -}} -`` -[endsect] -[section Class template iterators nested types] -If C is a const type,``typedef typename C::const_iterator iterator;`` -Otherwise: ``typedef typename C::iterator iterator;`` -[endsect] -[section Class template iterators static functions] -``static iterator begin(C&);`` -[variablelist [[Returns][`x.begin()`]]] -``static iterator end(C&);`` -[variablelist [[Returns][`x.end()`]]] -[endsect] -[section Functions] -`` -template -object range(Accessor1 start, Accessor2 finish); - -template -object range(Accessor1 start, Accessor2 finish); - -template -object range(Accessor1 start, Accessor2 finish); -`` -[variablelist -[[Requires][ NextPolicies is a default-constructible model of [link concepts.callpolicies CallPolicies].]] -[[Effects][The first form creates a Python callable object which, when invoked, converts its argument to a Target object x, and creates a Python iterator which traverses `[bind(start,_1)(x), bind(finish,_1)(x))`, applying NextPolicies to the iterator's `next()` function. -The second form is identical to the first, except that Target is deduced from Accessor1 as follows: - -# If Accessor1 is a function type, Target is the type of its first argument. -# If Accessor1 is a data member pointer of the form `R (T::*)`, Target is identical to `T`. -# If Accessor1 is a member function pointer of the form `R (T::*)(arguments...) cv-opt`, where cv-opt is an optional cv-qualifier, Target is identical to `T`. - -The third form is identical to the second, except that NextPolicies is an unspecified model of [link concepts.callpolicies CallPolicies] which always makes a copy of the result of deferencing the underlying C++ iterator - -]] -[[Rationale][The use of `boost::bind()` allows C++ iterators to be accessed through functions, member functions or data member pointers. Customization of NextPolicies (e.g. using [link function_invocation_and_creation.models_of_callpolicies.boost_python_return_internal_ref.class_template_return_internal_r return_internal_reference]) is useful when it is expensive to copy sequence elements of a wrapped class type. Customization of Target is useful when Accessor1 is a function object, or when a base class of the intended target type would otherwise be deduced.]] -] -[endsect] -[section Example] -`` -#include -#include - -#include - -using namespace boost::python; -BOOST_PYTHON_MODULE(demo) -{ - class_ >("dvec") - .def("__iter__", iterator >()) - ; -} -`` -[endsect] -[endsect] diff --git a/doc/reference/list.qbk b/doc/reference/list.qbk deleted file mode 100644 index fd602c18..00000000 --- a/doc/reference/list.qbk +++ /dev/null @@ -1,60 +0,0 @@ -[section boost_python_list.hpp] -[section Introduction] -Exposes a [link concepts.objectwrapper.typewrapper_concept_requirements TypeWrapper] for the Python [@http://www.python.org/doc/current/lib/typesseq-mutable.html list] type. -[endsect] -[section Class `list`] -Exposes the [@http://www.python.org/doc/current/lib/typesseq-mutable.html mapping protocol] of Python's built-in `list` type. The semantics of the constructors and member functions defined below can be fully understood by reading the [link concepts.objectwrapper.typewrapper_concept_requirements TypeWrapper] concept definition. Since `list` is publicly derived from [link object_wrappers.boost_python_object_hpp.class_object `object`], the public `object` interface applies to `list` instances as well.`` -namespace boost { namespace python -{ - class list : public object - { - public: - list(); // new list - - template - explicit list(T const& sequence); - - template - void append(T const& x); - - template - long count(T const& value) const; - - template - void extend(T const& x); - - template - long index(T const& x) const; - - template - void insert(object const& index, T const& x); // insert object before index - - object pop(); // remove and return item at index (default last) - object pop(long index); - object pop(object const& index); - - template - void remove(T const& value); - - void reverse(); // reverse *IN PLACE* - - void sort(); // sort *IN PLACE*; if given, cmpfunc(x, y) -> -1, 0, 1 - - template - void sort(T const& value); - }; -}} -`` -[endsect] -[section Example] -`` -using namespace boost::python; - -// Return the number of zeroes in the list -long zeroes(list l) -{ - return l.count(0); -} -`` -[endsect] -[endsect] diff --git a/doc/reference/long.qbk b/doc/reference/long.qbk deleted file mode 100644 index dddc3944..00000000 --- a/doc/reference/long.qbk +++ /dev/null @@ -1,38 +0,0 @@ -[section boost/python/long.hpp] -[section Introduction] -Exposes a [link concepts.objectwrapper.typewrapper_concept_requirements TypeWrapper] for the Python [@http://www.python.org/doc/current/lib/typesnumeric.html long] integer type. -[endsect] -[section Class `long_`] -Exposes the [@http://www.python.org/doc/current/lib/typesnumeric.html numeric type protocol] of Python's built-in `long` type. The semantics of the constructors and member functions defined below can be fully understood by reading the [link concepts.objectwrapper.typewrapper_concept_requirements TypeWrapper] concept definition. Since `long_` is publicly derived from [link object_wrappers.boost_python_object_hpp.class_object `object`], the public `object` interface applies to `long_` instances as well. -`` -namespace boost { namespace python -{ - class long_ : public object - { - public: - long_(); // new long_ - - template - explicit long_(T const& rhs); - - template - long_(T const& rhs, U const& base); - }; -}} -`` -[endsect] -[section Example] -`` -namespace python = boost::python; - -// compute a factorial without overflowing -python::long_ fact(long n) -{ - if (n == 0) - return python::long_(1); - else - return n * fact(n - 1); -} -`` -[endsect] -[endsect] diff --git a/doc/reference/lvalue_from_pytype.qbk b/doc/reference/lvalue_from_pytype.qbk deleted file mode 100644 index 7b5e907c..00000000 --- a/doc/reference/lvalue_from_pytype.qbk +++ /dev/null @@ -1,120 +0,0 @@ -[section boost/python/lvalue_from_pytype.hpp] -[section Introduction] - supplies a facility for extracting C++ objects from within Python instances of a given type. This is typically useful for dealing with "traditional" Python extension types. -[endsect] -[section Class template `lvalue_from_pytype`] -Class template lvalue_from_pytype will register from_python converters which, given an object of the given Python type, can extract references and pointers to a particular C++ type. Its template arguments are: - - In the table below, x denotes an object of type PythonObject& -[table -[[Parameter][Requirements][Semantics]] -[[Extractor][a model of [link concepts.extractor `Extractor`] whose execute function returns a reference type.][Extracts the lvalue from the Python object once its type has been confirmed]] -[[python_type][A compile-time constant [@http://www.python.org/doc/2.2/ext/dnt-type-methods.html `PyTypeObject*`]][The Python type of instances convertible by this converter. Python subtypes are also convertible.]] -] -`` -namespace boost { namespace python -{ - template - struct lvalue_from_pytype - { - lvalue_from_pytype(); - }; -}} -`` -[section Class template `lvalue_from_pytype` constructor] -``lvalue_from_pytype();`` -[variablelist -[[Effects][Registers converters which can convert Python objects of the given type to lvalues of the type returned by Extractor::execute.]] -] -[endsect] -[endsect] -[section Class template `extract_identity`] -extract_identity is a model of [link concepts.extractor `Extractor`] which can be used in the common case where the C++ type to be extracted is the same as the Python object type. -`` -namespace boost { namespace python -{ - template - struct extract_identity - { - static InstanceType& execute(InstanceType& c); - }; -}} -`` -[section Class template `extract_identity` static functions] -``InstanceType& execute(InstanceType& c);`` -[variablelist -[[Returns][c]] -] -[endsect] -[endsect] -[section Class template `extract_member`] -`extract_member` is a model of [link concepts.extractor `Extractor`] which can be used in the common case in the common case where the C++ type to be extracted is a member of the Python object. -`` -namespace boost { namespace python -{ - template - struct extract_member - { - static MemberType& execute(InstanceType& c); - }; -}} -`` -[section Class template `extract_member` static functions] -``static MemberType& execute(InstanceType& c);`` -[variablelist -[[Returns][`c.*member`]] -] -[endsect] -[endsect] -[section Example] -This example presumes that someone has implemented the standard noddy example module from the Python documentation, and we want to build a module which manipulates Noddys. Since noddy_NoddyObject is so simple that it carries no interesting information, the example is a bit contrived: it assumes you want to keep track of one particular object for some reason. This module would have to be dynamically linked to the module which defines noddy_NoddyType. - -In C++: -`` -#include -#include -#include -#include - -// definition lifted from the Python docs -typedef struct { - PyObject_HEAD -} noddy_NoddyObject; - -using namespace boost::python; -static handle cache; - -bool is_cached(noddy_NoddyObject* x) -{ - return x == cache.get(); -} - -void set_cache(noddy_NoddyObject* x) -{ - cache = handle(borrowed(x)); -} - -BOOST_PYTHON_MODULE(noddy_cache) -{ - def("is_cached", is_cached); - def("set_cache", set_cache); - - // register Noddy lvalue converter - lvalue_from_pytype,&noddy_NoddyType>(); -} -`` -In Python: -`` ->>> import noddy ->>> n = noddy.new_noddy() ->>> import noddy_cache ->>> noddy_cache.is_cached(n) -0 ->>> noddy_cache.set_cache(n) ->>> noddy_cache.is_cached(n) -1 ->>> noddy_cache.is_cached(noddy.new_noddy()) -0 -`` -[endsect] -[endsect] diff --git a/doc/reference/make_function.qbk b/doc/reference/make_function.qbk deleted file mode 100644 index 78c18237..00000000 --- a/doc/reference/make_function.qbk +++ /dev/null @@ -1,83 +0,0 @@ -[section boost/python/make_function.hpp] -[section Introduction] -make_function() and make_constructor() are the functions used internally by def() and class_<>::def() to produce Python callable objects which wrap C++ functions and member functions. -[endsect] -[section Functions] -`` -template -object make_function(F f) - -template -object make_function(F f, Policies const& policies) - -template -object make_function(F f, Policies const& policies, KeywordsOrSignature const& ks) - -template -object make_function(F f, Policies const& policies, Keywords const& kw, Signature const& sig) -`` -[variablelist -[[Requires][F is a function pointer or member function pointer type. If policies are supplied, it must be a model of CallPolicies. If kewords are supplied, it must be the result of a keyword-expression specifying no more arguments than the arity of f.]] -[[Effects][Creates a Python callable object which, when called from Python, converts its arguments to C++ and calls f. If F is a pointer-to-member-function type, the target object of the function call (*this) will be taken from the first Python argument, and subsequent Python arguments will be used as the arguments to f. - -* If policies are supplied, it will be applied to the function as described here. -* If keywords are supplied, the keywords will be applied in order to the final arguments of the resulting function. -* If Signature is supplied, it should be an instance of an MPL front-extensible sequence representing the function's return type followed by its argument types. Pass a Signature when wrapping function object types whose signatures can't be deduced, or when you wish to override the types which will be passed to the wrapped function. ]] -[[Returns][An instance of object which holds the new Python callable object.]] -[[Caveats][An argument of pointer type may be 0 if None is passed from Python. An argument type which is a constant reference may refer to a temporary which was created from the Python object for just the duration of the call to the wrapped function, for example a std::vector conjured up by the conversion process from a Python list. Use a non-const reference argument when a persistent lvalue is required. ]] -] -`` -template -object make_constructor(F f) - -template -object make_constructor(F f, Policies const& policies) - -template -object make_constructor(F f, Policies const& policies, KeywordsOrSignature const& ks) - -template -object make_constructor(F f, Policies const& policies, Keywords const& kw, Signature const& sig) -`` -[variablelist -[[Requires][F is a function pointer type. If policies are supplied, it must be a model of CallPolicies. If kewords are supplied, it must be the result of a keyword-expression specifying no more arguments than the arity of f.]] -[[Effects][Creates a Python callable object which, when called from Python, converts its arguments to C++ and calls f.]] -[[Returns][An instance of object which holds the new Python callable object.]] -] - -[endsect] -[section Example] -C++ function exposed below returns a callable object wrapping one of two functions. -`` -#include -#include - -char const* foo() { return "foo"; } -char const* bar() { return "bar"; } - -using namespace boost::python; -object choose_function(bool selector) -{ - if (selector) - return boost::python::make_function(foo); - else - return boost::python::make_function(bar); -} - -BOOST_PYTHON_MODULE(make_function_test) -{ - def("choose_function", choose_function); -} -`` -It can be used this way in Python: -`` ->>> from make_function_test import * ->>> f = choose_function(1) ->>> g = choose_function(0) ->>> f() -'foo' ->>> g() -'bar' -`` -[endsect] -[endsect] diff --git a/doc/reference/manage_new_object.qbk b/doc/reference/manage_new_object.qbk deleted file mode 100644 index 95cc6859..00000000 --- a/doc/reference/manage_new_object.qbk +++ /dev/null @@ -1,56 +0,0 @@ -[section boost/python/manage_new_object.hpp] -[section Class `manage_new_object`] -`manage_new_object` is a model of [link concepts.resultconverter.resultconvertergenerator_concept ResultConverterGenerator] which can be used to wrap C++ functions which return a pointer to an object allocated with a new-expression, and expect the caller to take responsibility for deleting that object. -`` -namespace boost { namespace python -{ - struct manage_new_object - { - template struct apply; - }; -}} -`` -[endsect] -[section Class `manage_new_object` metafunctions] -``template struct apply`` -[variablelist -[[Requires][`T` is `U*` for some `U`.]] -[[Returns][`typedef to_python_indirect type;`]] -] -[endsect] -[section Example] -In C++: -`` -#include -#include -#include -#include - - -struct Foo { - Foo(int x) : x(x){} - int get_x() { return x; } - int x; -}; - -Foo* make_foo(int x) { return new Foo(x); } - -// Wrapper code -using namespace boost::python; -BOOST_PYTHON_MODULE(my_module) -{ - def("make_foo", make_foo, return_value_policy()) - class_("Foo") - .def("get_x", &Foo::get_x) - ; -} -`` -Python code: -`` ->>> from my_module import * ->>> f = make_foo(3) # create a Foo object ->>> f.get_x() -3 -`` -[endsect] -[endsect] diff --git a/doc/reference/module.qbk b/doc/reference/module.qbk deleted file mode 100644 index 31c9fec9..00000000 --- a/doc/reference/module.qbk +++ /dev/null @@ -1,41 +0,0 @@ -[section boost/python/module.hpp] -[section Introduction] -This header provides the basic facilities needed to create a Boost.Python extension module. -[endsect] -[section Macros] -`BOOST_PYTHON_MODULE(name)` is used to declare Python [@http://www.python.org/doc/2.2/ext/methodTable.html#SECTION003400000000000000000 module initialization functions]. The name argument must exactly match the name of the module to be initialized, and must conform to Python's [@http://www.python.org/doc/2.2/ref/identifiers.html identifier naming rules]. Where you would normally write - -`` -extern "C" void initname() -{ - ... -} -`` -Boost.Python modules should be initialized with -`` -BOOST_PYTHON_MODULE(name) -{ - ... -} -`` -This macro generates two functions in the scope where it is used: `extern "C" void initname()`, and `void init_module_name()`, whose body must follow the macro invocation. `init_name` passes `init_module_name` to [link high_level_components.boost_python_errors_hpp.functions handle_exception()] so that any C++ exceptions generated are safely processeed. During the body of `init_name`, the [link high_level_components.boost_python_scope_hpp current scope] refers to the module being initialized. -[endsect] -[section Examples] -C++ module definition: -`` -#include - -BOOST_PYTHON_MODULE(xxx) -{ - throw "something bad happened" -} -`` -Interactive Python: -`` ->>> import xxx -Traceback (most recent call last): - File "", line 1, in ? -RuntimeError: Unidentifiable C++ Exception -`` -[endsect] -[endsect] diff --git a/doc/reference/numeric.qbk b/doc/reference/numeric.qbk deleted file mode 100644 index 4ccb0d38..00000000 --- a/doc/reference/numeric.qbk +++ /dev/null @@ -1,153 +0,0 @@ -[section boost/python/numeric.hpp] -[section Introduction] -Exposes a [link concepts.objectwrapper.typewrapper_concept_requirements TypeWrapper] for the Python [@http://www.python.org/dev/doc/devel/lib/typesmapping.html array] type. -[endsect] -[section Class `array`] -Provides access to the array types of [@http://www.pfdubois.com/numpy/ Numerical Python]\ 's [@http://www.pfdubois.com/numpy/#Numeric Numeric] and [@http://stsdas.stsci.edu/numarray/index.html NumArray] modules. With the exception of the functions documented below, the semantics of the constructors and member functions defined below can be fully understood by reading the [link concepts.objectwrapper.typewrapper_concept_requirements TypeWrapper] concept definition. Since array is publicly derived from object, the public object interface applies to array instances as well. - -The default behavior is to use numarray.NDArray as the associated Python type if the numarray module is installed in the default location. Otherwise it falls back to use Numeric.ArrayType. If neither extension module is installed, overloads of wrapped C++ functions with numeric::array parameters will never be matched, and other attempted uses of numeric::array will raise an appropriate Python exception. The associated Python type can be set manually using the set_module_and_type(...) static function. -`` -namespace boost { namespace python { namespace numeric -{ - class array : public object - { - public: - object astype(); - template - object astype(Type const& type_); - - template - array new_(Type const& type_) const; - - template - void resize(Sequence const& x); - void resize(long x1); - void resize(long x1, long x2); - ... - void resize(long x1, long x2,...long xn); - - template - void setshape(Sequence const& x); - void setshape(long x1); - void setshape(long x1, long x2); - ... - void setshape(long x1, long x2,...long xn); - - template - void put(Indices const& indices, Values const& values); - - template - object take(Sequence const& sequence, long axis = 0); - - template - void tofile(File const& f) const; - - object factory(); - template - object factory(Sequence const&); - template - object factory(Sequence const&, Typecode const&, bool copy = true, bool savespace = false); - template - object factory(Sequence const&, Typecode const&, bool copy, bool savespace, Type const&); - template - object factory(Sequence const&, Typecode const&, bool copy, bool savespace, Type const&, Shape const&); - - template - explicit array(T1 const& x1); - template - explicit array(T1 const& x1, T2 const& x2); - ... - template - explicit array(T1 const& x1, T2 const& x2,...Tn const& xn); - - static void set_module_and_type(); - static void set_module_and_type(char const* package_path = 0, char const* type_name = 0); - static void get_module_name(); - - object argmax(long axis=-1); - - object argmin(long axis=-1); - - object argsort(long axis=-1); - - void byteswap(); - - object copy() const; - - object diagonal(long offset = 0, long axis1 = 0, long axis2 = 1) const; - - void info() const; - - bool is_c_array() const; - bool isbyteswapped() const; - void sort(); - object trace(long offset = 0, long axis1 = 0, long axis2 = 1) const; - object type() const; - char typecode() const; - - object getflat() const; - long getrank() const; - object getshape() const; - bool isaligned() const; - bool iscontiguous() const; - long itemsize() const; - long nelements() const; - object nonzero() const; - - void ravel(); - object repeat(object const& repeats, long axis=0); - void setflat(object const& flat); - void swapaxes(long axis1, long axis2); - str tostring() const; - void transpose(object const& axes = object()); - object view() const; - }; -}}} -`` -[endsect] -[section Class `array` observer functions] -`` -object factory(); -template -object factory(Sequence const&); -template -object factory(Sequence const&, Typecode const&, bool copy = true, bool savespace = false); -template -object factory(Sequence const&, Typecode const&, bool copy, bool savespace, Type const&); -template -object factory(Sequence const&, Typecode const&, bool copy, bool savespace, Type const&, Shape const&); -`` -These functions map to the underlying array type's array() function family. They are not called "array" because of the C++ limitation that you can't define a member function with the same name as its enclosing class. -`` -template -array new_(Type const&) const; -`` -This function maps to the underlying array type's new() function. It is not called "new" because that is a keyword in C++. -[endsect] -[section Class `array` static functions] -`` -static void set_module_and_type(char const* package_path, char const* type_name); -static void set_module_and_type(); -`` -[variablelist -[[Requires][package_path and type_name, if supplied, is an [link ntbs].]] -[[Effects][The first form sets the package path of the module that supplies the type named by type_name to package_path. The second form restores the default search behavior. The associated Python type will be searched for only the first time it is needed, and thereafter the first time it is needed after an invocation of set_module_and_type.]] -] -``static std::string get_module_name()`` -[variablelist -[[Effects][Returns the name of the module containing the class that will be held by new `numeric::array` instances.]] -] -[endsect] -[section Example] -`` -#include -#include - -// sets the first element in a 2d numeric array -void set_first_element(numeric::array& y, double value) -{ - y[make_tuple(0,0)] = value; -} -`` -[endsect] -[endsect] diff --git a/doc/reference/object.qbk b/doc/reference/object.qbk deleted file mode 100644 index 26b4840d..00000000 --- a/doc/reference/object.qbk +++ /dev/null @@ -1,574 +0,0 @@ -[section boost/python/object.hpp] -[section Introduction] -Exposes the generic Python object wrapper class object, and related classes. In order to avoid some potenential problems with argument-dependent lookup and the generalized operators defined on object, all these facilities are defined in namespace boost::python::api, and object is imported into namespace boost::python with a using-declaration. -[endsect] -[section Class `slice_nil`] -`` -class slice_nil; -static const _ = slice_nil(); -`` -A type that can be used to get the effect of leaving out an index in a Python slice expression: -`` ->>> x[:-1] ->>> x[::-1] -`` -C++ equivalent: -`` -x.slice(_,-1) -x[slice(_,_,-1)] -`` -[endsect] -[section Class `const_attribute_policies`] -The policies which are used for proxies representing an attribute access to a const object. -`` -namespace boost { namespace python { namespace api -{ - struct const_attribute_policies - { - typedef char const* key_type; - static object get(object const& target, char const* key); - }; -}}} -`` -[endsect] -[section Class `const_attribute_policies` static functions] -`` -static object get(object const& target, char const* key); -`` -[variablelist -[[Requires][key is an [link ntbs].]] -[[Effects][accesses the attribute of target named by key.]] -[[Returns][An object managing the result of the attribute access.]] -[[Throws][[link high_level_components.boost_python_errors_hpp.class_error_already_set error_already_set] if a Python exception is raised.]] -] -[endsect] -[section Class `attribute_policies`] -The policies which are used for proxies representing an attribute access to a mutable object. -`` -namespace boost { namespace python { namespace api -{ - struct attribute_policies : const_attribute_policies - { - static object const& set(object const& target, char const* key, object const& value); - static void del(object const&target, char const* key); - }; -}}} -`` -[endsect] -[section Class `attribute_policies` static functions] -`` -static object const& set(object const& target, char const* key, object const& value); -`` -[variablelist -[[Requires][key is an [link ntbs].]] -[[Effects][sets the attribute of target named by key to value.]] -[[Throws][[link high_level_components.boost_python_errors_hpp.class_error_already_set error_already_set] if a Python exception is raised.]] -] -`` -static void del(object const&target, char const* key); -`` -[variablelist -[[Requires][key is an [link ntbs].]] -[[Effects][deletes the attribute of target named by key.]] -[[Throws][[link high_level_components.boost_python_errors_hpp.class_error_already_set error_already_set] if a Python exception is raised.]] -] -[endsect] -[section Class `const_objattribute_policies`] -The policies which are used for proxies representing an attribute access to a const object when the attribute name is given as a const object. -`` -namespace boost { namespace python { namespace api -{ - struct const_objattribute_policies - { - typedef object const& key_type; - static object get(object const& target, object const& key); - }; -}}} -`` -[endsect] -[section Class `const_objattribute_policies` static functions] -`` -static object get(object const& target, object const& key); -`` -[variablelist -[[Requires][key is an object holding a string.]] -[[Effects][accesses the attribute of target named by key.]] -[[Returns][An object managing the result of the attribute access.]] -[[Throws][[link high_level_components.boost_python_errors_hpp.class_error_already_set error_already_set] if a Python exception is raised.]] -] -[endsect] -[section Class `objattribute_policies`] -The policies which are used for proxies representing an attribute access to a mutable object when the attribute name is given as a const object. -`` -namespace boost { namespace python { namespace api -{ - struct objattribute_policies : const_objattribute_policies - { - static object const& set(object const& target, object const& key, object const& value); - static void del(object const&target, object const& key); - }; -}}} -`` -[endsect] -[section Class `objattribute_policies` static functions] -`` -static object const& set(object const& target, object const& key, object const& value); -`` -[variablelist -[[Requires][key is an object holding a string.]] -[[Effects][sets the attribute of target named by key to value.]] -[[Throws][[link high_level_components.boost_python_errors_hpp.class_error_already_set error_already_set] if a Python exception is raised.]] -] -`` -static void del(object const&target, object const& key); -`` -[variablelist -[[Requires][key is an object holding a string.]] -[[Effects][deletes the attribute of target named by key.]] -[[Throws][[link high_level_components.boost_python_errors_hpp.class_error_already_set error_already_set] if a Python exception is raised.]] -] -[endsect] -[section Class `const_item_policies`] -The policies which are used for proxies representing an item access (via the Python bracket operators []) to a const object. -`` -namespace boost { namespace python { namespace api -{ - struct const_item_policies - { - typedef object key_type; - static object get(object const& target, object const& key); - }; -}}} -`` -[endsect] -[section Class `const_item_policies` static functions] -`` -static object get(object const& target, object const& key); -`` -[variablelist -[[Effects][accesses the item of target specified by key.]] -[[Returns][An object managing the result of the item access.]] -[[Throws][[link high_level_components.boost_python_errors_hpp.class_error_already_set error_already_set] if a Python exception is raised.]] -] -[endsect] -[section Class `item_policies`] -The policies which are used for proxies representing an item access (via the Python bracket operators []) to a mutable object. -`` -namespace boost { namespace python { namespace api -{ - struct item_policies : const_item_policies - { - static object const& set(object const& target, object const& key, object const& value); - static void del(object const& target, object const& key); - }; -}}} -`` -[endsect] -[section Class `item_policies` static functions] -`` -static object const& set(object const& target, object const& key, object const& value); -`` -[variablelist -[[Effects][sets the item of target specified by key to value.]] -[[Throws][[link high_level_components.boost_python_errors_hpp.class_error_already_set error_already_set] if a Python exception is raised.]] -] -`` -static void del(object const& target, object const& key); -`` -[variablelist -[[Effects][deletes the item of target specified by key.]] -[[Throws][[link high_level_components.boost_python_errors_hpp.class_error_already_set error_already_set] if a Python exception is raised.]] -] -[endsect] -[section Class `const_slice_policies`] -The policies which are used for proxies representing an slice access (via the Python slice notation [x:y]) to a const object. -`` -namespace boost { namespace python { namespace api -{ - struct const_slice_policies - { - typedef std::pair, handle<> > key_type; - static object get(object const& target, key_type const& key); - }; -}}} -`` -[endsect] -[section Class `const_slice_policies` static functions] -`` -static object get(object const& target, key_type const& key); -`` -[variablelist -[[Effects][accesses the slice of target specified by key.]] -[[Returns][An object managing the result of the slice access.]] -[[Throws][[link high_level_components.boost_python_errors_hpp.class_error_already_set error_already_set] if a Python exception is raised.]] -] -[endsect] -[section Class `slice_policies`] -The policies which are used for proxies representing an slice access to a mutable object. -`` -namespace boost { namespace python { namespace api -{ - struct slice_policies : const_slice_policies - { - static object const& set(object const& target, key_type const& key, object const& value); - static void del(object const& target, key_type const& key); - }; -}}} -`` -[endsect] -[section Class `slice_policies` static functions] -`` -static object const& set(object const& target, key_type const& key, object const& value); -`` -[variablelist -[[Effects][sets the slice of target specified by key to value.]] -[[Throws][[link high_level_components.boost_python_errors_hpp.class_error_already_set error_already_set] if a Python exception is raised.]] -] -`` -static void del(object const& target, key_type const& key); -`` -[variablelist -[[Effects][deletes the slice of target specified by key.]] -[[Throws][[link high_level_components.boost_python_errors_hpp.class_error_already_set error_already_set] if a Python exception is raised.]] -] -[endsect] -[section Class template `object_operators`] -This is the base class of object and its proxy template used to supply common interface: member functions, and operators which must be defined within the class body. Its template parameter U is expected to be a class derived from object_operators. In practice users should never use this class directly, but it is documented here because it supplies important interface to object and its proxies. -`` -namespace boost { namespace python { namespace api -{ - template - class object_operators - { - public: - // function call - // - object operator()() const; - - template - object operator()(A0 const&) const; - template - object operator()(A0 const&, A1 const&) const; - ... - template - object operator()(A0 const&, A1 const&,...An const&) const; - - detail::args_proxy operator* () const; - object operator()(detail::args_proxy const &args) const; - object operator()(detail::args_proxy const &args, - detail::kwds_proxy const &kwds) const; - - // truth value testing - // - typedef unspecified bool_type; - operator bool_type() const; - - // Attribute access - // - proxy attr(char const*) const; - proxy attr(char const*); - proxy attr(object const&) const; - proxy attr(object const&); - - // item access - // - template - proxy operator[](T const& key) const; - - template - proxy operator[](T const& key); - - // slicing - // - template - proxy slice(T const& start, V const& end) const - - template - proxy slice(T const& start, V const& end); - }; -}}} -`` -[endsect] -[section Class template `object_operators` observer functions] -`` -object operator()() const; -template -object operator()(A0 const&) const; -template -object operator()(A0 const&, A1 const&) const; -... -template -object operator()(A0 const& a1, A1 const& a2,...An const& aN) const; -`` -[variablelist -[[Effects][`call(object(*static_cast(this)).ptr(), a1, a2,...aN)`]] -] -``object operator()(detail::args_proxy const &args) const; `` -[variablelist -[[Effects][`call object with arguments given by the tuple args`]] -] -``object operator()(detail::args_proxy const &args, - detail::kwds_proxy const &kwds) const; - -`` -[variablelist -[[Effects][`call object with arguments given by the tuple args, and named arguments given by the dictionary kwds`]] -] -``operator bool_type() const;`` -[variablelist -[[Effects][Tests truth value of `*this`.]] -[[Returns][`call(object(*static_cast(this)).ptr(), a1, a2,...aN)`]] -] -`` -proxy attr(char const* name) const; -proxy attr(char const* name); -`` -[variablelist -[[Requires][name is an [link ntbs].]] -[[Effects][accesses the named attribute of *this.]] -[[Returns][a proxy object which binds `object(*static_cast(this))` as its target, and name as its key.]] -] -`` -proxy attr(const object& name) const; -proxy attr(const object& name); -`` -[variablelist -[[Requires][name is a object holding a string.]] -[[Effects][accesses the named attribute of `*this`.]] -[[Returns][a proxy object which binds `object(*static_cast(this))` as its target, and name as its key.]] -] -`` -template -proxy operator[](T const& key) const; -template -proxy operator[](T const& key); -`` -[variablelist -[[Effects][accesses the item of `*this` indicated by key.]] -[[Returns][a proxy object which binds `object(*static_cast(this))` as its target, and object(key) as its key.]] -] -`` -template -proxy slice(T const& start; start, V const& finish) const -template -proxy slice(T const& start; start, V const& finish); -`` -[variablelist -[[Effects][accesses the slice of `*this` indicated by `std::make_pair(object(start), object(finish))`.]] -[[Returns][a proxy object which binds `object(*static_cast(this))` as its target, and `std::make_pair(object(start), object(finish))` as its key.]] -] -[endsect] -[section Class `object`] -The intention is that object acts as much like a Python variable as possible. Thus expressions you'd expect to work in Python should generally work in the same way from C++. Most of object's interface is provided by its base class `object_operators`, and the free functions defined in this header. -`` -namespace boost { namespace python { namespace api -{ - class object : public object_operators - { - public: - object(); - object(object const&); - template - explicit object(T const& x); - - ~object(); - - object& operator=(object const&); - PyObject* ptr() const; - bool is_none() const; - }; -}}} -`` -[endsect] -[section Class `object` constructors and destructor] -``object();`` -[variablelist -[[Effects][Constructs an object managing a reference to the Python None object.]] -[[Throws][nothing.]] -] -``template -explicit object(T const& x); -`` -[variablelist -[[Effects][converts x to python and manages a reference to it.]] -[[Throws][[link high_level_components.boost_python_errors_hpp.class_error_already_set error_already_set] and sets a Python TypeError exception if no such conversion is possible.]] -] -`` -~object(); -`` -[variablelist -[[Effects][decrements the reference count of the internally-held object.]] -] -[endsect] -[section Class `object` modifiers] -``PyObject* ptr() const;`` - -[variablelist -[[Returns] [a pointer to the internally-held Python object.]] -] -``bool is_none() const;`` - -[variablelist -[[Returns] [result of `(ptr() == Py_None)`]] -] -[endsect] -[section Class template `proxy`] -This template is instantiated with various Policies described in this document in order to implement attribute, item, and slice access for object. It stores an object of type Policies::key_type. -`` -namespace boost { namespace python { namespace api -{ - template - class proxy : public object_operators > - { - public: - operator object() const; - - proxy const& operator=(proxy const&) const; - template - inline proxy const& operator=(T const& rhs) const; - - void del() const; - - template - proxy operator+=(R const& rhs); - template - proxy operator-=(R const& rhs); - template - proxy operator*=(R const& rhs); - template - proxy operator/=(R const& rhs); - template - proxy operator%=(R const& rhs); - template - proxy operator<<=(R const& rhs); - template - proxy operator>>=(R const& rhs); - template - proxy operator&=(R const& rhs); - template - proxy operator|=(R const& rhs); - }; -}}} -`` -[endsect] -[section Class template `proxy` observer functions] -``operator object() const;`` -[variablelist -[[Effects][applies `Policies::get(target, key)` with the proxy's target and key objects.]] -] -[endsect] -[section Class template `proxy` modifier functions] -`` -proxy const& operator=(proxy const& rhs) const; -template -inline proxy const& operator=(T const& rhs) const; -`` -[variablelist -[[Effects][ `Policies::set(target, key , object(rhs))` with the proxy's target and key objects.]] -] -`` -template -proxy operator+=(R const& rhs); -template -proxy operator-=(R const& rhs); -template -proxy operator*=(R const& rhs); -template -proxy operator/=(R const& rhs); -template -proxy operator%=(R const& rhs); -template -proxy operator<<=(R const& rhs); -template -proxy operator>>=(R const& rhs); -template -proxy operator&=(R const& rhs); -template -proxy operator|=(R const& rhs); -`` -[variablelist -[[Effects][for a given `operator@=`, `object(*this) @= rhs;`]] -[[Returns][`*this`]] -] -``void del() const;`` -[variablelist -[[Effects][Policies::del(target, key ) with the proxy's target and key objects.]] -] -[endsect] -[section Functions] -`` -template -void del(proxy const& x); -`` -[variablelist -[[Effects][`x.del()`]] -] -`` -template object operator>(L const&l,R const&r); -template object operator>=(L const&l,R const&r); -template object operator<(L const&l,R const&r); -template object operator<=(L const&l,R const&r); -template object operator==(L const&l,R const&r); -template object operator!=(L const&l,R const&r); -`` -[variablelist -[[Effects][returns the result of applying the operator to `object(l)` and `object(r)`, respectively, in Python.]] -] -`` -template object operator+(L const&l,R const&r); -template object operator-(L const&l,R const&r); -template object operator*(L const&l,R const&r); -template object operator/(L const&l,R const&r); -template object operator%(L const&l,R const&r); -template object operator<<(L const&l,R const&r); -template object operator>>(L const&l,R const&r); -template object operator&(L const&l,R const&r); -template object operator^(L const&l,R const&r); -template object operator|(L const&l,R const&r); -`` -[variablelist -[[Effects][returns the result of applying the operator to `object(l)` and `object(r)`, respectively, in Python.]] -] -`` -template object& operator+=(object&l,R const&r); -template object& operator-=(object&l,R const&r); -template object& operator*=(object&l,R const&r); -template object& operator/=(object&l,R const&r); -template object& operator%=(object&l,R const&r); -template object& operator<<=(object&l,R const&r) -template object& operator>>=(object&l,R const&r); -template object& operator&=(object&l,R const&r); -template object& operator^=(object&l,R const&r); -template object& operator|=(object&l,R const&r); -`` -[variablelist -[[Effects][assigns to `l` the result of applying the corresponding Python inplace operator to `l` and `object(r)`, respectively.]] -[[Returns][l]] -] -``long len(object const& obj);`` -[variablelist -[[Effects][`PyObject_Length(obj.ptr())`]] -[[Returns][`len()` of object.]] -] -[endsect] -[section Example] -Python code: -`` -def sum_items(seq): - result = 0 - for x in seq: - result += x - return result -`` -C++ version -`` -object sum_items(object seq) -{ - object result = object(0); - for (int i = 0; i < len(seq); ++i) - result += seq[i]; - return result; -} -`` -[endsect] -[endsect] diff --git a/doc/reference/objects.qbk b/doc/reference/objects.qbk deleted file mode 100644 index 80ce257c..00000000 --- a/doc/reference/objects.qbk +++ /dev/null @@ -1,12 +0,0 @@ -[chapter Object Wrappers - [quickbook 1.7] -] - -[include dict.qbk] -[include list.qbk] -[include long.qbk] -[include numeric.qbk] -[include object.qbk] -[include str.qbk] -[include slice.qbk] -[include tuple.qbk] diff --git a/doc/reference/opaque_pointer_converter.qbk b/doc/reference/opaque_pointer_converter.qbk deleted file mode 100644 index c87cd36a..00000000 --- a/doc/reference/opaque_pointer_converter.qbk +++ /dev/null @@ -1,31 +0,0 @@ -[section boost/python/opaque_pointer_converter.hpp] -[section Introduction] -`opaque<>` registers itself as a converter from Python objects to pointers to undefined types and vice versa. -`` -namespace boost { namespace python -{ - template - struct opaque - { - opaque(); - }; -}} -`` -[endsect] -[section Class template `opaque` constructor] -``opaque();`` -[variablelist -[[Effects][ -* Registers the instance as a [link to_from_python_type_conversion.boost_python_lvalue_from_pytype_.class_template_lvalue_from_pytyp `lvalue_from_pytype`] converter from Python objects into opaque pointers. - The Python Objects created are named after the type pointed to by the opaque pointer being wrapped. -* Registers the instance as a [link to_from_python_type_conversion.boost_python_to_python_converter.class_template_to_python_convert `to_python_converter`] from opaque pointers to Python objects. -]] -] -[note If there is already an instance registered by another module, this instance doesn't try to register again in order to avoid warnings about multiple registrations.] - -[endsect] -[section Macro `BOOST_PYTHON_OPAQUE_SPECIALIZED_TYPE_ID(Pointee)`] -This macro must be used to define specializations of the [link utility_and_infrastructure.boost_python_type_id_hpp.functions `type_id`] function which can't be instantiated for incomplete types. -[note The macro must be invoked in every translation unit which uses the opaque converter.] -[endsect] -[endsect] diff --git a/doc/reference/operators.qbk b/doc/reference/operators.qbk deleted file mode 100644 index 892d33b7..00000000 --- a/doc/reference/operators.qbk +++ /dev/null @@ -1,257 +0,0 @@ -[section boost/python/operators.hpp] -[section Introduction] - provides types and functions for automatically generating Python [@http://www.python.org/doc/ref/specialnames.html special methods] from the corresponding C++ constructs. Most of these constructs are operator expressions, hence the name. To use the facility, substitute the [link high_level_components.boost_python_operators_hpp.object_self self] object for an object of the class type being wrapped in the expression to be exposed, and pass the result to [link high_level_components.boost_python_class_hpp.class_template_class_t_bases_hel.class_template_class_modifier_fu class_<>::def()]. Much of what is exposed in this header should be considered part of the implementation, so is not documented in detail here. -[endsect] -[section Class `self_ns::self_t`] -`self_ns::self_t` is the actual type of the [link high_level_components.boost_python_operators_hpp.object_self self] object. The library isolates `self_t` in its own namespace, `self_ns`, in order to prevent the generalized operator templates which operate on it from being found by argument-dependent lookup in other contexts. This should be considered an implementation detail, since users should never have to mention `self_t` directly. -`` -namespace boost { namespace python { namespace self_ns { -{ - unspecified-type-declaration self_t; - - // inplace operators - template operator_ operator+=(self_t, T); - template operator_ operator-=(self_t, T); - template operator_ operator*=(self_t, T); - template operator_ operator/=(self_t, T); - template operator_ operator%=(self_t, T); - template operator_ operator>>=(self_t, T); - template operator_ operator<<=(self_t, T); - template operator_ operator&=(self_t, T); - template operator_ operator^=(self_t, T); - template operator_ operator|=(self_t, T); - - // comparisons - template operator_ operator==(L const&, R const&); - template operator_ operator!=(L const&, R const&); - template operator_ operator<(L const&, R const&); - template operator_ operator>(L const&, R const&); - template operator_ operator<=(L const&, R const&); - template operator_ operator>=(L const&, R const&); - - // non-member operations - template operator_ operator+(L const&, R const&); - template operator_ operator-(L const&, R const&); - template operator_ operator*(L const&, R const&); - template operator_ operator/(L const&, R const&); - template operator_ operator%(L const&, R const&); - template operator_ operator>>(L const&, R const&); - template operator_ operator<<(L const&, R const&); - template operator_ operator&(L const&, R const&); - template operator_ operator^(L const&, R const&); - template operator_ operator|(L const&, R const&); - template operator_ pow(L const&, R const&); - - // unary operations - operator_ operator-(self_t); - operator_ operator+(self_t); - operator_ operator~(self_t); - operator_ operator!(self_t); - - // value operations - operator_ int_(self_t); - operator_ long_(self_t); - operator_ float_(self_t); - operator_ complex_(self_t); - operator_ str(self_t); - - operator_ repr(self_t); -}}}; -`` -The tables below describe the methods generated when the results of the expressions described are passed as arguments to [link high_level_components.boost_python_class_hpp.class_template_class_t_bases_hel.class_template_class_modifier_fu class_<>::def()]. `x` is an object of the class type being wrapped. -[section `self_t` inplace operators] -In the table below, If `r` is an object of type [link high_level_components.boost_python_operators_hpp.class_template_other other], `y` is an object of type `T`; otherwise, `y` is an object of the same type as `r`. -[table -[[C++ Expression][Python Method Name][C++ Implementation]] -[[`self += r`][`__iadd__`][`x += y`]] -[[`self -= r`][`__isub__`][`x -= y`]] -[[`self *= r`][`__imul__`][`x *= y`]] -[[`self /= r`][`__idiv__`][`x /= y`]] -[[`self %= r`][`__imod__`][`x %= y`]] -[[`self >>= r`][`__irshift__`][`x >>= y`]] -[[`self <<= r`][`__ilshift__`][`x <<= y`]] -[[`self &= r`][`__iand__`][`x &= y`]] -[[`self ^= r`][`__ixor__`][`x ^= y`]] -[[`self |= r`][`__ior__`][`x |= y`]] -] -[endsect] -[section `self_t` comparison functions] -In the tables below, if `r` is of type [link high_level_components.boost_python_operators_hpp.class_self_ns_self_t self_t], `y` is an object of the same type as `x`; -if `l` or `r` is an object of type [link high_level_components.boost_python_operators_hpp.class_template_other other], `y` is an object of type `T`; -otherwise, `y` is an object of the same type as `l` or `r`. -`l` is never of type [link high_level_components.boost_python_operators_hpp.class_self_ns_self_t self_t]. - -The column of Python Expressions illustrates the expressions that will be supported in Python for objects convertible to the types of x and y. The secondary operation arises due to Python's [@http://www.python.org/doc/ref/customization.html#l2h-89 reflection rules] for rich comparison operators, and are only used when the corresponding operation is not defined as a method of the y object. -[table -[[C++ Expression][Python Method Name][C++ Implementation][Python Expression (primary, secondary)]] -[[`self == r`][`__eq__`][`x == y`][`x == y`, `y == x`]] -[[`l == self`][`__eq__`][`y == x`][`y == x`, `x == y`]] -[[`self != r`][`__nq__`][`x != y`][`x != y`, `y != x`]] -[[`l != self`][`__nq__`][`y != x`][`y != x`, `x != y`]] -[[`self < r`][`__lt__`][`x < y`][`x < y`, `y > x`]] -[[`l < self`][`__gt__`][`y < x`][`y > x`, `x < y`]] -[[`self > r`][`__gt__`][`x > y`][`x > y`, `y < x`]] -[[`l > self`][`__lt__`][`y > x`][`y < x`, `x > y`]] -[[`self <= r`][`__le__`][`x <= y`][`x <= y`, `y >= x`]] -[[`l <= self`][`__ge__`][`y <= x`][`y >= x`, `x <= y`]] -[[`self >= r`][`__ge__`][`x >= y`][`x >= y`, `y <= x`]] -[[`l <= self`][`__le__`][`y >= x`][`y <= x`, `x >= y`]] -] -[endsect] -[section `self_t` non-member operations] -The operations whose names begin with "__r" below will only be called if the left-hand operand does not already support the given operation, as described [@http://www.python.org/doc/current/ref/numeric-types.html#l2h-152 here]. -[table -[[C++ Expression][Python Method Name][C++ Implementation]] -[[`self + r`][`__add__`][`x + y`]] -[[`l + self`][`__radd__`][`y + x`]] -[[`self - r`][`__sub__`][`x - y`]] -[[`l - self`][`__rsub__`][`y - x`]] -[[`self * r`][`__mult__`][`x * y`]] -[[`l * self`][`__rmult__`][`y * x`]] -[[`self / r`][`__div__`][`x / y`]] -[[`l / self`][`__rdiv__`][`y / x`]] -[[`self % r`][`__mod__`][`x % y`]] -[[`l % self`][`__rmod__`][`y % x`]] -[[`self >> r`][`__rshift__`][`x >> y`]] -[[`l >> self`][`__rrshift__`][`y >> x`]] -[[`self << r`][`__lshift__`][`x << y`]] -[[`l << self`][`__rlshift__`][`y << x`]] -[[`self & r`][`__and__`][`x & y`]] -[[`l & self`][`__rand__`][`y & x`]] -[[`self ^ r`][`__xor__`][`x ^ y`]] -[[`l ^ self`][`__rxor__`][`y ^ x`]] -[[`self | r`][`__or__`][`x | y`]] -[[`l | self`][`__ror__`][`y | x`]] -[[`pow(self, r)`][`__pow__`][`x ** y`]] -[[`pow(l, self)`][`__rpow__`][`y ** x`]] -] -[endsect] -[section `self_t` unary operations] -[table -[[C++ Expression][Python Method Name][C++ Implementation]] -[[`-self`][`__neg__`][`-x`]] -[[`+self`][`__pos__`][`+x`]] -[[`~self`][`__invert__`][`~x`]] -[[`not self` or `!self`][`__nonzero__`][`!!x`]] -] -[endsect] -[section `self_t` value operations] -[table -[[C++ Expression][Python Method Name][C++ Implementation]] -[[`int_(self)`][`__int__`][`long(x)`]] -[[`long_(self)`][`__long__`][`PyLong_FromLong(x)`]] -[[`float_(self)`][`__float__`][`double(x)`]] -[[`complex_(self)`][`__complex__`][`std::complex(x)`]] -[[`str(self)`][`__str__`][`lexical_cast(x)`]] -[[`repr(self)`][`__repr__`][`lexical_cast(x)`]] -] -[endsect] -[endsect] -[section Class template `other`] -Instances of `other` can be used in operator expressions with [link high_level_components.boost_python_operators_hpp.object_self self]; the result is equivalent to the same expression with a `T` object in place of `other`. Use `other` to prevent construction of a `T` object in case it is heavyweight, when no constructor is available, or simply for clarity. -`` -namespace boost { namespace python -{ - template - struct other - { - }; -}} -`` -[endsect] -[section Class template `detail::operator_`] -Instantiations of `detail::operator_<>` are used as the return type of operator expressions involving [link high_level_components.boost_python_operators_hpp.object_self self]. This should be considered an implementation detail and is only documented here as a way of showing how the result of self-expressions match calls to [link high_level_components.boost_python_class_hpp.class_template_class_t_bases_hel.class_template_class_modifier_fu `class_<>::def()`]. -`` -namespace boost { namespace python { namespace detail -{ - template - struct operator_ - { - }; -}}} -`` -[endsect] -[section Object `self`] -`` -namespace boost { namespace python -{ - using self_ns::self; -}} -`` -[endsect] -[section Example] -`` -#include -#include -#include -#include - -struct number - : boost::integer_arithmetic -{ - explicit number(long x_) : x(x_) {} - operator long() const { return x; } - - template - number& operator+=(T const& rhs) - { x += rhs; return *this; } - - template - number& operator-=(T const& rhs) - { x -= rhs; return *this; } - - template - number& operator*=(T const& rhs) - { x *= rhs; return *this; } - - template - number& operator/=(T const& rhs) - { x /= rhs; return *this; } - - template - number& operator%=(T const& rhs) - { x %= rhs; return *this; } - - long x; -}; - -using namespace boost::python; -BOOST_PYTHON_MODULE(demo) -{ - class_("number", init()) - // interoperate with self - .def(self += self) - .def(self + self) - .def(self -= self) - .def(self - self) - .def(self *= self) - .def(self * self) - .def(self /= self) - .def(self / self) - .def(self %= self) - .def(self % self) - - // Convert to Python int - .def(int_(self)) - - // interoperate with long - .def(self += long()) - .def(self + long()) - .def(long() + self) - .def(self -= long()) - .def(self - long()) - .def(long() - self) - .def(self *= long()) - .def(self * long()) - .def(long() * self) - .def(self /= long()) - .def(self / long()) - .def(long() / self) - .def(self %= long()) - .def(self % long()) - .def(long() % self) - ; -} -`` -[endsect] -[endsect] diff --git a/doc/reference/overloads.qbk b/doc/reference/overloads.qbk deleted file mode 100644 index 819ee680..00000000 --- a/doc/reference/overloads.qbk +++ /dev/null @@ -1,97 +0,0 @@ -[section boost/python/overloads.hpp] -[section Introduction] -Defines facilities for generating families of overloaded Python functions and extension class methods from C++ functions and member functions with default arguments, or from similar families of C++ overloads -[section overload-dispatch-expressions] -An overload-dispatch-expression is used to describe a family of overloaded methods to be generated for an extension class. It has the following properties: -[variablelist -[[docstring][An [link ntbs] whose value will bound to the methods' `__doc__` attribute]] -[[keywords][A [link function_invocation_and_creation.boost_python_args_hpp.introduction.keyword_expressions keyword-expression] which will be used to name (a trailing subsequence of) the arguments to the generated methods.]] -[[call policies][An instance of some type which models CallPolicies.]] -[[minimum arity][The minimum number of arguments to be accepted by a generated method overload.]] -[[maximum arity][The maximum number of arguments to be accepted by a generated method overload.]] -] -[endsect] -[endsect] -[section OverloadDispatcher Concept] -An OverloadDispatcher X is a class which has a minimum arity and a maximum arity, and for which the following following are valid overload-dispatch-expressions, with the same minimum and maximum arity as the OverloadDispatcher. -`` -X() -X(docstring) -X(docstring, keywords) -X(keywords, docstring) -X()[policies] -X(docstring)[policies] -X(docstring, keywords)[policies] -X(keywords, docstring)[policies] -`` -* If policies are supplied, it must be an instance of a type which models [link concepts.callpolicies CallPolicies], and will be used as the result's call policies. Otherwise the result's call policies will be an instance of [link function_invocation_and_creation.models_of_callpolicies.boost_python_default_call_polici `default_call_policies`]. -* If docstring is supplied it must be an [link ntbs], and will be used as the result's docstring. Otherwise the result has an empty docstring. -* If keywords is supplied it must be the result of a [link function_invocation_and_creation.boost_python_args_hpp.introduction.keyword_expressions keyword-expression] whose length is no greater than X's maximum arity, and will be used as the result's keywords. Otherwise the result's keywords will be empty. -[endsect] -[section Macros] -`` -BOOST_PYTHON_FUNCTION_OVERLOADS(name, func_id, min_args, max_args) -`` -Expands to the definition of an OverloadDispatcher called name in the current scope which can be used to generate the following function invocation: -``func_id(a1, a2,...ai);`` -for all `min_args <= i <= max_args`. -`` -BOOST_PYTHON_MEMBER_FUNCTION_OVERLOADS(name, member_name, min_args, max_args) -`` -Expands to the definition of an OverloadDispatcher called name in the current scope which can be used to generate the following function invocation: -``x.member_name(a1, a2,...ai);`` -for all min_args <= i <= max_args, where x is a reference to an object of class type. -[endsect] -[section Example] -`` -#include -#include -#include -#include -#include -#include -#include - -using namespace boost::python; - -tuple f(int x = 1, double y = 4.25, char const* z = "wow") -{ - return make_tuple(x, y, z); -} - -BOOST_PYTHON_FUNCTION_OVERLOADS(f_overloads, f, 0, 3) - -struct Y {}; -struct X -{ - Y& f(int x, double y = 4.25, char const* z = "wow") - { - return inner; - } - Y inner; -}; - -BOOST_PYTHON_MEMBER_FUNCTION_OVERLOADS(f_member_overloads, f, 1, 3) - -BOOST_PYTHON_MODULE(args_ext) -{ - def("f", f, - f_overloads( - args("x", "y", "z"), "This is f's docstring" - )); - - - class_("Y") - ; - - class_("X", "This is X's docstring") - .def("f1", &X::f, - f_member_overloads( - args("x", "y", "z"), "f's docstring" - )[return_internal_reference<>()] - ) - ; -} -`` -[endsect] -[endsect] diff --git a/doc/reference/pickle.qbk b/doc/reference/pickle.qbk deleted file mode 100644 index 7f89c2d1..00000000 --- a/doc/reference/pickle.qbk +++ /dev/null @@ -1,159 +0,0 @@ -[section Pickle support] -[section Introduction] -Pickle is a Python module for object serialization, also known as persistence, marshalling, or flattening. - -It is often necessary to save and restore the contents of an object to a file. One approach to this problem is to write a pair of functions that read and write data from a file in a special format. A powerful alternative approach is to use Python's pickle module. Exploiting Python's ability for introspection, the pickle module recursively converts nearly arbitrary Python objects into a stream of bytes that can be written to a file. - -The Boost Python Library supports the pickle module through the interface as described in detail in the [@http://www.python.org/doc/current/lib/module-pickle.html Python Library Reference for pickle]. This interface involves the special methods `__getinitargs__`, `__getstate__` and `__setstate__` as described in the following. Note that `Boost.Python` is also fully compatible with Python's cPickle module. -[endsect] -[section The Pickle Interface] -At the user level, the Boost.Python pickle interface involves three special methods: -[variablelist -[[__getinitargs__][When an instance of a Boost.Python extension class is pickled, the pickler tests if the instance has a `__getinitargs__` method. This method must return a Python `tuple` (it is most convenient to use a [link object_wrappers.boost_python_tuple_hpp.class_tuple `boost::python::tuple`]). When the instance is restored by the unpickler, the contents of this tuple are used as the arguments for the class constructor. - -If `__getinitargs__` is not defined, `pickle.load` will call the constructor (`__init__`) without arguments; i.e., the object must be default-constructible.]] -[[__getstate__][When an instance of a `Boost.Python` extension class is pickled, the pickler tests if the instance has a `__getstate__` method. This method should return a Python object representing the state of the instance.]] -[[__setstate__][When an instance of a `Boost.Python` extension class is restored by the unpickler (`pickle.load`), it is first constructed using the result of `__getinitargs__` as arguments (see above). Subsequently the unpickler tests if the new instance has a `__setstate__` method. If so, this method is called with the result of `__getstate__` (a Python object) as the argument.]] -] - -The three special methods described above may be `.def()`\ 'ed individually by the user. However, `Boost.Python` provides an easy to use high-level interface via the `boost::python::pickle_suite` class that also enforces consistency: `__getstate__` and `__setstate__` must be defined as pairs. Use of this interface is demonstrated by the following examples. -[endsect] -[section Example] -There are three files in `python/test` that show how to provide pickle support. -[section pickle1.cpp] -The C++ class in this example can be fully restored by passing the appropriate argument to the constructor. Therefore it is sufficient to define the pickle interface method `__getinitargs__`. This is done in the following way: -Definition of the C++ pickle function: -`` -struct world_pickle_suite : boost::python::pickle_suite -{ - static - boost::python::tuple - getinitargs(world const& w) - { - return boost::python::make_tuple(w.get_country()); - } -}; -`` -Establishing the Python binding: -`` -class_("world", args()) - // ... - .def_pickle(world_pickle_suite()) - // ... -`` -[endsect] -[section pickle2.cpp] -The C++ class in this example contains member data that cannot be restored by any of the constructors. Therefore it is necessary to provide the `__getstate__`/`__setstate__` pair of pickle interface methods: - -Definition of the C++ pickle functions: -`` -struct world_pickle_suite : boost::python::pickle_suite - { - static - boost::python::tuple - getinitargs(const world& w) - { - // ... - } - - static - boost::python::tuple - getstate(const world& w) - { - // ... - } - - static - void - setstate(world& w, boost::python::tuple state) - { - // ... - } - }; -`` -Establishing the Python bindings for the entire suite: -`` - class_("world", args()) - // ... - .def_pickle(world_pickle_suite()) - // ... - -`` - -For simplicity, the `__dict__` is not included in the result of `__getstate__`. This is not generally recommended, but a valid approach if it is anticipated that the object's `__dict__` will always be empty. Note that the safety guard described below will catch the cases where this assumption is violated. -[endsect] -[section pickle3.cpp] -This example is similar to pickle2.cpp. However, the object's `__dict__` is included in the result of `__getstate__`. This requires a little more code but is unavoidable if the object's `__dict__` is not always empty. -[endsect] -[endsect] -[section Pitfall and Safety Guard] -The pickle protocol described above has an important pitfall that the end user of a Boost.Python extension module might not be aware of: - -[*`__getstate__` is defined and the instance's `__dict__` is not empty.] - -The author of a `Boost.Python` extension class might provide a `__getstate__` method without considering the possibilities that: -* his class is used in Python as a base class. Most likely the `__dict__` of instances of the derived class needs to be pickled in order to restore the instances correctly. -* the user adds items to the instance's `__dict__` directly. Again, the `__dict__` of the instance then needs to be pickled. - -To alert the user to this highly unobvious problem, a safety guard is provided. If `__getstate__` is defined and the instance's `__dict__` is not empty, `Boost.Python` tests if the class has an attribute `__getstate_manages_dict__`. An exception is raised if this attribute is not defined: - -`` - RuntimeError: Incomplete pickle support (__getstate_manages_dict__ not set) -`` - -To resolve this problem, it should first be established that the `__getstate__` and `__setstate__` methods manage the instances's `__dict__` correctly. Note that this can be done either at the C++ or the Python level. Finally, the safety guard should intentionally be overridden. E.g. in C++ (from pickle3.cpp): - -`` -struct world_pickle_suite : boost::python::pickle_suite -{ - // ... - - static bool getstate_manages_dict() { return true; } -}; -`` - -Alternatively in Python: - -`` -import your_bpl_module -class your_class(your_bpl_module.your_class): - __getstate_manages_dict__ = 1 - def __getstate__(self): - # your code here - def __setstate__(self, state): - # your code here - -`` -[endsect] -[section Practical Advice] - -* In `Boost.Python` extension modules with many extension classes, providing complete pickle support for all classes would be a significant overhead. In general complete pickle support should only be implemented for extension classes that will eventually be pickled. -* Avoid using `__getstate__` if the instance can also be reconstructed by way of `__getinitargs__`. This automatically avoids the pitfall described above. -* If `__getstate__` is required, include the instance's `__dict__` in the Python object that is returned. - -[endsect] -[section Light-weight alternative: pickle support implemented in Python] -The pickle4.cpp example demonstrates an alternative technique for implementing pickle support. First we direct Boost.Python via the class_::enable_pickling() member function to define only the basic attributes required for pickling: - -`` - class_("world", args()) - // ... - .enable_pickling() - // ... -`` -This enables the standard Python pickle interface as described in the Python documentation. By "injecting" a `__getinitargs__` method into the definition of the wrapped class we make all instances pickleable: - -`` - # import the wrapped world class - from pickle4_ext import world - - # definition of __getinitargs__ - def world_getinitargs(self): - return (self.get_country(),) - - # now inject __getinitargs__ (Python is a dynamic language!) - world.__getinitargs__ = world_getinitargs -`` -See also the tutorial section on injecting additional methods from Python. -[endsect] -[endsect] diff --git a/doc/reference/pointee.qbk b/doc/reference/pointee.qbk deleted file mode 100644 index 525ba5d8..00000000 --- a/doc/reference/pointee.qbk +++ /dev/null @@ -1,47 +0,0 @@ -[section boost/python/pointee.hpp] -[section Introduction] - introduces a traits metafunction `template pointee` that can be used to extract the "pointed-to" type from the type of a pointer or smart pointer. -[endsect] -[section Class template `pointee`] -`pointee` is used by the [link high_level_components.boost_python_class_hpp.class_template_class_t_bases_hel `class_<...>`] template to deduce the type being held when a pointer or smart pointer type is used as its HeldType argument. -`` -namespace boost { namespace python -{ - template struct pointee - { - typedef T::element_type type; - }; - - // specialization for pointers - template struct pointee - { - typedef T type; - }; -} -`` -[endsect] -[section Examples] -Given a 3rd-party smart pointer type `smart_pointer`, one might partially specialize `pointee >` so that it can be used as the HeldType for a class wrapper: -`` -#include -#include -#include - -namespace boost { namespace python -{ - template struct pointee > - { - typedef T type; - }; -}} - -BOOST_PYTHON_MODULE(pointee_demo) -{ - class_ >("third_party_class") - .def(...) - ... - ; -} -`` -[endsect] -[endsect] diff --git a/doc/reference/ptr.qbk b/doc/reference/ptr.qbk deleted file mode 100644 index c39c5ac8..00000000 --- a/doc/reference/ptr.qbk +++ /dev/null @@ -1,118 +0,0 @@ -[section boost/python/ptr.hpp] -[section Introduction] - defines the ptr() function template, which allows users to specify how to convert C++ pointer values to python in the context of implementing overridable virtual functions, invoking Python callable objects, or explicitly converting C++ objects to Python. Normally, when passing pointers to Python callbacks, the pointee is copied to ensure that the Python object never holds a dangling reference. To specify that the new Python object should merely contain a copy of a pointer p, the user can pass ptr(p) instead of passing p directly. This interface is meant to mirror the use of boost::ref(), which can be similarly used to prevent copying of referents. - -ptr(p) returns an instance of [link function_invocation_and_creation.boost_python_ptr_hpp.class_template_pointer_wrapper `pointer_wrapper<>`], which can be detected using the [link function_invocation_and_creation.boost_python_ptr_hpp.metafunctions.class_template_is_pointer_wrappe `is_pointer_wrapper<>`] metafunction; [link function_invocation_and_creation.boost_python_ptr_hpp.metafunctions.class_template_unwrap_pointer `unwrap_pointer<>`] is a metafunction which extracts the original pointer type from a `pointer_wrapper<>`. These classes can be thought of as implementation details. -[endsect] -[section Functions] -`` -template -pointer_wrapper ptr(T x); -`` -[variablelist -[[Requires][T is a pointer type.]] -[[Returns][pointer_wrapper(x)]] -[[Throws][nothing.]] -] -[endsect] -[section Class template `pointer_wrapper`] -A "type envelope" which is returned by `ptr()`, used to indicate reference semantics for pointers passed to Python callbacks. -`` -namespace boost { namespace python -{ - template class pointer_wrapper - { - public: - typedef Ptr type; - - explicit pointer_wrapper(Ptr x); - operator Ptr() const; - Ptr get() const; - }; -}} -`` -[endsect] -[section Class template `pointer_wrapper` types] -`` -typedef Ptr type; -`` -The type of the pointer being wrapped. -[endsect] -[section Class template `pointer_wrapper` constructors and destructor] -`` -explicit pointer_wrapper(Ptr x); -`` -[variablelist -[[Requires][`Ptr` is a pointer type]] -[[Effects][Stores `x` in a the `pointer_wrapper<>`. ]] -[[Throws][nothing.]] -] -[endsect] -[section Class template `pointer_wrapper` observer functions] -`` -operator Ptr() const; -Ptr get() const; -`` -[variablelist -[[Returns][a copy of the stored pointer. ]] -[[Rationale][pointer_wrapper is intended to be a stand-in for the actual pointer type, but sometimes it's better to have an explicit way to retrieve the pointer. ]] -] -[endsect] -[section Metafunctions] -[section Class template `is_pointer_wrapper`] -A unary metafunction whose value is true iff its argument is a pointer_wrapper<>. -`` -namespace boost { namespace python -{ - template class is_pointer_wrapper - { - static unspecified value = ...; - }; -}} -`` -[variablelist -[[Returns][`true` iff `T` is a specialization of `pointer_wrapper<>`. -value is an integral constant convertible to bool of unspecified type ]] -] -[endsect] -[section Class template `unwrap_pointer`] -A unary metafunction which extracts the wrapped pointer type from a specialization of pointer_wrapper<>. -`` -namespace boost { namespace python -{ - template class unwrap_pointer - { - typedef unspecified type; - }; -}} -`` -[variablelist -[[Returns][`T::type` if `T` is a specialization of `pointer_wrapper<>`, `T` otherwise ]] -] -[endsect] -[endsect] -[section Example] -This example illustrates the use of ptr() to prevent an object from being copied: -`` -#include -#include - -class expensive_to_copy -{ - ... -}; - -void pass_as_arg(expensive_to_copy* x, PyObject* f) -{ - // call the Python function f, passing a Python object built around - // which refers to *x by-pointer. - // - // *** Note: ensuring that *x outlives the argument to f() is *** - // *** up to the user! Failure to do so could result in a crash! *** - - boost::python::call(f, ptr(x)); -} -... -`` -[endsect] -[endsect] diff --git a/doc/reference/pytype_function.qbk b/doc/reference/pytype_function.qbk deleted file mode 100644 index 18ceff57..00000000 --- a/doc/reference/pytype_function.qbk +++ /dev/null @@ -1,194 +0,0 @@ -[section boost/python/pytype_function.hpp] -[section Introduction] -To support Pythonic signatures the converters should supply a `get_pytype` function returning a pointer to the associated `PyTypeObject`. See for example [link concepts.resultconverter `ResultConverter`] or [link to_from_python_type_conversion.boost_python_to_python_converter.class_template_to_python_convert.class_template_to_python_convert `to_python_converter`]. The classes in this header file are meant to be used when implmenting `get_pytype`. There are also `_direct` versions of the templates of `class T` which should be used with undecorated type parameter, expected to be in the conversion registry when the module loads. -[endsect] -[section Class `wrap_pytype`] -This template generates a static `get_pytype` member returning the template parameter. -`` -namespace boost { namespace python { namespace converter{ - - template < PyTypeObject const *pytype > - class wrap_pytype - { - public: - static PyTypeObject const *get_pytype(){return pytype; } - }; - -}}} -`` -[endsect] -[section Class `registered_pytype`] -This template should be used with template parameters which are (possibly decorated) types exported to python using [link high_level_components.boost_python_class_hpp.class_template_class_t_bases_hel `class_`]. The generated a static `get_pytype` member returns the corresponding python type. -`` -namespace boost { namespace python { namespace converter{ - - template < class T > - class registered_pytype - { - public: - static PyTypeObject const *get_pytype(); - }; - -}}} -`` -[endsect] -[section Class `expected_from_python_type`] -This template generates a static `get_pytype` member which inspects the registered `from_python` converters for the type `T` and returns a matching python type. -`` -namespace boost { namespace python { namespace converter{ - - template < class T > - class expected_from_python_type - { - public: - static PyTypeObject const *get_pytype(); - }; - -}}} -`` -[endsect] -[section Class `to_python_target_type`] -This template generates a static `get_pytype` member returning the python type to which `T` can be converted. -`` -namespace boost { namespace python { namespace converter{ - - template < class T > - class to_python_target_type - { - public: - static PyTypeObject const *get_pytype(); - }; - -}}} -`` -[endsect] -[section Example] -This example presumes that someone has implemented the standard noddy example module from the Python documentation, and placed the corresponding declarations in "noddy.h". Because `noddy_NoddyObject` is the ultimate trivial extension type, the example is a bit contrived: it wraps a function for which all information is contained in the type of its return value. - -C++ module definition: -`` -#include -#include -#include "noddy.h" - -struct tag {}; -tag make_tag() { return tag(); } - -using namespace boost::python; - -struct tag_to_noddy -#if defined BOOST_PYTHON_SUPPORTS_PY_SIGNATURES //unnecessary overhead if py signatures are not supported -: wrap_pytype<&noddy_NoddyType> //inherits get_pytype from wrap_pytype -#endif -{ - static PyObject* convert(tag const& x) - { - return PyObject_New(noddy_NoddyObject, &noddy_NoddyType); - } -}; - -BOOST_PYTHON_MODULE(to_python_converter) -{ - def("make_tag", make_tag); - to_python_converter(); //"true" because tag_to_noddy has member get_pytype -} -`` -The following example registers to and from python converters using the templates expected_from_python_type and to_pyhton_target_type. -`` -#include -#include -#include -#include -#include - -using namespace boost::python; - -struct A -{ -}; - -struct B -{ - A a; - B(const A& a_):a(a_){} -}; - -// Converter from A to python int -struct BToPython -#if defined BOOST_PYTHON_SUPPORTS_PY_SIGNATURES //unnecessary overhead if py signatures are not supported - : converter::to_python_target_type //inherits get_pytype -#endif -{ - static PyObject* convert(const B& b) - { - return incref(object(b.a).ptr()); - } -}; - -// Conversion from python int to A -struct BFromPython -{ - BFromPython() - { - boost::python::converter::registry::push_back - ( &convertible - , &construct - , type_id< B >() -#if defined BOOST_PYTHON_SUPPORTS_PY_SIGNATURES //invalid if py signatures are not supported - , &converter::expected_from_python_type::get_pytype//convertible to A can be converted to B -#endif - ); - } - - static void* convertible(PyObject* obj_ptr) - { - extract ex(obj_ptr); - if (!ex.check()) return 0; - return obj_ptr; - } - - static void construct( - PyObject* obj_ptr, - converter::rvalue_from_python_stage1_data* data) - { - void* storage = ( - (converter::rvalue_from_python_storage< B >*)data)-> storage.bytes; - - extract ex(obj_ptr); - new (storage) B(ex()); - data->convertible = storage; - } -}; - - -B func(const B& b) { return b ; } - -BOOST_PYTHON_MODULE(pytype_function_ext) -{ - to_python_converter< B , BToPython -#if defined BOOST_PYTHON_SUPPORTS_PY_SIGNATURES //invalid if py signatures are not supported - ,true -#endif - >(); //has get_pytype - BFromPython(); - - class_("A") ; - - def("func", &func); - -} - - - ->>> from pytype_function_ext import * ->>> print func.__doc__ -func( (A)arg1) -> A : - C++ signature: - struct B func(struct B) -`` -[endsect] -[endsect] diff --git a/doc/reference/raw_function.qbk b/doc/reference/raw_function.qbk deleted file mode 100644 index 705428d1..00000000 --- a/doc/reference/raw_function.qbk +++ /dev/null @@ -1,44 +0,0 @@ -[section boost/python/raw_function.hpp] -[section Introduction] -`raw_function(...)` is used to convert a function taking a [link object_wrappers.boost_python_tuple_hpp.class_tuple `tuple`] and a [link object_wrappers.boost_python_dict_hpp.class_dict `dict`] into a Python callable object which accepts a variable number of arguments and arbitrary keyword arguments. -[endsect] -[section Function `raw_function`] -`` -template -object raw_function(F f, std::size_t min_args = 0); -`` -[variablelist -[[Requires][f(tuple(), dict()) is well-formed.]] -[[Returns][a callable object which requires at least min_args arguments. When called, the actual non-keyword arguments will be passed in a tuple as the first argument to f, and the keyword arguments will be passed in a dict as the second argument to f. ]] -] -[endsect] -[section Example] -C++: -`` -#include -#include -#include -#include -#include - -using namespace boost::python; - -tuple raw(tuple args, dict kw) -{ - return make_tuple(args, kw); -} - -BOOST_PYTHON_MODULE(raw_test) -{ - def("raw", raw_function(raw)); -} -`` -Python: -`` ->>> from raw_test import * - ->>> raw(3, 4, foo = 'bar', baz = 42) -((3, 4), {'foo': 'bar', 'baz': 42}) -`` -[endsect] -[endsect] diff --git a/doc/reference/reference_existing_object.qbk b/doc/reference/reference_existing_object.qbk deleted file mode 100644 index e95c8fac..00000000 --- a/doc/reference/reference_existing_object.qbk +++ /dev/null @@ -1,75 +0,0 @@ -[section boost/python/reference_existing_object.hpp] -[section Class `reference_existing_object`] -`reference_existing_object` is a model of [link concepts.resultconverter.resultconvertergenerator_concept ResultConverterGenerator] which can be used to wrap C++ functions which return a reference or pointer to a C++ object. When the wrapped function is called, the value referenced by its return value is not copied. A new Python object is created which contains a pointer to the referent, and no attempt is made to ensure that the lifetime of the referent is at least as long as that of the corresponding Python object. Thus, it can be *highly dangerous* to use `reference_existing_object` without additional lifetime management from such models of [link concepts.callpolicies CallPolicies] as [link function_invocation_and_creation.models_of_callpolicies.boost_python_with_custodian_and_.class_with_custodian_and_ward `with_custodian_and_ward`]. This class is used in the implementation of [link function_invocation_and_creation.models_of_callpolicies.boost_python_return_internal_ref.class_template_return_internal_r `return_internal_reference`]. -`` -namespace boost { namespace python -{ - struct reference_existing_object - { - template struct apply; - }; -}} -`` -[endsect] -[section Class `reference_existing_object` metafunctions] -``template struct apply`` -[variablelist -[[Requires][`T` is `U&` or `U*` for some `U`.]] -[[Returns][`typedef to_python_indirect type;`, where V is a class whose static execute function constructs an instance holder containing an unowned `U*` pointing to the referent of the wrapped function's return value.]] -] -[endsect] -[section Example] -In C++: -`` -#include -#include -#include -#include -#include - -// classes to wrap -struct Singleton -{ - Singleton() : x(0) {} - - int exchange(int n) // set x and return the old value - { - std::swap(n, x); - return n; - } - - int x; -}; - -Singleton& get_it() -{ - static Singleton just_one; - return just_one; -} - -// Wrapper code -using namespace boost::python; -BOOST_PYTHON_MODULE(singleton) -{ - def("get_it", get_it, - return_value_policy()); - - class_("Singleton") - .def("exchange", &Singleton::exchange) - ; -} -`` -Python code: -`` ->>> import singleton ->>> s1 = singleton.get_it() ->>> s2 = singleton.get_it() ->>> id(s1) == id(s2) # s1 and s2 are not the same object -0 ->>> s1.exchange(42) # but they reference the same C++ Singleton -0 ->>> s2.exchange(99) -42 -`` -[endsect] -[endsect] diff --git a/doc/reference/register_ptr_to_python.qbk b/doc/reference/register_ptr_to_python.qbk deleted file mode 100644 index 0c9f72e8..00000000 --- a/doc/reference/register_ptr_to_python.qbk +++ /dev/null @@ -1,86 +0,0 @@ -[section boost/python/register_ptr_to_python.hpp] -[section Introduction] - supplies `register_ptr_to_python`, a function template which registers a conversion for smart pointers to Python. The resulting Python object holds a copy of the converted smart pointer, but behaves as though it were a wrapped copy of the pointee. If the pointee type has virtual functions and the class representing its dynamic (most-derived) type has been wrapped, the Python object will be an instance of the wrapper for the most-derived type. More than one smart pointer type for a pointee's class can be registered. - -Note that in order to convert a Python `X` object to a `smart_ptr&` (non-const reference), the embedded C++ object must be held by `smart_ptr`, and that when wrapped objects are created by calling the constructor from Python, how they are held is determined by the HeldType parameter to `class_<...>` instances. -[endsect] -[section Function `register_ptr_to_python`] -`` -template -void register_ptr_to_python() -`` -[variablelist -[[Requires][`P` is [link concepts.dereferenceable Dereferenceable].]] -[[Effects][Allows conversions to-python of P instances. ]] -] -[endsect] -[section Example] -Here is an example of a module that contains a class A with virtual functions and some functions that work with boost::shared_ptr. - -In C++: -`` -struct A -{ - virtual int f() { return 0; } -}; - -shared_ptr New() { return shared_ptr( new A() ); } - -int Ok( const shared_ptr& a ) { return a->f(); } - -int Fail( shared_ptr& a ) { return a->f(); } - -struct A_Wrapper: A -{ - A_Wrapper(PyObject* self_): self(self_) {} - int f() { return call_method(self, "f"); } - int default_f() { return A::f(); } - PyObject* self; -}; - -BOOST_PYTHON_MODULE(register_ptr) -{ - class_("A") - .def("f", &A::f, &A_Wrapper::default_f) - ; - - def("New", &New); - def("Ok", &Call); - def("Fail", &Fail); - - register_ptr_to_python< shared_ptr >(); -} -`` -In Python: -`` ->>> from register_ptr import * ->>> a = A() ->>> Ok(a) # ok, passed as shared_ptr -0 ->>> Fail(a) # passed as shared_ptr&, and was created in Python! -Traceback (most recent call last): - File "", line 1, in ? -TypeError: bad argument type for built-in operation ->>> ->>> na = New() # now "na" is actually a shared_ptr ->>> Ok(a) -0 ->>> Fail(a) -0 ->>> -`` -If shared_ptr is registered as follows: -`` -class_ >("A") - .def("f", &A::f, &A_Wrapper::default_f) -; -`` -There will be an error when trying to convert shared_ptr to shared_ptr: -`` ->>> a = New() -Traceback (most recent call last): -File "", line 1, in ? -TypeError: No to_python (by-value) converter found for C++ type: class boost::shared_ptr ->>> -`` -[endsect] diff --git a/doc/reference/return_arg.qbk b/doc/reference/return_arg.qbk deleted file mode 100644 index 08e6f299..00000000 --- a/doc/reference/return_arg.qbk +++ /dev/null @@ -1,91 +0,0 @@ -[section boost/python/return_arg.hpp] -[section Introduction] -`return_arg` and `return_self` instantiations are models of [link concepts.callpolicies `CallPolicies`] which return the specified argument parameter (usually `*this`) of a wrapped (member) function. -[endsect] -[section Class `return_arg`] -[table -[[Parameter][Requirements][Description][Default]] - [[arg_pos][A positive compile-time constant of type `std::size_t`.][the position of the argument to be returned.][1]] -[[Base][A model of [link concepts.callpolicies `CallPolicies`]][Used for policy composition. Any `result_converter` it supplies will be overridden by `return_arg`, but its `precall` and `postcall` policies are composed as described here [link concepts.callpolicies `CallPolicies`].][default_call_policies]] - ] -`` -namespace boost { namespace python -{ - template - struct return_arg : Base - { - static PyObject* postcall(PyObject*, PyObject* result); - struct result_converter{ template struct apply; }; - template struct extract_return_type : mpl::at_c{}; - - }; -}} -`` -[endsect] -[section Class `return_arg` static functions] -``PyObject* postcall(PyObject* args, PyObject* result);`` -[variablelist -[[Requires][`PyTuple_Check(args) != 0` and `PyTuple_Size(args) != 0`]] -[[Returns][PyTuple_GetItem(args,arg_pos-1)]] -] -[endsect] -[section Class template `return_self`] -`` -namespace boost { namespace python -{ - template - struct return_self - : return_arg<1,Base> - {}; -}} -`` -[endsect] -[section Example] -C++ module definition: -`` -#include -#include -#include - -struct Widget -{ - Widget() :sensitive_(true){} - bool get_sensitive() const { return sensitive_; } - void set_sensitive(bool s) { this->sensitive_ = s; } - private: - bool sensitive_; -}; - -struct Label : Widget -{ - Label() {} - - std::string get_label() const { return label_; } - void set_label(const std::string &l){ label_ = l; } - - private: - std::string label_; -}; - -using namespace boost::python; -BOOST_PYTHON_MODULE(return_self_ext) -{ - class_("Widget") - .def("sensitive", &Widget::get_sensitive) - .def("sensitive", &Widget::set_sensitive, return_self<>()) - ; - - class_ >("Label") - .def("label", &Label::get_label) - .def("label", &Label::set_label, return_self<>()) - ; -} -`` -Python code: -`` ->>> from return_self_ext import * ->>> l1 = Label().label("foo").sensitive(false) ->>> l2 = Label().sensitive(false).label("foo") -`` -[endsect] -[endsect] diff --git a/doc/reference/return_by_value.qbk b/doc/reference/return_by_value.qbk deleted file mode 100644 index 2b8b7887..00000000 --- a/doc/reference/return_by_value.qbk +++ /dev/null @@ -1,62 +0,0 @@ -[section boost/python/return_by_value.hpp] -[section Class `return_by_value`] -`return_by_value` is a model of [link concepts.resultconverter.resultconvertergenerator_concept ResultConverterGenerator] which can be used to wrap C++ functions returning any reference or value type such that the return value is copied into a new Python object. -`` -namespace boost { namespace python -{ - struct return_by_value - { - template struct apply; - }; -}} -`` -[endsect] -[section Class `return_by_value` metafunctions] -``template struct apply`` -[variablelist -[[Returns][`typedef to_python_value type;`]] -] -[endsect] -[section Example] -In C++: -`` -#include -#include -#include -#include - -// classes to wrap -struct Bar { }; - -Bar global_bar; - -// functions to wrap: -Bar b1(); -Bar& b2(); -Bar const& b3(); - -// Wrapper code -using namespace boost::python; -template -void def_void_function(char const* name, R (*f)()) -{ - def(name, f, return_value_policy()); -} - -BOOST_PYTHON_MODULE(my_module) -{ - class_("Bar"); - def_void_function("b1", b1); - def_void_function("b2", b2); - def_void_function("b3", b3); -} -`` -Python code: -`` ->>> from my_module import * ->>> b = b1() # each of these calls ->>> b = b2() # creates a brand ->>> b = b3() # new Bar object -`` -[endsect] -[endsect] diff --git a/doc/reference/return_internal_reference.qbk b/doc/reference/return_internal_reference.qbk deleted file mode 100644 index 240ed0ab..00000000 --- a/doc/reference/return_internal_reference.qbk +++ /dev/null @@ -1,88 +0,0 @@ -[section boost/python/return_internal_reference.hpp] -[section Introduction] -`return_internal_reference` instantiations are models of [link concepts.callpolicies `CallPolicies`] which allow pointers and references to objects held internally by a free or member function argument or from the target of a member function to be returned safely without making a copy of the referent. The default for its first template argument handles the common case where the containing object is the target (`*this`) of a wrapped member function. -[endsect] -[section Class template `return_internal_reference`] -[table - [[Parameter][Requirements][Description][Default]] - [[owner_arg][A positive compile-time constant of type `std::size_t`.][The index of the parameter which contains the object to which the reference or pointer is being returned. If used to wrap a member function, parameter 1 is the target object (`*this`). Note that if the target Python object type doesn't support weak references, a Python TypeError exception will be raised when the function being wrapped is called.][]] - [[Base][A model of [link concepts.callpolicies `CallPolicies`]][Used for policy composition. Any `result_converter` it supplies will be overridden by `return_internal_reference`, but its `precall` and `postcall` policies are composed as described here [link concepts.callpolicies `CallPolicies`].][default_call_policies]] -] -`` -namespace boost { namespace python -{ - template - struct return_internal_reference : Base - { - static PyObject* postcall(PyObject*, PyObject* result); - typedef reference_existing_object result_converter; - }; -}} -`` -[endsect] -[section Class `return_internal_reference` static functions] -``PyObject* postcall(PyObject* args, PyObject* result);`` -[variablelist -[[Requires][`PyTuple_Check(args) != 0`]] -[[Returns][[link function_invocation_and_creation.models_of_callpolicies.boost_python_with_custodian_and_.class_with_custodian_and_ward_st `with_custodian_and_ward_postcall::postcall(args, result)`]]] -] -[endsect] -[section Example] -C++ module definition: -`` -#include -#include -#include - -class Bar -{ - public: - Bar(int x) : x(x) {} - int get_x() const { return x; } - void set_x(int x) { this->x = x; } - private: - int x; -}; - -class Foo -{ - public: - Foo(int x) : b(x) {} - - // Returns an internal reference - Bar const& get_bar() const { return b; } - - private: - Bar b; -}; - -using namespace boost::python; -BOOST_PYTHON_MODULE(internal_refs) -{ - class_("Bar", init()) - .def("get_x", &Bar::get_x) - .def("set_x", &Bar::set_x) - ; - - class_("Foo", init()) - .def("get_bar", &Foo::get_bar - , return_internal_reference<>()) - ; -} -`` -Python code: -`` ->>> from internal_refs import * ->>> f = Foo(3) ->>> b1 = f.get_bar() ->>> b2 = f.get_bar() ->>> b1.get_x() -3 ->>> b2.get_x() -3 ->>> b1.set_x(42) ->>> b2.get_x() -42 -`` -[endsect] -[endsect] diff --git a/doc/reference/return_opaque_pointer.qbk b/doc/reference/return_opaque_pointer.qbk deleted file mode 100644 index e87d82b9..00000000 --- a/doc/reference/return_opaque_pointer.qbk +++ /dev/null @@ -1,95 +0,0 @@ -[section boost/python/return_opaque_pointer.hpp] -[section Class `return_opaqe_pointer`] -return_opaque_pointer is a model of [link concepts.resultconverter.resultconvertergenerator_concept ResultConverterGenerator] which can be used to wrap C++ functions returning pointers to undefined types such that the return value is copied into a new Python object. - -In addition to specifying the `return_opaque_pointer` policy the [link to_from_python_type_conversion.boost_python_opaque_pointer_conv.macro_boost_python_opaque_specia `BOOST_PYTHON_OPAQUE_SPECIALIZED_TYPE_ID`] macro must be used to define specializations for the [link utility_and_infrastructure.boost_python_type_id_hpp.functions `type_id`] function on the type pointed to by returned pointer. -`` -namespace boost { namespace python -{ - struct return_opaque_pointer - { - template struct apply; - }; -}} -`` -[endsect] -[section Class `return_opaque_pointer` metafunctions] -``template struct apply`` -[variablelist -[[Returns][`detail::opaque_conversion_holder type;`]] -] -[endsect] -[section Example] -In C++: -`` -# include -# include -# include -# include - -typedef struct opaque_ *opaque; - -opaque the_op = ((opaque) 0x47110815); - -opaque get () { return the_op; } -void use (opaque op) { - if (op != the_op) - throw std::runtime_error (std::string ("failed")); -} - -void failuse (opaque op) { - if (op == the_op) - throw std::runtime_error (std::string ("success")); -} - -BOOST_PYTHON_OPAQUE_SPECIALIZED_TYPE_ID(opaque_) - -namespace bpl = boost::python; - -BOOST_PYTHON_MODULE(opaque_ext) -{ - bpl::def ( - "get", &::get, bpl::return_value_policy()); - bpl::def ("use", &::use); - bpl::def ("failuse", &::failuse); -} -`` -Python code: -`` -""" ->>> from opaque_ext import * ->>> # ->>> # Check for correct conversion ->>> use(get()) ->>> failuse(get()) -Traceback (most recent call last): - ... -RuntimeError: success ->>> # ->>> # Check that there is no conversion from integers ... ->>> use(0) -Traceback (most recent call last): - ... -TypeError: bad argument type for built-in operation ->>> # ->>> # ... and from strings to opaque objects ->>> use("") -Traceback (most recent call last): - ... -TypeError: bad argument type for built-in operation -""" -def run(args = None): - import sys - import doctest - - if args is not None: - sys.argv = args - return doctest.testmod(sys.modules.get(__name__)) - -if __name__ == '__main__': - print "running..." - import sys - sys.exit(run()[0]) -`` -[endsect] -[endsect] diff --git a/doc/reference/return_value_policy.qbk b/doc/reference/return_value_policy.qbk deleted file mode 100644 index 6c2e394c..00000000 --- a/doc/reference/return_value_policy.qbk +++ /dev/null @@ -1,59 +0,0 @@ -[section boost/python/return_value_policy.hpp] -[section Introduction] -return_value_policy instantiations are simply models of [link concepts.callpolicies `CallPolicies`] which are composed of a [link concepts.resultconverter.resultconvertergenerator_concept `ResultConverterGenerator`] and optional `Base` [link concepts.callpolicies `CallPolicies`]. -[endsect] -[section Class template `return_value_policy`] -[table -[[Parameter][Requirements][Default]] - [[ResultConverterGenerator][A model of [link concepts.resultconverter.resultconvertergenerator_concept `ResultConverterGenerator`]][]] -[[Base][A model of [link concepts.callpolicies `CallPolicies`]][default_call_policies]] - ] -`` -namespace boost { namespace python -{ - template - struct return_value_policy : Base - { - typedef ResultConverterGenerator result_converter; - }; -}} -`` -[endsect] -[section Example] -C++ module definition: -`` -#include -#include -#include -#include - -// classes to wrap -struct Bar { int x; } - -struct Foo { - Foo(int x) : { b.x = x; } - Bar const& get_bar() const { return b; } - private: - Bar b; -}; - -// Wrapper code -using namespace boost::python; -BOOST_PYTHON_MODULE(my_module) -{ - class_("Bar"); - - class_("Foo", init()) - .def("get_bar", &Foo::get_bar - , return_value_policy()) - ; -} -`` -Python code: -`` ->>> from my_module import * ->>> f = Foo(3) # create a Foo object ->>> b = f.get_bar() # make a copy of the internal Bar object -`` -[endsect] -[endsect] diff --git a/doc/reference/scope.qbk b/doc/reference/scope.qbk deleted file mode 100644 index d17ae69b..00000000 --- a/doc/reference/scope.qbk +++ /dev/null @@ -1,83 +0,0 @@ -[section boost/python/scope.hpp] -[section Introduction] -Defines facilities for querying and controlling the Python scope (namespace) which will contain new wrapped classes and functions. -[endsect] -[section Class `scope`] -The scope class has an associated global Python object which controls the Python namespace in which new extension classes and wrapped functions will be defined as attributes. Default-constructing a new scope object binds it to the associated global Python object. Constructing a scope object with an argument changes the associated global Python object to the one held by the argument, until the lifetime of the scope object ends, at which time the associated global Python object reverts to what it was before the scope object was constructed. -`` -namespace boost { namespace python -{ - class scope : public object - { - public: - scope(scope const&); - scope(object const&); - scope(); - ~scope() - private: - void operator=(scope const&); - }; -}} -`` -[endsect] -[section Class scope constructors and destructor] -`` -explicit scope(scope const& x); -explicit scope(object const& x); -`` -Stores a reference to the current associated scope object, and sets the associated scope object to the one referred to by x.ptr(). The object base class is initialized with x. - -``scope();`` - -Stores a reference to the current associated scope object. The object base class is initialized with the current associated scope object. Outside any module initialization function, the current associated Python object is None. - -``~scope()`` - -Sets the current associated Python object to the stored object. -[endsect] -[section Example] -The following example shows how scope setting can be used to define nested classes. - -C++ Module definition: -`` -#include -#include -#include -using namespace boost::python; - -struct X -{ - void f() {} - - struct Y { int g() { return 42; } }; -}; - -BOOST_PYTHON_MODULE(nested) -{ - // add some constants to the current (module) scope - scope().attr("yes") = 1; - scope().attr("no") = 0; - - // Change the current scope - scope outer - = class_("X") - .def("f", &X::f) - ; - - // Define a class Y in the current scope, X - class_("Y") - .def("g", &X::Y::g) - ; -} -`` -Interactive Python: -`` ->>> import nested ->>> nested.yes -1 ->>> y = nested.X.Y() ->>> y.g() -42 -`` -[endsect] -[endsect] diff --git a/doc/reference/slice.qbk b/doc/reference/slice.qbk deleted file mode 100644 index 32e3363f..00000000 --- a/doc/reference/slice.qbk +++ /dev/null @@ -1,136 +0,0 @@ -[section boost/python/slice.hpp] -[section Introduction] -Exposes a [link concepts.objectwrapper.typewrapper_concept_requirements TypeWrapper] for the Python [@http://www.python.org/doc/2.3.3/api/slice-objects.html `slice`] type. -[endsect] -[section Class `slice`] -Exposes the extended slicing protocol by wrapping the built-in slice type. The semantics of the constructors and member functions defined below can be fully understood by reading the [link concepts.objectwrapper.typewrapper_concept_requirements TypeWrapper] concept definition. Since `slice` is publicly derived from [link object_wrappers.boost_python_object_hpp.class_object `object`], the public `object` interface applies to `slice` instances as well. -`` -namespace boost { namespace python -{ - class slice : public object - { - public: - slice(); // create an empty slice, equivalent to [::] - - template - slice(Int1 start, Int2 stop); - - template - slice(Int1 start, Int2 stop, Int3 step); - - // Access the parameters this slice was created with. - object start(); - object stop(); - object step(); - - // The return type of slice::get_indices() - template - struct range - { - RandomAccessIterator start; - RandomAccessIterator stop; - int step; - }; - - template - range - get_indices( - RandomAccessIterator const& begin, - RandomAccessIterator const& end); - }; -}} -`` -[endsect] -[section Class `slice` constructors] -``slice();`` -[variablelist -[[Effects][constructs a slice with default stop, start, and step values. Equivalent to the slice object created as part of the Python expression `base[::]`.]] -[[Throws][nothing]] -] -`` -template -slice(Int1 start, Int2 stop); -`` -[variablelist -[[Requires][`start`, `stop`, and `step` are of type `slice_nil` or convertible to type `object`.]] -[[Effects][constructs a new slice with default step value and the provided start and stop values. Equivalent to the slice object created by the built-in Python function `slice(start,stop)`, or as part of the Python expression `base[start:stop]`.]] -[[Throws][`error_already_set` and sets a Python TypeError exception if no conversion is possible from the arguments to type object.]] -] -`` -template -slice(Int1 start, Int2 stop, Int3 step); -`` -[variablelist -[[Requires][`start`, `stop`, and `step` are `slice_nil` or convertible to type `object`.]] -[[Effects][constructs a new slice with start stop and step values. Equivalent to the slice object created by the built-in Python function `slice(start,stop,step)`, or as part of the Python expression `base[start:stop:step]`.]] -[[Throws][`error_already_set` and sets a Python TypeError exception if no conversion is possible from the arguments to type object.]] -] -[endsect] -[section Class `slice` observer functions] -`` -object slice::start() const; -object slice::stop() const; -object slice::step() const; -`` -[variablelist -[[Effects][None]] -[[Throws][nothing]] -[[Returns][the parameter that the slice was created with. If the parameter was omitted or `slice_nil` was used when the slice was created, than that parameter will be a reference to `PyNone` and compare equal to a default-constructed object. In principal, any object may be used when creating a slice object, but in practice they are usually integers.]] -] -`` -template -slice::range -slice::get_indices( - RandomAccessIterator const& begin, - RandomAccessIterator const& end) const; -`` -[variablelist -[[Arguments][A pair of STL-conforming Random Access Iterators that form a half-open range.]] -[[Effects][Create a RandomAccessIterator pair that defines a fully-closed range within the `[begin,end)` range of its arguments. This function translates this slice's indices while accounting for the effects of any PyNone or negative indices, and non-singular step sizes.]] -[[Returns][a `slice::range` that has been initialized with a non-zero value of step and a pair of RandomAccessIterators that point within the range of this functions arguments and define a closed interval.]] -[[Throws][Raises a Python TypeError exception if any of this slice's arguments are neither references to PyNone nor convertible to int. Throws `std::invalid_argument` if the resulting range would be empty. You should always wrap calls to `slice::get_indices()` within `try { ...; } catch (std::invalid_argument) {}` to handle this case and take appropriate action.]] -[[Rationale][closed-interval: If an open interval were used, then for step size other than 1, the required state for the end iterator would point beyond the one-past-the-end position or before the beginning of the specified range. -exceptions on empty slice: It is impossible to define a closed interval over an empty range, so some other form of error checking would have to be used to prevent undefined behavior. In the case where the exception is not caught, it will simply be translated to Python by the default exception handling mechanisms. ]] -] -[endsect] -[section Example] -`` -using namespace boost::python; - -// Perform an extended slice of a Python list. -// Warning: extended slicing was not supported for built-in types prior -// to Python 2.3 -list odd_elements(list l) -{ - return l[slice(_,_,2)]; -} - -// Perform a multidimensional extended slice of a Numeric.array -numeric::array even_columns(numeric::array arr) -{ - // select every other column, starting with the second, of a 2-D array. - // Equivalent to "return arr[:, 1::2]" in Python. - return arr[make_tuple( slice(), slice(1,_,2))]; -} - -// Perform a summation over a slice of a std::vector. -double partial_sum(std::vector const& Foo, const slice index) -{ - slice::range::const_iterator> bounds; - try { - bounds = index.get_indices<>(Foo.begin(), Foo.end()); - } - catch (std::invalid_argument) { - return 0.0; - } - double sum = 0.0; - while (bounds.start != bounds.stop) { - sum += *bounds.start; - std::advance( bounds.start, bounds.step); - } - sum += *bounds.start; - return sum; -} -`` -[endsect] -[endsect] diff --git a/doc/reference/ssize_t.qbk b/doc/reference/ssize_t.qbk deleted file mode 100644 index 1cddfd1b..00000000 --- a/doc/reference/ssize_t.qbk +++ /dev/null @@ -1,27 +0,0 @@ -[section boost/python/ssize_t.hpp] -[section Introduction] -Python 2.5 introduces a new `Py_ssize_t` typedef and two related macros ([@http://www.python.org/dev/peps/pep-0353/ PEP 353]). The header imports these definitions into the `boost::python` namespace as `ssize_t`, `ssize_t_max`, and `ssize_t_min`. Appropriate definitions are provided for backward compatibility with previous Python versions. -[endsect] -[section Typedefs] -Imports `Py_ssize_t` into the `boost::python` namespace if available, or provides an appropriate typedef for backward compatibility: -`` -#if PY_VERSION_HEX >= 0x02050000 -typedef Py_ssize_t ssize_t; -#else -typedef int ssize_t; -#endif -`` -[endsect] -[section Constants] -Imports `PY_SSIZE_T_MAX` and `PY_SSIZE_T_MIN` as constants into the `boost::python` namespace if available, or provides appropriate constants for backward compatibility: -`` -#if PY_VERSION_HEX >= 0x02050000 -ssize_t const ssize_t_max = PY_SSIZE_T_MAX; -ssize_t const ssize_t_min = PY_SSIZE_T_MIN; -#else -ssize_t const ssize_t_max = INT_MAX; -ssize_t const ssize_t_min = INT_MIN; -#endif -`` -[endsect] -[endsect] diff --git a/doc/reference/stl_iterator.qbk b/doc/reference/stl_iterator.qbk deleted file mode 100644 index d0b26563..00000000 --- a/doc/reference/stl_iterator.qbk +++ /dev/null @@ -1,108 +0,0 @@ -[section boost/python/stl_iterator.hpp] -[section Introduction] - provides types for creating C++ Iterators from [@http://www.python.org/doc/current/lib/typeiter.html Python iterables]. -[endsect] -[section Class template `stl_input_iterator`] -Instances of `stl_input_iterator` hold a Python iterator and adapt it for use with STL algorithms. `stl_input_iterator` satisfies the requirements for an Input Iterator. -[table -[[Template Parameter][Requirements][Semantics][Default]] -[[ValueType][ValueType must be CopyConstructible.][Dereferencing an instance of `stl_input_iterator` will return an rvalue of type ValueType.][None]] -] -`` -namespace boost { namespace python -{ - template - struct stl_input_iterator - { - typedef std::ptrdiff_t difference_type; - typedef ValueType value_type; - typedef ValueType* pointer; - typedef ValueType reference; - typedef std::input_iterator_tag iterator_category; - - stl_input_iterator(); - stl_input_iterator(object const& ob); - - stl_input_iterator& operator++(); - stl_input_iterator operator++(int); - - ValueType operator*() const; - - friend bool operator==(stl_input_iterator const& lhs, stl_input_iterator const& rhs); - friend bool operator!=(stl_input_iterator const& lhs, stl_input_iterator const& rhs); - private: - object it; // For exposition only - object ob; // For exposition only - }; -}} -`` -[endsect] -[section Class template `stl_input_iterator` constructors] -`` -stl_input_iterator() -`` -[variablelist -[[Effects][Creates a past-the-end input iterator, useful for signifying the end of a sequence. ]] -[[Postconditions][`this` is past-the-end]] -[[Throws][Nothing.]] -] -``stl_input_iterator(object const& ob)`` -[variablelist -[[Effects][Calls ob.attr("__iter__")() and stores the resulting Python iterator object in this->it. Then, calls this->it.attr("next")() and stores the result in this->ob. If the sequence is exhausted, sets this->ob to object(). ]] -[[Postconditions][this is a dereferenceable or past-the-end.]] -] -[endsect] -[section Class template `stl_input_iterator` modifiers] -`` -stl_input_iterator &operator++() -`` -[variablelist -[[Effects][Calls this->it.attr("next")() and stores the result in this->ob. If the sequence is exhausted, sets this->ob to object(). ]] -[[Postconditions][this is a dereferenceable or past-the-end.]] -[[Returns][`*this`]] -] -``stl_input_iterator &operator++(int)`` -[variablelist -[[Effects][`stl_input_iterator tmp = *this; ++*this; return tmp;`]] -[[Postconditions][this is a dereferenceable or past-the-end.]] -] -[endsect] -[section Class template `stl_input_iterator` observers] -`` -ValueType operator*() const -`` -[variablelist -[[Effects][Returns the current element in the sequence. ]] -[[Returns][`extract(this->ob);`]] -] -`` -friend bool operator==(stl_input_iterator const& lhs, stl_input_iterator const& rhs) -`` -[variablelist -[[Effects][Returns true if both iterators are dereferenceable or if both iterators are past-the-end, false otherwise. ]] -[[Returns][`(lhs.ob == object()) == (rhs.ob == object())`]] -] -`` -friend bool operator!=(stl_input_iterator const& lhs, stl_input_iterator const& rhs) -`` -[variablelist -[[Effects][Returns false if both iterators are dereferenceable or if both iterators are past-the-end, true otherwise. ]] -[[Returns][`!(lhs == rhs)`]] -] -[endsect] -[section Example] -`` -#include -#include - -#include - -using namespace boost::python; -std::list sequence_to_int_list(object const& ob) -{ - stl_input_iterator begin(ob), end; - return std::list(begin, end); -} -`` -[endsect] -[endsect] diff --git a/doc/reference/str.qbk b/doc/reference/str.qbk deleted file mode 100644 index 12fe5896..00000000 --- a/doc/reference/str.qbk +++ /dev/null @@ -1,153 +0,0 @@ -[section boost/python/str.hpp] -[section Introduction] -Exposes a [link concepts.objectwrapper.typewrapper_concept_requirements TypeWrapper] for the Python [@http://www.python.org/dev/doc/devel/lib/string-methods.html `str`] type. -[endsect] -[section Class `str`] -Exposes the [@http://www.python.org/dev/doc/devel/lib/string-methods.html string methods] of Python's built-in `str` type. The semantics of the constructors and member functions defined below, except for the two-argument constructors which construct str objects from a range of characters, can be fully understood by reading the [link concepts.objectwrapper.typewrapper_concept_requirements TypeWrapper] concept definition. Since str is publicly derived from [link object_wrappers.boost_python_object_hpp.class_object `object`], the public `object` interface applies to `str` instances as well. -`` -namespace boost { namespace python -{ - class str : public object - { - public: - str(); // new str - - str(char const* s); // new str - - str(char const* start, char const* finish); // new str - str(char const* start, std::size_t length); // new str - - template - explicit str(T const& other); - - str capitalize() const; - - template - str center(T const& width) const; - - template - long count(T const& sub) const; - template - long count(T1 const& sub,T2 const& start) const; - template - long count(T1 const& sub,T2 const& start, T3 const& end) const; - - object decode() const; - template - object decode(T const& encoding) const; - template - object decode(T1 const& encoding, T2 const& errors) const; - - object encode() const; - template - object encode(T const& encoding) const; - template - object encode(T1 const& encoding, T2 const& errors) const; - - template - bool endswith(T const& suffix) const; - template - bool endswith(T1 const& suffix, T2 const& start) const; - template - bool endswith(T1 const& suffix, T2 const& start, T3 const& end) const; - - str expandtabs() const; - template - str expandtabs(T const& tabsize) const; - - template - long find(T const& sub) const; - template - long find(T1 const& sub, T2 const& start) const; - template - long find(T1 const& sub, T2 const& start, T3 const& end) const; - - template - long index(T const& sub) const; - template - long index(T1 const& sub, T2 const& start) const; - template - long index(T1 const& sub, T2 const& start, T3 const& end) const; - - bool isalnum() const; - bool isalpha() const; - bool isdigit() const; - bool islower() const; - bool isspace() const; - bool istitle() const; - bool isupper() const; - - template - str join(T const& sequence) const; - - template - str ljust(T const& width) const; - - str lower() const; - str lstrip() const; - - template - str replace(T1 const& old, T2 const& new_) const; - template - str replace(T1 const& old, T2 const& new_, T3 const& maxsplit) const; - - template - long rfind(T const& sub) const; - template - long rfind(T1 const& sub, T2 const& start) const; - template - long rfind(T1 const& sub, T2 const& start, T3 const& end) const; - - template - long rindex(T const& sub) const; - template - long rindex(T1 const& sub, T2 const& start) const; - template - long rindex(T1 const& sub, T2 const& start, T3 const& end) const; - - template - str rjust(T const& width) const; - - str rstrip() const; - - list split() const; - template - list split(T const& sep) const; - template - list split(T1 const& sep, T2 const& maxsplit) const; - - list splitlines() const; - template - list splitlines(T const& keepends) const; - - template - bool startswith(T const& prefix) const; - template - bool startswidth(T1 const& prefix, T2 const& start) const; - template - bool startswidth(T1 const& prefix, T2 const& start, T3 const& end) const; - - str strip() const; - str swapcase() const; - str title() const; - - template - str translate(T const& table) const; - template - str translate(T1 const& table, T2 const& deletechars) const; - - str upper() const; - }; -}} -`` -[endsect] -[section Example] -`` -using namespace boost::python; -str remove_angle_brackets(str x) -{ - return x.strip('<').strip('>'); -} -`` -[endsect] -[endsect] diff --git a/doc/reference/to_python_converter.qbk b/doc/reference/to_python_converter.qbk deleted file mode 100644 index 45d4121c..00000000 --- a/doc/reference/to_python_converter.qbk +++ /dev/null @@ -1,91 +0,0 @@ -[section boost/python/to_python_converter.hpp] -[section Introduction] -`to_python_converter` registers a conversion from objects of a given C++ type into a Python object. -[endsect] -[section Class template `to_python_converter`] -`to_python_converter` adds a wrapper around a static member function of its second template parameter, handling low-level details such as insertion into the converter registry. - -In the table below, x denotes an object of type T -[table -[[Parameter][Requirements][Description]] -[[T][][The C++ type of the source object in the conversion]] -[[Conversion][`PyObject* p = Conversion::convert(x)`, -`if p == 0`, `PyErr_Occurred() != 0`.][A class type whose static member function convert does the real work of the conversion.]] -[[bool has_get_pytype=false][`PyTypeObject const * p = Conversion::get_pytype()`] -[Optional member - if Conversion has `get_pytype` member supply `true` for this parameters. If present `get_pytype` is used to document the return type of functions using this conversion. The `get_pytype` may be implemented using the classes and functions from pytype_function.hpp NOTE : For backward compatibility this parameter may be passed after checking if BOOST_PYTHON_SUPPORTS_PY_SIGNATURES is defined (see [link function_invocation_and_creation.function_documentation.boost_python_pytype_function_hpp.example here]).] -]] - -`` -namespace boost { namespace python -{ - template - struct to_python_converter - { - to_python_converter(); - }; -}} -`` -[section Class template `to_python_converter` constructor] -``to_python_converter();`` -[variablelist -[[Effects][Registers a `to_python` converter which uses `Conversion::convert()` to do its work.]] -] -[endsect] -[endsect] -[section Example] -This example presumes that someone has implemented the standard noddy example module from the Python documentation, and placed the corresponding declarations in "noddy.h". Because noddy_NoddyObject is the ultimate trivial extension type, the example is a bit contrived: it wraps a function for which all information is contained in the type of its return value. - -In C++: -`` -#include -#include -#include "noddy.h" - -struct tag {}; -tag make_tag() { return tag(); } - -using namespace boost::python; - -struct tag_to_noddy -{ - static PyObject* convert(tag const& x) - { - return PyObject_New(noddy_NoddyObject, &noddy_NoddyType); - } - static PyTypeObject const* get_pytype() - { - return &noddy_NoddyType; - } -}; - -BOOST_PYTHON_MODULE(to_python_converter) -{ - def("make_tag", make_tag); - to_python_converter(); //"true" because tag_to_noddy has member get_pytype -} -`` -In Python: -`` ->>> import to_python_converter ->>> def always_none(): -... return None -... ->>> def choose_function(x): -... if (x % 2 != 0): -... return to_python_converter.make_tag -... else: -... return always_none -... ->>> a = [ choose_function(x) for x in range(5) ] ->>> b = [ f() for f in a ] ->>> type(b[0]) - ->>> type(b[1]) - ->>> type(b[2]) - ->>> type(b[3]) - -`` -[endsect] -[endsect] diff --git a/doc/reference/to_python_indirect.qbk b/doc/reference/to_python_indirect.qbk deleted file mode 100644 index 9b03ba53..00000000 --- a/doc/reference/to_python_indirect.qbk +++ /dev/null @@ -1,65 +0,0 @@ -[section boost/python/to_python_indirect.hpp] -[section Introduction] - supplies a way to construct new Python objects that hold wrapped C++ class instances via a pointer or smart pointer. - [endsect] -[section Class `to_python_indirect`] -Class template `to_python_indirect` converts objects of its first argument type to python as extension class instances, using the ownership policy provided by its 2nd argument. -[table -[[Parameter][Requirements][Description]] - [[T][Either `U cv&` (where cv is any optional cv-qualification) or a [link concepts.dereferenceable Dereferenceable] type such that `*x` is convertible to `U const&`, where `U` is a class type. ][`A` type deferencing a C++ class exposed to Python using class template [link high_level_components.boost_python_class_hpp.class_template_class_t_bases_hel `class_`]. ]] -[[MakeHolder][`h = MakeHolder::execute(p);` ][A class whose static `execute()` creates an `instance_holder`. ]] - ] -Instantiations of to_python_indirect are models of [link concepts.resultconverter `ResultConverter`]. -`` -namespace boost { namespace python -{ - template - struct to_python_indirect - { - static bool convertible(); - PyObject* operator()(T ptr_or_reference) const; - private: - static PyTypeObject* type(); - }; -}} -`` -[endsect] -[section Class `to_python_indirect` observers] -``PyObject* operator()(T x) const;`` -[variablelist -[[Requires][`x` refers to an object (if it is a pointer type, it is non-null). `convertible() == true`.]] -[[Effects][Creates an appropriately-typed Boost.Python extension class instance, uses MakeHolder to create an instance_holder from x, installs the instance_holder in the new extension class instance, and returns a pointer to it.]] -] -[endsect] -[section Class `to_python_indirect` statics] -``bool convertible()`` -[variablelist -[[Effects][Returns true iff any module has registered a Python type corresponding to U. ]] -] -[endsect] -[endsect] -[section Example] -This example replicates the functionality of [link function_invocation_and_creation.models_of_resultconvertergenerat.boost_python_reference_existing_.class_reference_existing_object `reference_existing_object`], but without some of the compile-time error checking. -`` -struct make_reference_holder -{ - typedef boost::python::objects::instance_holder* result_type; - template - static result_type execute(T* p) - { - return new boost::python::objects::pointer_holder(p); - } -}; - -struct reference_existing_object -{ - // metafunction returning the ResultConverter - template - struct apply - { - typedef boost::python::to_python_indirect type; - }; -}; -`` -[endsect] -[endsect] diff --git a/doc/reference/to_python_value.qbk b/doc/reference/to_python_value.qbk deleted file mode 100644 index 4b31d73f..00000000 --- a/doc/reference/to_python_value.qbk +++ /dev/null @@ -1,34 +0,0 @@ -[section boost/python/to_python_value.hpp] -[section Introduction] -`to_python_value` is a model of [link concepts.resultconverter ResultConverter] which copies its argument into a new Python object. -[endsect] -[section Class template `to_python_value`] -`` -namespace boost { namespace python -{ - template - struct to_python_value - { - typedef typename add_reference< - typename add_const::type - >::type argument_type; - - static bool convertible(); - PyObject* operator()(argument_type) const; - }; -}} -`` -[endsect] -[section Class `to_python_value` observers] -``static bool convertible();`` -[variablelist -[[Returns][`true` iff a converter has been registered which can convert `T` to python by-value. ]] -] -``PyObject* operator()(argument_type x) const;`` -[variablelist -[[Requires][`convertible() == true`]] -[[Effects][converts `x` to python]] -[[Returns][the resulting Python object iff a converter for `T` has been registered, `0` otherwise. ]] -] -[endsect] -[endsect] diff --git a/doc/reference/topics.qbk b/doc/reference/topics.qbk deleted file mode 100644 index 644f20d4..00000000 --- a/doc/reference/topics.qbk +++ /dev/null @@ -1,7 +0,0 @@ -[chapter Topics - [quickbook 1.7] -] - -[include calling.qbk] -[include pickle.qbk] -[include indexing.qbk] diff --git a/doc/reference/tuple.qbk b/doc/reference/tuple.qbk deleted file mode 100644 index 0c54161c..00000000 --- a/doc/reference/tuple.qbk +++ /dev/null @@ -1,52 +0,0 @@ -[section boost/python/tuple.hpp] -[section Introduction] -Exposes a [link concepts.objectwrapper.typewrapper_concept_requirements TypeWrapper] for the Python [@http://www.python.org/doc/current/tut/node7.html#SECTION007300000000000000000`tuple`] type. -[endsect] -[section Class `tuple`] -Exposes the interface of Python's built-in tuple type. The semantics of the constructors and member functions defined below can be fully understood by reading the [link concepts.objectwrapper.typewrapper_concept_requirements TypeWrapper] concept definition. Since tuple is publicly derived from [link object_wrappers.boost_python_object_hpp.class_object `object`], the public `object` interface applies to `tuple` instances as well. -`` -namespace boost { namespace python -{ - class tuple : public object - { - // tuple() -> an empty tuple - tuple(); - - // tuple(sequence) -> tuple initialized from sequence's items - template - explicit tuple(T const& sequence) - }; -}} -`` -[endsect] -[section Function `make_tuple`] -`` -namespace boost { namespace python -{ - tuple make_tuple(); - - template - tuple make_tuple(A0 const& a0); - - template - tuple make_tuple(A0 const& a0, A1 const& a1); - ... - template - tuple make_tuple(A0 const& a0, A1 const& a1,...An const& an); -}} -`` -[variablelist -[[Effect][Constructs a new tuple object composed of `object(a0), - object(a0),...object(an)`. ]] -] -[endsect] -[section Example] -`` -using namespace boost::python; -tuple head_and_tail(object sequence) -{ - return make_tuple(sequence[0],sequence[-1]); -} -`` -[endsect] -[endsect] diff --git a/doc/reference/type_id.qbk b/doc/reference/type_id.qbk deleted file mode 100644 index bb013119..00000000 --- a/doc/reference/type_id.qbk +++ /dev/null @@ -1,83 +0,0 @@ -[section boost/python/type_id.hpp] -[section Introduction] - provides types and functions for runtime type identification like those of of ``. It exists mostly to work around certain compiler bugs and platform-dependent interactions with shared libraries. -[endsect] -[section Class template `type_info`] -`type_info` instances identify a type. As `std::type_info` is specified to (but unlike its implementation in some compilers), `boost::python::type_info` never represents top-level references or cv-qualification (see section 5.2.8 in the C++ standard). Unlike `std::type_info`, `boost::python::type_info` instances are copyable, and comparisons always work reliably across shared library boundaries. -`` -namespace boost { namespace python -{ - class type_info : totally_ordered - { - public: - // constructor - type_info(std::type_info const& = typeid(void)); - - // comparisons - bool operator<(type_info const& rhs) const; - bool operator==(type_info const& rhs) const; - - // observers - char const* name() const; - }; -}} -`` -[section Class template `type_info` constructor] -``type_info(std::type_info const& = typeid(void));`` -[variablelist -[[Effects][constructs a `type_info` object which identifies the same type as its argument.]] -[[Rationale][Since it is occasionally necessary to make an array of `type_info` objects a benign default argument is supplied. Note: this constructor does not correct for non-conformance of compiler `typeid()` implementations. See `type_id`, below.]] -] -[endsect] -[section Class template `type_info` comparison] -``bool operator<(type_info const &rhs) const;`` -[variablelist -[[Effects][yields a total order over `type_info` objects.]] -] -``bool operator==(type_info const &rhs) const;`` -[variablelist -[[Returns][`true` iff the two values describe the same type.]] -[[Note][The use of `totally_ordered` as a private base class supplies operators `<=`, `>=`, `>`, and `!=`]] -] -[endsect] -[section Class template `type_info` observers] -`` -char const* name() const; -`` -[variablelist -[[Returns][The result of calling `name()` on the argument used to construct the object.]] -] -[endsect] -[endsect] -[section Functions] -`` -std::ostream& operator<<(std::ostream&s, type_info const&x); -`` -[variablelist -[[Effects][Writes a description of the type described by to `x` into s.]] -[[Rationale][Not every C++ implementation provides a truly human-readable `type_info::name()` string, but for some we may be able to decode the string and produce a reasonable representation.]] -[[Note][On some non-conforming C++ implementations, the code is not actually as simple as described above; the semantics are adjusted to work as-if the C++ implementation were conforming.]] -] -`` -template type_info type_id() -`` -[variablelist -[[Returns][`type_info(typeid(T))`]] -[[Note][On some non-conforming C++ implementations, the code is not actually as simple as described above; the semantics are adjusted to work as-if the C++ implementation were conforming.]] -] -[endsect] -[section Example] -The following example, though silly, illustrates how the type_id facility might be used -`` -#include - -// Returns true iff the user passes an int argument -template -bool is_int(T x) -{ - using boost::python::type_id; - return type_id() == type_id(); -} -`` -[endsect] -[endsect] diff --git a/doc/reference/utility.qbk b/doc/reference/utility.qbk deleted file mode 100644 index 3123cd8d..00000000 --- a/doc/reference/utility.qbk +++ /dev/null @@ -1,10 +0,0 @@ -[chapter Utility and Infrastructure - [quickbook 1.7] -] - -[include has_back_reference.qbk] -[include instance_holder.qbk] -[include pointee.qbk] -[include handle.qbk] -[include type_id.qbk] -[include ssize_t.qbk] diff --git a/doc/reference/with_custodian_and_ward.qbk b/doc/reference/with_custodian_and_ward.qbk deleted file mode 100644 index 76a03632..00000000 --- a/doc/reference/with_custodian_and_ward.qbk +++ /dev/null @@ -1,72 +0,0 @@ -[section boost/python/with_custodian_and_ward.hpp] -[section Introduction] -This header provides facilities for establishing a lifetime dependency between two of a function's Python argument or result objects. The ward object will not be destroyed until after the custodian as long as the custodian object supports [@http://www.python.org/doc/current/lib/module-weakref.html weak references] (Boost.Python extension classes all support weak references). If the custodian object does not support weak references and is not `None`, an appropriate exception will be thrown. The two class templates `with_custodian_and_ward` and `with_custodian_and_ward_postcall` differ in the point at which they take effect. - -In order to reduce the chance of inadvertently creating dangling pointers, the default is to do lifetime binding before the underlying C++ object is invoked. However, before invocation the result object is not available, so `with_custodian_and_ward_postcall` is provided to bind lifetimes after invocation. Also, if a C++ exception is thrown after `with_custodian_and_ward<>::precall` but before the underlying C++ object actually stores a pointer, the lifetime of the custodian and ward objects will be artificially bound together, so one might choose `with_custodian_and_ward_postcall` instead, depending on the semantics of the function being wrapped. - -Please note that this is not the appropriate tool to use when wrapping functions which transfer ownership of a raw pointer across the function-call boundary. Please see the FAQ if you want to do that. -[endsect] -[section Class `with_custodian_and_ward`] -[table -[[Parameter][Requirements][Description][Default]] - [[custodian][ A positive compile-time constant of `type std::size_t`. ][ The 1-based index of the parameter which is the dependency in the lifetime relationship to be established. If used to wrap a member function, parameter 1 is the target object (`*this`). Note that if the target Python object type doesn't support weak references, a Python TypeError exception will be raised when the C++ object being wrapped is called. ][]] -[[ward][ A positive compile-time constant of type `std::size_t`. ][ The 1-based index of the parameter which is the dependent in the lifetime relationship to be established. If used to wrap a member function, parameter 1 is the target object (`*this`). ][]] -[[Base][ A model of [link concepts.callpolicies `CallPolicies`]][ Used for policy [link concepts.callpolicies.callpolicies_composition composition]. ][default_call_policies]] - ] -`` -namespace boost { namespace python -{ - template - struct with_custodian_and_ward : Base - { - static bool precall(PyObject* args); - }; -}}`` -[endsect] -[section Class `with_custodian_and_ward` static functions] -``bool precall(PyObject* args);`` -[variablelist -[[Requires][`PyTuple_Check(args) != 0`]] -[[Effects][Makes the lifetime of the argument indicated by ward dependent on the lifetime of the argument indicated by custodian. ]] -[[Returns][false and PyErr_Occurred() != 0 upon failure, true otherwise.]] -] -[endsect] - -[section Class `with_custodian_and_ward_postcall`] -[table -[[Parameter][Requirements][Description][Default]] - [[custodian][ A positive compile-time constant of type `std::size_t`. ][ The index of the parameter which is the dependency in the lifetime relationship to be established. Zero indicates the result object; 1 indicates the first argument. If used to wrap a member function, parameter 1 is the target object (`*this`). Note that if the target Python object type doesn't support weak references, a Python TypeError exception will be raised when the C++ object being wrapped is called. ][]] -[[ward][ A positive compile-time constant of type `std::size_t`. ][ The index of the parameter which is the dependent in the lifetime relationship to be established. Zero indicates the result object; 1 indicates the first argument. If used to wrap a member function, parameter 1 is the target object (`*this`). ][]] -[[Base][ A model of [link concepts.callpolicies `CallPolicies`]][ Used for policy [link concepts.callpolicies.callpolicies_composition composition]. ][default_call_policies]] - ] -`` -namespace boost { namespace python -{ - template - struct with_custodian_and_ward_postcall : Base - { - static PyObject* postcall(PyObject* args, PyObject* result); - }; -}} -`` -[endsect] -[section Class `with_custodian_and_ward_postcall` static functions] -``PyObject *postcall(PyObject* args, PyObject* result);`` -[variablelist -[[Requires][`PyTuple_Check(args) != 0`, `result != 0`]] -[[Effects][Makes the lifetime of the object indicated by ward dependent on the lifetime of the object indicated by custodian. ]] -[[Returns][`0` and `PyErr_Occurred() != 0` upon failure, `true` otherwise. ]] -] -[endsect] -[section Example] -The following example shows how `with_custodian_and_ward_postcall` is used by the library to implement `return_internal_reference` -`` -template -struct return_internal_reference - : with_custodian_and_ward_postcall<0, owner_arg, Base> -{ - typedef reference_existing_object result_converter; -}; -`` -[endsect] -[endsect] diff --git a/doc/reference/wrapper.qbk b/doc/reference/wrapper.qbk deleted file mode 100644 index 5c5bfc48..00000000 --- a/doc/reference/wrapper.qbk +++ /dev/null @@ -1,117 +0,0 @@ -[section boost/python/wrapper.hpp] -[section Introduction] -To wrap a class T such that its virtual functions can be "overridden in Python"—so that the corresponding method of a Python derived class will be called when the virtual function is invoked from C++—you must create a C++ wrapper class derived from `T` that overrides those virtual functions so that they call into Python. This header contains classes that can be used to make that job easier. -[endsect] -[section Class `override`] -Encapsulates a Python override of a C++ virtual function. An override object either holds a callable Python object or `None`. -`` -namespace boost -{ - class override : object - { - public: - unspecified operator() const; - template - unspecified operator(A0) const; - template - unspecified operator(A0, A1) const; - ... - template - unspecified operator(A0, A1, ...An) const; - }; -}; -`` -[endsect] -[section Class `override` observer functions] -`` -unspecified operator() const; -template -unspecified operator(A0) const; -template -unspecified operator(A0, A1) const; -... -template -unspecified operator(A0, A1, ...An) const; -`` -[variablelist -[[Effects][If *this holds a callable Python object, it is invoked with the specified arguments in the manner specified here. Otherwise, throws [link high_level_components.boost_python_errors_hpp.class_error_already_set error_already_set].]] -[[Returns][An object of unspecified type that holds the Python result of the invocation and, when converted to a C++ type R, attempts to convert that result object to R. If that conversion fails, throws [link high_level_components.boost_python_errors_hpp.class_error_already_set error_already_set].]] -] -[endsect] -[section Class template `wrapper`] -Deriving your wrapper class from both `T` and `wrapper` makes writing that derived class easier. -`` -namespace boost -{ - class wrapper - { - protected: - override get_override(char const* name) const; - }; -}; -`` -[endsect] -[section Class template `wrapper` observer functions] -``override get_override(char const* name) const;`` -[variablelist -[[Requires][name is a [link ntbs].]] -[[Returns][If `*this` is the C++ base class subobject of a Python derived class instance that overrides the named function, returns an override object that delegates to the Python override. Otherwise, returns an override object that holds `None`.]] -] -[endsect] -[section Example] -`` -#include -#include -#include -#include - -using namespace boost::python; - -// Class with one pure virtual function -struct P -{ - virtual ~P(){} - virtual char const* f() = 0; - char const* g() { return "P::g()"; } -}; - -struct PCallback : P, wrapper

-{ - char const* f() - { - return this->get_override("f")(); - } -}; - -// Class with one non-pure virtual function -struct A -{ - virtual ~A(){} - virtual char const* f() { return "A::f()"; } -}; - -struct ACallback : A, wrapper -{ - char const* f() - { - if (override f = this->get_override("f")) - return f(); - return A::f(); - } - - char const* default_f() { return this->A::f(); } -}; - -BOOST_PYTHON_MODULE_INIT(polymorphism) -{ - class_("P") - .def("f", pure_virtual(&P::f)) - ; - - class_("A") - .def("f", &A::f, &ACallback::default_f) - ; -} -`` -[endsect] -[endsect] diff --git a/doc/support.qbk b/doc/support.qbk deleted file mode 100644 index f075e3e9..00000000 --- a/doc/support.qbk +++ /dev/null @@ -1,17 +0,0 @@ -[chapter Support Resources - [quickbook 1.7] - [id support] -] - - -[h2 Synopsis] -This is a list of available resources for support with Boost.Python problems and feature requests. Please try to resist emailing the Boost.Python developers directly for support. Use the following resources instead; the developers are listening! - -[h2 Support] -* The _bp_list_ is a forum for discussing Python/C++ interoperability, and Boost.Python in particular. Post your Boost.Python questions here. -* The _bb_list_ is a forum for discussing Boost's Build System. -* The Boost.Python [@https://github.com/boostorg/python/issues Issue tracker] - [note In the past we used Trac, which still hosts a considerable number of [@https://svn.boost.org/trac/boost/query?status=!closed&component=python+USE+GITHUB open issues]. We hope to be able to either close them or migrate them to the new issue tracker.] -* The Boost.Python [@https://github.com/boostorg/python/wiki Wiki] -* Boost.Python [@https://github.com/boostorg/python Source repository] - diff --git a/doc/tutorial.qbk b/doc/tutorial.qbk deleted file mode 100644 index 83c6b2b3..00000000 --- a/doc/tutorial.qbk +++ /dev/null @@ -1,1983 +0,0 @@ -[article Boost.Python Tutorial - [quickbook 1.7] - [authors [de Guzman, Joel], [Abrahams, David]] - [copyright 2002 2003 2004 2005 Joel de Guzman, David Abrahams] - [category inter-language support] - [id tutorial] - [purpose - Reflects C++ classes and functions into Python - ] - [license - 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] - ] -] - -[/ QuickBook Document version 0.9 ] - -[def __note__ [$../images/note.png]] -[def __alert__ [$../images/alert.png]] -[def __tip__ [$../images/tip.png]] -[def :-) [$../images/smiley.png]] -[def __jam__ [$../images/jam.png]] - -[section QuickStart] - -The Boost Python Library is a framework for interfacing Python and -C++. It allows you to quickly and seamlessly expose C++ classes -functions and objects to Python, and vice-versa, using no special -tools -- just your C++ compiler. It is designed to wrap C++ interfaces -non-intrusively, so that you should not have to change the C++ code at -all in order to wrap it, making Boost.Python ideal for exposing -3rd-party libraries to Python. The library's use of advanced -metaprogramming techniques simplifies its syntax for users, so that -wrapping code takes on the look of a kind of declarative interface -definition language (IDL). - -[h2 Hello World] - -Following C/C++ tradition, let's start with the "hello, world". A C++ -Function: - - char const* greet() - { - return "hello, world"; - } - -can be exposed to Python by writing a Boost.Python wrapper: - - #include - - BOOST_PYTHON_MODULE(hello_ext) - { - using namespace boost::python; - def("greet", greet); - } - -That's it. We're done. We can now build this as a shared library. The -resulting DLL is now visible to Python. Here's a sample Python session: - -[python] - - >>> import hello_ext - >>> print hello_ext.greet() - hello, world - -[c++] - -[:['[*Next stop... Building your Hello World module from start to finish...]]] - -[endsect] -[section:hello Building Hello World] - -[h2 From Start To Finish] - -Now the first thing you'd want to do is to build the Hello World module and -try it for yourself in Python. In this section, we will outline the steps -necessary to achieve that. We will use the build tool that comes bundled -with every boost distribution: [*bjam]. - -[note [*Building without bjam] - -Besides bjam, there are of course other ways to get your module built. -What's written here should not be taken as "the one and only way". -There are of course other build tools apart from [^bjam]. - -Take note however that the preferred build tool for Boost.Python is bjam. -There are so many ways to set up the build incorrectly. Experience shows -that 90% of the "I can't build Boost.Python" problems come from people -who had to use a different tool. -] - -We will skip over the details. Our objective will be to simply create -the hello world module and run it in Python. For a complete reference to -building Boost.Python, check out: [@../../../building.html -building.html]. After this brief ['bjam] tutorial, we should have built -the DLLs and run a python program using the extension. - -The tutorial example can be found in the directory: -[^libs/python/example/tutorial]. There, you can find: - -* hello.cpp -* hello.py -* Jamroot - -The [^hello.cpp] file is our C++ hello world example. The [^Jamroot] is -a minimalist ['bjam] script that builds the DLLs for us. Finally, -[^hello.py] is our Python program that uses the extension in -[^hello.cpp]. - -Before anything else, you should have the bjam executable in your boost -directory or somewhere in your path such that [^bjam] can be executed in -the command line. Pre-built Boost.Jam executables are available for most -platforms. The complete list of Bjam executables can be found -[@http://sourceforge.net/project/showfiles.php?group_id=7586 here]. - -[h2 Let's Jam!] -__jam__ - -[@../../../../example/tutorial/Jamroot Here] is our minimalist Jamroot -file. Simply copy the file and tweak [^use-project boost] to where your -boost root directory is and your OK. - -The comments contained in the Jamrules file above should be sufficient -to get you going. - -[h2 Running bjam] - -['bjam] is run using your operating system's command line interpreter. - -[:Start it up.] - -A file called user-config.jam in your home directory is used to -configure your tools. In Windows, your home directory can be found by -typing: - -[pre -ECHO %HOMEDRIVE%%HOMEPATH% -] - -into a command prompt window. Your file should at least have the rules -for your compiler and your python installation. A specific example of -this on Windows would be: - -[pre -# MSVC configuration -using msvc : 8.0 ; - -# Python configuration -using python : 2.4 : C:/dev/tools/Python/ ; -] - -The first rule tells Bjam to use the MSVC 8.0 compiler and associated -tools. The second rule provides information on Python, its version and -where it is located. The above assumes that the Python installation is -in [^C:/dev/tools\/Python/]. If you have one fairly "standard" python -installation for your platform, you might not need to do this. - -Now we are ready... Be sure to [^cd] to [^libs/python/example/tutorial] -where the tutorial [^"hello.cpp"] and the [^"Jamroot"] is situated. - -Finally: - - bjam - -It should be building now: - -[pre -cd C:\dev\boost\libs\python\example\tutorial -bjam -...patience... -...found 1101 targets... -...updating 35 targets... -] - -And so on... Finally: - -[pre - Creating library /path-to-boost_python.dll/ - Creating library /path-to-'''hello_ext'''.exp/ -'''**passed**''' ... hello.test -...updated 35 targets... -] - -Or something similar. If all is well, you should now have built the DLLs and -run the Python program. - -[:[*There you go... Have fun!]] - -[endsect] -[section:exposing Exposing Classes] - -Now let's expose a C++ class to Python. - -Consider a C++ class/struct that we want to expose to Python: - - struct World - { - void set(std::string msg) { this->msg = msg; } - std::string greet() { return msg; } - std::string msg; - }; - -We can expose this to Python by writing a corresponding Boost.Python -C++ Wrapper: - - #include - using namespace boost::python; - - BOOST_PYTHON_MODULE(hello) - { - class_("World") - .def("greet", &World::greet) - .def("set", &World::set) - ; - } - -Here, we wrote a C++ class wrapper that exposes the member functions -[^greet] and [^set]. Now, after building our module as a shared library, we -may use our class [^World] in Python. Here's a sample Python session: - -[python] - - >>> import hello - >>> planet = hello.World() - >>> planet.set('howdy') - >>> planet.greet() - 'howdy' - -[section Constructors] - -Our previous example didn't have any explicit constructors. -Since [^World] is declared as a plain struct, it has an implicit default -constructor. Boost.Python exposes the default constructor by default, -which is why we were able to write - - >>> planet = hello.World() - -We may wish to wrap a class with a non-default constructor. Let us -build on our previous example: - -[c++] - - struct World - { - World(std::string msg): msg(msg) {} // added constructor - void set(std::string msg) { this->msg = msg; } - std::string greet() { return msg; } - std::string msg; - }; - -This time [^World] has no default constructor; our previous -wrapping code would fail to compile when the library tried to expose -it. We have to tell [^class_] about the constructor we want to -expose instead. - - #include - using namespace boost::python; - - BOOST_PYTHON_MODULE(hello) - { - class_("World", init()) - .def("greet", &World::greet) - .def("set", &World::set) - ; - } - -[^init()] exposes the constructor taking in a -[^std::string] (in Python, constructors are spelled -"[^"__init__"]"). - -We can expose additional constructors by passing more [^init<...>]s to -the [^def()] member function. Say for example we have another World -constructor taking in two doubles: - - class_("World", init()) - .def(init()) - .def("greet", &World::greet) - .def("set", &World::set) - ; - -On the other hand, if we do not wish to expose any constructors at -all, we may use [^no_init] instead: - - class_("Abstract", no_init) - -This actually adds an [^__init__] method which always raises a -Python RuntimeError exception. - -[endsect] -[section Class Data Members] - -Data members may also be exposed to Python so that they can be -accessed as attributes of the corresponding Python class. Each data -member that we wish to be exposed may be regarded as [*read-only] or -[*read-write]. Consider this class [^Var]: - - struct Var - { - Var(std::string name) : name(name), value() {} - std::string const name; - float value; - }; - -Our C++ [^Var] class and its data members can be exposed to Python: - - class_("Var", init()) - .def_readonly("name", &Var::name) - .def_readwrite("value", &Var::value); - -Then, in Python, assuming we have placed our Var class inside the namespace -hello as we did before: - -[python] - - >>> x = hello.Var('pi') - >>> x.value = 3.14 - >>> print x.name, 'is around', x.value - pi is around 3.14 - -Note that [^name] is exposed as [*read-only] while [^value] is exposed -as [*read-write]. - - >>> x.name = 'e' # can't change name - Traceback (most recent call last): - File "", line 1, in ? - AttributeError: can't set attribute - -[endsect] -[section Class Properties] - -In C++, classes with public data members are usually frowned -upon. Well designed classes that take advantage of encapsulation hide -the class' data members. The only way to access the class' data is -through access (getter/setter) functions. Access functions expose class -properties. Here's an example: - -[c++] - - struct Num - { - Num(); - float get() const; - void set(float value); - ... - }; - -However, in Python attribute access is fine; it doesn't neccessarily break -encapsulation to let users handle attributes directly, because the -attributes can just be a different syntax for a method call. Wrapping our -[^Num] class using Boost.Python: - - class_("Num") - .add_property("rovalue", &Num::get) - .add_property("value", &Num::get, &Num::set); - -And at last, in Python: - -[python] - - >>> x = Num() - >>> x.value = 3.14 - >>> x.value, x.rovalue - (3.14, 3.14) - >>> x.rovalue = 2.17 # error! - -Take note that the class property [^rovalue] is exposed as [*read-only] -since the [^rovalue] setter member function is not passed in: - -[c++] - - .add_property("rovalue", &Num::get) - -[endsect] -[section Inheritance] - -In the previous examples, we dealt with classes that are not polymorphic. -This is not often the case. Much of the time, we will be wrapping -polymorphic classes and class hierarchies related by inheritance. We will -often have to write Boost.Python wrappers for classes that are derived from -abstract base classes. - -Consider this trivial inheritance structure: - - struct Base { virtual ~Base(); }; - struct Derived : Base {}; - -And a set of C++ functions operating on [^Base] and [^Derived] object -instances: - - void b(Base*); - void d(Derived*); - Base* factory() { return new Derived; } - -We've seen how we can wrap the base class [^Base]: - - class_("Base") - /*...*/ - ; - -Now we can inform Boost.Python of the inheritance relationship between -[^Derived] and its base class [^Base]. Thus: - - class_ >("Derived") - /*...*/ - ; - -Doing so, we get some things for free: - -# Derived automatically inherits all of Base's Python methods - (wrapped C++ member functions) -# [*If] Base is polymorphic, [^Derived] objects which have been passed to - Python via a pointer or reference to [^Base] can be passed where a pointer - or reference to [^Derived] is expected. - -Now, we will expose the C++ free functions [^b] and [^d] and [^factory]: - - def("b", b); - def("d", d); - def("factory", factory); - -Note that free function [^factory] is being used to generate new -instances of class [^Derived]. In such cases, we use -[^return_value_policy] to instruct Python to adopt -the pointer to [^Base] and hold the instance in a new Python [^Base] -object until the the Python object is destroyed. We will see more of -Boost.Python [link python.call_policies call policies] later. - - // Tell Python to take ownership of factory's result - def("factory", factory, - return_value_policy()); - -[endsect] - -[section Class Virtual Functions] - -In this section, we will learn how to make functions behave polymorphically -through virtual functions. Continuing our example, let us add a virtual function -to our [^Base] class: - - struct Base - { - virtual ~Base() {} - virtual int f() = 0; - }; - -One of the goals of Boost.Python is to be minimally intrusive on an existing C++ -design. In principle, it should be possible to expose the interface for a 3rd -party library without changing it. It is not ideal to add anything to our class -`Base`. Yet, when you have a virtual function that's going to be overridden in -Python and called polymorphically *from C++*, we'll need to add some -scaffoldings to make things work properly. What we'll do is write a class -wrapper that derives from `Base` that will unintrusively hook into the virtual -functions so that a Python override may be called: - - struct BaseWrap : Base, wrapper - { - int f() - { - return this->get_override("f")(); - } - }; - -Notice too that in addition to inheriting from `Base`, we also multiply- -inherited `wrapper` (See [@../../../v2/wrapper.html Wrapper]). The -`wrapper` template makes the job of wrapping classes that are meant to -overridden in Python, easier. - -[blurb __alert__ [*MSVC6/7 Workaround] - -If you are using Microsoft Visual C++ 6 or 7, you have to write `f` as: - -`return call(this->get_override("f").ptr());`.] - -BaseWrap's overridden virtual member function `f` in effect calls the -corresponding method of the Python object through `get_override`. - -Finally, exposing `Base`: - - class_("Base") - .def("f", pure_virtual(&Base::f)) - ; - -`pure_virtual` signals Boost.Python that the function `f` is a pure virtual -function. - -[note [*member function and methods] - -Python, like many object oriented languages uses the term [*methods]. -Methods correspond roughly to C++'s [*member functions]] - -[endsect] - -[section Virtual Functions with Default Implementations] - -We've seen in the previous section how classes with pure virtual functions are -wrapped using Boost.Python's [@../../../v2/wrapper.html class wrapper] -facilities. If we wish to wrap [*non]-pure-virtual functions instead, the -mechanism is a bit different. - -Recall that in the [link python.class_virtual_functions previous section], we -wrapped a class with a pure virtual function that we then implemented in C++, or -Python classes derived from it. Our base class: - - struct Base - { - virtual int f() = 0; - }; - -had a pure virtual function [^f]. If, however, its member function [^f] was -not declared as pure virtual: - - struct Base - { - virtual ~Base() {} - virtual int f() { return 0; } - }; - -We wrap it this way: - - struct BaseWrap : Base, wrapper - { - int f() - { - if (override f = this->get_override("f")) - return f(); // *note* - return Base::f(); - } - - int default_f() { return this->Base::f(); } - }; - -Notice how we implemented `BaseWrap::f`. Now, we have to check if there is an -override for `f`. If none, then we call `Base::f()`. - -[blurb __alert__ [*MSVC6/7 Workaround] - -If you are using Microsoft Visual C++ 6 or 7, you have to rewrite the line -with the `*note*` as: - -`return call(f.ptr());`.] - -Finally, exposing: - - class_("Base") - .def("f", &Base::f, &BaseWrap::default_f) - ; - -Take note that we expose both `&Base::f` and `&BaseWrap::default_f`. -Boost.Python needs to keep track of 1) the dispatch function [^f] and 2) the -forwarding function to its default implementation [^default_f]. There's a -special [^def] function for this purpose. - -In Python, the results would be as expected: - -[python] - - >>> base = Base() - >>> class Derived(Base): - ... def f(self): - ... return 42 - ... - >>> derived = Derived() - -Calling [^base.f()]: - - >>> base.f() - 0 - -Calling [^derived.f()]: - - >>> derived.f() - 42 - -[endsect] -[section Class Operators/Special Functions] - -[h2 Python Operators] - -C is well known for the abundance of operators. C++ extends this to the -extremes by allowing operator overloading. Boost.Python takes advantage of -this and makes it easy to wrap C++ operator-powered classes. - -Consider a file position class [^FilePos] and a set of operators that take -on FilePos instances: - -[c++] - - class FilePos { /*...*/ }; - - FilePos operator+(FilePos, int); - FilePos operator+(int, FilePos); - int operator-(FilePos, FilePos); - FilePos operator-(FilePos, int); - FilePos& operator+=(FilePos&, int); - FilePos& operator-=(FilePos&, int); - bool operator<(FilePos, FilePos); - -The class and the various operators can be mapped to Python rather easily -and intuitively: - - class_("FilePos") - .def(self + int()) // __add__ - .def(int() + self) // __radd__ - .def(self - self) // __sub__ - .def(self - int()) // __sub__ - .def(self += int()) // __iadd__ - .def(self -= other()) - .def(self < self); // __lt__ - -The code snippet above is very clear and needs almost no explanation at -all. It is virtually the same as the operators' signatures. Just take -note that [^self] refers to FilePos object. Also, not every class [^T] that -you might need to interact with in an operator expression is (cheaply) -default-constructible. You can use [^other()] in place of an actual -[^T] instance when writing "self expressions". - -[h2 Special Methods] - -Python has a few more ['Special Methods]. Boost.Python supports all of the -standard special method names supported by real Python class instances. A -similar set of intuitive interfaces can also be used to wrap C++ functions -that correspond to these Python ['special functions]. Example: - - class Rational - { public: operator double() const; }; - - Rational pow(Rational, Rational); - Rational abs(Rational); - ostream& operator<<(ostream&,Rational); - - class_("Rational") - .def(float_(self)) // __float__ - .def(pow(self, other)) // __pow__ - .def(abs(self)) // __abs__ - .def(str(self)) // __str__ - ; - -Need we say more? - -[note What is the business of `operator<<`? -Well, the method `str` requires the `operator<<` to do its work (i.e. -`operator<<` is used by the method defined by `def(str(self))`.] - -[endsect] -[endsect] [/ Exposing Classes ] - -[section Functions] - -In this chapter, we'll look at Boost.Python powered functions in closer -detail. We will see some facilities to make exposing C++ functions to -Python safe from potential pifalls such as dangling pointers and -references. We will also see facilities that will make it even easier for -us to expose C++ functions that take advantage of C++ features such as -overloading and default arguments. - -[:['Read on...]] - -But before you do, you might want to fire up Python 2.2 or later and type -[^>>> import this]. - -[pre ->>> import this -The Zen of Python, by Tim Peters -Beautiful is better than ugly. -Explicit is better than implicit. -Simple is better than complex. -Complex is better than complicated. -Flat is better than nested. -Sparse is better than dense. -Readability counts. -Special cases aren't special enough to break the rules. -Although practicality beats purity. -Errors should never pass silently. -Unless explicitly silenced. -In the face of ambiguity, refuse the temptation to guess. -There should be one-- and preferably only one --obvious way to do it -Although that way may not be obvious at first unless you're Dutch. -Now is better than never. -Although never is often better than *right* now. -If the implementation is hard to explain, it's a bad idea. -If the implementation is easy to explain, it may be a good idea. -Namespaces are one honking great idea -- let's do more of those! -] - -[section Call Policies] - -In C++, we often deal with arguments and return types such as pointers -and references. Such primitive types are rather, ummmm, low level and -they really don't tell us much. At the very least, we don't know the -owner of the pointer or the referenced object. No wonder languages -such as Java and Python never deal with such low level entities. In -C++, it's usually considered a good practice to use smart pointers -which exactly describe ownership semantics. Still, even good C++ -interfaces use raw references and pointers sometimes, so Boost.Python -must deal with them. To do this, it may need your help. Consider the -following C++ function: - - X& f(Y& y, Z* z); - -How should the library wrap this function? A naive approach builds a -Python X object around result reference. This strategy might or might -not work out. Here's an example where it didn't - - >>> x = f(y, z) # x refers to some C++ X - >>> del y - >>> x.some_method() # CRASH! - -What's the problem? - -Well, what if f() was implemented as shown below: - - X& f(Y& y, Z* z) - { - y.z = z; - return y.x; - } - -The problem is that the lifetime of result X& is tied to the lifetime -of y, because the f() returns a reference to a member of the y -object. This idiom is is not uncommon and perfectly acceptable in the -context of C++. However, Python users should not be able to crash the -system just by using our C++ interface. In this case deleting y will -invalidate the reference to X. We have a dangling reference. - -Here's what's happening: - -# [^f] is called passing in a reference to [^y] and a pointer to [^z] -# A reference to [^y.x] is returned -# [^y] is deleted. [^x] is a dangling reference -# [^x.some_method()] is called -# [*BOOM!] - -We could copy result into a new object: - -[python] - - >>> f(y, z).set(42) # Result disappears - >>> y.x.get() # No crash, but still bad - 3.14 - -This is not really our intent of our C++ interface. We've broken our -promise that the Python interface should reflect the C++ interface as -closely as possible. - -Our problems do not end there. Suppose Y is implemented as follows: - -[c++] - - struct Y - { - X x; Z* z; - int z_value() { return z->value(); } - }; - -Notice that the data member [^z] is held by class Y using a raw -pointer. Now we have a potential dangling pointer problem inside Y: - - >>> x = f(y, z) # y refers to z - >>> del z # Kill the z object - >>> y.z_value() # CRASH! - -For reference, here's the implementation of [^f] again: - - X& f(Y& y, Z* z) - { - y.z = z; - return y.x; - } - -Here's what's happening: - -# [^f] is called passing in a reference to [^y] and a pointer to [^z] -# A pointer to [^z] is held by [^y] -# A reference to [^y.x] is returned -# [^z] is deleted. [^y.z] is a dangling pointer -# [^y.z_value()] is called -# [^z->value()] is called -# [*BOOM!] - -[h2 Call Policies] - -Call Policies may be used in situations such as the example detailed above. -In our example, [^return_internal_reference] and [^with_custodian_and_ward] -are our friends: - - def("f", f, - return_internal_reference<1, - with_custodian_and_ward<1, 2> >()); - -What are the [^1] and [^2] parameters, you ask? - - return_internal_reference<1 - -Informs Boost.Python that the first argument, in our case [^Y& y], is the -owner of the returned reference: [^X&]. The "[^1]" simply specifies the -first argument. In short: "return an internal reference [^X&] owned by the -1st argument [^Y& y]". - - with_custodian_and_ward<1, 2> - -Informs Boost.Python that the lifetime of the argument indicated by ward -(i.e. the 2nd argument: [^Z* z]) is dependent on the lifetime of the -argument indicated by custodian (i.e. the 1st argument: [^Y& y]). - -It is also important to note that we have defined two policies above. Two -or more policies can be composed by chaining. Here's the general syntax: - - policy1 > > - -Here is the list of predefined call policies. A complete reference detailing -these can be found [@../../../v2/reference.html#models_of_call_policies here]. - -* [*with_custodian_and_ward]: Ties lifetimes of the arguments -* [*with_custodian_and_ward_postcall]: Ties lifetimes of the arguments and results -* [*return_internal_reference]: Ties lifetime of one argument to that of result -* [*return_value_policy with T one of:] - * [*reference_existing_object]: naive (dangerous) approach - * [*copy_const_reference]: Boost.Python v1 approach - * [*copy_non_const_reference]: - * [*manage_new_object]: Adopt a pointer and hold the instance - -[blurb :-) [*Remember the Zen, Luke:] - -"Explicit is better than implicit" - -"In the face of ambiguity, refuse the temptation to guess" -] - -[endsect] -[section Overloading] - -The following illustrates a scheme for manually wrapping an overloaded -member functions. Of course, the same technique can be applied to wrapping -overloaded non-member functions. - -We have here our C++ class: - - struct X - { - bool f(int a) - { - return true; - } - - bool f(int a, double b) - { - return true; - } - - bool f(int a, double b, char c) - { - return true; - } - - int f(int a, int b, int c) - { - return a + b + c; - }; - }; - -Class X has 4 overloaded functions. We will start by introducing some -member function pointer variables: - - bool (X::*fx1)(int) = &X::f; - bool (X::*fx2)(int, double) = &X::f; - bool (X::*fx3)(int, double, char)= &X::f; - int (X::*fx4)(int, int, int) = &X::f; - -With these in hand, we can proceed to define and wrap this for Python: - - .def("f", fx1) - .def("f", fx2) - .def("f", fx3) - .def("f", fx4) - -[endsect] -[section Default Arguments] - -Boost.Python wraps (member) function pointers. Unfortunately, C++ function -pointers carry no default argument info. Take a function [^f] with default -arguments: - - int f(int, double = 3.14, char const* = "hello"); - -But the type of a pointer to the function [^f] has no information -about its default arguments: - - int(*g)(int,double,char const*) = f; // defaults lost! - -When we pass this function pointer to the [^def] function, there is no way -to retrieve the default arguments: - - def("f", f); // defaults lost! - -Because of this, when wrapping C++ code, we had to resort to manual -wrapping as outlined in the [link python.overloading previous section], or -writing thin wrappers: - - // write "thin wrappers" - int f1(int x) { return f(x); } - int f2(int x, double y) { return f(x,y); } - - /*...*/ - - // in module init - def("f", f); // all arguments - def("f", f2); // two arguments - def("f", f1); // one argument - -When you want to wrap functions (or member functions) that either: - -* have default arguments, or -* are overloaded with a common sequence of initial arguments - -[h2 BOOST_PYTHON_FUNCTION_OVERLOADS] - -Boost.Python now has a way to make it easier. For instance, given a function: - - int foo(int a, char b = 1, unsigned c = 2, double d = 3) - { - /*...*/ - } - -The macro invocation: - - BOOST_PYTHON_FUNCTION_OVERLOADS(foo_overloads, foo, 1, 4) - -will automatically create the thin wrappers for us. This macro will create -a class [^foo_overloads] that can be passed on to [^def(...)]. The third -and fourth macro argument are the minimum arguments and maximum arguments, -respectively. In our [^foo] function the minimum number of arguments is 1 -and the maximum number of arguments is 4. The [^def(...)] function will -automatically add all the foo variants for us: - - def("foo", foo, foo_overloads()); - -[h2 BOOST_PYTHON_MEMBER_FUNCTION_OVERLOADS] - -Objects here, objects there, objects here there everywhere. More frequently -than anything else, we need to expose member functions of our classes to -Python. Then again, we have the same inconveniences as before when default -arguments or overloads with a common sequence of initial arguments come -into play. Another macro is provided to make this a breeze. - -Like [^BOOST_PYTHON_FUNCTION_OVERLOADS], -[^BOOST_PYTHON_MEMBER_FUNCTION_OVERLOADS] may be used to automatically create -the thin wrappers for wrapping member functions. Let's have an example: - - struct george - { - void - wack_em(int a, int b = 0, char c = 'x') - { - /*...*/ - } - }; - -The macro invocation: - - BOOST_PYTHON_MEMBER_FUNCTION_OVERLOADS(george_overloads, wack_em, 1, 3) - -will generate a set of thin wrappers for george's [^wack_em] member function -accepting a minimum of 1 and a maximum of 3 arguments (i.e. the third and -fourth macro argument). The thin wrappers are all enclosed in a class named -[^george_overloads] that can then be used as an argument to [^def(...)]: - - .def("wack_em", &george::wack_em, george_overloads()); - -See the [@../../../v2/overloads.html#BOOST_PYTHON_FUNCTION_OVERLOADS-spec overloads reference] -for details. - -[h2 init and optional] - -A similar facility is provided for class constructors, again, with -default arguments or a sequence of overloads. Remember [^init<...>]? For example, -given a class X with a constructor: - - struct X - { - X(int a, char b = 'D', std::string c = "constructor", double d = 0.0); - /*...*/ - } - -You can easily add this constructor to Boost.Python in one shot: - - .def(init >()) - -Notice the use of [^init<...>] and [^optional<...>] to signify the default -(optional arguments). - -[endsect] -[section Auto-Overloading] - -It was mentioned in passing in the previous section that -[^BOOST_PYTHON_FUNCTION_OVERLOADS] and [^BOOST_PYTHON_MEMBER_FUNCTION_OVERLOADS] -can also be used for overloaded functions and member functions with a -common sequence of initial arguments. Here is an example: - - void foo() - { - /*...*/ - } - - void foo(bool a) - { - /*...*/ - } - - void foo(bool a, int b) - { - /*...*/ - } - - void foo(bool a, int b, char c) - { - /*...*/ - } - -Like in the previous section, we can generate thin wrappers for these -overloaded functions in one-shot: - - BOOST_PYTHON_FUNCTION_OVERLOADS(foo_overloads, foo, 0, 3) - -Then... - - .def("foo", (void(*)(bool, int, char))0, foo_overloads()); - -Notice though that we have a situation now where we have a minimum of zero -(0) arguments and a maximum of 3 arguments. - -[h2 Manual Wrapping] - -It is important to emphasize however that [*the overloaded functions must -have a common sequence of initial arguments]. Otherwise, our scheme above -will not work. If this is not the case, we have to wrap our functions -[link python.overloading manually]. - -Actually, we can mix and match manual wrapping of overloaded functions and -automatic wrapping through [^BOOST_PYTHON_MEMBER_FUNCTION_OVERLOADS] and -its sister, [^BOOST_PYTHON_FUNCTION_OVERLOADS]. Following up on our example -presented in the section [link python.overloading on overloading], since the -first 4 overload functins have a common sequence of initial arguments, we -can use [^BOOST_PYTHON_MEMBER_FUNCTION_OVERLOADS] to automatically wrap the -first three of the [^def]s and manually wrap just the last. Here's -how we'll do this: - - BOOST_PYTHON_MEMBER_FUNCTION_OVERLOADS(xf_overloads, f, 1, 4) - -Create a member function pointers as above for both X::f overloads: - - bool (X::*fx1)(int, double, char) = &X::f; - int (X::*fx2)(int, int, int) = &X::f; - -Then... - - .def("f", fx1, xf_overloads()); - .def("f", fx2) - -[endsect] -[endsect] [/ Functions ] - -[section:object Object Interface] - -Python is dynamically typed, unlike C++ which is statically typed. Python -variables may hold an integer, a float, list, dict, tuple, str, long etc., -among other things. In the viewpoint of Boost.Python and C++, these -Pythonic variables are just instances of class [^object]. We will see in -this chapter how to deal with Python objects. - -As mentioned, one of the goals of Boost.Python is to provide a -bidirectional mapping between C++ and Python while maintaining the Python -feel. Boost.Python C++ [^object]s are as close as possible to Python. This -should minimize the learning curve significantly. - -[$../images/python.png] - -[section Basic Interface] - -Class [^object] wraps [^PyObject*]. All the intricacies of dealing with -[^PyObject]s such as managing reference counting are handled by the -[^object] class. C++ object interoperability is seamless. Boost.Python C++ -[^object]s can in fact be explicitly constructed from any C++ object. - -To illustrate, this Python code snippet: - -[python] - - def f(x, y): - if (y == 'foo'): - x[3:7] = 'bar' - else: - x.items += y(3, x) - return x - - def getfunc(): - return f; - -Can be rewritten in C++ using Boost.Python facilities this way: - -[c++] - - object f(object x, object y) { - if (y == "foo") - x.slice(3,7) = "bar"; - else - x.attr("items") += y(3, x); - return x; - } - object getfunc() { - return object(f); - } - -Apart from cosmetic differences due to the fact that we are writing the -code in C++, the look and feel should be immediately apparent to the Python -coder. - -[endsect] -[section Derived Object types] - -Boost.Python comes with a set of derived [^object] types corresponding to -that of Python's: - -* list -* dict -* tuple -* str -* long_ -* enum - -These derived [^object] types act like real Python types. For instance: - - str(1) ==> "1" - -Wherever appropriate, a particular derived [^object] has corresponding -Python type's methods. For instance, [^dict] has a [^keys()] method: - - d.keys() - -[^make_tuple] is provided for declaring ['tuple literals]. Example: - - make_tuple(123, 'D', "Hello, World", 0.0); - -In C++, when Boost.Python [^object]s are used as arguments to functions, -subtype matching is required. For example, when a function [^f], as -declared below, is wrapped, it will only accept instances of Python's -[^str] type and subtypes. - - void f(str name) - { - object n2 = name.attr("upper")(); // NAME = name.upper() - str NAME = name.upper(); // better - object msg = "%s is bigger than %s" % make_tuple(NAME,name); - } - -In finer detail: - - str NAME = name.upper(); - -Illustrates that we provide versions of the str type's methods as C++ -member functions. - - object msg = "%s is bigger than %s" % make_tuple(NAME,name); - -Demonstrates that you can write the C++ equivalent of [^"format" % x,y,z] -in Python, which is useful since there's no easy way to do that in std C++. - -[blurb - __alert__ [*Beware] the common pitfall of forgetting that the constructors - of most of Python's mutable types make copies, just as in Python. -] - -Python: -[python] - - >>> d = dict(x.__dict__) # copies x.__dict__ - >>> d['whatever'] = 3 # modifies the copy - -C++: -[c++] - - dict d(x.attr("__dict__")); // copies x.__dict__ - d['whatever'] = 3; // modifies the copy - -[h2 class_ as objects] - -Due to the dynamic nature of Boost.Python objects, any [^class_] may -also be one of these types! The following code snippet wraps the class -(type) object. - -We can use this to create wrapped instances. Example: - - object vec345 = ( - class_("Vec2", init()) - .def_readonly("length", &Point::length) - .def_readonly("angle", &Point::angle) - )(3.0, 4.0); - - assert(vec345.attr("length") == 5.0); - -[endsect] -[section Extracting C++ objects] - -At some point, we will need to get C++ values out of object instances. This -can be achieved with the [^extract] function. Consider the following: - - double x = o.attr("length"); // compile error - -In the code above, we got a compiler error because Boost.Python -[^object] can't be implicitly converted to [^double]s. Instead, what -we wanted to do above can be achieved by writing: - - double l = extract(o.attr("length")); - Vec2& v = extract(o); - assert(l == v.length()); - -The first line attempts to extract the "length" attribute of the Boost.Python -[^object]. The second line attempts to ['extract] the [^Vec2] object from held -by the Boost.Python [^object]. - -Take note that we said "attempt to" above. What if the Boost.Python [^object] -does not really hold a [^Vec2] type? This is certainly a possibility considering -the dynamic nature of Python [^object]s. To be on the safe side, if the C++ type -can't be extracted, an appropriate exception is thrown. To avoid an exception, -we need to test for extractibility: - - extract x(o); - if (x.check()) { - Vec2& v = x(); ... - -__tip__ The astute reader might have noticed that the [^extract] -facility in fact solves the mutable copying problem: - - dict d = extract(x.attr("__dict__")); - d["whatever"] = 3; // modifies x.__dict__ ! - - -[endsect] -[section Enums] - -Boost.Python has a nifty facility to capture and wrap C++ enums. While -Python has no [^enum] type, we'll often want to expose our C++ enums to -Python as an [^int]. Boost.Python's enum facility makes this easy while -taking care of the proper conversions from Python's dynamic typing to C++'s -strong static typing (in C++, ints cannot be implicitly converted to -enums). To illustrate, given a C++ enum: - - enum choice { red, blue }; - -the construct: - - enum_("choice") - .value("red", red) - .value("blue", blue) - ; - -can be used to expose to Python. The new enum type is created in the -current [^scope()], which is usually the current module. The snippet above -creates a Python class derived from Python's [^int] type which is -associated with the C++ type passed as its first parameter. - -[note [*what is a scope?] - -The scope is a class that has an associated global Python object which -controls the Python namespace in which new extension classes and wrapped -functions will be defined as attributes. Details can be found -[@../../../v2/scope.html here].] - -You can access those values in Python as - -[python] - - >>> my_module.choice.red - my_module.choice.red - -where my_module is the module where the enum is declared. You can also -create a new scope around a class: - -[c++] - - scope in_X = class_("X") - .def( ... ) - .def( ... ) - ; - - // Expose X::nested as X.nested - enum_("nested") - .value("red", red) - .value("blue", blue) - ; - -[def Py_Initialize [@http://www.python.org/doc/current/api/initialization.html#l2h-652 Py_Initialize]] -[def Py_Finalize [@http://www.python.org/doc/current/api/initialization.html#l2h-656 Py_Finalize]] -[def Py_XINCREF [@http://www.python.org/doc/current/api/countingRefs.html#l2h-65 Py_XINCREF]] -[def Py_XDECREF [@http://www.python.org/doc/current/api/countingRefs.html#l2h-67 Py_XDECREF]] -[def PyImport_AppendInittab [@http://www.python.org/doc/current/api/importing.html#l2h-137 PyImport_AppendInittab]] -[def PyImport_AddModule [@http://www.python.org/doc/current/api/importing.html#l2h-125 PyImport_AddModule]] -[def PyModule_New [@http://www.python.org/doc/current/api/moduleObjects.html#l2h-591 PyModule_New]] -[def PyModule_GetDict [@http://www.python.org/doc/current/api/moduleObjects.html#l2h-594 PyModule_GetDict]] - -[endsect] - -[section:creating_python_object Creating `boost::python::object` from `PyObject*`] - -When you want a `boost::python::object` to manage a pointer to `PyObject*` pyobj one does: - - boost::python::object o(boost::python::handle<>(pyobj)); - -In this case, the `o` object, manages the `pyobj`, it won’t increase the reference count on construction. - -Otherwise, to use a borrowed reference: - - boost::python::object o(boost::python::handle<>(boost::python::borrowed(pyobj))); - -In this case, `Py_INCREF` is called, so `pyobj` is not destructed when object o goes out of scope. - -[endsect] [/ creating_python_object ] - -[endsect] [/ Object Interface] - -[section Embedding] - -By now you should know how to use Boost.Python to call your C++ code from -Python. However, sometimes you may need to do the reverse: call Python code -from the C++-side. This requires you to ['embed] the Python interpreter -into your C++ program. - -Currently, Boost.Python does not directly support everything you'll need -when embedding. Therefore you'll need to use the -[@http://www.python.org/doc/current/api/api.html Python/C API] to fill in -the gaps. However, Boost.Python already makes embedding a lot easier and, -in a future version, it may become unnecessary to touch the Python/C API at -all. So stay tuned... :-) - -[h2 Building embedded programs] - -To be able to embed python into your programs, you have to link to -both Boost.Python's as well as Python's own runtime library. - -Boost.Python's library comes in two variants. Both are located -in Boost's [^/libs/python/build/bin-stage] subdirectory. On Windows, the -variants are called [^boost_python.lib] (for release builds) and -[^boost_python_debug.lib] (for debugging). If you can't find the libraries, -you probably haven't built Boost.Python yet. See -[@../../../building.html Building and Testing] on how to do this. - -Python's library can be found in the [^/libs] subdirectory of -your Python directory. On Windows it is called pythonXY.lib where X.Y is -your major Python version number. - -Additionally, Python's [^/include] subdirectory has to be added to your -include path. - -In a Jamfile, all the above boils down to: - -[pre -projectroot c:\projects\embedded_program ; # location of the program - -# bring in the rules for python -SEARCH on python.jam = $(BOOST_BUILD_PATH) ; -include python.jam ; - -exe embedded_program # name of the executable - : #sources - embedded_program.cpp - : # requirements - boost_python c:\boost\libs\python - $(PYTHON_PROPERTIES) - $(PYTHON_LIB_PATH) - $(PYTHON_EMBEDDED_LIBRARY) ; -] - -[h2 Getting started] - -Being able to build is nice, but there is nothing to build yet. Embedding -the Python interpreter into one of your C++ programs requires these 4 -steps: - -# '''#include''' [^] - -# Call Py_Initialize() to start the interpreter and create the [^__main__] module. - -# Call other Python C API routines to use the interpreter. - -[/ # Call Py_Finalize() to stop the interpreter and release its resources.] - -[note [*Note that at this time you must not call Py_Finalize() to stop the -interpreter. This may be fixed in a future version of boost.python.] -] - -(Of course, there can be other C++ code between all of these steps.) - -[:['[*Now that we can embed the interpreter in our programs, lets see how to put it to use...]]] - -[section Using the interpreter] - -As you probably already know, objects in Python are reference-counted. -Naturally, the [^PyObject]s of the Python C API are also reference-counted. -There is a difference however. While the reference-counting is fully -automatic in Python, the Python C API requires you to do it -[@http://www.python.org/doc/current/c-api/refcounting.html by hand]. This is -messy and especially hard to get right in the presence of C++ exceptions. -Fortunately Boost.Python provides the [@../../../v2/handle.html handle] and -[@../../../v2/object.html object] class templates to automate the process. - -[h2 Running Python code] - -Boost.python provides three related functions to run Python code from C++. - - object eval(str expression, object globals = object(), object locals = object()) - object exec(str code, object globals = object(), object locals = object()) - object exec_file(str filename, object globals = object(), object locals = object()) - -eval evaluates the given expression and returns the resulting value. -exec executes the given code (typically a set of statements) returning the result, -and exec_file executes the code contained in the given file. - -The [^globals] and [^locals] parameters are Python dictionaries -containing the globals and locals of the context in which to run the code. -For most intents and purposes you can use the namespace dictionary of the -[^__main__] module for both parameters. - -Boost.python provides a function to import a module: - - object import(str name) - -import imports a python module (potentially loading it into the running process -first), and returns it. - -Let's import the [^__main__] module and run some Python code in its namespace: - - object main_module = import("__main__"); - object main_namespace = main_module.attr("__dict__"); - - object ignored = exec("hello = file('hello.txt', 'w')\n" - "hello.write('Hello world!')\n" - "hello.close()", - main_namespace); - -This should create a file called 'hello.txt' in the current directory -containing a phrase that is well-known in programming circles. - -[h2 Manipulating Python objects] - -Often we'd like to have a class to manipulate Python objects. -But we have already seen such a class above, and in the -[@python/object.html previous section]: the aptly named [^object] class -and its derivatives. We've already seen that they can be constructed from -a [^handle]. The following examples should further illustrate this fact: - - object main_module = import("__main__"); - object main_namespace = main_module.attr("__dict__"); - object ignored = exec("result = 5 ** 2", main_namespace); - int five_squared = extract(main_namespace["result"]); - -Here we create a dictionary object for the [^__main__] module's namespace. -Then we assign 5 squared to the result variable and read this variable from -the dictionary. Another way to achieve the same result is to use eval instead, -which returns the result directly: - - object result = eval("5 ** 2"); - int five_squared = extract(result); - -[h2 Exception handling] - -If an exception occurs in the evaluation of the python expression, -[@../../../v2/errors.html#error_already_set-spec error_already_set] is thrown: - - try - { - object result = eval("5/0"); - // execution will never get here: - int five_divided_by_zero = extract(result); - } - catch(error_already_set const &) - { - // handle the exception in some way - } - -The [^error_already_set] exception class doesn't carry any information in itself. -To find out more about the Python exception that occurred, you need to use the -[@http://www.python.org/doc/api/exceptionHandling.html exception handling functions] -of the Python C API in your catch-statement. This can be as simple as calling -[@http://www.python.org/doc/api/exceptionHandling.html#l2h-70 PyErr_Print()] to -print the exception's traceback to the console, or comparing the type of the -exception with those of the [@http://www.python.org/doc/api/standardExceptions.html -standard exceptions]: - - catch(error_already_set const &) - { - if (PyErr_ExceptionMatches(PyExc_ZeroDivisionError)) - { - // handle ZeroDivisionError specially - } - else - { - // print all other errors to stderr - PyErr_Print(); - } - } - -(To retrieve even more information from the exception you can use some of the other -exception handling functions listed [@http://www.python.org/doc/api/exceptionHandling.html here].) - -[endsect] -[endsect] [/ Embedding] - -[section Iterators] - -In C++, and STL in particular, we see iterators everywhere. Python also has -iterators, but these are two very different beasts. - -[*C++ iterators:] - -* C++ has 5 type categories (random-access, bidirectional, forward, input, output) -* There are 2 Operation categories: reposition, access -* A pair of iterators is needed to represent a (first/last) range. - -[*Python Iterators:] - -* 1 category (forward) -* 1 operation category (next()) -* Raises StopIteration exception at end - -The typical Python iteration protocol: [^[*for y in x...]] is as follows: - -[python] - - iter = x.__iter__() # get iterator - try: - while 1: - y = iter.next() # get each item - ... # process y - except StopIteration: pass # iterator exhausted - -Boost.Python provides some mechanisms to make C++ iterators play along -nicely as Python iterators. What we need to do is to produce -appropriate `__iter__` function from C++ iterators that is compatible -with the Python iteration protocol. For example: - -[c++] - - object get_iterator = iterator >(); - object iter = get_iterator(v); - object first = iter.next(); - -Or for use in class_<>: - - .def("__iter__", iterator >()) - -[*range] - -We can create a Python savvy iterator using the range function: - -* range(start, finish) -* range(start, finish) - -Here, start/finish may be one of: - -* member data pointers -* member function pointers -* adaptable function object (use Target parameter) - -[*iterator] - -* iterator() - -Given a container [^T], iterator is a shortcut that simply calls [^range] -with &T::begin, &T::end. - -Let's put this into action... Here's an example from some hypothetical -bogon Particle accelerator code: - -[python] - - f = Field() - for x in f.pions: - smash(x) - for y in f.bogons: - count(y) - -Now, our C++ Wrapper: - -[c++] - - class_("Field") - .property("pions", range(&F::p_begin, &F::p_end)) - .property("bogons", range(&F::b_begin, &F::b_end)); - -[*stl_input_iterator] - -So far, we have seen how to expose C++ iterators and ranges to Python. -Sometimes we wish to go the other way, though: we'd like to pass a -Python sequence to an STL algorithm or use it to initialize an STL -container. We need to make a Python iterator look like an STL iterator. -For that, we use `stl_input_iterator<>`. Consider how we might -implement a function that exposes `std::list::assign()` to -Python: - -[c++] - - template - void list_assign(std::list& l, object o) { - // Turn a Python sequence into an STL input range - stl_input_iterator begin(o), end; - l.assign(begin, end); - } - - // Part of the wrapper for list - class_ >("list_int") - .def("assign", &list_assign) - // ... - ; - -Now in Python, we can assign any integer sequence to `list_int` objects: - -[python] - - x = list_int(); - x.assign([1,2,3,4,5]) - -[endsect] -[section:exception Exception Translation] - -All C++ exceptions must be caught at the boundary with Python code. This -boundary is the point where C++ meets Python. Boost.Python provides a -default exception handler that translates selected standard exceptions, -then gives up: - - raise RuntimeError, 'unidentifiable C++ Exception' - -Users may provide custom translation. Here's an example: - - struct PodBayDoorException; - void translator(PodBayDoorException const& x) { - PyErr_SetString(PyExc_UserWarning, "I'm sorry Dave..."); - } - BOOST_PYTHON_MODULE(kubrick) { - register_exception_translator< - PodBayDoorException>(translator); - ... - -[endsect] -[section:techniques General Techniques] - -Here are presented some useful techniques that you can use while wrapping code with Boost.Python. - -[section Creating Packages] - -A Python package is a collection of modules that provide to the user a certain -functionality. If you're not familiar on how to create packages, a good -introduction to them is provided in the -[@http://www.python.org/doc/current/tut/node8.html Python Tutorial]. - -But we are wrapping C++ code, using Boost.Python. How can we provide a nice -package interface to our users? To better explain some concepts, let's work -with an example. - -We have a C++ library that works with sounds: reading and writing various -formats, applying filters to the sound data, etc. It is named (conveniently) -[^sounds]. Our library already has a neat C++ namespace hierarchy, like so: - - sounds::core - sounds::io - sounds::filters - -We would like to present this same hierarchy to the Python user, allowing him -to write code like this: - - import sounds.filters - sounds.filters.echo(...) # echo is a C++ function - -The first step is to write the wrapping code. We have to export each module -separately with Boost.Python, like this: - - /* file core.cpp */ - BOOST_PYTHON_MODULE(core) - { - /* export everything in the sounds::core namespace */ - ... - } - - /* file io.cpp */ - BOOST_PYTHON_MODULE(io) - { - /* export everything in the sounds::io namespace */ - ... - } - - /* file filters.cpp */ - BOOST_PYTHON_MODULE(filters) - { - /* export everything in the sounds::filters namespace */ - ... - } - -Compiling these files will generate the following Python extensions: -[^core.pyd], [^io.pyd] and [^filters.pyd]. - -[note The extension [^.pyd] is used for python extension modules, which -are just shared libraries. Using the default for your system, like [^.so] for -Unix and [^.dll] for Windows, works just as well.] - -Now, we create this directory structure for our Python package: - -[pre -sounds/ - \_\_init\_\_.py - core.pyd - filters.pyd - io.pyd -] - -The file [^\_\_init\_\_.py] is what tells Python that the directory [^sounds/] is -actually a Python package. It can be a empty file, but can also perform some -magic, that will be shown later. - -Now our package is ready. All the user has to do is put [^sounds] into his -[@http://www.python.org/doc/current/tut/node8.html#SECTION008110000000000000000 PYTHONPATH] -and fire up the interpreter: - -[python] - - >>> import sounds.io - >>> import sounds.filters - >>> sound = sounds.io.open('file.mp3') - >>> new_sound = sounds.filters.echo(sound, 1.0) - -Nice heh? - -This is the simplest way to create hierarchies of packages, but it is not very -flexible. What if we want to add a ['pure] Python function to the filters -package, for instance, one that applies 3 filters in a sound object at once? -Sure, you can do this in C++ and export it, but why not do so in Python? You -don't have to recompile the extension modules, plus it will be easier to write -it. - -If we want this flexibility, we will have to complicate our package hierarchy a -little. First, we will have to change the name of the extension modules: - -[c++] - - /* file core.cpp */ - BOOST_PYTHON_MODULE(_core) - { - ... - /* export everything in the sounds::core namespace */ - } - -Note that we added an underscore to the module name. The filename will have to -be changed to [^_core.pyd] as well, and we do the same to the other extension modules. -Now, we change our package hierarchy like so: - -[pre -sounds/ - \_\_init\_\_.py - core/ - \_\_init\_\_.py - _core.pyd - filters/ - \_\_init\_\_.py - _filters.pyd - io/ - \_\_init\_\_.py - _io.pyd -] - -Note that we created a directory for each extension module, and added a -\_\_init\_\_.py to each one. But if we leave it that way, the user will have to -access the functions in the core module with this syntax: - -[python] - - >>> import sounds.core._core - >>> sounds.core._core.foo(...) - -which is not what we want. But here enters the [^\_\_init\_\_.py] magic: everything -that is brought to the [^\_\_init\_\_.py] namespace can be accessed directly by the -user. So, all we have to do is bring the entire namespace from [^_core.pyd] -to [^core/\_\_init\_\_.py]. So add this line of code to [^sounds/core/\_\_init\_\_.py]: - - from _core import * - -We do the same for the other packages. Now the user accesses the functions and -classes in the extension modules like before: - - >>> import sounds.filters - >>> sounds.filters.echo(...) - -with the additional benefit that we can easily add pure Python functions to -any module, in a way that the user can't tell the difference between a C++ -function and a Python function. Let's add a ['pure] Python function, -[^echo_noise], to the [^filters] package. This function applies both the -[^echo] and [^noise] filters in sequence in the given [^sound] object. We -create a file named [^sounds/filters/echo_noise.py] and code our function: - - import _filters - def echo_noise(sound): - s = _filters.echo(sound) - s = _filters.noise(sound) - return s - -Next, we add this line to [^sounds/filters/\_\_init\_\_.py]: - - from echo_noise import echo_noise - -And that's it. The user now accesses this function like any other function -from the [^filters] package: - - >>> import sounds.filters - >>> sounds.filters.echo_noise(...) - -[endsect] -[section Extending Wrapped Objects in Python] - -Thanks to Python's flexibility, you can easily add new methods to a class, -even after it was already created: - - >>> class C(object): pass - >>> - >>> # a regular function - >>> def C_str(self): return 'A C instance!' - >>> - >>> # now we turn it in a member function - >>> C.__str__ = C_str - >>> - >>> c = C() - >>> print c - A C instance! - >>> C_str(c) - A C instance! - -Yes, Python rox. :-) - -We can do the same with classes that were wrapped with Boost.Python. Suppose -we have a class [^point] in C++: - -[c++] - - class point {...}; - - BOOST_PYTHON_MODULE(_geom) - { - class_("point")...; - } - -If we are using the technique from the previous session, -[link python.creating_packages Creating Packages], we can code directly -into [^geom/\_\_init\_\_.py]: - -[python] - - from _geom import * - - # a regular function - def point_str(self): - return str((self.x, self.y)) - - # now we turn it into a member function - point.__str__ = point_str - -[*All] point instances created from C++ will also have this member function! -This technique has several advantages: - -* Cut down compile times to zero for these additional functions -* Reduce the memory footprint to virtually zero -* Minimize the need to recompile -* Rapid prototyping (you can move the code to C++ if required without changing the interface) - -You can even add a little syntactic sugar with the use of metaclasses. Let's -create a special metaclass that "injects" methods in other classes. - - # The one Boost.Python uses for all wrapped classes. - # You can use here any class exported by Boost instead of "point" - BoostPythonMetaclass = point.__class__ - - class injector(object): - class __metaclass__(BoostPythonMetaclass): - def __init__(self, name, bases, dict): - for b in bases: - if type(b) not in (self, type): - for k,v in dict.items(): - setattr(b,k,v) - return type.__init__(self, name, bases, dict) - - # inject some methods in the point foo - class more_point(injector, point): - def __repr__(self): - return 'Point(x=%s, y=%s)' % (self.x, self.y) - def foo(self): - print 'foo!' - -Now let's see how it got: - - >>> print point() - Point(x=10, y=10) - >>> point().foo() - foo! - -Another useful idea is to replace constructors with factory functions: - - _point = point - - def point(x=0, y=0): - return _point(x, y) - -In this simple case there is not much gained, but for constructurs with -many overloads and/or arguments this is often a great simplification, again -with virtually zero memory footprint and zero compile-time overhead for -the keyword support. - -[endsect] -[section Reducing Compiling Time] - -If you have ever exported a lot of classes, you know that it takes quite a good -time to compile the Boost.Python wrappers. Plus the memory consumption can -easily become too high. If this is causing you problems, you can split the -class_ definitions in multiple files: - -[c++] - - /* file point.cpp */ - #include - #include - - void export_point() - { - class_("point")...; - } - - /* file triangle.cpp */ - #include - #include - - void export_triangle() - { - class_("triangle")...; - } - -Now you create a file [^main.cpp], which contains the [^BOOST_PYTHON_MODULE] -macro, and call the various export functions inside it. - - void export_point(); - void export_triangle(); - - BOOST_PYTHON_MODULE(_geom) - { - export_point(); - export_triangle(); - } - -Compiling and linking together all this files produces the same result as the -usual approach: - - #include - #include - #include - - BOOST_PYTHON_MODULE(_geom) - { - class_("point")...; - class_("triangle")...; - } - -but the memory is kept under control. - -This method is recommended too if you are developing the C++ library and -exporting it to Python at the same time: changes in a class will only demand -the compilation of a single cpp, instead of the entire wrapper code. - -[note If you're exporting your classes with [@../../../../pyste/index.html Pyste], -take a look at the [^--multiple] option, that generates the wrappers in -various files as demonstrated here.] - -[note This method is useful too if you are getting the error message -['"fatal error C1204:Compiler limit:internal structure overflow"] when compiling -a large source file, as explained in the [@../../../v2/faq.html#c1204 FAQ].] - -[endsect] -[endsect] [/ General Techniques] - diff --git a/include/boost/python.hpp b/include/boost/python.hpp deleted file mode 100644 index 11067c17..00000000 --- a/include/boost/python.hpp +++ /dev/null @@ -1,76 +0,0 @@ -// 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) - -// See http://www.boost.org/libs/python for documentation. - -#ifndef PYTHON_DWA2002810_HPP -# define PYTHON_DWA2002810_HPP - -# include -# include -# include -# include -# include -# include -# include -# include -# include -# include -# include -# include -# include -# include -# include -# include -# include -# include -# include -# include -# include -# include -# include -# include -# include -# include -# include -# include -# include -# include -# include -# include -# include -# include -# include -# include -# include -# include -# include -# include -# include -# include -# include -# include -# include -# include -# include -# include -# include -# include -# include -# include -# include -# include -# include -# include -# include -# include -# include -# include -# include -# include -# include -# include - -#endif // PYTHON_DWA2002810_HPP diff --git a/include/boost/python/arg_from_python.hpp b/include/boost/python/arg_from_python.hpp deleted file mode 100755 index 05611edb..00000000 --- a/include/boost/python/arg_from_python.hpp +++ /dev/null @@ -1,76 +0,0 @@ -// 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) -#ifndef ARG_FROM_PYTHON_DWA2002128_HPP -# define ARG_FROM_PYTHON_DWA2002128_HPP - -# include -# include -# if BOOST_WORKAROUND(BOOST_MSVC, BOOST_TESTED_AT(1400)) \ - || BOOST_WORKAROUND(BOOST_INTEL_WIN, BOOST_TESTED_AT(800)) -# include -#endif - -namespace boost { namespace python { - -template -struct arg_from_python - : converter::select_arg_from_python< -# if BOOST_WORKAROUND(BOOST_MSVC, BOOST_TESTED_AT(1400)) \ - || BOOST_WORKAROUND(BOOST_INTEL_WIN, BOOST_TESTED_AT(800)) - typename boost::remove_cv::type -# else - T -# endif - >::type -{ - typedef typename converter::select_arg_from_python< -# if BOOST_WORKAROUND(BOOST_MSVC, BOOST_TESTED_AT(1400)) \ - || BOOST_WORKAROUND(BOOST_INTEL_WIN, BOOST_TESTED_AT(800)) - typename boost::remove_cv::type -# else - T -# endif - >::type base; - - arg_from_python(PyObject*); -}; - -// specialization for PyObject* -template <> -struct arg_from_python -{ - typedef PyObject* result_type; - - arg_from_python(PyObject* p) : m_source(p) {} - bool convertible() const { return true; } - PyObject* operator()() const { return m_source; } - private: - PyObject* m_source; -}; - -template <> -struct arg_from_python -{ - typedef PyObject* const& result_type; - - arg_from_python(PyObject* p) : m_source(p) {} - bool convertible() const { return true; } - PyObject*const& operator()() const { return m_source; } - private: - PyObject* m_source; -}; - -// -// implementations -// -template -inline arg_from_python::arg_from_python(PyObject* source) - : base(source) -{ -} - -}} // namespace boost::python - -#endif // ARG_FROM_PYTHON_DWA2002128_HPP diff --git a/include/boost/python/args.hpp b/include/boost/python/args.hpp deleted file mode 100644 index 55d1283b..00000000 --- a/include/boost/python/args.hpp +++ /dev/null @@ -1,149 +0,0 @@ -// 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) -#ifndef KEYWORDS_DWA2002323_HPP -# define KEYWORDS_DWA2002323_HPP - -# include - -# include -# include -# include -# include - -# include -# include -# include - -# include -# include -# include -# include - -# include -# include - -# include - -# include -# include - -namespace boost { namespace python { - -typedef detail::keywords<1> arg; -typedef arg arg_; // gcc 2.96 workaround - -namespace detail -{ - template - struct keywords_base - { - BOOST_STATIC_CONSTANT(std::size_t, size = nkeywords); - - keyword_range range() const - { - return keyword_range(elements, elements + nkeywords); - } - - keyword elements[nkeywords]; - - keywords - operator,(python::arg const &k) const; - - keywords - operator,(char const *name) const; - }; - - template - struct keywords : keywords_base - { - }; - - template <> - struct keywords<1> : keywords_base<1> - { - explicit keywords(char const *name) - { - elements[0].name = name; - } - - template - python::arg& operator=(T const& value) - { - object z(value); - elements[0].default_value = handle<>(python::borrowed(object(value).ptr())); - return *this; - } - - operator detail::keyword const&() const - { - return elements[0]; - } - }; - - template - inline - keywords - keywords_base::operator,(python::arg const &k) const - { - keywords const& l = *static_cast const*>(this); - python::detail::keywords res; - std::copy(l.elements, l.elements+nkeywords, res.elements); - res.elements[nkeywords] = k.elements[0]; - return res; - } - - template - inline - keywords - keywords_base::operator,(char const *name) const - { - return this->operator,(python::arg(name)); - } - - template - struct is_keywords - { - BOOST_STATIC_CONSTANT(bool, value = false); - }; - - template - struct is_keywords > - { - BOOST_STATIC_CONSTANT(bool, value = true); - }; - template - struct is_reference_to_keywords - { - BOOST_STATIC_CONSTANT(bool, is_ref = is_reference::value); - typedef typename remove_reference::type deref; - typedef typename remove_cv::type key_t; - BOOST_STATIC_CONSTANT(bool, is_key = is_keywords::value); - BOOST_STATIC_CONSTANT(bool, value = (is_ref & is_key)); - - typedef mpl::bool_ type; - BOOST_PYTHON_MPL_LAMBDA_SUPPORT(1,is_reference_to_keywords,(T)) - }; -} - -inline detail::keywords<1> args(char const* name) -{ - return detail::keywords<1>(name); -} - -# define BOOST_PYTHON_ASSIGN_NAME(z, n, _) result.elements[n].name = name##n; -# define BOOST_PP_LOCAL_MACRO(n) \ -inline detail::keywords args(BOOST_PP_ENUM_PARAMS_Z(1, n, char const* name)) \ -{ \ - detail::keywords result; \ - BOOST_PP_REPEAT_1(n, BOOST_PYTHON_ASSIGN_NAME, _) \ - return result; \ -} -# define BOOST_PP_LOCAL_LIMITS (2, BOOST_PYTHON_MAX_ARITY) -# include BOOST_PP_LOCAL_ITERATE() - -}} // namespace boost::python - - -# endif // KEYWORDS_DWA2002323_HPP diff --git a/include/boost/python/args_fwd.hpp b/include/boost/python/args_fwd.hpp deleted file mode 100644 index 39239461..00000000 --- a/include/boost/python/args_fwd.hpp +++ /dev/null @@ -1,52 +0,0 @@ -// 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) -#ifndef ARGS_FWD_DWA2002927_HPP -# define ARGS_FWD_DWA2002927_HPP - -# include - -# include -# include -# include -# include - -namespace boost { namespace python { - -namespace detail -{ - struct keyword - { - keyword(char const* name_=0) - : name(name_) - {} - - char const* name; - handle<> default_value; - }; - - template struct keywords; - - typedef std::pair keyword_range; - - template <> - struct keywords<0> - { - BOOST_STATIC_CONSTANT(std::size_t, size = 0); - static keyword_range range() { return keyword_range(); } - }; - - namespace error - { - template - struct more_keywords_than_function_arguments - { - typedef char too_many_keywords[keywords > function_args ? -1 : 1]; - }; - } -} - -}} // namespace boost::python - -#endif // ARGS_FWD_DWA2002927_HPP diff --git a/include/boost/python/back_reference.hpp b/include/boost/python/back_reference.hpp deleted file mode 100644 index e68066f7..00000000 --- a/include/boost/python/back_reference.hpp +++ /dev/null @@ -1,71 +0,0 @@ -// 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) -#ifndef BACK_REFERENCE_DWA2002510_HPP -# define BACK_REFERENCE_DWA2002510_HPP - -# include - -# include -# include -# include - -namespace boost { namespace python { - -template -struct back_reference -{ - private: // types - typedef typename detail::dependent::type source_t; - public: - typedef T type; - - back_reference(PyObject*, T); - source_t const& source() const; - T get() const; - private: - source_t m_source; - T m_value; -}; - -template -class is_back_reference -{ - public: - BOOST_STATIC_CONSTANT(bool, value = false); -}; - -template -class is_back_reference > -{ - public: - BOOST_STATIC_CONSTANT(bool, value = true); -}; - - -// -// implementations -// -template -back_reference::back_reference(PyObject* p, T x) - : m_source(detail::borrowed_reference(p)) - , m_value(x) -{ -} - -template -typename back_reference::source_t const& back_reference::source() const -{ - return m_source; -} - -template -T back_reference::get() const -{ - return m_value; -} - -}} // namespace boost::python - -#endif // BACK_REFERENCE_DWA2002510_HPP diff --git a/include/boost/python/base_type_traits.hpp b/include/boost/python/base_type_traits.hpp deleted file mode 100755 index e1c6a484..00000000 --- a/include/boost/python/base_type_traits.hpp +++ /dev/null @@ -1,43 +0,0 @@ -// 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) -#ifndef BASE_TYPE_TRAITS_DWA2002614_HPP -# define BASE_TYPE_TRAITS_DWA2002614_HPP - -# include - -namespace boost { namespace python { - -namespace detail -{ - struct unspecialized {}; -} - -// Derive from unspecialized so we can detect whether traits are -// specialized -template struct base_type_traits - : detail::unspecialized -{}; - -template <> -struct base_type_traits -{ - typedef PyObject type; -}; - -template <> -struct base_type_traits -{ - typedef PyObject type; -}; - -template <> -struct base_type_traits -{ - typedef PyObject type; -}; - -}} // namespace boost::python - -#endif // BASE_TYPE_TRAITS_DWA2002614_HPP diff --git a/include/boost/python/bases.hpp b/include/boost/python/bases.hpp deleted file mode 100644 index 614d6223..00000000 --- a/include/boost/python/bases.hpp +++ /dev/null @@ -1,50 +0,0 @@ -// 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) -#ifndef BASES_DWA2002321_HPP -# define BASES_DWA2002321_HPP - -# include -# include -# include -# include -# include -# include -# include - -namespace boost { namespace python { - -# define BOOST_PYTHON_BASE_PARAMS BOOST_PP_ENUM_PARAMS_Z(1, BOOST_PYTHON_MAX_BASES, Base) - - // A type list for specifying bases - template < BOOST_PP_ENUM_PARAMS_WITH_A_DEFAULT(BOOST_PYTHON_MAX_BASES, typename Base, mpl::void_) > - struct bases : detail::type_list< BOOST_PYTHON_BASE_PARAMS >::type - {}; - - namespace detail - { - template struct specifies_bases - : mpl::false_ - { - }; - - template < BOOST_PP_ENUM_PARAMS_Z(1, BOOST_PYTHON_MAX_BASES, class Base) > - struct specifies_bases< bases< BOOST_PYTHON_BASE_PARAMS > > - : mpl::true_ - { - }; - template > - struct select_bases - : mpl::if_< - specifies_bases - , T - , Prev - > - { - }; - } -# undef BOOST_PYTHON_BASE_PARAMS -}} // namespace boost::python - -#endif // BASES_DWA2002321_HPP diff --git a/include/boost/python/borrowed.hpp b/include/boost/python/borrowed.hpp deleted file mode 100755 index fd2716bf..00000000 --- a/include/boost/python/borrowed.hpp +++ /dev/null @@ -1,21 +0,0 @@ -// 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) -#ifndef BORROWED_DWA2002614_HPP -# define BORROWED_DWA2002614_HPP - -# include -# include - -namespace boost { namespace python { - -template -inline python::detail::borrowed* borrowed(T* p) -{ - return (detail::borrowed*)p; -} - -}} // namespace boost::python - -#endif // BORROWED_DWA2002614_HPP diff --git a/include/boost/python/call.hpp b/include/boost/python/call.hpp deleted file mode 100644 index 5d2d7d23..00000000 --- a/include/boost/python/call.hpp +++ /dev/null @@ -1,83 +0,0 @@ -#if !defined(BOOST_PP_IS_ITERATING) - -// 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) - -# ifndef CALL_DWA2002411_HPP -# define CALL_DWA2002411_HPP - -# include - -# include - -# include -# include -# include -# include - -# include -# include -# include -# include -# include -# include - -namespace boost { namespace python { - -# define BOOST_PYTHON_FAST_ARG_TO_PYTHON_GET(z, n, _) \ - , converter::arg_to_python(a##n).get() - -# define BOOST_PP_ITERATION_PARAMS_1 (3, (0, BOOST_PYTHON_MAX_ARITY, )) -# include BOOST_PP_ITERATE() - -# undef BOOST_PYTHON_FAST_ARG_TO_PYTHON_GET - -}} // namespace boost::python - -# endif // CALL_DWA2002411_HPP - -// For gcc 4.4 compatability, we must include the -// BOOST_PP_ITERATION_DEPTH test inside an #else clause. -#else // BOOST_PP_IS_ITERATING -#if BOOST_PP_ITERATION_DEPTH() == 1 -# if !(BOOST_WORKAROUND(__MWERKS__, > 0x3100) \ - && BOOST_WORKAROUND(__MWERKS__, BOOST_TESTED_AT(0x3201))) -# line BOOST_PP_LINE(__LINE__, call.hpp) -# endif - -# define N BOOST_PP_ITERATION() - -template < - class R - BOOST_PP_ENUM_TRAILING_PARAMS_Z(1, N, class A) - > -typename detail::returnable::type -call(PyObject* callable - BOOST_PP_COMMA_IF(N) BOOST_PP_ENUM_BINARY_PARAMS_Z(1, N, A, const& a) - , boost::type* = 0 - ) -{ - PyObject* const result = - PyEval_CallFunction( - callable - , const_cast("(" BOOST_PP_REPEAT_1ST(N, BOOST_PYTHON_FIXED, "O") ")") - BOOST_PP_REPEAT_1ST(N, BOOST_PYTHON_FAST_ARG_TO_PYTHON_GET, nil) - ); - - // This conversion *must not* be done in the same expression as - // the call, because, in the special case where the result is a - // reference a Python object which was created by converting a C++ - // argument for passing to PyEval_CallFunction, its reference - // count will be 2 until the end of the full expression containing - // the conversion, and that interferes with dangling - // pointer/reference detection. - converter::return_from_python converter; - return converter(result); -} - -# undef N - -#endif // BOOST_PP_ITERATION_DEPTH() -#endif diff --git a/include/boost/python/call_method.hpp b/include/boost/python/call_method.hpp deleted file mode 100644 index 410f6682..00000000 --- a/include/boost/python/call_method.hpp +++ /dev/null @@ -1,83 +0,0 @@ -#if !defined(BOOST_PP_IS_ITERATING) - -// 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) -# ifndef CALL_METHOD_DWA2002411_HPP -# define CALL_METHOD_DWA2002411_HPP - -# include - -# include - -# include -# include -# include -# include - -# include -# include -# include -# include -# include -# include - -namespace boost { namespace python { - -# define BOOST_PYTHON_FAST_ARG_TO_PYTHON_GET(z, n, _) \ - , converter::arg_to_python(a##n).get() - -# define BOOST_PP_ITERATION_PARAMS_1 (3, (0, BOOST_PYTHON_MAX_ARITY, )) -# include BOOST_PP_ITERATE() - -# undef BOOST_PYTHON_FAST_ARG_TO_PYTHON_GET - -}} // namespace boost::python - -# endif // CALL_METHOD_DWA2002411_HPP - -// For gcc 4.4 compatability, we must include the -// BOOST_PP_ITERATION_DEPTH test inside an #else clause. -#else // BOOST_PP_IS_ITERATING -#if BOOST_PP_ITERATION_DEPTH() == 1 -# if !(BOOST_WORKAROUND(__MWERKS__, > 0x3100) \ - && BOOST_WORKAROUND(__MWERKS__, BOOST_TESTED_AT(0x3201))) -# line BOOST_PP_LINE(__LINE__, call_method.hpp) -# endif - -# define N BOOST_PP_ITERATION() - -template < - class R - BOOST_PP_ENUM_TRAILING_PARAMS_Z(1, N, class A) - > -typename detail::returnable::type -call_method(PyObject* self, char const* name - BOOST_PP_COMMA_IF(N) BOOST_PP_ENUM_BINARY_PARAMS_Z(1, N, A, const& a) - , boost::type* = 0 - ) -{ - PyObject* const result = - PyEval_CallMethod( - self - , const_cast(name) - , const_cast("(" BOOST_PP_REPEAT_1ST(N, BOOST_PYTHON_FIXED, "O") ")") - BOOST_PP_REPEAT_1ST(N, BOOST_PYTHON_FAST_ARG_TO_PYTHON_GET, nil) - ); - - // This conversion *must not* be done in the same expression as - // the call, because, in the special case where the result is a - // reference a Python object which was created by converting a C++ - // argument for passing to PyEval_CallFunction, its reference - // count will be 2 until the end of the full expression containing - // the conversion, and that interferes with dangling - // pointer/reference detection. - converter::return_from_python converter; - return converter(result); -} - -# undef N - -#endif // BOOST_PP_ITERATION_DEPTH() -#endif // BOOST_PP_IS_ITERATING diff --git a/include/boost/python/cast.hpp b/include/boost/python/cast.hpp deleted file mode 100755 index 31c61dbf..00000000 --- a/include/boost/python/cast.hpp +++ /dev/null @@ -1,106 +0,0 @@ -// 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) -#ifndef CAST_DWA200269_HPP -# define CAST_DWA200269_HPP - -# include - -# include -# include -# include -# include -# include - -namespace boost { namespace python { - -namespace detail -{ - template inline Target* upcast_impl(Source*, Target*); - - template - inline Target* upcast(Source* p, yes_convertible, no_convertible, Target*) - { - return p; - } - - template - inline Target* upcast(Source* p, no_convertible, no_convertible, Target*) - { - typedef typename base_type_traits::type base; - - return detail::upcast_impl((base*)p, (Target*)0); - } - - template - struct upcaster - { - template - static inline T* execute(T* x, T*) { return x; } - }; - - template <> - struct upcaster - { - template - static inline Target* execute(Source* x, Target*) - { - return detail::upcast( - x, detail::convertible::check(x) - , detail::convertible::check((Target*)0) - , (Target*)0); - } - }; - - - template - inline Target* downcast(Source* p, yes_convertible) - { - return static_cast(p); - } - - template - inline Target* downcast(Source* p, no_convertible, boost::type* = 0) - { - typedef typename base_type_traits::type base; - return (Target*)detail::downcast(p, convertible::check((base*)0)); - } - - template - inline void assert_castable(boost::type* = 0) - { - typedef char must_be_a_complete_type[sizeof(T)]; - } - - template - inline Target* upcast_impl(Source* x, Target*) - { - typedef typename add_cv::type src_t; - typedef typename add_cv::type target_t; - bool const same = is_same::value; - - return detail::upcaster::execute(x, (Target*)0); - } -} - -template -inline Target* upcast(Source* x, Target* = 0) -{ - detail::assert_castable(); - detail::assert_castable(); - return detail::upcast_impl(x, (Target*)0); - -} - -template -inline Target* downcast(Source* x, Target* = 0) -{ - detail::assert_castable(); - detail::assert_castable(); - return detail::downcast(x, detail::convertible::check((Target*)0)); -} - -}} // namespace boost::python - -#endif // CAST_DWA200269_HPP diff --git a/include/boost/python/class.hpp b/include/boost/python/class.hpp deleted file mode 100644 index f43b615a..00000000 --- a/include/boost/python/class.hpp +++ /dev/null @@ -1,612 +0,0 @@ -// 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) -#ifndef CLASS_DWA200216_HPP -# define CLASS_DWA200216_HPP - -# include - -# include - -# include -# include - -# include -# include -# include -# include -# include -# include -# include - -# include -# include -# include - -# include -# include -# include -# include -# include -# include - -# include -# include -# include - -# include -# include -# include -# include - -# include - -# if BOOST_WORKAROUND(__MWERKS__, <= 0x3004) \ - /* pro9 reintroduced the bug */ \ - || (BOOST_WORKAROUND(__MWERKS__, > 0x3100) \ - && BOOST_WORKAROUND(__MWERKS__, BOOST_TESTED_AT(0x3201))) - -# define BOOST_PYTHON_NO_MEMBER_POINTER_ORDERING 1 - -# endif - -# ifdef BOOST_PYTHON_NO_MEMBER_POINTER_ORDERING -# include -# include -# endif - -namespace boost { namespace python { - -template class def_visitor; - -enum no_init_t { no_init }; - -namespace detail -{ - // This function object is used with mpl::for_each to write the id - // of the type a pointer to which is passed as its 2nd compile-time - // argument. into the iterator pointed to by its runtime argument - struct write_type_id - { - write_type_id(type_info**p) : p(p) {} - - // Here's the runtime behavior - template - void operator()(T*) const - { - *(*p)++ = type_id(); - } - - type_info** p; - }; - - template - struct is_data_member_pointer - : mpl::and_< - is_member_pointer - , mpl::not_ > - > - {}; - -# ifdef BOOST_PYTHON_NO_MEMBER_POINTER_ORDERING -# define BOOST_PYTHON_DATA_MEMBER_HELPER(D) , detail::is_data_member_pointer() -# define BOOST_PYTHON_YES_DATA_MEMBER , mpl::true_ -# define BOOST_PYTHON_NO_DATA_MEMBER , mpl::false_ -# elif defined(BOOST_NO_FUNCTION_TEMPLATE_ORDERING) -# define BOOST_PYTHON_DATA_MEMBER_HELPER(D) , 0 -# define BOOST_PYTHON_YES_DATA_MEMBER , int -# define BOOST_PYTHON_NO_DATA_MEMBER , ... -# else -# define BOOST_PYTHON_DATA_MEMBER_HELPER(D) -# define BOOST_PYTHON_YES_DATA_MEMBER -# define BOOST_PYTHON_NO_DATA_MEMBER -# endif - - namespace error - { - // - // A meta-assertion mechanism which prints nice error messages and - // backtraces on lots of compilers. Usage: - // - // assertion::failed - // - // where C is an MPL metafunction class - // - - template struct assertion_failed { }; - template struct assertion_ok { typedef C failed; }; - - template - struct assertion - : mpl::if_, assertion_failed >::type - {}; - - // - // Checks for validity of arguments used to define virtual - // functions with default implementations. - // - - template - void not_a_derived_class_member(Default) {} - - template - struct virtual_function_default - { - template - static void - must_be_derived_class_member(Default const&) - { - // https://svn.boost.org/trac/boost/ticket/5803 - //typedef typename assertion > >::failed test0; -# if !BOOST_WORKAROUND(__MWERKS__, <= 0x2407) - typedef typename assertion >::failed test1; -# endif - typedef typename assertion >::failed test2; - not_a_derived_class_member(Fn()); - } - }; - } -} - -// This is the primary mechanism through which users will expose -// C++ classes to Python. -template < - class W // class being wrapped - , class X1 // = detail::not_specified - , class X2 // = detail::not_specified - , class X3 // = detail::not_specified - > -class class_ : public objects::class_base -{ - public: // types - typedef objects::class_base base; - typedef class_ self; - typedef typename objects::class_metadata metadata; - typedef W wrapped_type; - - private: // types - - // A helper class which will contain an array of id objects to be - // passed to the base class constructor - struct id_vector - { - typedef typename metadata::bases bases; - - id_vector() - { - // Stick the derived class id into the first element of the array - ids[0] = detail::unwrap_type_id((W*)0, (W*)0); - - // Write the rest of the elements into succeeding positions. - type_info* p = ids + 1; - mpl::for_each(detail::write_type_id(&p), (bases*)0, (add_pointer*)0); - } - - BOOST_STATIC_CONSTANT( - std::size_t, size = mpl::size::value + 1); - type_info ids[size]; - }; - friend struct id_vector; - - public: // constructors - - // Construct with the class name, with or without docstring, and default __init__() function - class_(char const* name, char const* doc = 0); - - // Construct with class name, no docstring, and an uncallable __init__ function - class_(char const* name, no_init_t); - - // Construct with class name, docstring, and an uncallable __init__ function - class_(char const* name, char const* doc, no_init_t); - - // Construct with class name and init<> function - template - inline class_(char const* name, init_base const& i) - : base(name, id_vector::size, id_vector().ids) - { - this->initialize(i); - } - - // Construct with class name, docstring and init<> function - template - inline class_(char const* name, char const* doc, init_base const& i) - : base(name, id_vector::size, id_vector().ids, doc) - { - this->initialize(i); - } - - public: // member functions - - // Generic visitation - template - self& def(def_visitor const& visitor) - { - visitor.visit(*this); - return *this; - } - - // Wrap a member function or a non-member function which can take - // a T, T cv&, or T cv* as its first parameter, a callable - // python object, or a generic visitor. - template - self& def(char const* name, F f) - { - this->def_impl( - detail::unwrap_wrapper((W*)0) - , name, f, detail::def_helper(0), &f); - return *this; - } - - template - self& def(char const* name, A1 a1, A2 const& a2) - { - this->def_maybe_overloads(name, a1, a2, &a2); - return *this; - } - - template - self& def(char const* name, Fn fn, A1 const& a1, A2 const& a2) - { - // The arguments are definitely: - // def(name, function, policy, doc_string) - // def(name, function, doc_string, policy) - - this->def_impl( - detail::unwrap_wrapper((W*)0) - , name, fn - , detail::def_helper(a1,a2) - , &fn); - - return *this; - } - - template - self& def(char const* name, Fn fn, A1 const& a1, A2 const& a2, A3 const& a3) - { - this->def_impl( - detail::unwrap_wrapper((W*)0) - , name, fn - , detail::def_helper(a1,a2,a3) - , &fn); - - return *this; - } - - // - // Data member access - // - template - self& def_readonly(char const* name, D const& d, char const* doc=0) - { - return this->def_readonly_impl(name, d, doc BOOST_PYTHON_DATA_MEMBER_HELPER(D)); - } - - template - self& def_readwrite(char const* name, D const& d, char const* doc=0) - { - return this->def_readwrite_impl(name, d, doc BOOST_PYTHON_DATA_MEMBER_HELPER(D)); - } - - template - self& def_readonly(char const* name, D& d, char const* doc=0) - { - return this->def_readonly_impl(name, d, doc BOOST_PYTHON_DATA_MEMBER_HELPER(D)); - } - - template - self& def_readwrite(char const* name, D& d, char const* doc=0) - { - return this->def_readwrite_impl(name, d, doc BOOST_PYTHON_DATA_MEMBER_HELPER(D)); - } - - // Property creation - template - self& add_property(char const* name, Get fget, char const* docstr = 0) - { - base::add_property(name, this->make_getter(fget), docstr); - return *this; - } - - template - self& add_property(char const* name, Get fget, Set fset, char const* docstr = 0) - { - base::add_property( - name, this->make_getter(fget), this->make_setter(fset), docstr); - return *this; - } - - template - self& add_static_property(char const* name, Get fget) - { - base::add_static_property(name, object(fget)); - return *this; - } - - template - self& add_static_property(char const* name, Get fget, Set fset) - { - base::add_static_property(name, object(fget), object(fset)); - return *this; - } - - template - self& setattr(char const* name, U const& x) - { - this->base::setattr(name, object(x)); - return *this; - } - - // Pickle support - template - self& def_pickle(PickleSuiteType const& x) - { - error_messages::must_be_derived_from_pickle_suite(x); - detail::pickle_suite_finalize::register_( - *this, - &PickleSuiteType::getinitargs, - &PickleSuiteType::getstate, - &PickleSuiteType::setstate, - PickleSuiteType::getstate_manages_dict()); - return *this; - } - - self& enable_pickling() - { - this->base::enable_pickling_(false); - return *this; - } - - self& staticmethod(char const* name) - { - this->make_method_static(name); - return *this; - } - private: // helper functions - - // Builds a method for this class around the given [member] - // function pointer or object, appropriately adjusting the type of - // the first signature argument so that if f is a member of a - // (possibly not wrapped) base class of T, an lvalue argument of - // type T will be required. - // - // @group PropertyHelpers { - template - object make_getter(F f) - { - typedef typename api::is_object_operators::type is_obj_or_proxy; - - return this->make_fn_impl( - detail::unwrap_wrapper((W*)0) - , f, is_obj_or_proxy(), (char*)0, detail::is_data_member_pointer() - ); - } - - template - object make_setter(F f) - { - typedef typename api::is_object_operators::type is_obj_or_proxy; - - return this->make_fn_impl( - detail::unwrap_wrapper((W*)0) - , f, is_obj_or_proxy(), (int*)0, detail::is_data_member_pointer() - ); - } - - template - object make_fn_impl(T*, F const& f, mpl::false_, void*, mpl::false_) - { - return python::make_function(f, default_call_policies(), detail::get_signature(f, (T*)0)); - } - - template - object make_fn_impl(T*, D B::*pm_, mpl::false_, char*, mpl::true_) - { - D T::*pm = pm_; - return python::make_getter(pm); - } - - template - object make_fn_impl(T*, D B::*pm_, mpl::false_, int*, mpl::true_) - { - D T::*pm = pm_; - return python::make_setter(pm); - } - - template - object make_fn_impl(T*, F const& x, mpl::true_, void*, mpl::false_) - { - return x; - } - // } - - template - self& def_readonly_impl( - char const* name, D B::*pm_, char const* doc BOOST_PYTHON_YES_DATA_MEMBER) - { - return this->add_property(name, pm_, doc); - } - - template - self& def_readwrite_impl( - char const* name, D B::*pm_, char const* doc BOOST_PYTHON_YES_DATA_MEMBER) - { - return this->add_property(name, pm_, pm_, doc); - } - - template - self& def_readonly_impl( - char const* name, D& d, char const* BOOST_PYTHON_NO_DATA_MEMBER) - { - return this->add_static_property(name, python::make_getter(d)); - } - - template - self& def_readwrite_impl( - char const* name, D& d, char const* BOOST_PYTHON_NO_DATA_MEMBER) - { - return this->add_static_property(name, python::make_getter(d), python::make_setter(d)); - } - - template - inline void initialize(DefVisitor const& i) - { - metadata::register_(); // set up runtime metadata/conversions - - typedef typename metadata::holder holder; - this->set_instance_size( objects::additional_instance_size::value ); - - this->def(i); - } - - inline void initialize(no_init_t) - { - metadata::register_(); // set up runtime metadata/conversions - this->def_no_init(); - } - - // - // These two overloads discriminate between def() as applied to a - // generic visitor and everything else. - // - // @group def_impl { - template - inline void def_impl( - T* - , char const* name - , LeafVisitor - , Helper const& helper - , def_visitor const* v - ) - { - v->visit(*this, name, helper); - } - - template - inline void def_impl( - T* - , char const* name - , Fn fn - , Helper const& helper - , ... - ) - { - objects::add_to_namespace( - *this - , name - , make_function( - fn - , helper.policies() - , helper.keywords() - , detail::get_signature(fn, (T*)0) - ) - , helper.doc() - ); - - this->def_default(name, fn, helper, mpl::bool_()); - } - // } - - // - // These two overloads handle the definition of default - // implementation overloads for virtual functions. The second one - // handles the case where no default implementation was specified. - // - // @group def_default { - template - inline void def_default( - char const* name - , Fn - , Helper const& helper - , mpl::bool_) - { - detail::error::virtual_function_default::must_be_derived_class_member( - helper.default_implementation()); - - objects::add_to_namespace( - *this, name, - make_function( - helper.default_implementation(), helper.policies(), helper.keywords()) - ); - } - - template - inline void def_default(char const*, Fn, Helper const&, mpl::bool_) - { } - // } - - // - // These two overloads discriminate between def() as applied to - // regular functions and def() as applied to the result of - // BOOST_PYTHON_FUNCTION_OVERLOADS(). The final argument is used to - // discriminate. - // - // @group def_maybe_overloads { - template - void def_maybe_overloads( - char const* name - , SigT sig - , OverloadsT const& overloads - , detail::overloads_base const*) - - { - // convert sig to a type_list (see detail::get_signature in signature.hpp) - // before calling detail::define_with_defaults. - detail::define_with_defaults( - name, overloads, *this, detail::get_signature(sig)); - } - - template - void def_maybe_overloads( - char const* name - , Fn fn - , A1 const& a1 - , ...) - { - this->def_impl( - detail::unwrap_wrapper((W*)0) - , name - , fn - , detail::def_helper(a1) - , &fn - ); - - } - // } -}; - - -// -// implementations -// - -template -inline class_::class_(char const* name, char const* doc) - : base(name, id_vector::size, id_vector().ids, doc) -{ - this->initialize(init<>()); -// select_holder::assert_default_constructible(); -} - -template -inline class_::class_(char const* name, no_init_t) - : base(name, id_vector::size, id_vector().ids) -{ - this->initialize(no_init); -} - -template -inline class_::class_(char const* name, char const* doc, no_init_t) - : base(name, id_vector::size, id_vector().ids, doc) -{ - this->initialize(no_init); -} - -}} // namespace boost::python - -# undef BOOST_PYTHON_DATA_MEMBER_HELPER -# undef BOOST_PYTHON_YES_DATA_MEMBER -# undef BOOST_PYTHON_NO_DATA_MEMBER -# undef BOOST_PYTHON_NO_MEMBER_POINTER_ORDERING - -#endif // CLASS_DWA200216_HPP diff --git a/include/boost/python/class_fwd.hpp b/include/boost/python/class_fwd.hpp deleted file mode 100644 index 528e18a1..00000000 --- a/include/boost/python/class_fwd.hpp +++ /dev/null @@ -1,24 +0,0 @@ -// 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) -#ifndef CLASS_FWD_DWA200222_HPP -# define CLASS_FWD_DWA200222_HPP - -# include -# include - -namespace boost { namespace python { - -template < - class T // class being wrapped - // arbitrarily-ordered optional arguments. Full qualification needed for MSVC6 - , class X1 = ::boost::python::detail::not_specified - , class X2 = ::boost::python::detail::not_specified - , class X3 = ::boost::python::detail::not_specified - > -class class_; - -}} // namespace boost::python - -#endif // CLASS_FWD_DWA200222_HPP diff --git a/include/boost/python/converter/arg_from_python.hpp b/include/boost/python/converter/arg_from_python.hpp deleted file mode 100644 index 61bbaad5..00000000 --- a/include/boost/python/converter/arg_from_python.hpp +++ /dev/null @@ -1,336 +0,0 @@ -// 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) -#ifndef ARG_FROM_PYTHON_DWA2002127_HPP -# define ARG_FROM_PYTHON_DWA2002127_HPP - -# include -# include -# include -# include -# include -# include -# include -# include -# include -# include -# include -# include -# include -# include -# include -# include -# include -# include -# include - -namespace boost { namespace python -{ - template struct arg_from_python; -}} - -// This header defines Python->C++ function argument converters, -// parametrized on the argument type. - -namespace boost { namespace python { namespace converter { - -// -// lvalue converters -// -// These require that an lvalue of the type U is stored somewhere in -// the Python object being converted. - -// Used when T == U*const& -template -struct pointer_cref_arg_from_python -{ - typedef T result_type; - - pointer_cref_arg_from_python(PyObject*); - T operator()() const; - bool convertible() const; - - private: // storage for a U* - // needed because not all compilers will let us declare U* as the - // return type of operator() -- we return U*const& instead - typename python::detail::referent_storage::type m_result; -}; - -// Base class for pointer and reference converters -struct arg_lvalue_from_python_base -{ - public: // member functions - arg_lvalue_from_python_base(void* result); - bool convertible() const; - - protected: // member functions - void*const& result() const; - - private: // data members - void* m_result; -}; - -// Used when T == U* -template -struct pointer_arg_from_python : arg_lvalue_from_python_base -{ - typedef T result_type; - - pointer_arg_from_python(PyObject*); - T operator()() const; -}; - -// Used when T == U& and (T != V const& or T == W volatile&) -template -struct reference_arg_from_python : arg_lvalue_from_python_base -{ - typedef T result_type; - - reference_arg_from_python(PyObject*); - T operator()() const; -}; - -// =================== - -// -// rvalue converters -// -// These require only that an object of type T can be created from -// the given Python object, but not that the T object exist -// somewhere in storage. -// - -// Used when T is a plain value (non-pointer, non-reference) type or -// a (non-volatile) const reference to a plain value type. -template -struct arg_rvalue_from_python -{ - typedef typename boost::add_reference< - T - // We can't add_const here, or it would be impossible to pass - // auto_ptr args from Python to C++ - >::type result_type; - - arg_rvalue_from_python(PyObject*); - bool convertible() const; - -# if _MSC_FULL_VER > 13102196 - typename arg_rvalue_from_python:: -# endif - result_type operator()(); - - private: - rvalue_from_python_data m_data; - PyObject* m_source; -}; - - -// ================== - -// Converts to a (PyObject*,T) bundle, for when you need a reference -// back to the Python object -template -struct back_reference_arg_from_python - : boost::python::arg_from_python -{ - typedef T result_type; - - back_reference_arg_from_python(PyObject*); - T operator()(); - private: - typedef boost::python::arg_from_python base; - PyObject* m_source; -}; - - -// ================== - -template -struct if_2 -{ - typedef typename mpl::eval_if, F>::type type; -}; - -// This metafunction selects the appropriate arg_from_python converter -// type for an argument of type T. -template -struct select_arg_from_python -{ - typedef typename if_2< - is_object_manager - , object_manager_value_arg_from_python - , if_2< - is_reference_to_object_manager - , object_manager_ref_arg_from_python - , if_2< - is_pointer - , pointer_arg_from_python - , if_2< - mpl::and_< - indirect_traits::is_reference_to_pointer - , indirect_traits::is_reference_to_const - , mpl::not_ > - > - , pointer_cref_arg_from_python - , if_2< - mpl::or_< - indirect_traits::is_reference_to_non_const - , indirect_traits::is_reference_to_volatile - > - , reference_arg_from_python - , mpl::if_< - boost::python::is_back_reference - , back_reference_arg_from_python - , arg_rvalue_from_python - > - > - > - > - > - >::type type; -}; - -// ================== - -// -// implementations -// - -// arg_lvalue_from_python_base -// -inline arg_lvalue_from_python_base::arg_lvalue_from_python_base(void* result) - : m_result(result) -{ -} - -inline bool arg_lvalue_from_python_base::convertible() const -{ - return m_result != 0; -} - -inline void*const& arg_lvalue_from_python_base::result() const -{ - return m_result; -} - -// pointer_cref_arg_from_python -// -namespace detail -{ - // null_ptr_reference -- a function returning a reference to a null - // pointer of type U. Needed so that extractors for T*const& can - // convert Python's None. - template - struct null_ptr_owner - { - static T value; - }; - template T null_ptr_owner::value = 0; - - template - inline U& null_ptr_reference(U&(*)()) - { - return null_ptr_owner::value; - } -} - -template -inline pointer_cref_arg_from_python::pointer_cref_arg_from_python(PyObject* p) -{ - // T == U*const&: store a U* in the m_result storage. Nonzero - // indicates success. If find returns nonzero, it's a pointer to - // a U object. - python::detail::write_void_ptr_reference( - m_result.bytes - , p == Py_None ? p : converter::get_lvalue_from_python(p, registered_pointee::converters) - , (T(*)())0); -} - -template -inline bool pointer_cref_arg_from_python::convertible() const -{ - return python::detail::void_ptr_to_reference(m_result.bytes, (T(*)())0) != 0; -} -template -inline T pointer_cref_arg_from_python::operator()() const -{ - return (*(void**)m_result.bytes == Py_None) // None ==> 0 - ? detail::null_ptr_reference((T(*)())0) - // Otherwise, return a U*const& to the m_result storage. - : python::detail::void_ptr_to_reference(m_result.bytes, (T(*)())0); -} - -// pointer_arg_from_python -// -template -inline pointer_arg_from_python::pointer_arg_from_python(PyObject* p) - : arg_lvalue_from_python_base( - p == Py_None ? p : converter::get_lvalue_from_python(p, registered_pointee::converters)) -{ -} - -template -inline T pointer_arg_from_python::operator()() const -{ - return (result() == Py_None) ? 0 : T(result()); -} - -// reference_arg_from_python -// -template -inline reference_arg_from_python::reference_arg_from_python(PyObject* p) - : arg_lvalue_from_python_base(converter::get_lvalue_from_python(p,registered::converters)) -{ -} - -template -inline T reference_arg_from_python::operator()() const -{ - return python::detail::void_ptr_to_reference(result(), (T(*)())0); -} - - -// arg_rvalue_from_python -// -template -inline arg_rvalue_from_python::arg_rvalue_from_python(PyObject* obj) - : m_data(converter::rvalue_from_python_stage1(obj, registered::converters)) - , m_source(obj) -{ -} - -template -inline bool arg_rvalue_from_python::convertible() const -{ - return m_data.stage1.convertible != 0; -} - -template -inline typename arg_rvalue_from_python::result_type -arg_rvalue_from_python::operator()() -{ - if (m_data.stage1.construct != 0) - m_data.stage1.construct(m_source, &m_data.stage1); - - return python::detail::void_ptr_to_reference(m_data.stage1.convertible, (result_type(*)())0); -} - -// back_reference_arg_from_python -// -template -back_reference_arg_from_python::back_reference_arg_from_python(PyObject* x) - : base(x), m_source(x) -{ -} - -template -inline T -back_reference_arg_from_python::operator()() -{ - return T(m_source, base::operator()()); -} - -}}} // namespace boost::python::converter - -#endif // ARG_FROM_PYTHON_DWA2002127_HPP diff --git a/include/boost/python/converter/arg_to_python.hpp b/include/boost/python/converter/arg_to_python.hpp deleted file mode 100755 index 3a19ec43..00000000 --- a/include/boost/python/converter/arg_to_python.hpp +++ /dev/null @@ -1,261 +0,0 @@ -// 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) -#ifndef ARG_TO_PYTHON_DWA200265_HPP -# define ARG_TO_PYTHON_DWA200265_HPP - -# include -# include -# include - -# include -# include -# include -# include -// Bring in specializations -# include - -# include - -# include - -# include -# include -# include -# include - -# include -# include -# include - - -# include - -namespace boost { namespace python { namespace converter { - -template struct is_object_manager; - -namespace detail -{ - template - struct function_arg_to_python : handle<> - { - function_arg_to_python(T const& x); - }; - - template - struct reference_arg_to_python : handle<> - { - reference_arg_to_python(T& x); - private: - static PyObject* get_object(T& x); - }; - - template - struct shared_ptr_arg_to_python : handle<> - { - shared_ptr_arg_to_python(T const& x); - private: - static PyObject* get_object(T& x); - }; - - template - struct value_arg_to_python : arg_to_python_base - { - // Throw an exception if the conversion can't succeed - value_arg_to_python(T const&); - }; - - template - struct pointer_deep_arg_to_python : arg_to_python_base - { - // Throw an exception if the conversion can't succeed - pointer_deep_arg_to_python(Ptr); - }; - - template - struct pointer_shallow_arg_to_python : handle<> - { - // Throw an exception if the conversion can't succeed - pointer_shallow_arg_to_python(Ptr); - private: - static PyObject* get_object(Ptr p); - }; - - // Convert types that manage a Python object to_python - template - struct object_manager_arg_to_python - { - object_manager_arg_to_python(T const& x) : m_src(x) {} - - PyObject* get() const - { - return python::upcast(get_managed_object(m_src, tag)); - } - - private: - T const& m_src; - }; - - template - struct select_arg_to_python - { - typedef typename unwrap_reference::type unwrapped_referent; - typedef typename unwrap_pointer::type unwrapped_ptr; - - typedef typename mpl::if_< - // Special handling for char const[N]; interpret them as char - // const* for the sake of conversion - python::detail::is_string_literal - , arg_to_python - - , typename mpl::if_< - python::detail::value_is_shared_ptr - , shared_ptr_arg_to_python - - , typename mpl::if_< - mpl::or_< - is_function - , indirect_traits::is_pointer_to_function - , is_member_function_pointer - > - , function_arg_to_python - - , typename mpl::if_< - is_object_manager - , object_manager_arg_to_python - - , typename mpl::if_< - is_pointer - , pointer_deep_arg_to_python - - , typename mpl::if_< - is_pointer_wrapper - , pointer_shallow_arg_to_python - - , typename mpl::if_< - is_reference_wrapper - , reference_arg_to_python - , value_arg_to_python - >::type - >::type - >::type - >::type - >::type - >::type - >::type - - type; - }; -} - -template -struct arg_to_python - : detail::select_arg_to_python::type -{ - typedef typename detail::select_arg_to_python::type base; - public: // member functions - // Throw an exception if the conversion can't succeed - arg_to_python(T const& x); -}; - -// -// implementations -// -namespace detail -{ - // reject_raw_object_ptr -- cause a compile-time error if the user - // should pass a raw Python object pointer - using python::detail::yes_convertible; - using python::detail::no_convertible; - using python::detail::unspecialized; - - template struct cannot_convert_raw_PyObject; - - template - struct reject_raw_object_helper - { - static void error(Convertibility) - { - cannot_convert_raw_PyObject::to_python_use_handle_instead(); - } - static void error(...) {} - }; - - template - inline void reject_raw_object_ptr(T*) - { - reject_raw_object_helper::error( - python::detail::convertible::check((T*)0)); - - typedef typename remove_cv::type value_type; - - reject_raw_object_helper::error( - python::detail::convertible::check( - (base_type_traits*)0 - )); - } - // --------- - - template - inline function_arg_to_python::function_arg_to_python(T const& x) - : handle<>(python::objects::make_function_handle(x)) - { - } - - template - inline value_arg_to_python::value_arg_to_python(T const& x) - : arg_to_python_base(&x, registered::converters) - { - } - - template - inline pointer_deep_arg_to_python::pointer_deep_arg_to_python(Ptr x) - : arg_to_python_base(x, registered_pointee::converters) - { - detail::reject_raw_object_ptr((Ptr)0); - } - - template - inline PyObject* reference_arg_to_python::get_object(T& x) - { - to_python_indirect convert; - return convert(x); - } - - template - inline reference_arg_to_python::reference_arg_to_python(T& x) - : handle<>(reference_arg_to_python::get_object(x)) - { - } - - template - inline shared_ptr_arg_to_python::shared_ptr_arg_to_python(T const& x) - : handle<>(shared_ptr_to_python(x)) - { - } - - template - inline pointer_shallow_arg_to_python::pointer_shallow_arg_to_python(Ptr x) - : handle<>(pointer_shallow_arg_to_python::get_object(x)) - { - detail::reject_raw_object_ptr((Ptr)0); - } - - template - inline PyObject* pointer_shallow_arg_to_python::get_object(Ptr x) - { - to_python_indirect convert; - return convert(x); - } -} - -template -inline arg_to_python::arg_to_python(T const& x) - : base(x) -{} - -}}} // namespace boost::python::converter - -#endif // ARG_TO_PYTHON_DWA200265_HPP diff --git a/include/boost/python/converter/arg_to_python_base.hpp b/include/boost/python/converter/arg_to_python_base.hpp deleted file mode 100644 index c66ce9c3..00000000 --- a/include/boost/python/converter/arg_to_python_base.hpp +++ /dev/null @@ -1,24 +0,0 @@ -// 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) -#ifndef ARG_TO_PYTHON_BASE_DWA200237_HPP -# define ARG_TO_PYTHON_BASE_DWA200237_HPP -# include - -namespace boost { namespace python { namespace converter { - -struct registration; - -namespace detail -{ - struct BOOST_PYTHON_DECL arg_to_python_base - : handle<> - { - arg_to_python_base(void const volatile* source, registration const&); - }; -} - -}}} // namespace boost::python::converter - -#endif // ARG_TO_PYTHON_BASE_DWA200237_HPP diff --git a/include/boost/python/converter/as_to_python_function.hpp b/include/boost/python/converter/as_to_python_function.hpp deleted file mode 100644 index 19a3efaa..00000000 --- a/include/boost/python/converter/as_to_python_function.hpp +++ /dev/null @@ -1,49 +0,0 @@ -// 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) -#ifndef AS_TO_PYTHON_FUNCTION_DWA2002121_HPP -# define AS_TO_PYTHON_FUNCTION_DWA2002121_HPP -# include - -namespace boost { namespace python { namespace converter { - -// Given a typesafe to_python conversion function, produces a -// to_python_function_t which can be registered in the usual way. -template -struct as_to_python_function -{ - // Assertion functions used to prevent wrapping of converters - // which take non-const reference parameters. The T* argument in - // the first overload ensures it isn't used in case T is a - // reference. - template - static void convert_function_must_take_value_or_const_reference(U(*)(T), int, T* = 0) {} - template - static void convert_function_must_take_value_or_const_reference(U(*)(T const&), long ...) {} - - static PyObject* convert(void const* x) - { - convert_function_must_take_value_or_const_reference(&ToPython::convert, 1L); - - // Yes, the const_cast below opens a hole in const-correctness, - // but it's needed to convert auto_ptr to python. - // - // How big a hole is it? It allows ToPython::convert() to be - // a function which modifies its argument. The upshot is that - // client converters applied to const objects may invoke - // undefined behavior. The damage, however, is limited by the - // use of the assertion function. Thus, the only way this can - // modify its argument is if T is an auto_ptr-like type. There - // is still a const-correctness hole w.r.t. auto_ptr const, - // but c'est la vie. - return ToPython::convert(*const_cast(static_cast(x))); - } -#ifndef BOOST_PYTHON_NO_PY_SIGNATURES - static PyTypeObject const * get_pytype() { return ToPython::get_pytype(); } -#endif -}; - -}}} // namespace boost::python::converter - -#endif // AS_TO_PYTHON_FUNCTION_DWA2002121_HPP diff --git a/include/boost/python/converter/builtin_converters.hpp b/include/boost/python/converter/builtin_converters.hpp deleted file mode 100644 index c2e01c03..00000000 --- a/include/boost/python/converter/builtin_converters.hpp +++ /dev/null @@ -1,190 +0,0 @@ -// 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) -#ifndef BUILTIN_CONVERTERS_DWA2002124_HPP -# define BUILTIN_CONVERTERS_DWA2002124_HPP -# include -# include -# include -# include -# include -# include -# include -# include - -// Since all we can use to decide how to convert an object to_python -// is its C++ type, there can be only one such converter for each -// type. Therefore, for built-in conversions we can bypass registry -// lookups using explicit specializations of arg_to_python and -// result_to_python. - -namespace boost { namespace python { - -namespace converter -{ - template struct arg_to_python; - BOOST_PYTHON_DECL PyObject* do_return_to_python(char); - BOOST_PYTHON_DECL PyObject* do_return_to_python(char const*); - BOOST_PYTHON_DECL PyObject* do_return_to_python(PyObject*); - BOOST_PYTHON_DECL PyObject* do_arg_to_python(PyObject*); -} - -// Provide specializations of to_python_value -template struct to_python_value; - -namespace detail -{ - // Since there's no registry lookup, always report the existence of - // a converter. - struct builtin_to_python - { - // This information helps make_getter() decide whether to try to - // return an internal reference or not. I don't like it much, - // but it will have to serve for now. - BOOST_STATIC_CONSTANT(bool, uses_registry = false); - }; -} - -// Use expr to create the PyObject corresponding to x -# define BOOST_PYTHON_RETURN_TO_PYTHON_BY_VALUE(T, expr, pytype)\ - template <> struct to_python_value \ - : detail::builtin_to_python \ - { \ - inline PyObject* operator()(T const& x) const \ - { \ - return (expr); \ - } \ - inline PyTypeObject const* get_pytype() const \ - { \ - return (pytype); \ - } \ - }; \ - template <> struct to_python_value \ - : detail::builtin_to_python \ - { \ - inline PyObject* operator()(T const& x) const \ - { \ - return (expr); \ - } \ - inline PyTypeObject const* get_pytype() const \ - { \ - return (pytype); \ - } \ - }; - -# define BOOST_PYTHON_ARG_TO_PYTHON_BY_VALUE(T, expr) \ - namespace converter \ - { \ - template <> struct arg_to_python< T > \ - : handle<> \ - { \ - arg_to_python(T const& x) \ - : python::handle<>(expr) {} \ - }; \ - } - -// Specialize argument and return value converters for T using expr -# define BOOST_PYTHON_TO_PYTHON_BY_VALUE(T, expr, pytype) \ - BOOST_PYTHON_RETURN_TO_PYTHON_BY_VALUE(T,expr, pytype) \ - BOOST_PYTHON_ARG_TO_PYTHON_BY_VALUE(T,expr) - -// Specialize converters for signed and unsigned T to Python Int -#if PY_VERSION_HEX >= 0x03000000 - -# define BOOST_PYTHON_TO_INT(T) \ - BOOST_PYTHON_TO_PYTHON_BY_VALUE(signed T, ::PyLong_FromLong(x), &PyLong_Type) \ - BOOST_PYTHON_TO_PYTHON_BY_VALUE(unsigned T, ::PyLong_FromUnsignedLong(x), &PyLong_Type) - -#else - -# define BOOST_PYTHON_TO_INT(T) \ - BOOST_PYTHON_TO_PYTHON_BY_VALUE(signed T, ::PyInt_FromLong(x), &PyInt_Type) \ - BOOST_PYTHON_TO_PYTHON_BY_VALUE( \ - unsigned T \ - , static_cast(x) > static_cast( \ - (std::numeric_limits::max)()) \ - ? ::PyLong_FromUnsignedLong(x) \ - : ::PyInt_FromLong(x), &PyInt_Type) -#endif - -// Bool is not signed. -#if PY_VERSION_HEX >= 0x02030000 -BOOST_PYTHON_TO_PYTHON_BY_VALUE(bool, ::PyBool_FromLong(x), &PyBool_Type) -#else -BOOST_PYTHON_TO_PYTHON_BY_VALUE(bool, ::PyInt_FromLong(x), &PyInt_Type) -#endif - -// note: handles signed char and unsigned char, but not char (see below) -BOOST_PYTHON_TO_INT(char) - -BOOST_PYTHON_TO_INT(short) -BOOST_PYTHON_TO_INT(int) -BOOST_PYTHON_TO_INT(long) - -# if defined(_MSC_VER) && defined(_WIN64) && PY_VERSION_HEX < 0x03000000 -/* Under 64-bit Windows std::size_t is "unsigned long long". To avoid - getting a Python long for each std::size_t the value is checked before - the conversion. A std::size_t is converted to a simple Python int - if possible; a Python long appears only if the value is too small or - too large to fit into a simple int. */ -BOOST_PYTHON_TO_PYTHON_BY_VALUE( - signed BOOST_PYTHON_LONG_LONG, - ( x < static_cast( - (std::numeric_limits::min)()) - || x > static_cast( - (std::numeric_limits::max)())) - ? ::PyLong_FromLongLong(x) - : ::PyInt_FromLong(static_cast(x)), &PyInt_Type) -BOOST_PYTHON_TO_PYTHON_BY_VALUE( - unsigned BOOST_PYTHON_LONG_LONG, - x > static_cast( - (std::numeric_limits::max)()) - ? ::PyLong_FromUnsignedLongLong(x) - : ::PyInt_FromLong(static_cast(x)), &PyInt_Type) -// -# elif defined(HAVE_LONG_LONG) // using Python's macro instead of Boost's - // - we don't seem to get the config right - // all the time. -BOOST_PYTHON_TO_PYTHON_BY_VALUE(signed BOOST_PYTHON_LONG_LONG, ::PyLong_FromLongLong(x), &PyLong_Type) -BOOST_PYTHON_TO_PYTHON_BY_VALUE(unsigned BOOST_PYTHON_LONG_LONG, ::PyLong_FromUnsignedLongLong(x), &PyLong_Type) -# endif - -# undef BOOST_TO_PYTHON_INT - -#if PY_VERSION_HEX >= 0x03000000 -BOOST_PYTHON_TO_PYTHON_BY_VALUE(char, converter::do_return_to_python(x), &PyUnicode_Type) -BOOST_PYTHON_TO_PYTHON_BY_VALUE(char const*, converter::do_return_to_python(x), &PyUnicode_Type) -BOOST_PYTHON_TO_PYTHON_BY_VALUE(std::string, ::PyUnicode_FromStringAndSize(x.data(),implicit_cast(x.size())), &PyUnicode_Type) -#else -BOOST_PYTHON_TO_PYTHON_BY_VALUE(char, converter::do_return_to_python(x), &PyString_Type) -BOOST_PYTHON_TO_PYTHON_BY_VALUE(char const*, converter::do_return_to_python(x), &PyString_Type) -BOOST_PYTHON_TO_PYTHON_BY_VALUE(std::string, ::PyString_FromStringAndSize(x.data(),implicit_cast(x.size())), &PyString_Type) -#endif - -#if defined(Py_USING_UNICODE) && !defined(BOOST_NO_STD_WSTRING) -BOOST_PYTHON_TO_PYTHON_BY_VALUE(std::wstring, ::PyUnicode_FromWideChar(x.data(),implicit_cast(x.size())), &PyUnicode_Type) -# endif -BOOST_PYTHON_TO_PYTHON_BY_VALUE(float, ::PyFloat_FromDouble(x), &PyFloat_Type) -BOOST_PYTHON_TO_PYTHON_BY_VALUE(double, ::PyFloat_FromDouble(x), &PyFloat_Type) -BOOST_PYTHON_TO_PYTHON_BY_VALUE(long double, ::PyFloat_FromDouble(x), &PyFloat_Type) -BOOST_PYTHON_RETURN_TO_PYTHON_BY_VALUE(PyObject*, converter::do_return_to_python(x), 0) -BOOST_PYTHON_TO_PYTHON_BY_VALUE(std::complex, ::PyComplex_FromDoubles(x.real(), x.imag()), &PyComplex_Type) -BOOST_PYTHON_TO_PYTHON_BY_VALUE(std::complex, ::PyComplex_FromDoubles(x.real(), x.imag()), &PyComplex_Type) -BOOST_PYTHON_TO_PYTHON_BY_VALUE(std::complex, ::PyComplex_FromDoubles(x.real(), x.imag()), &PyComplex_Type) - -# undef BOOST_PYTHON_RETURN_TO_PYTHON_BY_VALUE -# undef BOOST_PYTHON_ARG_TO_PYTHON_BY_VALUE -# undef BOOST_PYTHON_TO_PYTHON_BY_VALUE -# undef BOOST_PYTHON_TO_INT - -namespace converter -{ - - void initialize_builtin_converters(); - -} - -}} // namespace boost::python::converter - -#endif // BUILTIN_CONVERTERS_DWA2002124_HPP diff --git a/include/boost/python/converter/constructor_function.hpp b/include/boost/python/converter/constructor_function.hpp deleted file mode 100644 index 814aa7d7..00000000 --- a/include/boost/python/converter/constructor_function.hpp +++ /dev/null @@ -1,17 +0,0 @@ -// 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) -#ifndef CONSTRUCTOR_FUNCTION_DWA200278_HPP -# define CONSTRUCTOR_FUNCTION_DWA200278_HPP - -namespace boost { namespace python { namespace converter { - -// Declares the type of functions used to construct C++ objects for -// rvalue from_python conversions. -struct rvalue_from_python_stage1_data; -typedef void (*constructor_function)(PyObject* source, rvalue_from_python_stage1_data*); - -}}} // namespace boost::python::converter - -#endif // CONSTRUCTOR_FUNCTION_DWA200278_HPP diff --git a/include/boost/python/converter/context_result_converter.hpp b/include/boost/python/converter/context_result_converter.hpp deleted file mode 100755 index beb7e9f0..00000000 --- a/include/boost/python/converter/context_result_converter.hpp +++ /dev/null @@ -1,17 +0,0 @@ -// 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 CONTEXT_RESULT_CONVERTER_DWA2003917_HPP -# define CONTEXT_RESULT_CONVERTER_DWA2003917_HPP - -namespace boost { namespace python { namespace converter { - -// A ResultConverter base class used to indicate that this result -// converter should be constructed with the original Python argument -// list. -struct context_result_converter {}; - -}}} // namespace boost::python::converter - -#endif // CONTEXT_RESULT_CONVERTER_DWA2003917_HPP diff --git a/include/boost/python/converter/convertible_function.hpp b/include/boost/python/converter/convertible_function.hpp deleted file mode 100644 index 4b29fbb0..00000000 --- a/include/boost/python/converter/convertible_function.hpp +++ /dev/null @@ -1,14 +0,0 @@ -// 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) -#ifndef CONVERTIBLE_FUNCTION_DWA200278_HPP -# define CONVERTIBLE_FUNCTION_DWA200278_HPP - -namespace boost { namespace python { namespace converter { - -typedef void* (*convertible_function)(PyObject*); - -}}} // namespace boost::python::converter - -#endif // CONVERTIBLE_FUNCTION_DWA200278_HPP diff --git a/include/boost/python/converter/from_python.hpp b/include/boost/python/converter/from_python.hpp deleted file mode 100644 index b2f24b35..00000000 --- a/include/boost/python/converter/from_python.hpp +++ /dev/null @@ -1,41 +0,0 @@ -// 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) -#ifndef FIND_FROM_PYTHON_DWA2002223_HPP -# define FIND_FROM_PYTHON_DWA2002223_HPP - -# include -# include - -namespace boost { namespace python { namespace converter { - -struct registration; - - -BOOST_PYTHON_DECL void* get_lvalue_from_python( - PyObject* source, registration const&); - -BOOST_PYTHON_DECL bool implicit_rvalue_convertible_from_python( - PyObject* source, registration const&); - -BOOST_PYTHON_DECL rvalue_from_python_stage1_data rvalue_from_python_stage1( - PyObject* source, registration const&); - -BOOST_PYTHON_DECL void* rvalue_from_python_stage2( - PyObject* source, rvalue_from_python_stage1_data&, registration const&); - -BOOST_PYTHON_DECL void* rvalue_result_from_python( - PyObject*, rvalue_from_python_stage1_data&); - -BOOST_PYTHON_DECL void* reference_result_from_python(PyObject*, registration const&); -BOOST_PYTHON_DECL void* pointer_result_from_python(PyObject*, registration const&); - -BOOST_PYTHON_DECL void void_result_from_python(PyObject*); - -BOOST_PYTHON_DECL void throw_no_pointer_from_python(PyObject*, registration const&); -BOOST_PYTHON_DECL void throw_no_reference_from_python(PyObject*, registration const&); - -}}} // namespace boost::python::converter - -#endif // FIND_FROM_PYTHON_DWA2002223_HPP diff --git a/include/boost/python/converter/implicit.hpp b/include/boost/python/converter/implicit.hpp deleted file mode 100644 index 8bbbfd5a..00000000 --- a/include/boost/python/converter/implicit.hpp +++ /dev/null @@ -1,46 +0,0 @@ -// 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) -#ifndef IMPLICIT_DWA2002326_HPP -# define IMPLICIT_DWA2002326_HPP - -# include -# include -# include - -# include - -namespace boost { namespace python { namespace converter { - -template -struct implicit -{ - static void* convertible(PyObject* obj) - { - // Find a converter which can produce a Source instance from - // obj. The user has told us that Source can be converted to - // Target, and instantiating construct() below, ensures that - // at compile-time. - return implicit_rvalue_convertible_from_python(obj, registered::converters) - ? obj : 0; - } - - static void construct(PyObject* obj, rvalue_from_python_stage1_data* data) - { - void* storage = ((rvalue_from_python_storage*)data)->storage.bytes; - - arg_from_python get_source(obj); - bool convertible = get_source.convertible(); - BOOST_VERIFY(convertible); - - new (storage) Target(get_source()); - - // record successful construction - data->convertible = storage; - } -}; - -}}} // namespace boost::python::converter - -#endif // IMPLICIT_DWA2002326_HPP diff --git a/include/boost/python/converter/obj_mgr_arg_from_python.hpp b/include/boost/python/converter/obj_mgr_arg_from_python.hpp deleted file mode 100644 index cd4e1e0e..00000000 --- a/include/boost/python/converter/obj_mgr_arg_from_python.hpp +++ /dev/null @@ -1,121 +0,0 @@ -// 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) -#ifndef OBJ_MGR_ARG_FROM_PYTHON_DWA2002628_HPP -# define OBJ_MGR_ARG_FROM_PYTHON_DWA2002628_HPP - -# include -# include -# include -# include -# include -# include -# include - -// -// arg_from_python converters for Python type wrappers, to be used as -// base classes for specializations. -// -namespace boost { namespace python { namespace converter { - -template -struct object_manager_value_arg_from_python -{ - typedef T result_type; - - object_manager_value_arg_from_python(PyObject*); - bool convertible() const; - T operator()() const; - private: - PyObject* m_source; -}; - -// Used for converting reference-to-object-manager arguments from -// python. The process used here is a little bit odd. Upon -// construction, we build the object manager object in the m_result -// object, *forcing* it to accept the source Python object by casting -// its pointer to detail::borrowed_reference. This is supposed to -// bypass any type checking of the source object. The convertible -// check then extracts the owned object and checks it. If the check -// fails, nothing else in the program ever gets to touch this strange -// "forced" object. -template -struct object_manager_ref_arg_from_python -{ - typedef Ref result_type; - - object_manager_ref_arg_from_python(PyObject*); - bool convertible() const; - Ref operator()() const; - ~object_manager_ref_arg_from_python(); - private: - typename python::detail::referent_storage::type m_result; -}; - -// -// implementations -// - -template -inline object_manager_value_arg_from_python::object_manager_value_arg_from_python(PyObject* x) - : m_source(x) -{ -} - -template -inline bool object_manager_value_arg_from_python::convertible() const -{ - return object_manager_traits::check(m_source); -} - -template -inline T object_manager_value_arg_from_python::operator()() const -{ - return T(python::detail::borrowed_reference(m_source)); -} - -template -inline object_manager_ref_arg_from_python::object_manager_ref_arg_from_python(PyObject* x) -{ -# if defined(__EDG_VERSION__) && __EDG_VERSION__ <= 243 - // needed for warning suppression - python::detail::borrowed_reference x_ = python::detail::borrowed_reference(x); - python::detail::construct_referent(&m_result.bytes, x_); -# else - python::detail::construct_referent(&m_result.bytes, (python::detail::borrowed_reference)x); -# endif -} - -template -inline object_manager_ref_arg_from_python::~object_manager_ref_arg_from_python() -{ - python::detail::destroy_referent(this->m_result.bytes); -} - -namespace detail -{ - template - inline bool object_manager_ref_check(T const& x) - { - return object_manager_traits::check(get_managed_object(x, tag)); - } -} - -template -inline bool object_manager_ref_arg_from_python::convertible() const -{ - return detail::object_manager_ref_check( - python::detail::void_ptr_to_reference(this->m_result.bytes, (Ref(*)())0)); -} - -template -inline Ref object_manager_ref_arg_from_python::operator()() const -{ - return python::detail::void_ptr_to_reference( - this->m_result.bytes, (Ref(*)())0); -} - -}}} // namespace boost::python::converter - -#endif // OBJ_MGR_ARG_FROM_PYTHON_DWA2002628_HPP diff --git a/include/boost/python/converter/object_manager.hpp b/include/boost/python/converter/object_manager.hpp deleted file mode 100644 index 46682455..00000000 --- a/include/boost/python/converter/object_manager.hpp +++ /dev/null @@ -1,156 +0,0 @@ -// 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) -#ifndef OBJECT_MANAGER_DWA2002614_HPP -# define OBJECT_MANAGER_DWA2002614_HPP - -# include -# include -# include -# include -# include -# include -# include - -// Facilities for dealing with types which always manage Python -// objects. Some examples are object, list, str, et. al. Different -// to_python/from_python conversion rules apply here because in -// contrast to other types which are typically embedded inside a -// Python object, these are wrapped around a Python object. For most -// object managers T, a C++ non-const T reference argument does not -// imply the existence of a T lvalue embedded in the corresponding -// Python argument, since mutating member functions on T actually only -// modify the held Python object. -// -// handle is an object manager, though strictly speaking it should -// not be. In other words, even though mutating member functions of -// hanlde actually modify the handle and not the T object, -// handle& arguments of wrapped functions will bind to "rvalues" -// wrapping the actual Python argument, just as with other object -// manager classes. Making an exception for handle is simply not -// worth the trouble. -// -// borrowed cv* is an object manager so that we can use the general -// to_python mechanisms to convert raw Python object pointers to -// python, without the usual semantic problems of using raw pointers. - - -// Object Manager Concept requirements: -// -// T is an Object Manager -// p is a PyObject* -// x is a T -// -// * object_manager_traits::is_specialized == true -// -// * T(detail::borrowed_reference(p)) -// Manages p without checking its type -// -// * get_managed_object(x, boost::python::tag) -// Convertible to PyObject* -// -// Additional requirements if T can be converted from_python: -// -// * T(object_manager_traits::adopt(p)) -// steals a reference to p, or throws a TypeError exception if -// p doesn't have an appropriate type. May assume p is non-null -// -// * X::check(p) -// convertible to bool. True iff T(X::construct(p)) will not -// throw. - -// Forward declarations -// -namespace boost { namespace python -{ - namespace api - { - class object; - } -}} - -namespace boost { namespace python { namespace converter { - - -// Specializations for handle -template -struct handle_object_manager_traits - : pyobject_traits -{ - private: - typedef pyobject_traits base; - - public: - BOOST_STATIC_CONSTANT(bool, is_specialized = true); - - // Initialize with a null_ok pointer for efficiency, bypassing the - // null check since the source is always non-null. - static null_ok* adopt(PyObject* p) - { - return python::allow_null(base::checked_downcast(p)); - } -}; - -template -struct default_object_manager_traits -{ - BOOST_STATIC_CONSTANT( - bool, is_specialized = python::detail::is_borrowed_ptr::value - ); -}; - -template -struct object_manager_traits - : mpl::if_c< - is_handle::value - , handle_object_manager_traits - , default_object_manager_traits - >::type -{ -}; - -// -// Traits for detecting whether a type is an object manager or a -// (cv-qualified) reference to an object manager. -// - -template -struct is_object_manager - : mpl::bool_::is_specialized> -{ -}; - -template -struct is_reference_to_object_manager - : mpl::false_ -{ -}; - -template -struct is_reference_to_object_manager - : is_object_manager -{ -}; - -template -struct is_reference_to_object_manager - : is_object_manager -{ -}; - -template -struct is_reference_to_object_manager - : is_object_manager -{ -}; - -template -struct is_reference_to_object_manager - : is_object_manager -{ -}; - -}}} // namespace boost::python::converter - -#endif // OBJECT_MANAGER_DWA2002614_HPP diff --git a/include/boost/python/converter/pointer_type_id.hpp b/include/boost/python/converter/pointer_type_id.hpp deleted file mode 100644 index 963f58f7..00000000 --- a/include/boost/python/converter/pointer_type_id.hpp +++ /dev/null @@ -1,68 +0,0 @@ -// 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) -#ifndef POINTER_TYPE_ID_DWA2002222_HPP -# define POINTER_TYPE_ID_DWA2002222_HPP - -# include -# include - -namespace boost { namespace python { namespace converter { - -namespace detail -{ - template - struct pointer_typeid_select - { - template - static inline type_info execute(T*(*)() = 0) - { - return type_id(); - } - }; - - template <> - struct pointer_typeid_select - { - template - static inline type_info execute(T* const volatile&(*)() = 0) - { - return type_id(); - } - - template - static inline type_info execute(T*volatile&(*)() = 0) - { - return type_id(); - } - - template - static inline type_info execute(T*const&(*)() = 0) - { - return type_id(); - } - - template - static inline type_info execute(T*&(*)() = 0) - { - return type_id(); - } - }; -} - -// Usage: pointer_type_id() -// -// Returns a type_info associated with the type pointed -// to by T, which may be a pointer or a reference to a pointer. -template -type_info pointer_type_id(T(*)() = 0) -{ - return detail::pointer_typeid_select< - is_reference::value - >::execute((T(*)())0); -} - -}}} // namespace boost::python::converter - -#endif // POINTER_TYPE_ID_DWA2002222_HPP diff --git a/include/boost/python/converter/pyobject_traits.hpp b/include/boost/python/converter/pyobject_traits.hpp deleted file mode 100644 index 43e384af..00000000 --- a/include/boost/python/converter/pyobject_traits.hpp +++ /dev/null @@ -1,46 +0,0 @@ -// 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) -#ifndef PYOBJECT_TRAITS_DWA2002720_HPP -# define PYOBJECT_TRAITS_DWA2002720_HPP - -# include -# include - -namespace boost { namespace python { namespace converter { - -template struct pyobject_traits; - -template <> -struct pyobject_traits -{ - // All objects are convertible to PyObject - static bool check(PyObject*) { return true; } - static PyObject* checked_downcast(PyObject* x) { return x; } -#ifndef BOOST_PYTHON_NO_PY_SIGNATURES - static PyTypeObject const* get_pytype() { return 0; } -#endif -}; - -// -// Specializations -// - -# define BOOST_PYTHON_BUILTIN_OBJECT_TRAITS(T) \ - template <> struct pyobject_traits \ - : pyobject_type {} - -// This is not an exhaustive list; should be expanded. -BOOST_PYTHON_BUILTIN_OBJECT_TRAITS(Type); -BOOST_PYTHON_BUILTIN_OBJECT_TRAITS(List); -#if PY_VERSION_HEX < 0x03000000 -BOOST_PYTHON_BUILTIN_OBJECT_TRAITS(Int); -#endif -BOOST_PYTHON_BUILTIN_OBJECT_TRAITS(Long); -BOOST_PYTHON_BUILTIN_OBJECT_TRAITS(Dict); -BOOST_PYTHON_BUILTIN_OBJECT_TRAITS(Tuple); - -}}} // namespace boost::python::converter - -#endif // PYOBJECT_TRAITS_DWA2002720_HPP diff --git a/include/boost/python/converter/pyobject_type.hpp b/include/boost/python/converter/pyobject_type.hpp deleted file mode 100644 index 526f9f9d..00000000 --- a/include/boost/python/converter/pyobject_type.hpp +++ /dev/null @@ -1,37 +0,0 @@ -// 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) -#ifndef PYOBJECT_TYPE_DWA2002720_HPP -# define PYOBJECT_TYPE_DWA2002720_HPP - -# include - -namespace boost { namespace python { namespace converter { - -BOOST_PYTHON_DECL PyObject* checked_downcast_impl(PyObject*, PyTypeObject*); - -// Used as a base class for specializations which need to provide -// Python type checking capability. -template -struct pyobject_type -{ - static bool check(PyObject* x) - { - return ::PyObject_IsInstance(x, (PyObject*)pytype); - } - - static Object* checked_downcast(PyObject* x) - { - return python::downcast( - (checked_downcast_impl)(x, pytype) - ); - } -#ifndef BOOST_PYTHON_NO_PY_SIGNATURES - static PyTypeObject const* get_pytype() { return pytype; } -#endif -}; - -}}} // namespace boost::python::converter - -#endif // PYOBJECT_TYPE_DWA2002720_HPP diff --git a/include/boost/python/converter/pytype_function.hpp b/include/boost/python/converter/pytype_function.hpp deleted file mode 100755 index 95d0f66d..00000000 --- a/include/boost/python/converter/pytype_function.hpp +++ /dev/null @@ -1,132 +0,0 @@ -// Copyright David Abrahams 2002, Nikolay Mladenov 2007. -// 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 WRAP_PYTYPE_NM20070606_HPP -# define WRAP_PYTYPE_NM20070606_HPP - -# include -# include -# include - - -namespace boost { namespace python { - -namespace converter -{ -template -struct wrap_pytype -{ - static PyTypeObject const* get_pytype() - { - return python_type; - } -}; - -typedef PyTypeObject const* (*pytype_function)(); - -#ifndef BOOST_PYTHON_NO_PY_SIGNATURES - - - -namespace detail -{ -struct unwind_type_id_helper{ - typedef python::type_info result_type; - template - static result_type execute(U* ){ - return python::type_id(); - } -}; - -template -inline python::type_info unwind_type_id_(boost::type* = 0, mpl::false_ * =0) -{ - return boost::python::detail::unwind_type (); -} - -inline python::type_info unwind_type_id_(boost::type* = 0, mpl::true_* =0) -{ - return type_id(); -} - -template -inline python::type_info unwind_type_id(boost::type* p= 0) -{ - return unwind_type_id_(p, (mpl::bool_::value >*)0 ); -} -} - - -template -struct expected_pytype_for_arg -{ - static PyTypeObject const *get_pytype() - { - const converter::registration *r=converter::registry::query( - detail::unwind_type_id_((boost::type*)0, (mpl::bool_::value >*)0 ) - ); - return r ? r->expected_from_python_type(): 0; - } -}; - - -template -struct registered_pytype -{ - static PyTypeObject const *get_pytype() - { - const converter::registration *r=converter::registry::query( - detail::unwind_type_id_((boost::type*) 0, (mpl::bool_::value >*)0 ) - ); - return r ? r->m_class_object: 0; - } -}; - - -template -struct registered_pytype_direct -{ - static PyTypeObject const* get_pytype() - { - return registered::converters.m_class_object; - } -}; - -template -struct expected_from_python_type : expected_pytype_for_arg{}; - -template -struct expected_from_python_type_direct -{ - static PyTypeObject const* get_pytype() - { - return registered::converters.expected_from_python_type(); - } -}; - -template -struct to_python_target_type -{ - static PyTypeObject const *get_pytype() - { - const converter::registration *r=converter::registry::query( - detail::unwind_type_id_((boost::type*)0, (mpl::bool_::value >*)0 ) - ); - return r ? r->to_python_target_type(): 0; - } -}; - -template -struct to_python_target_type_direct -{ - static PyTypeObject const *get_pytype() - { - return registered::converters.to_python_target_type(); - } -}; -#endif - -}}} // namespace boost::python - -#endif // WRAP_PYTYPE_NM20070606_HPP diff --git a/include/boost/python/converter/pytype_object_mgr_traits.hpp b/include/boost/python/converter/pytype_object_mgr_traits.hpp deleted file mode 100644 index 8f5b2b76..00000000 --- a/include/boost/python/converter/pytype_object_mgr_traits.hpp +++ /dev/null @@ -1,42 +0,0 @@ -// 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) -#ifndef PYTYPE_OBJECT_MANAGER_TRAITS_DWA2002716_HPP -# define PYTYPE_OBJECT_MANAGER_TRAITS_DWA2002716_HPP - -# include -# include -# include -# include -# include - -namespace boost { namespace python { namespace converter { - -// Provide a forward declaration as a convenience for clients, who all -// need it. -template struct object_manager_traits; - -// Derive specializations of object_manager_traits from this class -// when T is an object manager for a particular Python type hierarchy. -// -template -struct pytype_object_manager_traits - : pyobject_type // provides check() -{ - BOOST_STATIC_CONSTANT(bool, is_specialized = true); - static inline python::detail::new_reference adopt(PyObject*); -}; - -// -// implementations -// -template -inline python::detail::new_reference pytype_object_manager_traits::adopt(PyObject* x) -{ - return python::detail::new_reference(python::pytype_check(pytype, x)); -} - -}}} // namespace boost::python::converter - -#endif // PYTYPE_OBJECT_MANAGER_TRAITS_DWA2002716_HPP diff --git a/include/boost/python/converter/registered.hpp b/include/boost/python/converter/registered.hpp deleted file mode 100644 index 68bb3c4a..00000000 --- a/include/boost/python/converter/registered.hpp +++ /dev/null @@ -1,110 +0,0 @@ -// 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) -#ifndef REGISTERED_DWA2002710_HPP -# define REGISTERED_DWA2002710_HPP -# include -# include -# include -# include -# include -# include -# include -# include -# include - -namespace boost { - -// You'll see shared_ptr mentioned in this header because we need to -// note which types are shared_ptrs in their registrations, to -// implement special shared_ptr handling for rvalue conversions. -template class shared_ptr; - -namespace python { namespace converter { - -struct registration; - -namespace detail -{ - template - struct registered_base - { - static registration const& converters; - }; -} - -template -struct registered - : detail::registered_base< - typename add_reference< - typename add_cv::type - >::type - > -{ -}; - -# if !BOOST_WORKAROUND(BOOST_MSVC, BOOST_TESTED_AT(1310)) -// collapses a few more types to the same static instance. MSVC7.1 -// fails to strip cv-qualification from array types in typeid. For -// some reason we can't use this collapse there or array converters -// will not be found. -template -struct registered - : registered {}; -# endif - -// -// implementations -// -namespace detail -{ - inline void - register_shared_ptr0(...) - { - } - - template - inline void - register_shared_ptr0(shared_ptr*) - { - registry::lookup_shared_ptr(type_id >()); - } - - template - inline void - register_shared_ptr1(T const volatile*) - { - detail::register_shared_ptr0((T*)0); - } - - template - inline registration const& - registry_lookup2(T&(*)()) - { - detail::register_shared_ptr1((T*)0); - return registry::lookup(type_id()); - } - - template - inline registration const& - registry_lookup1(type) - { - return registry_lookup2((T(*)())0); - } - - inline registration const& - registry_lookup1(type) - { - detail::register_shared_ptr1((void*)0); - return registry::lookup(type_id()); - } - - template - registration const& registered_base::converters = detail::registry_lookup1(type()); - -} - -}}} // namespace boost::python::converter - -#endif // REGISTERED_DWA2002710_HPP diff --git a/include/boost/python/converter/registered_pointee.hpp b/include/boost/python/converter/registered_pointee.hpp deleted file mode 100644 index 974cb6d8..00000000 --- a/include/boost/python/converter/registered_pointee.hpp +++ /dev/null @@ -1,30 +0,0 @@ -// 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) -#ifndef REGISTERED_POINTEE_DWA2002710_HPP -# define REGISTERED_POINTEE_DWA2002710_HPP -# include -# include -# include -# include -# include - -namespace boost { namespace python { namespace converter { - -struct registration; - -template -struct registered_pointee - : registered< - typename remove_pointer< - typename remove_cv< - typename remove_reference::type - >::type - >::type - > -{ -}; -}}} // namespace boost::python::converter - -#endif // REGISTERED_POINTEE_DWA2002710_HPP diff --git a/include/boost/python/converter/registrations.hpp b/include/boost/python/converter/registrations.hpp deleted file mode 100644 index 7ef74e8f..00000000 --- a/include/boost/python/converter/registrations.hpp +++ /dev/null @@ -1,99 +0,0 @@ -// 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) -#ifndef REGISTRATIONS_DWA2002223_HPP -# define REGISTRATIONS_DWA2002223_HPP - -# include - -# include - -# include -# include -# include - -# include - -namespace boost { namespace python { namespace converter { - -struct lvalue_from_python_chain -{ - convertible_function convert; - lvalue_from_python_chain* next; -}; - -struct rvalue_from_python_chain -{ - convertible_function convertible; - constructor_function construct; - PyTypeObject const* (*expected_pytype)(); - rvalue_from_python_chain* next; -}; - -struct BOOST_PYTHON_DECL registration -{ - public: // member functions - explicit registration(type_info target, bool is_shared_ptr = false); - ~registration(); - - // Convert the appropriately-typed data to Python - PyObject* to_python(void const volatile*) const; - - // Return the class object, or raise an appropriate Python - // exception if no class has been registered. - PyTypeObject* get_class_object() const; - - // Return common denominator of the python class objects, - // convertable to target. Inspects the m_class_object and the value_chains. - PyTypeObject const* expected_from_python_type() const; - PyTypeObject const* to_python_target_type() const; - - public: // data members. So sue me. - const python::type_info target_type; - - // The chain of eligible from_python converters when an lvalue is required - lvalue_from_python_chain* lvalue_chain; - - // The chain of eligible from_python converters when an rvalue is acceptable - rvalue_from_python_chain* rvalue_chain; - - // The class object associated with this type - PyTypeObject* m_class_object; - - // The unique to_python converter for the associated C++ type. - to_python_function_t m_to_python; - PyTypeObject const* (*m_to_python_target_type)(); - - - // True iff this type is a shared_ptr. Needed for special rvalue - // from_python handling. - const bool is_shared_ptr; - -# if BOOST_WORKAROUND(__MWERKS__, BOOST_TESTED_AT(0x3003)) - private: - void operator=(registration); // This is not defined, and just keeps MWCW happy. -# endif -}; - -// -// implementations -// -inline registration::registration(type_info target_type, bool is_shared_ptr) - : target_type(target_type) - , lvalue_chain(0) - , rvalue_chain(0) - , m_class_object(0) - , m_to_python(0) - , m_to_python_target_type(0) - , is_shared_ptr(is_shared_ptr) -{} - -inline bool operator<(registration const& lhs, registration const& rhs) -{ - return lhs.target_type < rhs.target_type; -} - -}}} // namespace boost::python::converter - -#endif // REGISTRATIONS_DWA2002223_HPP diff --git a/include/boost/python/converter/registry.hpp b/include/boost/python/converter/registry.hpp deleted file mode 100644 index 368adcc6..00000000 --- a/include/boost/python/converter/registry.hpp +++ /dev/null @@ -1,55 +0,0 @@ -// Copyright David Abrahams 2001. -// 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 REGISTRY_DWA20011127_HPP -# define REGISTRY_DWA20011127_HPP -# include -# include -# include -# include -# include - -namespace boost { namespace python { namespace converter { - -struct registration; - -// This namespace acts as a sort of singleton -namespace registry -{ - // Get the registration corresponding to the type, creating it if necessary - BOOST_PYTHON_DECL registration const& lookup(type_info); - - // Get the registration corresponding to the type, creating it if - // necessary. Use this first when the type is a shared_ptr. - BOOST_PYTHON_DECL registration const& lookup_shared_ptr(type_info); - - // Return a pointer to the corresponding registration, if one exists - BOOST_PYTHON_DECL registration const* query(type_info); - - BOOST_PYTHON_DECL void insert(to_python_function_t, type_info, PyTypeObject const* (*to_python_target_type)() = 0); - - // Insert an lvalue from_python converter - BOOST_PYTHON_DECL void insert(convertible_function, type_info, PyTypeObject const* (*expected_pytype)() = 0); - - // Insert an rvalue from_python converter - BOOST_PYTHON_DECL void insert( - convertible_function - , constructor_function - , type_info - , PyTypeObject const* (*expected_pytype)() = 0 - ); - - // Insert an rvalue from_python converter at the tail of the - // chain. Used for implicit conversions - BOOST_PYTHON_DECL void push_back( - convertible_function - , constructor_function - , type_info - , PyTypeObject const* (*expected_pytype)() = 0 - ); -} - -}}} // namespace boost::python::converter - -#endif // REGISTRY_DWA20011127_HPP diff --git a/include/boost/python/converter/return_from_python.hpp b/include/boost/python/converter/return_from_python.hpp deleted file mode 100755 index 5db97485..00000000 --- a/include/boost/python/converter/return_from_python.hpp +++ /dev/null @@ -1,162 +0,0 @@ -// 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) -#ifndef RETURN_FROM_PYTHON_DWA200265_HPP -# define RETURN_FROM_PYTHON_DWA200265_HPP - -# include -# include -# include -# include -# include -# include -# include -# include -# include -# include -# include -# include - -namespace boost { namespace python { namespace converter { - -template struct is_object_manager; - -namespace detail -{ - template - struct return_pointer_from_python - { - typedef T result_type; - T operator()(PyObject*) const; - }; - - template - struct return_reference_from_python - { - typedef T result_type; - T operator()(PyObject*) const; - }; - - template - struct return_rvalue_from_python - { - typedef T result_type; - - return_rvalue_from_python(); - result_type operator()(PyObject*); - private: - rvalue_from_python_data m_data; - }; - - template - struct return_object_manager_from_python - { - typedef T result_type; - result_type operator()(PyObject*) const; - }; - - template - struct select_return_from_python - { - BOOST_STATIC_CONSTANT( - bool, obj_mgr = is_object_manager::value); - - BOOST_STATIC_CONSTANT( - bool, ptr = is_pointer::value); - - BOOST_STATIC_CONSTANT( - bool, ref = is_reference::value); - - typedef typename mpl::if_c< - obj_mgr - , return_object_manager_from_python - , typename mpl::if_c< - ptr - , return_pointer_from_python - , typename mpl::if_c< - ref - , return_reference_from_python - , return_rvalue_from_python - >::type - >::type - >::type type; - }; -} - -template -struct return_from_python - : detail::select_return_from_python::type -{ -}; - -// Specialization as a convenience for call and call_method -template <> -struct return_from_python -{ - typedef python::detail::returnable::type result_type; - - result_type operator()(PyObject* x) const - { - (void_result_from_python)(x); -# ifdef BOOST_NO_VOID_RETURNS - return result_type(); -# endif - } -}; - -// -// Implementations -// -namespace detail -{ - template - inline return_rvalue_from_python::return_rvalue_from_python() - : m_data( - const_cast(®istered::converters) - ) - { - } - - template - inline typename return_rvalue_from_python::result_type - return_rvalue_from_python::operator()(PyObject* obj) - { - // Take possession of the source object here. If the result is in - // fact going to be a copy of an lvalue embedded in the object, - // and we take possession inside rvalue_result_from_python, it - // will be destroyed too early. - handle<> holder(obj); - - return *(T*) - (rvalue_result_from_python)(obj, m_data.stage1); - } - - template - inline T return_reference_from_python::operator()(PyObject* obj) const - { - return python::detail::void_ptr_to_reference( - (reference_result_from_python)(obj, registered::converters) - , (T(*)())0); - } - - template - inline T return_pointer_from_python::operator()(PyObject* obj) const - { - return T( - (pointer_result_from_python)(obj, registered_pointee::converters) - ); - } - - template - inline T return_object_manager_from_python::operator()(PyObject* obj) const - { - return T( - object_manager_traits::adopt(expect_non_null(obj)) - ); - } -} - -}}} // namespace boost::python::converter - -#endif // RETURN_FROM_PYTHON_DWA200265_HPP diff --git a/include/boost/python/converter/rvalue_from_python_data.hpp b/include/boost/python/converter/rvalue_from_python_data.hpp deleted file mode 100644 index 471a5255..00000000 --- a/include/boost/python/converter/rvalue_from_python_data.hpp +++ /dev/null @@ -1,140 +0,0 @@ -// 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) -#ifndef FROM_PYTHON_AUX_DATA_DWA2002128_HPP -# define FROM_PYTHON_AUX_DATA_DWA2002128_HPP - -# include -# include -# include -# include -# include -# include -# include - -// Data management for potential rvalue conversions from Python to C++ -// types. When a client requests a conversion to T* or T&, we -// generally require that an object of type T exists in the source -// Python object, and the code here does not apply**. This implements -// conversions which may create new temporaries of type T. The classic -// example is a conversion which converts a Python tuple to a -// std::vector. Since no std::vector lvalue exists in the Python -// object -- it must be created "on-the-fly" by the converter, and -// which must manage the lifetime of the created object. -// -// Note that the client is not precluded from using a registered -// lvalue conversion to T in this case. In other words, we will -// happily accept a Python object which /does/ contain a std::vector -// lvalue, provided an appropriate converter is registered. So, while -// this is an rvalue conversion from the client's point-of-view, the -// converter registry may serve up lvalue or rvalue conversions for -// the target type. -// -// ** C++ argument from_python conversions to T const& are an -// exception to the rule for references: since in C++, const -// references can bind to temporary rvalues, we allow rvalue -// converters to be chosen when the target type is T const& for some -// T. -namespace boost { namespace python { namespace converter { - -// Conversions begin by filling in and returning a copy of this -// structure. The process looks up a converter in the rvalue converter -// registry for the target type. It calls the convertible() function -// of each registered converter, passing the source PyObject* as an -// argument, until a non-null result is returned. This result goes in -// the convertible field, and the converter's construct() function is -// stored in the construct field. -// -// If no appropriate converter is found, conversion fails and the -// convertible field is null. When used in argument conversion for -// wrapped C++ functions, it causes overload resolution to reject the -// current function but not to fail completely. If an exception is -// thrown, overload resolution stops and the exception propagates back -// through the caller. -// -// If an lvalue converter is matched, its convertible() function is -// expected to return a pointer to the stored T object; its -// construct() function will be NULL. The convertible() function of -// rvalue converters may return any non-singular pointer; the actual -// target object will only be available once the converter's -// construct() function is called. -struct rvalue_from_python_stage1_data -{ - void* convertible; - constructor_function construct; -}; - -// Augments rvalue_from_python_stage1_data by adding storage for -// constructing an object of remove_reference::type. The -// construct() function of rvalue converters (stored in m_construct -// above) will cast the rvalue_from_python_stage1_data to an -// appropriate instantiation of this template in order to access that -// storage. -template -struct rvalue_from_python_storage -{ - rvalue_from_python_stage1_data stage1; - - // Storage for the result, in case an rvalue must be constructed - typename python::detail::referent_storage< - typename add_reference::type - >::type storage; -}; - -// Augments rvalue_from_python_storage with a destructor. If -// stage1.convertible == storage.bytes, it indicates that an object of -// remove_reference::type has been constructed in storage and -// should will be destroyed in ~rvalue_from_python_data(). It is -// crucial that successful rvalue conversions establish this equality -// and that unsuccessful ones do not. -template -struct rvalue_from_python_data : rvalue_from_python_storage -{ -# if (!defined(__MWERKS__) || __MWERKS__ >= 0x3000) \ - && (!defined(__EDG_VERSION__) || __EDG_VERSION__ >= 245) \ - && (!defined(__DECCXX_VER) || __DECCXX_VER > 60590014) \ - && !defined(BOOST_PYTHON_SYNOPSIS) /* Synopsis' OpenCXX has trouble parsing this */ - // This must always be a POD struct with m_data its first member. - BOOST_STATIC_ASSERT(BOOST_PYTHON_OFFSETOF(rvalue_from_python_storage,stage1) == 0); -# endif - - // The usual constructor - rvalue_from_python_data(rvalue_from_python_stage1_data const&); - - // This constructor just sets m_convertible -- used by - // implicitly_convertible<> to perform the final step of the - // conversion, where the construct() function is already known. - rvalue_from_python_data(void* convertible); - - // Destroys any object constructed in the storage. - ~rvalue_from_python_data(); - private: - typedef typename add_reference::type>::type ref_type; -}; - -// -// Implementataions -// -template -inline rvalue_from_python_data::rvalue_from_python_data(rvalue_from_python_stage1_data const& _stage1) -{ - this->stage1 = _stage1; -} - -template -inline rvalue_from_python_data::rvalue_from_python_data(void* convertible) -{ - this->stage1.convertible = convertible; -} - -template -inline rvalue_from_python_data::~rvalue_from_python_data() -{ - if (this->stage1.convertible == this->storage.bytes) - python::detail::destroy_referent(this->storage.bytes); -} - -}}} // namespace boost::python::converter - -#endif // FROM_PYTHON_AUX_DATA_DWA2002128_HPP diff --git a/include/boost/python/converter/shared_ptr_deleter.hpp b/include/boost/python/converter/shared_ptr_deleter.hpp deleted file mode 100644 index 926508d0..00000000 --- a/include/boost/python/converter/shared_ptr_deleter.hpp +++ /dev/null @@ -1,22 +0,0 @@ -// 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) -#ifndef SHARED_PTR_DELETER_DWA2002121_HPP -# define SHARED_PTR_DELETER_DWA2002121_HPP - -namespace boost { namespace python { namespace converter { - -struct BOOST_PYTHON_DECL shared_ptr_deleter -{ - shared_ptr_deleter(handle<> owner); - ~shared_ptr_deleter(); - - void operator()(void const*); - - handle<> owner; -}; - -}}} // namespace boost::python::converter - -#endif // SHARED_PTR_DELETER_DWA2002121_HPP diff --git a/include/boost/python/converter/shared_ptr_from_python.hpp b/include/boost/python/converter/shared_ptr_from_python.hpp deleted file mode 100644 index c0910776..00000000 --- a/include/boost/python/converter/shared_ptr_from_python.hpp +++ /dev/null @@ -1,63 +0,0 @@ -// 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) -#ifndef SHARED_PTR_FROM_PYTHON_DWA20021130_HPP -# define SHARED_PTR_FROM_PYTHON_DWA20021130_HPP - -# include -# include -# include -# include -# include -#ifndef BOOST_PYTHON_NO_PY_SIGNATURES -# include -#endif -# include - -namespace boost { namespace python { namespace converter { - -template -struct shared_ptr_from_python -{ - shared_ptr_from_python() - { - converter::registry::insert(&convertible, &construct, type_id >() -#ifndef BOOST_PYTHON_NO_PY_SIGNATURES - , &converter::expected_from_python_type_direct::get_pytype -#endif - ); - } - - private: - static void* convertible(PyObject* p) - { - if (p == Py_None) - return p; - - return converter::get_lvalue_from_python(p, registered::converters); - } - - static void construct(PyObject* source, rvalue_from_python_stage1_data* data) - { - void* const storage = ((converter::rvalue_from_python_storage >*)data)->storage.bytes; - // Deal with the "None" case. - if (data->convertible == source) - new (storage) shared_ptr(); - else - { - boost::shared_ptr hold_convertible_ref_count( - (void*)0, shared_ptr_deleter(handle<>(borrowed(source))) ); - // use aliasing constructor - new (storage) shared_ptr( - hold_convertible_ref_count, - static_cast(data->convertible)); - } - - data->convertible = storage; - } -}; - -}}} // namespace boost::python::converter - -#endif // SHARED_PTR_FROM_PYTHON_DWA20021130_HPP diff --git a/include/boost/python/converter/shared_ptr_to_python.hpp b/include/boost/python/converter/shared_ptr_to_python.hpp deleted file mode 100644 index fe867ace..00000000 --- a/include/boost/python/converter/shared_ptr_to_python.hpp +++ /dev/null @@ -1,28 +0,0 @@ -// 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 SHARED_PTR_TO_PYTHON_DWA2003224_HPP -# define SHARED_PTR_TO_PYTHON_DWA2003224_HPP - -# include -# include -# include -# include - -namespace boost { namespace python { namespace converter { - -template -PyObject* shared_ptr_to_python(shared_ptr const& x) -{ - if (!x) - return python::detail::none(); - else if (shared_ptr_deleter* d = boost::get_deleter(x)) - return incref( get_pointer( d->owner ) ); - else - return converter::registered const&>::converters.to_python(&x); -} - -}}} // namespace boost::python::converter - -#endif // SHARED_PTR_TO_PYTHON_DWA2003224_HPP diff --git a/include/boost/python/converter/to_python_function_type.hpp b/include/boost/python/converter/to_python_function_type.hpp deleted file mode 100644 index cccd014d..00000000 --- a/include/boost/python/converter/to_python_function_type.hpp +++ /dev/null @@ -1,19 +0,0 @@ -// 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) -#ifndef TO_PYTHON_FUNCTION_TYPE_DWA200236_HPP -# define TO_PYTHON_FUNCTION_TYPE_DWA200236_HPP -# include -# include - -namespace boost { namespace python { namespace converter { - -// The type of stored function pointers which actually do conversion -// by-value. The void* points to the object to be converted, and -// type-safety is preserved through runtime registration. -typedef PyObject* (*to_python_function_t)(void const*); - -}}} // namespace boost::python::converter - -#endif // TO_PYTHON_FUNCTION_TYPE_DWA200236_HPP diff --git a/include/boost/python/copy_const_reference.hpp b/include/boost/python/copy_const_reference.hpp deleted file mode 100644 index 55bede13..00000000 --- a/include/boost/python/copy_const_reference.hpp +++ /dev/null @@ -1,43 +0,0 @@ -// 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) -#ifndef COPY_CONST_REFERENCE_DWA2002131_HPP -# define COPY_CONST_REFERENCE_DWA2002131_HPP - -# include -# include -# include -# include - -namespace boost { namespace python { - -namespace detail -{ - template - struct copy_const_reference_expects_a_const_reference_return_type -# if defined(__GNUC__) || defined(__EDG__) - {} -# endif - ; -} - -template struct to_python_value; - -struct copy_const_reference -{ - template - struct apply - { - typedef typename mpl::if_c< - indirect_traits::is_reference_to_const::value - , to_python_value - , detail::copy_const_reference_expects_a_const_reference_return_type - >::type type; - }; -}; - - -}} // namespace boost::python - -#endif // COPY_CONST_REFERENCE_DWA2002131_HPP diff --git a/include/boost/python/copy_non_const_reference.hpp b/include/boost/python/copy_non_const_reference.hpp deleted file mode 100644 index 15fef62d..00000000 --- a/include/boost/python/copy_non_const_reference.hpp +++ /dev/null @@ -1,43 +0,0 @@ -// 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) -#ifndef COPY_NON_CONST_REFERENCE_DWA2002131_HPP -# define COPY_NON_CONST_REFERENCE_DWA2002131_HPP - -# include -# include -# include -# include - -namespace boost { namespace python { - -namespace detail -{ - template - struct copy_non_const_reference_expects_a_non_const_reference_return_type -# if defined(__GNUC__) || defined(__EDG__) - {} -# endif - ; -} - -template struct to_python_value; - -struct copy_non_const_reference -{ - template - struct apply - { - typedef typename mpl::if_c< - indirect_traits::is_reference_to_non_const::value - , to_python_value - , detail::copy_non_const_reference_expects_a_non_const_reference_return_type - >::type type; - }; -}; - - -}} // namespace boost::python - -#endif // COPY_NON_CONST_REFERENCE_DWA2002131_HPP diff --git a/include/boost/python/data_members.hpp b/include/boost/python/data_members.hpp deleted file mode 100644 index 139bde32..00000000 --- a/include/boost/python/data_members.hpp +++ /dev/null @@ -1,318 +0,0 @@ -// 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) -#ifndef DATA_MEMBERS_DWA2002328_HPP -# define DATA_MEMBERS_DWA2002328_HPP - -# include - -# include - -# include -# include -# include -# include - -# include - -# include -# include -# include - -# include -# include -# include - -# if BOOST_WORKAROUND(__MWERKS__, BOOST_TESTED_AT(0x3003)) -# include -# endif - -# include -# include -# include - -# include - -namespace boost { namespace python { - -// -// This file defines the make_getter and make_setter function -// families, which are responsible for turning pointers, references, -// and pointers-to-data-members into callable Python objects which -// can be used for attribute access on wrapped classes. -// - -namespace detail -{ - - // A small function object which handles the getting and setting of - // data members. - template - struct member - { - public: - member(Data Class::*which) : m_which(which) {} - - Data& operator()(Class& c) const - { - return c.*m_which; - } - - void operator()(Class& c, typename value_arg::type d) const - { - c.*m_which = d; - } - private: - Data Class::*m_which; - }; - - // A small function object which handles the getting and setting of - // non-member objects. - template - struct datum - { - public: - datum(Data *which) : m_which(which) {} - - Data& operator()() const - { - return *m_which; - } - - void operator()(typename value_arg::type d) const - { - *m_which = d; - } - private: - Data *m_which; - }; - - // - // Helper metafunction for determining the default CallPolicy to use - // for attribute access. If T is a [reference to a] class type X - // whose conversion to python would normally produce a new copy of X - // in a wrapped X class instance (as opposed to types such as - // std::string, which are converted to native Python types, and - // smart pointer types which produce a wrapped class instance of the - // pointee type), to-python conversions will attempt to produce an - // object which refers to the original C++ object, rather than a - // copy. See default_member_getter_policy for rationale. - // - template - struct default_getter_by_ref - : mpl::and_< - mpl::bool_< - to_python_value< - typename value_arg::type - >::uses_registry - > - , indirect_traits::is_reference_to_class< - typename value_arg::type - > - > - { - }; - - // Metafunction computing the default CallPolicy to use for reading - // data members - // - // If it's a regular class type (not an object manager or other - // type for which we have to_python specializations, use - // return_internal_reference so that we can do things like - // x.y.z = 1 - // and get the right result. - template - struct default_member_getter_policy - : mpl::if_< - default_getter_by_ref - , return_internal_reference<> - , return_value_policy - > - {}; - - // Metafunction computing the default CallPolicy to use for reading - // non-member data. - template - struct default_datum_getter_policy - : mpl::if_< - default_getter_by_ref - , return_value_policy - , return_value_policy - > - {}; - - // - // make_getter helper function family -- These helpers to - // boost::python::make_getter are used to dispatch behavior. The - // third argument is a workaround for a CWPro8 partial ordering bug - // with pointers to data members. It should be convertible to - // mpl::true_ iff the first argument is a pointer-to-member, and - // mpl::false_ otherwise. The fourth argument is for compilers - // which don't support partial ordering at all and should always be - // passed 0L. - // - -#if BOOST_WORKAROUND(__EDG_VERSION__, <= 238) - template - inline object make_getter(D& d, P& p, mpl::false_, ...); -#endif - - // Handle non-member pointers with policies - template - inline object make_getter(D* d, Policies const& policies, mpl::false_, int) - { - return python::make_function( - detail::datum(d), policies, mpl::vector1() - ); - } - - // Handle non-member pointers without policies - template - inline object make_getter(D* d, not_specified, mpl::false_, long) - { - typedef typename default_datum_getter_policy::type policies; - return detail::make_getter(d, policies(), mpl::false_(), 0); - } - - // Handle pointers-to-members with policies - template - inline object make_getter(D C::*pm, Policies const& policies, mpl::true_, int) - { -#if BOOST_WORKAROUND(__MWERKS__, BOOST_TESTED_AT(0x3003)) - typedef typename remove_cv::type Class; -#else - typedef C Class; -#endif - return python::make_function( - detail::member(pm) - , policies - , mpl::vector2() - ); - } - - // Handle pointers-to-members without policies - template - inline object make_getter(D C::*pm, not_specified, mpl::true_, long) - { - typedef typename default_member_getter_policy::type policies; - return detail::make_getter(pm, policies(), mpl::true_(), 0); - } - - // Handle references - template - inline object make_getter(D& d, P& p, mpl::false_, ...) - { - // Just dispatch to the handler for pointer types. - return detail::make_getter(&d, p, mpl::false_(), 0L); - } - - // - // make_setter helper function family -- These helpers to - // boost::python::make_setter are used to dispatch behavior. The - // third argument is for compilers which don't support partial - // ordering at all and should always be passed 0. - // - - - // Handle non-member pointers - template - inline object make_setter(D* p, Policies const& policies, mpl::false_, int) - { - return python::make_function( - detail::datum(p), policies, mpl::vector2() - ); - } - - // Handle pointers-to-members - template - inline object make_setter(D C::*pm, Policies const& policies, mpl::true_, int) - { - return python::make_function( - detail::member(pm) - , policies - , mpl::vector3() - ); - } - - // Handle references - template - inline object make_setter(D& x, Policies const& policies, mpl::false_, ...) - { - return detail::make_setter(&x, policies, mpl::false_(), 0L); - } -} - -// -// make_getter function family -- build a callable object which -// retrieves data through the first argument and is appropriate for -// use as the `get' function in Python properties . The second, -// policies argument, is optional. We need both D& and D const& -// overloads in order be able to handle rvalues. -// -template -inline object make_getter(D& d, Policies const& policies) -{ - return detail::make_getter(d, policies, is_member_pointer(), 0L); -} - -template -inline object make_getter(D const& d, Policies const& policies) -{ - return detail::make_getter(d, policies, is_member_pointer(), 0L); -} - -template -inline object make_getter(D& x) -{ - detail::not_specified policy - = detail::not_specified(); // suppress a SunPro warning - return detail::make_getter(x, policy, is_member_pointer(), 0L); -} - -# if !BOOST_WORKAROUND(__EDG_VERSION__, <= 238) -template -inline object make_getter(D const& d) -{ - detail::not_specified policy - = detail::not_specified(); // Suppress a SunPro warning - return detail::make_getter(d, policy, is_member_pointer(), 0L); -} -# endif - -// -// make_setter function family -- build a callable object which -// writes data through the first argument and is appropriate for -// use as the `set' function in Python properties . The second, -// policies argument, is optional. We need both D& and D const& -// overloads in order be able to handle rvalues. -// -template -inline object make_setter(D& x, Policies const& policies) -{ - return detail::make_setter(x, policies, is_member_pointer(), 0); -} - -template -inline object make_setter(D const& x, Policies const& policies) -{ - return detail::make_setter(x, policies, is_member_pointer(), 0); -} - -template -inline object make_setter(D& x) -{ - return detail::make_setter(x, default_call_policies(), is_member_pointer(), 0); -} - -# if BOOST_WORKAROUND(__EDG_VERSION__, <= 238) -template -inline object make_setter(D const& x) -{ - return detail::make_setter(x, default_call_policies(), is_member_pointer(), 0); -} -# endif - -}} // namespace boost::python - -#endif // DATA_MEMBERS_DWA2002328_HPP diff --git a/include/boost/python/def.hpp b/include/boost/python/def.hpp deleted file mode 100644 index 76829b08..00000000 --- a/include/boost/python/def.hpp +++ /dev/null @@ -1,114 +0,0 @@ -// 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) -#ifndef DEF_DWA200292_HPP -# define DEF_DWA200292_HPP - -# include - -# include -# include -# include -# include -# include -# include -# include - -namespace boost { namespace python { - -namespace detail -{ - namespace error - { - // Compile-time error messages - template struct multiple_functions_passed_to_def; - template <> struct multiple_functions_passed_to_def { typedef char type; }; - } - - // - // def_from_helper -- - // - // Use a def_helper to define a regular wrapped function in the current scope. - template - void def_from_helper( - char const* name, F const& fn, Helper const& helper) - { - // Must not try to use default implementations except with method definitions. - typedef typename error::multiple_functions_passed_to_def< - Helper::has_default_implementation - >::type assertion; - - detail::scope_setattr_doc( - name, boost::python::make_function( - fn - , helper.policies() - , helper.keywords()) - , helper.doc() - ); - } - - // - // These two overloads discriminate between def() as applied to - // regular functions and def() as applied to the result of - // BOOST_PYTHON_FUNCTION_OVERLOADS(). The final argument is used to - // discriminate. - // - template - void - def_maybe_overloads( - char const* name - , Fn fn - , A1 const& a1 - , ...) - { - detail::def_from_helper(name, fn, def_helper(a1)); - } - - template - void def_maybe_overloads( - char const* name - , SigT sig - , StubsT const& stubs - , detail::overloads_base const*) - { - scope current; - - detail::define_with_defaults( - name, stubs, current, detail::get_signature(sig)); - } - - template - object make_function1(T fn, ...) { return make_function(fn); } - - inline - object make_function1(object const& x, object const*) { return x; } -} - -template -void def(char const* name, Fn fn) -{ - detail::scope_setattr_doc(name, detail::make_function1(fn, &fn), 0); -} - -template -void def(char const* name, Arg1T arg1, Arg2T const& arg2) -{ - detail::def_maybe_overloads(name, arg1, arg2, &arg2); -} - -template -void def(char const* name, F f, A1 const& a1, A2 const& a2) -{ - detail::def_from_helper(name, f, detail::def_helper(a1,a2)); -} - -template -void def(char const* name, F f, A1 const& a1, A2 const& a2, A3 const& a3) -{ - detail::def_from_helper(name, f, detail::def_helper(a1,a2,a3)); -} - -}} // namespace boost::python - -#endif // DEF_DWA200292_HPP diff --git a/include/boost/python/def_visitor.hpp b/include/boost/python/def_visitor.hpp deleted file mode 100755 index 9c8907cd..00000000 --- a/include/boost/python/def_visitor.hpp +++ /dev/null @@ -1,86 +0,0 @@ -// 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 -# include - -namespace boost { namespace python { - -template class def_visitor; -template 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 friend class def_visitor; -# endif - - // unnamed visit, c.f. init<...>, container suites - template - static void visit(V const& v, classT& c) - { - v.derived_visitor().visit(c); - } - - // named visit, c.f. object, pure_virtual - template - static void visit( - V const& v - , classT& c - , char const* name - , OptionalArgs const& options - ) - { - v.derived_visitor().visit(c, name, options); - } - -}; - - -template -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 friend class class_; -# endif - - // unnamed visit, c.f. init<...>, container suites - template - void visit(classT& c) const - { - def_visitor_access::visit(*this, c); - } - - // named visit, c.f. object, pure_virtual - template - 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(*this); - } -}; - -}} // namespace boost::python - -#endif // DEF_VISITOR_DWA2003810_HPP diff --git a/include/boost/python/default_call_policies.hpp b/include/boost/python/default_call_policies.hpp deleted file mode 100644 index fcc242a9..00000000 --- a/include/boost/python/default_call_policies.hpp +++ /dev/null @@ -1,91 +0,0 @@ -// 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) -#ifndef DEFAULT_CALL_POLICIES_DWA2002131_HPP -# define DEFAULT_CALL_POLICIES_DWA2002131_HPP - -# include -# include -# include -# include -# include -# include -# include -# include -# include - -namespace boost { namespace python { - -template struct to_python_value; - -namespace detail -{ -// for "readable" error messages - template struct specify_a_return_value_policy_to_wrap_functions_returning -# if defined(__GNUC__) || defined(__EDG__) - {} -# endif - ; -} - -struct default_result_converter; - -struct default_call_policies -{ - // Ownership of this argument tuple will ultimately be adopted by - // the caller. - template - static bool precall(ArgumentPackage const&) - { - return true; - } - - // Pass the result through - template - static PyObject* postcall(ArgumentPackage const&, PyObject* result) - { - return result; - } - - typedef default_result_converter result_converter; - typedef PyObject* argument_package; - - template - struct extract_return_type : mpl::front - { - }; - -}; - -struct default_result_converter -{ - template - struct apply - { - typedef typename mpl::if_< - mpl::or_, is_reference > - , detail::specify_a_return_value_policy_to_wrap_functions_returning - , boost::python::to_python_value< - typename detail::value_arg::type - > - >::type type; - }; -}; - -// Exceptions for c strings an PyObject*s -template <> -struct default_result_converter::apply -{ - typedef boost::python::to_python_value type; -}; - -template <> -struct default_result_converter::apply -{ - typedef boost::python::to_python_value type; -}; - -}} // namespace boost::python - -#endif // DEFAULT_CALL_POLICIES_DWA2002131_HPP diff --git a/include/boost/python/detail/aix_init_module.hpp b/include/boost/python/detail/aix_init_module.hpp deleted file mode 100644 index 9214dbf0..00000000 --- a/include/boost/python/detail/aix_init_module.hpp +++ /dev/null @@ -1,26 +0,0 @@ -// 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) -#ifndef AIX_INIT_MODULE_DWA2002529_HPP -# define AIX_INIT_MODULE_DWA2002529_HPP -# ifdef _AIX -# include -# include -# ifdef __KCC -# include // this works around a problem in KCC 4.0f -# endif - -namespace boost { namespace python { namespace detail { - -extern "C" -{ - typedef PyObject* (*so_load_function)(char*,char*,FILE*); -} - -void aix_init_module(so_load_function, char const* name, void (*init_module)()); - -}}} // namespace boost::python::detail -# endif - -#endif // AIX_INIT_MODULE_DWA2002529_HPP diff --git a/include/boost/python/detail/api_placeholder.hpp b/include/boost/python/detail/api_placeholder.hpp deleted file mode 100644 index 5975a13b..00000000 --- a/include/boost/python/detail/api_placeholder.hpp +++ /dev/null @@ -1,15 +0,0 @@ -// 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) - -// DEPRECATED HEADER (2006 Jan 12) -// Provided only for backward compatibility. -// The boost::python::len() function is now defined in object.hpp. - -#ifndef BOOST_PYTHON_API_PLACE_HOLDER_HPP -#define BOOST_PYTHON_API_PLACE_HOLDER_HPP - -#include - -#endif // BOOST_PYTHON_API_PLACE_HOLDER_HPP diff --git a/include/boost/python/detail/borrowed_ptr.hpp b/include/boost/python/detail/borrowed_ptr.hpp deleted file mode 100644 index d91d05c9..00000000 --- a/include/boost/python/detail/borrowed_ptr.hpp +++ /dev/null @@ -1,81 +0,0 @@ -#ifndef BORROWED_PTR_DWA20020601_HPP -# define BORROWED_PTR_DWA20020601_HPP -// 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 -# include -# include -# include -# include -# include - -namespace boost { namespace python { namespace detail { - -template class borrowed -{ - typedef T type; -}; - -template -struct is_borrowed_ptr -{ - BOOST_STATIC_CONSTANT(bool, value = false); -}; - -# if !defined(__MWERKS__) || __MWERKS__ > 0x3000 -template -struct is_borrowed_ptr*> -{ - BOOST_STATIC_CONSTANT(bool, value = true); -}; - -template -struct is_borrowed_ptr const*> -{ - BOOST_STATIC_CONSTANT(bool, value = true); -}; - -template -struct is_borrowed_ptr volatile*> -{ - BOOST_STATIC_CONSTANT(bool, value = true); -}; - -template -struct is_borrowed_ptr const volatile*> -{ - BOOST_STATIC_CONSTANT(bool, value = true); -}; -# else -template -struct is_borrowed -{ - BOOST_STATIC_CONSTANT(bool, value = false); -}; -template -struct is_borrowed > -{ - BOOST_STATIC_CONSTANT(bool, value = true); -}; -template -struct is_borrowed_ptr - : is_borrowed::type> -{ -}; -# endif - - -} - -template -inline T* get_managed_object(detail::borrowed const volatile* p, tag_t) -{ - return (T*)p; -} - -}} // namespace boost::python::detail - -#endif // #ifndef BORROWED_PTR_DWA20020601_HPP diff --git a/include/boost/python/detail/caller.hpp b/include/boost/python/detail/caller.hpp deleted file mode 100644 index e479bf42..00000000 --- a/include/boost/python/detail/caller.hpp +++ /dev/null @@ -1,259 +0,0 @@ -#if !defined(BOOST_PP_IS_ITERATING) - -// 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) - -# ifndef CALLER_DWA20021121_HPP -# define CALLER_DWA20021121_HPP - -# include -# include - -# include - -# include -# include -# include - -# include -# include -# include - -# include -# include -# include -# include -# include -# include -# include - -# include - -# include -# include - -# include -# include -# include -# include -# include -# include -# include - -namespace boost { namespace python { namespace detail { - -template -inline PyObject* get(mpl::int_, PyObject* const& args_) -{ - return PyTuple_GET_ITEM(args_,N); -} - -inline unsigned arity(PyObject* const& args_) -{ - return PyTuple_GET_SIZE(args_); -} - -// This "result converter" is really just used as -// a dispatch tag to invoke(...), selecting the appropriate -// implementation -typedef int void_result_to_python; - -// Given a model of CallPolicies and a C++ result type, this -// metafunction selects the appropriate converter to use for -// converting the result to python. -template -struct select_result_converter - : mpl::eval_if< - is_same - , mpl::identity - , mpl::apply1 - > -{ -}; - -template -inline ResultConverter create_result_converter( - ArgPackage const& args_ - , ResultConverter* - , converter::context_result_converter* -) -{ - return ResultConverter(args_); -} - -template -inline ResultConverter create_result_converter( - ArgPackage const& - , ResultConverter* - , ... -) -{ - return ResultConverter(); -} - -#ifndef BOOST_PYTHON_NO_PY_SIGNATURES -template -struct converter_target_type -{ - static PyTypeObject const *get_pytype() - { - return create_result_converter((PyObject*)0, (ResultConverter *)0, (ResultConverter *)0).get_pytype(); - } -}; - -template < > -struct converter_target_type -{ - static PyTypeObject const *get_pytype() - { - return 0; - } -}; -#endif - - -template struct caller_arity; - -template -struct caller; - -# define BOOST_PYTHON_NEXT(init,name,n) \ - typedef BOOST_PP_IF(n,typename mpl::next< BOOST_PP_CAT(name,BOOST_PP_DEC(n)) >::type, init) name##n; - -# define BOOST_PYTHON_ARG_CONVERTER(n) \ - BOOST_PYTHON_NEXT(typename mpl::next::type, arg_iter,n) \ - typedef arg_from_python c_t##n; \ - c_t##n c##n(get(mpl::int_(), inner_args)); \ - if (!c##n.convertible()) \ - return 0; - -# define BOOST_PP_ITERATION_PARAMS_1 \ - (3, (0, BOOST_PYTHON_MAX_ARITY + 1, )) -# include BOOST_PP_ITERATE() - -# undef BOOST_PYTHON_ARG_CONVERTER -# undef BOOST_PYTHON_NEXT - -// A metafunction returning the base class used for caller. -template -struct caller_base_select -{ - enum { arity = mpl::size::value - 1 }; - typedef typename caller_arity::template impl type; -}; - -// A function object type which wraps C++ objects as Python callable -// objects. -// -// Template Arguments: -// -// F - -// the C++ `function object' that will be called. Might -// actually be any data for which an appropriate invoke_tag() can -// be generated. invoke(...) takes care of the actual invocation syntax. -// -// CallPolicies - -// The precall, postcall, and what kind of resultconverter to -// generate for mpl::front::type -// -// Sig - -// The `intended signature' of the function. An MPL sequence -// beginning with a result type and continuing with a list of -// argument types. -template -struct caller - : caller_base_select::type -{ - typedef typename caller_base_select< - F,CallPolicies,Sig - >::type base; - - typedef PyObject* result_type; - - caller(F f, CallPolicies p) : base(f,p) {} - -}; - -}}} // namespace boost::python::detail - -# endif // CALLER_DWA20021121_HPP - -#else - -# define N BOOST_PP_ITERATION() - -template <> -struct caller_arity -{ - template - struct impl - { - impl(F f, Policies p) : m_data(f,p) {} - - PyObject* operator()(PyObject* args_, PyObject*) // eliminate - // this - // trailing - // keyword dict - { - typedef typename mpl::begin::type first; - typedef typename first::type result_t; - typedef typename select_result_converter::type result_converter; - typedef typename Policies::argument_package argument_package; - - argument_package inner_args(args_); - -# if N -# define BOOST_PP_LOCAL_MACRO(i) BOOST_PYTHON_ARG_CONVERTER(i) -# define BOOST_PP_LOCAL_LIMITS (0, N-1) -# include BOOST_PP_LOCAL_ITERATE() -# endif - // all converters have been checked. Now we can do the - // precall part of the policy - if (!m_data.second().precall(inner_args)) - return 0; - - PyObject* result = detail::invoke( - detail::invoke_tag() - , create_result_converter(args_, (result_converter*)0, (result_converter*)0) - , m_data.first() - BOOST_PP_ENUM_TRAILING_PARAMS(N, c) - ); - - return m_data.second().postcall(inner_args, result); - } - - static unsigned min_arity() { return N; } - - static py_func_sig_info signature() - { - const signature_element * sig = detail::signature::elements(); -#ifndef BOOST_PYTHON_NO_PY_SIGNATURES - - typedef BOOST_DEDUCED_TYPENAME Policies::template extract_return_type::type rtype; - typedef typename select_result_converter::type result_converter; - - static const signature_element ret = { - (boost::is_void::value ? "void" : type_id().name()) - , &detail::converter_target_type::get_pytype - , boost::detail::indirect_traits::is_reference_to_non_const::value - }; - py_func_sig_info res = {sig, &ret }; -#else - py_func_sig_info res = {sig, sig }; -#endif - - return res; - } - private: - compressed_pair m_data; - }; -}; - - - -#endif // BOOST_PP_IS_ITERATING - - diff --git a/include/boost/python/detail/config.hpp b/include/boost/python/detail/config.hpp deleted file mode 100644 index 1857d39a..00000000 --- a/include/boost/python/detail/config.hpp +++ /dev/null @@ -1,138 +0,0 @@ -// (C) Copyright David Abrahams 2000. -// 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) -// -// The author gratefully acknowleges the support of Dragon Systems, Inc., in -// producing this work. - -// Revision History: -// 04 Mar 01 Some fixes so it will compile with Intel C++ (Dave Abrahams) - -#ifndef CONFIG_DWA052200_H_ -# define CONFIG_DWA052200_H_ - -# include -# include - -# ifdef BOOST_NO_OPERATORS_IN_NAMESPACE - // A gcc bug forces some symbols into the global namespace -# define BOOST_PYTHON_BEGIN_CONVERSION_NAMESPACE -# define BOOST_PYTHON_END_CONVERSION_NAMESPACE -# define BOOST_PYTHON_CONVERSION -# define BOOST_PYTHON_IMPORT_CONVERSION(x) using ::x -# else -# define BOOST_PYTHON_BEGIN_CONVERSION_NAMESPACE namespace boost { namespace python { -# define BOOST_PYTHON_END_CONVERSION_NAMESPACE }} // namespace boost::python -# define BOOST_PYTHON_CONVERSION boost::python -# define BOOST_PYTHON_IMPORT_CONVERSION(x) void never_defined() // so we can follow the macro with a ';' -# endif - -# if defined(BOOST_MSVC) - -# 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 - -# pragma warning(disable: 985) // identifier was truncated in debug information - -# endif - -// The STLport puts all of the standard 'C' library names in std (as far as the -// user is concerned), but without it you need a fix if you're using MSVC or -// Intel C++ -# if defined(BOOST_NO_STDC_NAMESPACE) -# define BOOST_CSTD_ -# else -# define BOOST_CSTD_ std -# endif - -/***************************************************************************** - * - * Set up dll import/export options: - * - ****************************************************************************/ - -// backwards compatibility: -#ifdef BOOST_PYTHON_STATIC_LIB -# define BOOST_PYTHON_STATIC_LINK -# elif !defined(BOOST_PYTHON_DYNAMIC_LIB) -# define BOOST_PYTHON_DYNAMIC_LIB -#endif - -#if defined(BOOST_PYTHON_DYNAMIC_LIB) - -# 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 BOOST_PYTHON_USE_GCC_SYMBOL_VISIBILITY -# if defined(BOOST_PYTHON_SOURCE) -# define BOOST_PYTHON_DECL __attribute__ ((__visibility__("default"))) -# define BOOST_PYTHON_BUILD_DLL -# else -# define BOOST_PYTHON_DECL -# endif -# define BOOST_PYTHON_DECL_FORWARD -# define BOOST_PYTHON_DECL_EXCEPTION __attribute__ ((__visibility__("default"))) -# elif (defined(_WIN32) || defined(__CYGWIN__)) -# if defined(BOOST_PYTHON_SOURCE) -# define BOOST_PYTHON_DECL __declspec(dllexport) -# define BOOST_PYTHON_BUILD_DLL -# else -# define BOOST_PYTHON_DECL __declspec(dllimport) -# endif -# endif - -#endif - -#ifndef BOOST_PYTHON_DECL -# define BOOST_PYTHON_DECL -#endif - -#ifndef BOOST_PYTHON_DECL_FORWARD -# define BOOST_PYTHON_DECL_FORWARD BOOST_PYTHON_DECL -#endif - -#ifndef BOOST_PYTHON_DECL_EXCEPTION -# define BOOST_PYTHON_DECL_EXCEPTION BOOST_PYTHON_DECL -#endif - -#if BOOST_WORKAROUND(__DECCXX_VER, BOOST_TESTED_AT(60590042)) -// Replace broken Tru64/cxx offsetof macro -# define BOOST_PYTHON_OFFSETOF(s_name, s_member) \ - ((size_t)__INTADDR__(&(((s_name *)0)->s_member))) -#else -# define BOOST_PYTHON_OFFSETOF offsetof -#endif - -// enable automatic library variant selection ------------------------------// - -#if !defined(BOOST_PYTHON_SOURCE) && !defined(BOOST_ALL_NO_LIB) && !defined(BOOST_PYTHON_NO_LIB) -// -// Set the name of our library, this will get undef'ed by auto_link.hpp -// once it's done with it: -// -#define BOOST_LIB_NAME boost_python -// -// If we're importing code from a dll, then tell auto_link.hpp about it: -// -#ifdef BOOST_PYTHON_DYNAMIC_LIB -# define BOOST_DYN_LINK -#endif -// -// And include the header that does the work: -// -#include -#endif // auto-linking disabled - -#ifndef BOOST_PYTHON_NO_PY_SIGNATURES -#define BOOST_PYTHON_SUPPORTS_PY_SIGNATURES // enables smooth transition -#endif - -#endif // CONFIG_DWA052200_H_ diff --git a/include/boost/python/detail/construct.hpp b/include/boost/python/detail/construct.hpp deleted file mode 100644 index e69fbc75..00000000 --- a/include/boost/python/detail/construct.hpp +++ /dev/null @@ -1,36 +0,0 @@ -// 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) -#ifndef CONSTRUCT_REFERENCE_DWA2002716_HPP -# define CONSTRUCT_REFERENCE_DWA2002716_HPP - -namespace boost { namespace python { namespace detail { - -template -void construct_pointee(void* storage, Arg& x, T const volatile*) -{ - new (storage) T(x); -} - -template -void construct_referent_impl(void* storage, Arg& x, T&(*)()) -{ - construct_pointee(storage, x, (T*)0); -} - -template -void construct_referent(void* storage, Arg const& x, T(*tag)() = 0) -{ - construct_referent_impl(storage, x, tag); -} - -template -void construct_referent(void* storage, Arg& x, T(*tag)() = 0) -{ - construct_referent_impl(storage, x, tag); -} - -}}} // namespace boost::python::detail - -#endif // CONSTRUCT_REFERENCE_DWA2002716_HPP diff --git a/include/boost/python/detail/convertible.hpp b/include/boost/python/detail/convertible.hpp deleted file mode 100755 index 2ce552f5..00000000 --- a/include/boost/python/detail/convertible.hpp +++ /dev/null @@ -1,38 +0,0 @@ -// 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) -#ifndef CONVERTIBLE_DWA2002614_HPP -# define CONVERTIBLE_DWA2002614_HPP - -# if defined(__EDG_VERSION__) && __EDG_VERSION__ <= 241 -# include -# include -# endif - -// Supplies a runtime is_convertible check which can be used with tag -// dispatching to work around the Metrowerks Pro7 limitation with boost::is_convertible -namespace boost { namespace python { namespace detail { - -typedef char* yes_convertible; -typedef int* no_convertible; - -template -struct convertible -{ -# if !defined(__EDG_VERSION__) || __EDG_VERSION__ > 241 || __EDG_VERSION__ == 238 - static inline no_convertible check(...) { return 0; } - static inline yes_convertible check(Target) { return 0; } -# else - template - static inline typename mpl::if_c< - is_convertible::value - , yes_convertible - , no_convertible - >::type check(X const&) { return 0; } -# endif -}; - -}}} // namespace boost::python::detail - -#endif // CONVERTIBLE_DWA2002614_HPP diff --git a/include/boost/python/detail/copy_ctor_mutates_rhs.hpp b/include/boost/python/detail/copy_ctor_mutates_rhs.hpp deleted file mode 100755 index 4ca8d039..00000000 --- a/include/boost/python/detail/copy_ctor_mutates_rhs.hpp +++ /dev/null @@ -1,21 +0,0 @@ -// 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 COPY_CTOR_MUTATES_RHS_DWA2003219_HPP -# define COPY_CTOR_MUTATES_RHS_DWA2003219_HPP - -#include -#include - -namespace boost { namespace python { namespace detail { - -template -struct copy_ctor_mutates_rhs - : is_auto_ptr -{ -}; - -}}} // namespace boost::python::detail - -#endif // COPY_CTOR_MUTATES_RHS_DWA2003219_HPP diff --git a/include/boost/python/detail/cv_category.hpp b/include/boost/python/detail/cv_category.hpp deleted file mode 100644 index d32dd0fd..00000000 --- a/include/boost/python/detail/cv_category.hpp +++ /dev/null @@ -1,36 +0,0 @@ -// 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) -#ifndef CV_CATEGORY_DWA200222_HPP -# define CV_CATEGORY_DWA200222_HPP -# include - -namespace boost { namespace python { namespace detail { - -template -struct cv_tag -{ - BOOST_STATIC_CONSTANT(bool, is_const = is_const_); - BOOST_STATIC_CONSTANT(bool, is_volatile = is_volatile_); -}; - -typedef cv_tag cv_unqualified; -typedef cv_tag const_; -typedef cv_tag volatile_; -typedef cv_tag const_volatile_; - -template -struct cv_category -{ -// BOOST_STATIC_CONSTANT(bool, c = is_const::value); -// BOOST_STATIC_CONSTANT(bool, v = is_volatile::value); - typedef cv_tag< - ::boost::is_const::value - , ::boost::is_volatile::value - > type; -}; - -}}} // namespace boost::python::detail - -#endif // CV_CATEGORY_DWA200222_HPP diff --git a/include/boost/python/detail/dealloc.hpp b/include/boost/python/detail/dealloc.hpp deleted file mode 100644 index f2d914b1..00000000 --- a/include/boost/python/detail/dealloc.hpp +++ /dev/null @@ -1,17 +0,0 @@ -// Copyright Gottfried Ganauge 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 BOOST_PYTHON_DETAIL_DEALLOC_HPP_ -# define BOOST_PYTHON_DETAIL_DEALLOC_HPP_ -namespace boost { namespace python { namespace detail { - extern "C" - { - inline void dealloc(PyObject* self) - { - PyObject_Del(self); - } - } -}}} // namespace boost::python::detail -# endif // BOOST_PYTHON_DETAIL_DEALLOC_HPP_ diff --git a/include/boost/python/detail/decorated_type_id.hpp b/include/boost/python/detail/decorated_type_id.hpp deleted file mode 100644 index 535508b4..00000000 --- a/include/boost/python/detail/decorated_type_id.hpp +++ /dev/null @@ -1,76 +0,0 @@ -// 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) -#ifndef DECORATED_TYPE_ID_DWA2002517_HPP -# define DECORATED_TYPE_ID_DWA2002517_HPP - -# include -# include -# include - -namespace boost { namespace python { namespace detail { - -struct decorated_type_info : totally_ordered -{ - enum decoration { const_ = 0x1, volatile_ = 0x2, reference = 0x4 }; - - decorated_type_info(type_info, decoration = decoration()); - - inline bool operator<(decorated_type_info const& rhs) const; - inline bool operator==(decorated_type_info const& rhs) const; - - friend BOOST_PYTHON_DECL std::ostream& operator<<(std::ostream&, decorated_type_info const&); - - operator type_info const&() const; - private: // type - typedef type_info base_id_t; - - private: // data members - decoration m_decoration; - base_id_t m_base_type; -}; - -template -inline decorated_type_info decorated_type_id(boost::type* = 0) -{ - return decorated_type_info( - type_id() - , decorated_type_info::decoration( - (is_const::value || indirect_traits::is_reference_to_const::value - ? decorated_type_info::const_ : 0) - | (is_volatile::value || indirect_traits::is_reference_to_volatile::value - ? decorated_type_info::volatile_ : 0) - | (is_reference::value ? decorated_type_info::reference : 0) - ) - ); -} - -inline decorated_type_info::decorated_type_info(type_info base_t, decoration decoration) - : m_decoration(decoration) - , m_base_type(base_t) -{ -} - -inline bool decorated_type_info::operator<(decorated_type_info const& rhs) const -{ - return m_decoration < rhs.m_decoration - || (m_decoration == rhs.m_decoration - && m_base_type < rhs.m_base_type); -} - -inline bool decorated_type_info::operator==(decorated_type_info const& rhs) const -{ - return m_decoration == rhs.m_decoration && m_base_type == rhs.m_base_type; -} - -inline decorated_type_info::operator type_info const&() const -{ - return m_base_type; -} - -BOOST_PYTHON_DECL std::ostream& operator<<(std::ostream&, decorated_type_info const&); - -}}} // namespace boost::python::detail - -#endif // DECORATED_TYPE_ID_DWA2002517_HPP diff --git a/include/boost/python/detail/decref_guard.hpp b/include/boost/python/detail/decref_guard.hpp deleted file mode 100644 index d713e0a6..00000000 --- a/include/boost/python/detail/decref_guard.hpp +++ /dev/null @@ -1,21 +0,0 @@ -// 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) -#ifndef DECREF_GUARD_DWA20021220_HPP -# define DECREF_GUARD_DWA20021220_HPP - -namespace boost { namespace python { namespace detail { - -struct decref_guard -{ - decref_guard(PyObject* o) : obj(o) {} - ~decref_guard() { Py_XDECREF(obj); } - void cancel() { obj = 0; } - private: - PyObject* obj; -}; - -}}} // namespace boost::python::detail - -#endif // DECREF_GUARD_DWA20021220_HPP diff --git a/include/boost/python/detail/def_helper.hpp b/include/boost/python/detail/def_helper.hpp deleted file mode 100644 index e68ca0cd..00000000 --- a/include/boost/python/detail/def_helper.hpp +++ /dev/null @@ -1,212 +0,0 @@ -// 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) -#ifndef DEF_HELPER_DWA200287_HPP -# define DEF_HELPER_DWA200287_HPP - -# include -# include -# include -# include -# include -# include -# include -# include -# include -# include -# include -# include -# include - -namespace boost { namespace python { - -struct default_call_policies; - -namespace detail -{ - // tuple_extract::extract(t) returns the first - // element of a Tuple whose type E satisfies the given Predicate - // applied to add_reference. The Predicate must be an MPL - // metafunction class. - template - struct tuple_extract; - - // Implementation class for when the tuple's head type does not - // satisfy the Predicate - template - struct tuple_extract_impl - { - template - struct apply - { - typedef typename Tuple::head_type result_type; - - static typename Tuple::head_type extract(Tuple const& x) - { - return x.get_head(); - } - }; - }; - - // Implementation specialization for when the tuple's head type - // satisfies the predicate - template <> - struct tuple_extract_impl - { - template - struct apply - { - // recursive application of tuple_extract on the tail of the tuple - typedef tuple_extract next; - typedef typename next::result_type result_type; - - static result_type extract(Tuple const& x) - { - return next::extract(x.get_tail()); - } - }; - }; - - // A metafunction which selects a version of tuple_extract_impl to - // use for the implementation of tuple_extract - template - struct tuple_extract_base_select - { - typedef typename Tuple::head_type head_type; - typedef typename mpl::apply1::type>::type match_t; - BOOST_STATIC_CONSTANT(bool, match = match_t::value); - typedef typename tuple_extract_impl::template apply type; - }; - - template - struct tuple_extract - : tuple_extract_base_select< - Tuple - , typename mpl::lambda::type - >::type - { - }; - - - // - // Specialized extractors for the docstring, keywords, CallPolicies, - // and default implementation of virtual functions - // - - template - struct doc_extract - : tuple_extract< - Tuple - , mpl::not_< - mpl::or_< - indirect_traits::is_reference_to_class - , indirect_traits::is_reference_to_member_function_pointer - > - > - > - { - }; - - template - struct keyword_extract - : tuple_extract > - { - }; - - template - struct policy_extract - : tuple_extract< - Tuple - , mpl::and_< - mpl::not_ > - , indirect_traits::is_reference_to_class - , mpl::not_ > - > - > - { - }; - - template - struct default_implementation_extract - : tuple_extract< - Tuple - , indirect_traits::is_reference_to_member_function_pointer - > - { - }; - - // - // A helper class for decoding the optional arguments to def() - // invocations, which can be supplied in any order and are - // discriminated by their type properties. The template parameters - // are expected to be the types of the actual (optional) arguments - // passed to def(). - // - template - struct def_helper - { - // A tuple type which begins with references to the supplied - // arguments and ends with actual representatives of the default - // types. - typedef boost::tuples::tuple< - T1 const& - , T2 const& - , T3 const& - , T4 const& - , default_call_policies - , detail::keywords<0> - , char const* - , void(not_specified::*)() // A function pointer type which is never an - // appropriate default implementation - > all_t; - - // Constructors; these initialize an member of the tuple type - // shown above. - def_helper(T1 const& a1) : m_all(a1,m_nil,m_nil,m_nil) {} - def_helper(T1 const& a1, T2 const& a2) : m_all(a1,a2,m_nil,m_nil) {} - def_helper(T1 const& a1, T2 const& a2, T3 const& a3) : m_all(a1,a2,a3,m_nil) {} - def_helper(T1 const& a1, T2 const& a2, T3 const& a3, T4 const& a4) : m_all(a1,a2,a3,a4) {} - - private: // types - typedef typename default_implementation_extract::result_type default_implementation_t; - - public: // Constants which can be used for static assertions. - - // Users must not supply a default implementation for non-class - // methods. - BOOST_STATIC_CONSTANT( - bool, has_default_implementation = ( - !is_same::value)); - - public: // Extractor functions which pull the appropriate value out - // of the tuple - char const* doc() const - { - return doc_extract::extract(m_all); - } - - typename keyword_extract::result_type keywords() const - { - return keyword_extract::extract(m_all); - } - - typename policy_extract::result_type policies() const - { - return policy_extract::extract(m_all); - } - - default_implementation_t default_implementation() const - { - return default_implementation_extract::extract(m_all); - } - - private: // data members - all_t m_all; - not_specified m_nil; // for filling in not_specified slots - }; -} - -}} // namespace boost::python::detail - -#endif // DEF_HELPER_DWA200287_HPP diff --git a/include/boost/python/detail/def_helper_fwd.hpp b/include/boost/python/detail/def_helper_fwd.hpp deleted file mode 100755 index 31c22e97..00000000 --- a/include/boost/python/detail/def_helper_fwd.hpp +++ /dev/null @@ -1,17 +0,0 @@ -// 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_HELPER_FWD_DWA2003810_HPP -# define DEF_HELPER_FWD_DWA2003810_HPP - -# include - -namespace boost { namespace python { namespace detail { - -template -struct def_helper; - -}}} // namespace boost::python::detail - -#endif // DEF_HELPER_FWD_DWA2003810_HPP diff --git a/include/boost/python/detail/defaults_def.hpp b/include/boost/python/detail/defaults_def.hpp deleted file mode 100644 index 68799f83..00000000 --- a/include/boost/python/detail/defaults_def.hpp +++ /dev/null @@ -1,291 +0,0 @@ -/////////////////////////////////////////////////////////////////////////////// -// -// Copyright David Abrahams 2002, Joel de Guzman, 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) -// -/////////////////////////////////////////////////////////////////////////////// -#if !defined(BOOST_PP_IS_ITERATING) - -#ifndef DEFAULTS_DEF_JDG20020811_HPP -#define DEFAULTS_DEF_JDG20020811_HPP - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -/////////////////////////////////////////////////////////////////////////////// -namespace boost { namespace python { - -struct module; - -namespace objects -{ - struct class_base; -} - -namespace detail -{ - // Called as:: - // - // name_space_def(ns, "func", func, kw, policies, docstring, &ns) - // - // Dispatch to properly add f to namespace ns. - // - // @group define_stub_function helpers { - template - static void name_space_def( - NameSpaceT& name_space - , char const* name - , Func f - , keyword_range const& kw - , CallPolicies const& policies - , char const* doc - , objects::class_base* - ) - { - typedef typename NameSpaceT::wrapped_type wrapped_type; - - objects::add_to_namespace( - name_space, name, - detail::make_keyword_range_function( - f, policies, kw, get_signature(f, (wrapped_type*)0)) - , doc - ); - } - - template - static void name_space_def( - object& name_space - , char const* name - , Func f - , keyword_range const& kw - , CallPolicies const& policies - , char const* doc - , ... - ) - { - scope within(name_space); - - detail::scope_setattr_doc( - name - , detail::make_keyword_range_function(f, policies, kw) - , doc); - } - - // For backward compatibility -- is this obsolete? - template - static void name_space_def( - NameSpaceT& name_space - , char const* name - , Func f - , keyword_range const& kw // ignored - , CallPolicies const& policies - , char const* doc - , module* - ) - { - name_space.def(name, f, policies, doc); - } - // } - - - // Expansions of :: - // - // template - // inline void - // define_stub_function( - // char const* name, OverloadsT s, NameSpaceT& name_space, mpl::int_) - // { - // name_space.def(name, &OverloadsT::func_N); - // } - // - // where N runs from 0 to BOOST_PYTHON_MAX_ARITY. - // - // The set of overloaded functions (define_stub_function) expects: - // - // 1. char const* name: function name that will be visible to python - // 2. OverloadsT: a function overloads struct (see defaults_gen.hpp) - // 3. NameSpaceT& name_space: a python::class_ or python::module instance - // 4. int_t: the Nth overloaded function (OverloadsT::func_N) - // (see defaults_gen.hpp) - // 5. char const* name: doc string - // - // @group define_stub_function { - template - struct define_stub_function {}; - -#define BOOST_PP_ITERATION_PARAMS_1 \ - (3, (0, BOOST_PYTHON_MAX_ARITY, )) - -#include BOOST_PP_ITERATE() - - // } - - // This helper template struct does the actual recursive - // definition. There's a generic version - // define_with_defaults_helper and a terminal case - // define_with_defaults_helper<0>. The struct and its - // specialization has a sole static member function def that - // expects: - // - // 1. char const* name: function name that will be - // visible to python - // - // 2. OverloadsT: a function overloads struct - // (see defaults_gen.hpp) - // - // 3. NameSpaceT& name_space: a python::class_ or - // python::module instance - // - // 4. char const* name: doc string - // - // The def static member function calls a corresponding - // define_stub_function. The general case recursively calls - // define_with_defaults_helper::def until it reaches the - // terminal case case define_with_defaults_helper<0>. - template - struct define_with_defaults_helper { - - template - static void - def( - char const* name, - StubsT stubs, - keyword_range kw, - CallPolicies const& policies, - NameSpaceT& name_space, - char const* doc) - { - // define the NTH stub function of stubs - define_stub_function::define(name, stubs, kw, policies, name_space, doc); - - if (kw.second > kw.first) - --kw.second; - - // call the next define_with_defaults_helper - define_with_defaults_helper::def(name, stubs, kw, policies, name_space, doc); - } - }; - - template <> - struct define_with_defaults_helper<0> { - - template - static void - def( - char const* name, - StubsT stubs, - keyword_range const& kw, - CallPolicies const& policies, - NameSpaceT& name_space, - char const* doc) - { - // define the Oth stub function of stubs - define_stub_function<0>::define(name, stubs, kw, policies, name_space, doc); - // return - } - }; - - // define_with_defaults - // - // 1. char const* name: function name that will be - // visible to python - // - // 2. OverloadsT: a function overloads struct - // (see defaults_gen.hpp) - // - // 3. CallPolicies& policies: Call policies - // 4. NameSpaceT& name_space: a python::class_ or - // python::module instance - // - // 5. SigT sig: Function signature typelist - // (see defaults_gen.hpp) - // - // 6. char const* name: doc string - // - // This is the main entry point. This function recursively - // defines all stub functions of StubT (see defaults_gen.hpp) in - // NameSpaceT name_space which can be either a python::class_ or - // a python::module. The sig argument is a typelist that - // specifies the return type, the class (for member functions, - // and the arguments. Here are some SigT examples: - // - // int foo(int) mpl::vector - // void bar(int, int) mpl::vector - // void C::foo(int) mpl::vector - // - template - inline void - define_with_defaults( - char const* name, - OverloadsT const& overloads, - NameSpaceT& name_space, - SigT const&) - { - typedef typename mpl::front::type return_type; - typedef typename OverloadsT::void_return_type void_return_type; - typedef typename OverloadsT::non_void_return_type non_void_return_type; - - typedef typename mpl::if_c< - boost::is_same::value - , void_return_type - , non_void_return_type - >::type stubs_type; - - BOOST_STATIC_ASSERT( - (stubs_type::max_args) <= mpl::size::value); - - typedef typename stubs_type::template gen gen_type; - define_with_defaults_helper::def( - name - , gen_type() - , overloads.keywords() - , overloads.call_policies() - , name_space - , overloads.doc_string()); - } - -} // namespace detail - -}} // namespace boost::python - -#endif // DEFAULTS_DEF_JDG20020811_HPP - -#else // defined(BOOST_PP_IS_ITERATING) -// PP vertical iteration code - - -template <> -struct define_stub_function { - template - static void define( - char const* name - , StubsT const& - , keyword_range const& kw - , CallPolicies const& policies - , NameSpaceT& name_space - , char const* doc) - { - detail::name_space_def( - name_space - , name - , &StubsT::BOOST_PP_CAT(func_, BOOST_PP_ITERATION()) - , kw - , policies - , doc - , &name_space); - } -}; - -#endif // !defined(BOOST_PP_IS_ITERATING) diff --git a/include/boost/python/detail/defaults_gen.hpp b/include/boost/python/detail/defaults_gen.hpp deleted file mode 100644 index 0b3e0e26..00000000 --- a/include/boost/python/detail/defaults_gen.hpp +++ /dev/null @@ -1,388 +0,0 @@ -/////////////////////////////////////////////////////////////////////////////// -// -// Copyright David Abrahams 2002, Joel de Guzman, 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) -// -/////////////////////////////////////////////////////////////////////////////// -#ifndef DEFAULTS_GEN_JDG20020807_HPP -#define DEFAULTS_GEN_JDG20020807_HPP - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -namespace boost { namespace python { - -namespace detail -{ - // overloads_base is used as a base class for all function - // stubs. This class holds the doc_string of the stubs. - struct overloads_base - { - overloads_base(char const* doc_) - : m_doc(doc_) {} - - overloads_base(char const* doc_, detail::keyword_range const& kw) - : m_doc(doc_), m_keywords(kw) {} - - char const* doc_string() const - { - return m_doc; - } - - detail::keyword_range const& keywords() const - { - return m_keywords; - } - - private: - char const* m_doc; - detail::keyword_range m_keywords; - }; - - // overloads_proxy is generated by the overloads_common operator[] (see - // below). This class holds a user defined call policies of the stubs. - template - struct overloads_proxy - : public overloads_base - { - typedef typename OverloadsT::non_void_return_type non_void_return_type; - typedef typename OverloadsT::void_return_type void_return_type; - - overloads_proxy( - CallPoliciesT const& policies_ - , char const* doc - , keyword_range const& kw - ) - : overloads_base(doc, kw) - , policies(policies_) - {} - - CallPoliciesT - call_policies() const - { - return policies; - } - - CallPoliciesT policies; - }; - - // overloads_common is our default function stubs base class. This - // class returns the default_call_policies in its call_policies() - // member function. It can generate a overloads_proxy however through - // its operator[] - template - struct overloads_common - : public overloads_base - { - overloads_common(char const* doc) - : overloads_base(doc) {} - - overloads_common(char const* doc, keyword_range const& kw) - : overloads_base(doc, kw) {} - - default_call_policies - call_policies() const - { - return default_call_policies(); - } - - template - overloads_proxy - operator[](CallPoliciesT const& policies) const - { - return overloads_proxy( - policies, this->doc_string(), this->keywords()); - } - }; - -}}} // namespace boost::python::detail - - -#define BOOST_PYTHON_TYPEDEF_GEN(z, index, data) \ - typedef typename ::boost::mpl::next::type \ - BOOST_PP_CAT(iter, BOOST_PP_INC(index)); \ - typedef typename ::boost::mpl::deref::type \ - BOOST_PP_CAT(T, index); - -#define BOOST_PYTHON_FUNC_WRAPPER_GEN(z, index, data) \ - static RT BOOST_PP_CAT(func_, \ - BOOST_PP_SUB_D(1, index, BOOST_PP_TUPLE_ELEM(3, 1, data))) ( \ - BOOST_PP_ENUM_BINARY_PARAMS_Z( \ - 1, index, T, arg)) \ - { \ - BOOST_PP_TUPLE_ELEM(3, 2, data) \ - BOOST_PP_TUPLE_ELEM(3, 0, data)( \ - BOOST_PP_ENUM_PARAMS( \ - index, \ - arg)); \ - } - -#define BOOST_PYTHON_GEN_FUNCTION(fname, fstubs_name, n_args, n_dflts, ret) \ - struct fstubs_name \ - { \ - BOOST_STATIC_CONSTANT(int, n_funcs = BOOST_PP_INC(n_dflts)); \ - BOOST_STATIC_CONSTANT(int, max_args = n_funcs); \ - \ - template \ - struct gen \ - { \ - typedef typename ::boost::mpl::begin::type rt_iter; \ - typedef typename ::boost::mpl::deref::type RT; \ - typedef typename ::boost::mpl::next::type iter0; \ - \ - BOOST_PP_REPEAT_2ND( \ - n_args, \ - BOOST_PYTHON_TYPEDEF_GEN, \ - 0) \ - \ - BOOST_PP_REPEAT_FROM_TO_2( \ - BOOST_PP_SUB_D(1, n_args, n_dflts), \ - BOOST_PP_INC(n_args), \ - BOOST_PYTHON_FUNC_WRAPPER_GEN, \ - (fname, BOOST_PP_SUB_D(1, n_args, n_dflts), ret)) \ - }; \ - }; \ - -/////////////////////////////////////////////////////////////////////////////// -#define BOOST_PYTHON_MEM_FUNC_WRAPPER_GEN(z, index, data) \ - static RT BOOST_PP_CAT(func_, \ - BOOST_PP_SUB_D(1, index, BOOST_PP_TUPLE_ELEM(3, 1, data))) ( \ - ClassT obj BOOST_PP_COMMA_IF(index) \ - BOOST_PP_ENUM_BINARY_PARAMS_Z(1, index, T, arg) \ - ) \ - { \ - BOOST_PP_TUPLE_ELEM(3, 2, data) obj.BOOST_PP_TUPLE_ELEM(3, 0, data)( \ - BOOST_PP_ENUM_PARAMS(index, arg) \ - ); \ - } - -#define BOOST_PYTHON_GEN_MEM_FUNCTION(fname, fstubs_name, n_args, n_dflts, ret) \ - struct fstubs_name \ - { \ - BOOST_STATIC_CONSTANT(int, n_funcs = BOOST_PP_INC(n_dflts)); \ - BOOST_STATIC_CONSTANT(int, max_args = n_funcs + 1); \ - \ - template \ - struct gen \ - { \ - typedef typename ::boost::mpl::begin::type rt_iter; \ - typedef typename ::boost::mpl::deref::type RT; \ - \ - typedef typename ::boost::mpl::next::type class_iter; \ - typedef typename ::boost::mpl::deref::type ClassT; \ - typedef typename ::boost::mpl::next::type iter0; \ - \ - BOOST_PP_REPEAT_2ND( \ - n_args, \ - BOOST_PYTHON_TYPEDEF_GEN, \ - 0) \ - \ - BOOST_PP_REPEAT_FROM_TO_2( \ - BOOST_PP_SUB_D(1, n_args, n_dflts), \ - BOOST_PP_INC(n_args), \ - BOOST_PYTHON_MEM_FUNC_WRAPPER_GEN, \ - (fname, BOOST_PP_SUB_D(1, n_args, n_dflts), ret)) \ - }; \ - }; - -#define BOOST_PYTHON_OVERLOAD_CONSTRUCTORS(fstubs_name, n_args, n_dflts) \ - fstubs_name(char const* doc = 0) \ - : ::boost::python::detail::overloads_common(doc) {} \ - template \ - fstubs_name(char const* doc, ::boost::python::detail::keywords const& keywords) \ - : ::boost::python::detail::overloads_common( \ - doc, keywords.range()) \ - { \ - typedef typename ::boost::python::detail:: \ - error::more_keywords_than_function_arguments< \ - N,n_args>::too_many_keywords assertion; \ - } \ - template \ - fstubs_name(::boost::python::detail::keywords const& keywords, char const* doc = 0) \ - : ::boost::python::detail::overloads_common( \ - doc, keywords.range()) \ - { \ - typedef typename ::boost::python::detail:: \ - error::more_keywords_than_function_arguments< \ - N,n_args>::too_many_keywords assertion; \ - } - -# if defined(BOOST_NO_VOID_RETURNS) - -# define BOOST_PYTHON_GEN_FUNCTION_STUB(fname, fstubs_name, n_args, n_dflts) \ - struct fstubs_name \ - : public ::boost::python::detail::overloads_common \ - { \ - BOOST_PYTHON_GEN_FUNCTION( \ - fname, non_void_return_type, n_args, n_dflts, return) \ - BOOST_PYTHON_GEN_FUNCTION( \ - fname, void_return_type, n_args, n_dflts, ;) \ - \ - BOOST_PYTHON_OVERLOAD_CONSTRUCTORS(fstubs_name, n_args, n_dflts) \ - }; - -# define BOOST_PYTHON_GEN_MEM_FUNCTION_STUB(fname, fstubs_name, n_args, n_dflts) \ - struct fstubs_name \ - : public ::boost::python::detail::overloads_common \ - { \ - BOOST_PYTHON_GEN_MEM_FUNCTION( \ - fname, non_void_return_type, n_args, n_dflts, return) \ - BOOST_PYTHON_GEN_MEM_FUNCTION( \ - fname, void_return_type, n_args, n_dflts, ;) \ - \ - BOOST_PYTHON_OVERLOAD_CONSTRUCTORS(fstubs_name, n_args + 1, n_dflts) \ - }; - -# else // !defined(BOOST_NO_VOID_RETURNS) - -# define BOOST_PYTHON_GEN_FUNCTION_STUB(fname, fstubs_name, n_args, n_dflts) \ - struct fstubs_name \ - : public ::boost::python::detail::overloads_common \ - { \ - BOOST_PYTHON_GEN_FUNCTION( \ - fname, non_void_return_type, n_args, n_dflts, return) \ - \ - typedef non_void_return_type void_return_type; \ - BOOST_PYTHON_OVERLOAD_CONSTRUCTORS(fstubs_name, n_args, n_dflts) \ - }; - - -# define BOOST_PYTHON_GEN_MEM_FUNCTION_STUB(fname, fstubs_name, n_args, n_dflts) \ - struct fstubs_name \ - : public ::boost::python::detail::overloads_common \ - { \ - BOOST_PYTHON_GEN_MEM_FUNCTION( \ - fname, non_void_return_type, n_args, n_dflts, return) \ - \ - typedef non_void_return_type void_return_type; \ - BOOST_PYTHON_OVERLOAD_CONSTRUCTORS(fstubs_name, n_args + 1, n_dflts) \ - }; - -# endif // !defined(BOOST_NO_VOID_RETURNS) - -/////////////////////////////////////////////////////////////////////////////// -// -// MAIN MACROS -// -// Given generator_name, fname, min_args and max_args, These macros -// generate function stubs that forward to a function or member function -// named fname. max_args is the arity of the function or member function -// fname. fname can have default arguments. min_args is the minimum -// arity that fname can accept. -// -// There are two versions: -// -// 1. BOOST_PYTHON_FUNCTION_OVERLOADS for free functions -// 2. BOOST_PYTHON_MEMBER_FUNCTION_OVERLOADS for member functions. -// -// For instance, given a function: -// -// int -// foo(int a, char b = 1, unsigned c = 2, double d = 3) -// { -// return a + b + c + int(d); -// } -// -// The macro invocation: -// -// BOOST_PYTHON_FUNCTION_OVERLOADS(foo_stubs, foo, 1, 4) -// -// Generates this code: -// -// struct foo_stubsNonVoid -// { -// static const int n_funcs = 4; -// static const int max_args = n_funcs; -// -// template -// struct gen -// { -// typedef typename ::boost::mpl::begin::type rt_iter; -// typedef typename rt_iter::type RT; -// typedef typename rt_iter::next iter0; -// typedef typename iter0::type T0; -// typedef typename iter0::next iter1; -// typedef typename iter1::type T1; -// typedef typename iter1::next iter2; -// typedef typename iter2::type T2; -// typedef typename iter2::next iter3; -// typedef typename iter3::type T3; -// typedef typename iter3::next iter4; -// -// static RT func_0(T0 arg0) -// { return foo(arg0); } -// -// static RT func_1(T0 arg0, T1 arg1) -// { return foo(arg0, arg1); } -// -// static RT func_2(T0 arg0, T1 arg1, T2 arg2) -// { return foo(arg0, arg1, arg2); } -// -// static RT func_3(T0 arg0, T1 arg1, T2 arg2, T3 arg3) -// { return foo(arg0, arg1, arg2, arg3); } -// }; -// }; -// -// struct foo_overloads -// : public boost::python::detail::overloads_common -// { -// typedef foo_overloadsNonVoid non_void_return_type; -// typedef foo_overloadsNonVoid void_return_type; -// -// foo_overloads(char const* doc = 0) -// : boost::python::detail::overloads_common(doc) {} -// }; -// -// The typedefs non_void_return_type and void_return_type are -// used to handle compilers that do not support void returns. The -// example above typedefs non_void_return_type and -// void_return_type to foo_overloadsNonVoid. On compilers that do -// not support void returns, there are two versions: -// foo_overloadsNonVoid and foo_overloadsVoid. The "Void" -// version is almost identical to the "NonVoid" version except -// for the return type (void) and the lack of the return keyword. -// -// See the overloads_common above for a description of the -// foo_overloads' base class. -// -/////////////////////////////////////////////////////////////////////////////// -#define BOOST_PYTHON_FUNCTION_OVERLOADS(generator_name, fname, min_args, max_args) \ - BOOST_PYTHON_GEN_FUNCTION_STUB( \ - fname, \ - generator_name, \ - max_args, \ - BOOST_PP_SUB_D(1, max_args, min_args)) - -#define BOOST_PYTHON_MEMBER_FUNCTION_OVERLOADS(generator_name, fname, min_args, max_args) \ - BOOST_PYTHON_GEN_MEM_FUNCTION_STUB( \ - fname, \ - generator_name, \ - max_args, \ - BOOST_PP_SUB_D(1, max_args, min_args)) - -// deprecated macro names (to be removed) -#define BOOST_PYTHON_FUNCTION_GENERATOR BOOST_PYTHON_FUNCTION_OVERLOADS -#define BOOST_PYTHON_MEM_FUN_GENERATOR BOOST_PYTHON_MEMBER_FUNCTION_OVERLOADS - -/////////////////////////////////////////////////////////////////////////////// -#endif // DEFAULTS_GEN_JDG20020807_HPP - - diff --git a/include/boost/python/detail/dependent.hpp b/include/boost/python/detail/dependent.hpp deleted file mode 100644 index 70392c4d..00000000 --- a/include/boost/python/detail/dependent.hpp +++ /dev/null @@ -1,27 +0,0 @@ -// 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) -#ifndef DEPENDENT_DWA200286_HPP -# define DEPENDENT_DWA200286_HPP - -namespace boost { namespace python { namespace detail { - -// A way to turn a concrete type T into a type dependent on U. This -// keeps conforming compilers (those implementing proper 2-phase -// name lookup for templates) from complaining about incomplete -// types in situations where it would otherwise be inconvenient or -// impossible to re-order code so that all types are defined in time. - -// One such use is when we must return an incomplete T from a member -// function template (which must be defined in the class body to -// keep MSVC happy). -template -struct dependent -{ - typedef T type; -}; - -}}} // namespace boost::python::detail - -#endif // DEPENDENT_DWA200286_HPP diff --git a/include/boost/python/detail/destroy.hpp b/include/boost/python/detail/destroy.hpp deleted file mode 100644 index 3ea64553..00000000 --- a/include/boost/python/detail/destroy.hpp +++ /dev/null @@ -1,63 +0,0 @@ -// 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) -#ifndef DESTROY_DWA2002221_HPP -# define DESTROY_DWA2002221_HPP - -# include -# include -namespace boost { namespace python { namespace detail { - -template struct value_destroyer; - -template <> -struct value_destroyer -{ - template - static void execute(T const volatile* p) - { - p->~T(); - } -}; - -template <> -struct value_destroyer -{ - template - static void execute(A*, T const volatile* const first) - { - for (T const volatile* p = first; p != first + sizeof(A)/sizeof(T); ++p) - { - value_destroyer< - boost::is_array::value - >::execute(p); - } - } - - template - static void execute(T const volatile* p) - { - execute(p, *p); - } -}; - -template -inline void destroy_referent_impl(void* p, T& (*)()) -{ - // note: cv-qualification needed for MSVC6 - // must come *before* T for metrowerks - value_destroyer< - (boost::is_array::value) - >::execute((const volatile T*)p); -} - -template -inline void destroy_referent(void* p, T(*)() = 0) -{ - destroy_referent_impl(p, (T(*)())0); -} - -}}} // namespace boost::python::detail - -#endif // DESTROY_DWA2002221_HPP diff --git a/include/boost/python/detail/enable_if.hpp b/include/boost/python/detail/enable_if.hpp deleted file mode 100644 index 7a37be12..00000000 --- a/include/boost/python/detail/enable_if.hpp +++ /dev/null @@ -1,39 +0,0 @@ -// Copyright David Abrahams 2004. 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 ENABLE_IF_DWA2004722_HPP -# define ENABLE_IF_DWA2004722_HPP - -# include -# include - -#if !defined(BOOST_NO_SFINAE) -# include - -namespace boost { namespace python { namespace detail { - -template -struct enable_if_arg - : enable_if -{}; - -template -struct disable_if_arg - : disable_if -{}; - -template -struct enable_if_ret - : enable_if -{}; - -template -struct disable_if_ret - : disable_if -{}; - -}}} // namespace boost::python::detail - -# endif - -#endif // ENABLE_IF_DWA2004722_HPP diff --git a/include/boost/python/detail/exception_handler.hpp b/include/boost/python/detail/exception_handler.hpp deleted file mode 100644 index 7f49868b..00000000 --- a/include/boost/python/detail/exception_handler.hpp +++ /dev/null @@ -1,48 +0,0 @@ -// 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) -#ifndef EXCEPTION_HANDLER_DWA2002810_HPP -# define EXCEPTION_HANDLER_DWA2002810_HPP - -# include -# include -# include - -namespace boost { namespace python { namespace detail { - -struct BOOST_PYTHON_DECL_FORWARD exception_handler; - -typedef function2 const&> handler_function; - -struct BOOST_PYTHON_DECL exception_handler -{ - private: // types - - public: - explicit exception_handler(handler_function const& impl); - - inline bool handle(function0 const& f) const; - - bool operator()(function0 const& f) const; - - static exception_handler* chain; - - private: - static exception_handler* tail; - - handler_function m_impl; - exception_handler* m_next; -}; - - -inline bool exception_handler::handle(function0 const& f) const -{ - return this->m_impl(*this, f); -} - -BOOST_PYTHON_DECL void register_exception_handler(handler_function const& f); - -}}} // namespace boost::python::detail - -#endif // EXCEPTION_HANDLER_DWA2002810_HPP diff --git a/include/boost/python/detail/force_instantiate.hpp b/include/boost/python/detail/force_instantiate.hpp deleted file mode 100644 index a8901b2d..00000000 --- a/include/boost/python/detail/force_instantiate.hpp +++ /dev/null @@ -1,18 +0,0 @@ -// 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) -#ifndef FORCE_INSTANTIATE_DWA200265_HPP -# define FORCE_INSTANTIATE_DWA200265_HPP - -namespace boost { namespace python { namespace detail { - -// Allows us to force the argument to be instantiated without -// incurring unused variable warnings - -template -inline void force_instantiate(T const&) {} - -}}} // namespace boost::python::detail - -#endif // FORCE_INSTANTIATE_DWA200265_HPP diff --git a/include/boost/python/detail/if_else.hpp b/include/boost/python/detail/if_else.hpp deleted file mode 100644 index 3f505c5e..00000000 --- a/include/boost/python/detail/if_else.hpp +++ /dev/null @@ -1,81 +0,0 @@ -// 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) -#ifndef IF_ELSE_DWA2002322_HPP -# define IF_ELSE_DWA2002322_HPP -# include - -namespace boost { namespace python { namespace detail { - -template struct elif_selected; - -template -struct if_selected -{ - template - struct elif : elif_selected - { - }; - - template - struct else_ - { - typedef T type; - }; -}; - -template -struct elif_selected -{ -# if !(defined(__MWERKS__) && __MWERKS__ <= 0x2407) - template class then; -# else - template - struct then : if_selected - { - }; -# endif -}; - -# if !(defined(__MWERKS__) && __MWERKS__ <= 0x2407) -template -template -class elif_selected::then : public if_selected -{ -}; -# endif - -template struct if_ -{ - template - struct then : if_selected - { - }; -}; - -struct if_unselected -{ - template struct elif : if_ - { - }; - - template - struct else_ - { - typedef U type; - }; -}; - -template <> -struct if_ -{ - template - struct then : if_unselected - { - }; -}; - -}}} // namespace boost::python::detail - -#endif // IF_ELSE_DWA2002322_HPP diff --git a/include/boost/python/detail/indirect_traits.hpp b/include/boost/python/detail/indirect_traits.hpp deleted file mode 100644 index ce8ba310..00000000 --- a/include/boost/python/detail/indirect_traits.hpp +++ /dev/null @@ -1,13 +0,0 @@ -// Copyright David Abrahams 2004. 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 INDIRECT_TRAITS_DWA2004915_HPP -# define INDIRECT_TRAITS_DWA2004915_HPP - -# include - -namespace boost { namespace python { -namespace indirect_traits = boost::detail::indirect_traits; -}} // namespace boost::python::detail - -#endif // INDIRECT_TRAITS_DWA2004915_HPP diff --git a/include/boost/python/detail/invoke.hpp b/include/boost/python/detail/invoke.hpp deleted file mode 100644 index 939fa118..00000000 --- a/include/boost/python/detail/invoke.hpp +++ /dev/null @@ -1,100 +0,0 @@ -#if !defined(BOOST_PP_IS_ITERATING) - -// 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) -# ifndef INVOKE_DWA20021122_HPP -# define INVOKE_DWA20021122_HPP - -# include -# include -# include - -# include - -# include -# include -# include -# include -# include -# include - -// This file declares a series of overloaded invoke(...) functions, -// used to invoke wrapped C++ function (object)s from Python. Each one -// accepts: -// -// - a tag which identifies the invocation syntax (e.g. member -// functions must be invoked with a different syntax from regular -// functions) -// -// - a pointer to a result converter type, used solely as a way of -// transmitting the type of the result converter to the function (or -// an int, if the return type is void). -// -// - the "function", which may be a function object, a function or -// member function pointer, or a defaulted_virtual_fn. -// -// - The arg_from_python converters for each of the arguments to be -// passed to the function being invoked. - -namespace boost { namespace python { namespace detail { - -// This "result converter" is really just used as a dispatch tag to -// invoke(...), selecting the appropriate implementation -typedef int void_result_to_python; - -template -struct invoke_tag_ {}; - -// A metafunction returning the appropriate tag type for invoking an -// object of type F with return type R. -template -struct invoke_tag - : invoke_tag_< - is_same::value - , is_member_function_pointer::value - > -{ -}; - -# define BOOST_PP_ITERATION_PARAMS_1 \ - (3, (0, BOOST_PYTHON_MAX_ARITY, )) -# include BOOST_PP_ITERATE() - -}}} // namespace boost::python::detail - -# endif // INVOKE_DWA20021122_HPP -#else - -# define N BOOST_PP_ITERATION() - -template -inline PyObject* invoke(invoke_tag_, RC const& rc, F& f BOOST_PP_ENUM_TRAILING_BINARY_PARAMS_Z(1, N, AC, & ac) ) -{ - return rc(f( BOOST_PP_ENUM_BINARY_PARAMS_Z(1, N, ac, () BOOST_PP_INTERCEPT) )); -} - -template -inline PyObject* invoke(invoke_tag_, RC const&, F& f BOOST_PP_ENUM_TRAILING_BINARY_PARAMS_Z(1, N, AC, & ac) ) -{ - f( BOOST_PP_ENUM_BINARY_PARAMS_Z(1, N, ac, () BOOST_PP_INTERCEPT) ); - return none(); -} - -template -inline PyObject* invoke(invoke_tag_, RC const& rc, F& f, TC& tc BOOST_PP_ENUM_TRAILING_BINARY_PARAMS_Z(1, N, AC, & ac) ) -{ - return rc( (tc().*f)(BOOST_PP_ENUM_BINARY_PARAMS_Z(1, N, ac, () BOOST_PP_INTERCEPT)) ); -} - -template -inline PyObject* invoke(invoke_tag_, RC const&, F& f, TC& tc BOOST_PP_ENUM_TRAILING_BINARY_PARAMS_Z(1, N, AC, & ac) ) -{ - (tc().*f)(BOOST_PP_ENUM_BINARY_PARAMS_Z(1, N, ac, () BOOST_PP_INTERCEPT)); - return none(); -} - -# undef N - -#endif // BOOST_PP_IS_ITERATING diff --git a/include/boost/python/detail/is_auto_ptr.hpp b/include/boost/python/detail/is_auto_ptr.hpp deleted file mode 100644 index 3b8198b8..00000000 --- a/include/boost/python/detail/is_auto_ptr.hpp +++ /dev/null @@ -1,30 +0,0 @@ -// 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 IS_AUTO_PTR_DWA2003224_HPP -# define IS_AUTO_PTR_DWA2003224_HPP - -# ifndef BOOST_NO_AUTO_PTR -# include -# include -# endif - -namespace boost { namespace python { namespace detail { - -# if !defined(BOOST_NO_AUTO_PTR) - -BOOST_PYTHON_IS_XXX_DEF(auto_ptr, std::auto_ptr, 1) - -# else - -template -struct is_auto_ptr : mpl::false_ -{ -}; - -# endif - -}}} // namespace boost::python::detail - -#endif // IS_AUTO_PTR_DWA2003224_HPP diff --git a/include/boost/python/detail/is_shared_ptr.hpp b/include/boost/python/detail/is_shared_ptr.hpp deleted file mode 100755 index 547af3f1..00000000 --- a/include/boost/python/detail/is_shared_ptr.hpp +++ /dev/null @@ -1,17 +0,0 @@ -// 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 IS_SHARED_PTR_DWA2003224_HPP -# define IS_SHARED_PTR_DWA2003224_HPP - -# include -# include - -namespace boost { namespace python { namespace detail { - -BOOST_PYTHON_IS_XXX_DEF(shared_ptr, shared_ptr, 1) - -}}} // namespace boost::python::detail - -#endif // IS_SHARED_PTR_DWA2003224_HPP diff --git a/include/boost/python/detail/is_wrapper.hpp b/include/boost/python/detail/is_wrapper.hpp deleted file mode 100755 index d7bce7b6..00000000 --- a/include/boost/python/detail/is_wrapper.hpp +++ /dev/null @@ -1,29 +0,0 @@ -// Copyright David Abrahams 2004. 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 IS_WRAPPER_DWA2004723_HPP -# define IS_WRAPPER_DWA2004723_HPP - -# include -# include - -namespace boost { namespace python { - -template class wrapper; - -namespace detail -{ - typedef char (&is_not_wrapper)[2]; - is_not_wrapper is_wrapper_helper(...); - template - char is_wrapper_helper(wrapper const volatile*); - - // A metafunction returning true iff T is [derived from] wrapper - template - struct is_wrapper - : mpl::bool_<(sizeof(detail::is_wrapper_helper((T*)0)) == 1)> - {}; - -}}} // namespace boost::python::detail - -#endif // IS_WRAPPER_DWA2004723_HPP diff --git a/include/boost/python/detail/is_xxx.hpp b/include/boost/python/detail/is_xxx.hpp deleted file mode 100644 index 9ddfafd3..00000000 --- a/include/boost/python/detail/is_xxx.hpp +++ /dev/null @@ -1,13 +0,0 @@ -// Copyright David Abrahams 2005. -// 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 IS_XXX_DWA2003224_HPP -# define IS_XXX_DWA2003224_HPP - -# include - -# define BOOST_PYTHON_IS_XXX_DEF(name, qualified_name, nargs) \ - BOOST_DETAIL_IS_XXX_DEF(name, qualified_name, nargs) - -#endif // IS_XXX_DWA2003224_HPP diff --git a/include/boost/python/detail/make_keyword_range_fn.hpp b/include/boost/python/detail/make_keyword_range_fn.hpp deleted file mode 100644 index c4795cf8..00000000 --- a/include/boost/python/detail/make_keyword_range_fn.hpp +++ /dev/null @@ -1,72 +0,0 @@ -// 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) -#ifndef MAKE_KEYWORD_RANGE_FN_DWA2002927_HPP -# define MAKE_KEYWORD_RANGE_FN_DWA2002927_HPP - -# include -# include - -# include - -# include - - -namespace boost { namespace python { namespace detail { - -// Think of this as a version of make_function without a compile-time -// check that the size of kw is no greater than the expected arity of -// F. This version is needed when defining functions with default -// arguments, because compile-time information about the number of -// keywords is missing for all but the initial function definition. -// -// @group make_keyword_range_function { -template -object make_keyword_range_function( - F f - , Policies const& policies - , keyword_range const& kw) -{ - return detail::make_function_aux( - f, policies, detail::get_signature(f), kw, mpl::int_<0>()); -} - -template -object make_keyword_range_function( - F f - , Policies const& policies - , keyword_range const& kw - , Signature const& sig) -{ - return detail::make_function_aux( - f, policies, sig, kw, mpl::int_<0>()); -} -// } - -// Builds an '__init__' function which inserts the given Holder type -// in a wrapped C++ class instance. ArgList is an MPL type sequence -// describing the C++ argument types to be passed to Holder's -// constructor. -// -// Holder and ArgList are intended to be explicitly specified. -template -object make_keyword_range_constructor( - CallPolicies const& policies // The CallPolicies with which to invoke the Holder's constructor - , detail::keyword_range const& kw // The (possibly empty) set of associated argument keywords - , Holder* = 0 - , ArgList* = 0, Arity* = 0) -{ -#if !defined( BOOST_PYTHON_NO_PY_SIGNATURES) && defined( BOOST_PYTHON_PY_SIGNATURES_PROPER_INIT_SELF_TYPE) - python_class::register_(); -#endif - return detail::make_keyword_range_function( - objects::make_holder - ::template apply::execute - , policies - , kw); -} - -}}} // namespace boost::python::detail - -#endif // MAKE_KEYWORD_RANGE_FN_DWA2002927_HPP diff --git a/include/boost/python/detail/make_tuple.hpp b/include/boost/python/detail/make_tuple.hpp deleted file mode 100644 index 57b285be..00000000 --- a/include/boost/python/detail/make_tuple.hpp +++ /dev/null @@ -1,32 +0,0 @@ -# ifndef BOOST_PYTHON_SYNOPSIS -# // 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) - -# if !defined(BOOST_PP_IS_ITERATING) -# error Boost.Python - do not include this file! -# endif - -# define N BOOST_PP_ITERATION() - -# define BOOST_PYTHON_MAKE_TUPLE_ARG(z, N, ignored) \ - PyTuple_SET_ITEM( \ - result.ptr() \ - , N \ - , python::incref(python::object(a##N).ptr()) \ - ); - - template - tuple - make_tuple(BOOST_PP_ENUM_BINARY_PARAMS_Z(1, N, A, const& a)) - { - tuple result((detail::new_reference)::PyTuple_New(N)); - BOOST_PP_REPEAT_1ST(N, BOOST_PYTHON_MAKE_TUPLE_ARG, _) - return result; - } - -# undef BOOST_PYTHON_MAKE_TUPLE_ARG - -# undef N -# endif // BOOST_PYTHON_SYNOPSIS diff --git a/include/boost/python/detail/map_entry.hpp b/include/boost/python/detail/map_entry.hpp deleted file mode 100644 index 8bf1759f..00000000 --- a/include/boost/python/detail/map_entry.hpp +++ /dev/null @@ -1,43 +0,0 @@ -// 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) -#ifndef MAP_ENTRY_DWA2002118_HPP -# define MAP_ENTRY_DWA2002118_HPP - -namespace boost { namespace python { namespace detail { - -// A trivial type that works well as the value_type of associative -// vector maps -template -struct map_entry -{ - map_entry() {} - map_entry(Key k) : key(k), value() {} - map_entry(Key k, Value v) : key(k), value(v) {} - - bool operator<(map_entry const& rhs) const - { - return this->key < rhs.key; - } - - Key key; - Value value; -}; - -template -bool operator<(map_entry const& e, Key const& k) -{ - return e.key < k; -} - -template -bool operator<(Key const& k, map_entry const& e) -{ - return k < e.key; -} - - -}}} // namespace boost::python::detail - -#endif // MAP_ENTRY_DWA2002118_HPP diff --git a/include/boost/python/detail/mpl_lambda.hpp b/include/boost/python/detail/mpl_lambda.hpp deleted file mode 100644 index a20608e7..00000000 --- a/include/boost/python/detail/mpl_lambda.hpp +++ /dev/null @@ -1,12 +0,0 @@ -// 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) -#ifndef MPL_LAMBDA_DWA2002122_HPP -# define MPL_LAMBDA_DWA2002122_HPP - -// this header should go away soon -# include -# define BOOST_PYTHON_MPL_LAMBDA_SUPPORT BOOST_MPL_AUX_LAMBDA_SUPPORT - -#endif // MPL_LAMBDA_DWA2002122_HPP diff --git a/include/boost/python/detail/msvc_typeinfo.hpp b/include/boost/python/detail/msvc_typeinfo.hpp deleted file mode 100644 index bfc84164..00000000 --- a/include/boost/python/detail/msvc_typeinfo.hpp +++ /dev/null @@ -1,84 +0,0 @@ -// 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) -#ifndef MSVC_TYPEINFO_DWA200222_HPP -# define MSVC_TYPEINFO_DWA200222_HPP - -#include -#include - -// -// Fix for icc's broken typeid() implementation which doesn't strip -// decoration. This fix doesn't handle cv-qualified array types. It -// could probably be done, but I haven't figured it out yet. -// - -// Note: This file is badly named. It initially was MSVC specific, but was -// extended to cover intel too. Now the old version of MSVC is no longer -// supported, but the intel version is still supported. - -# if defined(BOOST_INTEL_CXX_VERSION) && BOOST_INTEL_CXX_VERSION <= 700 - -namespace boost { namespace python { namespace detail { - -typedef std::type_info const& typeinfo; - -template -static typeinfo typeid_nonref(T const volatile*) { return typeid(T); } - -template -inline typeinfo typeid_ref_1(T&(*)()) -{ - return detail::typeid_nonref((T*)0); -} - -// A non-reference -template -inline typeinfo typeid_ref(type*, T&(*)(type)) -{ - return detail::typeid_nonref((T*)0); -} - -// A reference -template -inline typeinfo typeid_ref(type*, ...) -{ - return detail::typeid_ref_1((T(*)())0); -} - -#if defined(BOOST_MSVC) || (defined(__BORLANDC__) && !defined(BOOST_DISABLE_WIN32)) -# define BOOST_PYTT_DECL __cdecl -#else -# define BOOST_PYTT_DECL /**/ -#endif - -template< typename T > T&(* is_ref_tester1(type) )(type) { return 0; } -inline char BOOST_PYTT_DECL is_ref_tester1(...) { return 0; } - -template -inline typeinfo msvc_typeid(boost::type*) -{ - return detail::typeid_ref( - (boost::type*)0, detail::is_ref_tester1(type()) - ); -} - -template <> -inline typeinfo msvc_typeid(boost::type*) -{ - return typeid(void); -} - -# ifndef NDEBUG -inline typeinfo assert_array_typeid_compiles() -{ - return msvc_typeid((boost::type*)0) - , msvc_typeid((boost::type*)0); -} -# endif - -}}} // namespace boost::python::detail - -# endif // BOOST_INTEL_CXX_VERSION -#endif // MSVC_TYPEINFO_DWA200222_HPP diff --git a/include/boost/python/detail/none.hpp b/include/boost/python/detail/none.hpp deleted file mode 100644 index bc3337a2..00000000 --- a/include/boost/python/detail/none.hpp +++ /dev/null @@ -1,20 +0,0 @@ -// (C) Copyright David Abrahams 2000. -// 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) -// -// The author gratefully acknowleges the support of Dragon Systems, Inc., in -// producing this work. - -#ifndef NONE_DWA_052000_H_ -# define NONE_DWA_052000_H_ - -# include - -namespace boost { namespace python { namespace detail { - -inline PyObject* none() { Py_INCREF(Py_None); return Py_None; } - -}}} // namespace boost::python::detail - -#endif // NONE_DWA_052000_H_ diff --git a/include/boost/python/detail/not_specified.hpp b/include/boost/python/detail/not_specified.hpp deleted file mode 100644 index 2f7c7ad9..00000000 --- a/include/boost/python/detail/not_specified.hpp +++ /dev/null @@ -1,14 +0,0 @@ -// 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) -#ifndef NOT_SPECIFIED_DWA2002321_HPP -# define NOT_SPECIFIED_DWA2002321_HPP - -namespace boost { namespace python { namespace detail { - - struct not_specified {}; - -}}} // namespace boost::python::detail - -#endif // NOT_SPECIFIED_DWA2002321_HPP diff --git a/include/boost/python/detail/nullary_function_adaptor.hpp b/include/boost/python/detail/nullary_function_adaptor.hpp deleted file mode 100755 index 9dcc434f..00000000 --- a/include/boost/python/detail/nullary_function_adaptor.hpp +++ /dev/null @@ -1,46 +0,0 @@ -// 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 NULLARY_FUNCTION_ADAPTOR_DWA2003824_HPP -# define NULLARY_FUNCTION_ADAPTOR_DWA2003824_HPP - -# include -# include -# include -# include -# include - -namespace boost { namespace python { namespace detail { - -// nullary_function_adaptor -- a class template which ignores its -// arguments and calls a nullary function instead. Used for building -// error-reporting functions, c.f. pure_virtual -template -struct nullary_function_adaptor -{ - nullary_function_adaptor(NullaryFunction fn) - : m_fn(fn) - {} - - void operator()() const { m_fn(); } - -# define BOOST_PP_LOCAL_MACRO(i) \ - template \ - void operator()( \ - BOOST_PP_ENUM_BINARY_PARAMS_Z(1, i, A, const& BOOST_PP_INTERCEPT) \ - ) const \ - { \ - m_fn(); \ - } - -# define BOOST_PP_LOCAL_LIMITS (1, BOOST_PYTHON_MAX_ARITY) -# include BOOST_PP_LOCAL_ITERATE() - - private: - NullaryFunction m_fn; -}; - -}}} // namespace boost::python::detail - -#endif // NULLARY_FUNCTION_ADAPTOR_DWA2003824_HPP diff --git a/include/boost/python/detail/operator_id.hpp b/include/boost/python/detail/operator_id.hpp deleted file mode 100644 index ecfc70f1..00000000 --- a/include/boost/python/detail/operator_id.hpp +++ /dev/null @@ -1,63 +0,0 @@ -// 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) -#ifndef OPERATOR_ID_DWA2002531_HPP -# define OPERATOR_ID_DWA2002531_HPP - -namespace boost { namespace python { namespace detail { - -enum operator_id -{ - op_add, - op_sub, - op_mul, - op_div, - op_mod, - op_divmod, - op_pow, - op_lshift, - op_rshift, - op_and, - op_xor, - op_or, - op_neg, - op_pos, - op_abs, - op_invert, - op_int, - op_long, - op_float, - op_str, - op_cmp, - op_gt, - op_ge, - op_lt, - op_le, - op_eq, - op_ne, - op_iadd, - op_isub, - op_imul, - op_idiv, - op_imod, - op_ilshift, - op_irshift, - op_iand, - op_ixor, - op_ior, - op_complex, -#if PY_VERSION_HEX >= 0x03000000 - op_bool, -#else - op_nonzero, -#endif - op_repr -#if PY_VERSION_HEX >= 0x03000000 - ,op_truediv -#endif -}; - -}}} // namespace boost::python::detail - -#endif // OPERATOR_ID_DWA2002531_HPP diff --git a/include/boost/python/detail/overloads_fwd.hpp b/include/boost/python/detail/overloads_fwd.hpp deleted file mode 100644 index 4c7fdf29..00000000 --- a/include/boost/python/detail/overloads_fwd.hpp +++ /dev/null @@ -1,18 +0,0 @@ -// 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) -#ifndef OVERLOADS_FWD_DWA2002101_HPP -# define OVERLOADS_FWD_DWA2002101_HPP - -namespace boost { namespace python { namespace detail { - -// forward declarations -struct overloads_base; - -template -inline void define_with_defaults(char const* name, OverloadsT const&, NameSpaceT&, SigT const&); - -}}} // namespace boost::python::detail - -#endif // OVERLOADS_FWD_DWA2002101_HPP diff --git a/include/boost/python/detail/pointee.hpp b/include/boost/python/detail/pointee.hpp deleted file mode 100644 index e18c1f49..00000000 --- a/include/boost/python/detail/pointee.hpp +++ /dev/null @@ -1,35 +0,0 @@ -// 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) -#ifndef POINTEE_DWA2002323_HPP -# define POINTEE_DWA2002323_HPP - -# include - -namespace boost { namespace python { namespace detail { - -template -struct pointee_impl -{ - template struct apply : remove_pointer {}; -}; - -template <> -struct pointee_impl -{ - template struct apply - { - typedef typename T::element_type type; - }; -}; - -template -struct pointee - : pointee_impl::value>::template apply -{ -}; - -}}} // namespace boost::python::detail - -#endif // POINTEE_DWA2002323_HPP diff --git a/include/boost/python/detail/prefix.hpp b/include/boost/python/detail/prefix.hpp deleted file mode 100755 index 8b34ed77..00000000 --- a/include/boost/python/detail/prefix.hpp +++ /dev/null @@ -1,16 +0,0 @@ -// 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 PREFIX_DWA2003531_HPP -# define PREFIX_DWA2003531_HPP - -// The rule is that must be included before any system -// headers (so it can get control over some awful macros). -// Unfortunately, Boost.Python needs to #include first, at -// least... but this gets us as close as possible. - -# include -# include - -#endif // PREFIX_DWA2003531_HPP diff --git a/include/boost/python/detail/preprocessor.hpp b/include/boost/python/detail/preprocessor.hpp deleted file mode 100644 index 2c1b2e84..00000000 --- a/include/boost/python/detail/preprocessor.hpp +++ /dev/null @@ -1,66 +0,0 @@ -// 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) -#ifndef PREPROCESSOR_DWA200247_HPP -# define PREPROCESSOR_DWA200247_HPP - -# include -# include -# include -# include - -// stuff that should be in the preprocessor library - -# define BOOST_PYTHON_APPLY(x) BOOST_PP_CAT(BOOST_PYTHON_APPLY_, x) - -# define BOOST_PYTHON_APPLY_BOOST_PYTHON_ITEM(v) v -# define BOOST_PYTHON_APPLY_BOOST_PYTHON_NIL - -// cv-qualifiers - -# if !defined(__MWERKS__) || __MWERKS__ > 0x2407 -# define BOOST_PYTHON_CV_COUNT 4 -# else -# define BOOST_PYTHON_CV_COUNT 1 -# endif - -# ifndef BOOST_PYTHON_MAX_ARITY -# define BOOST_PYTHON_MAX_ARITY 15 -# endif - -# ifndef BOOST_PYTHON_MAX_BASES -# define BOOST_PYTHON_MAX_BASES 10 -# endif - -# define BOOST_PYTHON_CV_QUALIFIER(i) \ - BOOST_PYTHON_APPLY( \ - BOOST_PP_TUPLE_ELEM(4, i, BOOST_PYTHON_CV_QUALIFIER_I) \ - ) - -# define BOOST_PYTHON_CV_QUALIFIER_I \ - ( \ - BOOST_PYTHON_NIL, \ - BOOST_PYTHON_ITEM(const), \ - BOOST_PYTHON_ITEM(volatile), \ - BOOST_PYTHON_ITEM(const volatile) \ - ) - -// enumerators -# define BOOST_PYTHON_UNARY_ENUM(c, text) BOOST_PP_REPEAT(c, BOOST_PYTHON_UNARY_ENUM_I, text) -# define BOOST_PYTHON_UNARY_ENUM_I(z, n, text) BOOST_PP_COMMA_IF(n) text ## n - -# define BOOST_PYTHON_BINARY_ENUM(c, a, b) BOOST_PP_REPEAT(c, BOOST_PYTHON_BINARY_ENUM_I, (a, b)) -# define BOOST_PYTHON_BINARY_ENUM_I(z, n, _) BOOST_PP_COMMA_IF(n) BOOST_PP_CAT(BOOST_PP_TUPLE_ELEM(2, 0, _), n) BOOST_PP_CAT(BOOST_PP_TUPLE_ELEM(2, 1, _), n) - -# define BOOST_PYTHON_ENUM_WITH_DEFAULT(c, text, def) BOOST_PP_REPEAT(c, BOOST_PYTHON_ENUM_WITH_DEFAULT_I, (text, def)) -# define BOOST_PYTHON_ENUM_WITH_DEFAULT_I(z, n, _) BOOST_PP_COMMA_IF(n) BOOST_PP_CAT(BOOST_PP_TUPLE_ELEM(2, 0, _), n) = BOOST_PP_TUPLE_ELEM(2, 1, _) - -// fixed text (no commas) -# define BOOST_PYTHON_FIXED(z, n, text) text - -// flags -# define BOOST_PYTHON_FUNCTION_POINTER 0x0001 -# define BOOST_PYTHON_POINTER_TO_MEMBER 0x0002 - -#endif // PREPROCESSOR_DWA200247_HPP diff --git a/include/boost/python/detail/python22_fixed.h b/include/boost/python/detail/python22_fixed.h deleted file mode 100644 index 32bf941f..00000000 --- a/include/boost/python/detail/python22_fixed.h +++ /dev/null @@ -1,152 +0,0 @@ -// This file is a modified version of Python 2.2/2.2.1 Python.h. As -// such it is: -// -// Copyright (c) 2001, 2002 Python Software Foundation; All Rights -// Reserved -// -// boostinspect:nolicense (don't complain about the lack of a Boost license) -// -// Changes from the original: -// 1. #includes for Python 2.2.1 -// 2. Provides missing extern "C" wrapper for "iterobject.h" and "descrobject.h". -// - -// Changes marked with "Boost.Python modification" -#ifndef Py_PYTHON_H -#define Py_PYTHON_H -/* Since this is a "meta-include" file, no #ifdef __cplusplus / extern "C" { */ - - -/* Enable compiler features; switching on C lib defines doesn't work - here, because the symbols haven't necessarily been defined yet. */ -#ifndef _GNU_SOURCE -# define _GNU_SOURCE 1 -#endif - -/* Forcing SUSv2 compatibility still produces problems on some - platforms, True64 and SGI IRIX begin two of them, so for now the - define is switched off. */ -#if 0 -#ifndef _XOPEN_SOURCE -# define _XOPEN_SOURCE 500 -#endif -#endif - -/* Include nearly all Python header files */ - -#include "patchlevel.h" -#include "pyconfig.h" - -#ifdef HAVE_LIMITS_H -#include -#endif - -/* pyconfig.h may or may not define DL_IMPORT */ -#ifndef DL_IMPORT /* declarations for DLL import/export */ -#define DL_IMPORT(RTYPE) RTYPE -#endif -#ifndef DL_EXPORT /* declarations for DLL import/export */ -#define DL_EXPORT(RTYPE) RTYPE -#endif - -#if defined(__sgi) && defined(WITH_THREAD) && !defined(_SGI_MP_SOURCE) -#define _SGI_MP_SOURCE -#endif - -#include -#ifndef NULL -# error "Python.h requires that stdio.h define NULL." -#endif - -#include -#include -#ifdef HAVE_STDLIB_H -#include -#endif -#if PY_MICRO_VERSION == 1 // Boost.Python modification: emulate Python 2.2 -#ifdef HAVE_UNISTD_H -#include -#endif -#endif // Boost.Python modification: emulate Python 2.2 - -/* CAUTION: Build setups should ensure that NDEBUG is defined on the - * compiler command line when building Python in release mode; else - * assert() calls won't be removed. - */ -#include - -#include "pyport.h" - -#include "pymem.h" - -#include "object.h" -#include "objimpl.h" - -#include "pydebug.h" - -#include "unicodeobject.h" -#include "intobject.h" -#include "longobject.h" -#include "floatobject.h" -#ifndef WITHOUT_COMPLEX -#include "complexobject.h" -#endif -#include "rangeobject.h" -#include "stringobject.h" -#include "bufferobject.h" -#include "tupleobject.h" -#include "listobject.h" -#include "dictobject.h" -#include "methodobject.h" -#include "moduleobject.h" -#include "funcobject.h" -#include "classobject.h" -#include "fileobject.h" -#include "cobject.h" -#include "traceback.h" -#include "sliceobject.h" -#include "cellobject.h" -extern "C" { // Boost.Python modification: provide missing extern "C" -#include "iterobject.h" -#include "descrobject.h" -} // Boost.Python modification: provide missing extern "C" -#include "weakrefobject.h" - -#include "codecs.h" -#include "pyerrors.h" - -#include "pystate.h" - -#include "modsupport.h" -#include "pythonrun.h" -#include "ceval.h" -#include "sysmodule.h" -#include "intrcheck.h" -#include "import.h" - -#include "abstract.h" - -#define PyArg_GetInt(v, a) PyArg_Parse((v), "i", (a)) -#define PyArg_NoArgs(v) PyArg_Parse(v, "") - -/* Convert a possibly signed character to a nonnegative int */ -/* XXX This assumes characters are 8 bits wide */ -#ifdef __CHAR_UNSIGNED__ -#define Py_CHARMASK(c) (c) -#else -#define Py_CHARMASK(c) ((c) & 0xff) -#endif - -#include "pyfpe.h" - -/* These definitions must match corresponding definitions in graminit.h. - There's code in compile.c that checks that they are the same. */ -#define Py_single_input 256 -#define Py_file_input 257 -#define Py_eval_input 258 - -#ifdef HAVE_PTH -/* GNU pth user-space thread support */ -#include -#endif -#endif /* !Py_PYTHON_H */ diff --git a/include/boost/python/detail/python_type.hpp b/include/boost/python/detail/python_type.hpp deleted file mode 100755 index f7630c17..00000000 --- a/include/boost/python/detail/python_type.hpp +++ /dev/null @@ -1,37 +0,0 @@ -// Copyright Nikolay Mladenov 2007. -// 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 BOOST_PYTHON_OBJECT_PYTHON_TYPE_H -#define BOOST_PYTHON_OBJECT_PYTHON_TYPE_H - -#include - -namespace boost {namespace python {namespace detail{ - - -template struct python_class : PyObject -{ - typedef python_class this_type; - - typedef T type; - - static void *converter (PyObject *p){ - return p; - } - - static void register_() - { - static bool first_time = true; - - if ( !first_time ) return; - - first_time = false; - converter::registry::insert(&converter, boost::python::type_id(), &converter::registered_pytype_direct::get_pytype); - } -}; - - -}}} //namespace boost :: python :: detail - -#endif //BOOST_PYTHON_OBJECT_PYTHON_TYPE_H diff --git a/include/boost/python/detail/raw_pyobject.hpp b/include/boost/python/detail/raw_pyobject.hpp deleted file mode 100644 index 194409ed..00000000 --- a/include/boost/python/detail/raw_pyobject.hpp +++ /dev/null @@ -1,32 +0,0 @@ -// 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) -#ifndef RAW_PYOBJECT_DWA2002628_HPP -# define RAW_PYOBJECT_DWA2002628_HPP - -namespace boost { namespace python { namespace detail { - -// -// Define some types which we can use to get around the vagaries of -// PyObject*. We will use these to initialize object instances, and -// keep them in namespace detail to make sure they stay out of the -// hands of users. That is much simpler than trying to grant -// friendship to all the appropriate parties. -// - -// New references are normally checked for null -struct new_reference_t; -typedef new_reference_t* new_reference; - -// Borrowed references are assumed to be non-null -struct borrowed_reference_t; -typedef borrowed_reference_t* borrowed_reference; - -// New references which aren't checked for null -struct new_non_null_reference_t; -typedef new_non_null_reference_t* new_non_null_reference; - -}}} // namespace boost::python::detail - -#endif // RAW_PYOBJECT_DWA2002628_HPP diff --git a/include/boost/python/detail/referent_storage.hpp b/include/boost/python/detail/referent_storage.hpp deleted file mode 100644 index 2cddf696..00000000 --- a/include/boost/python/detail/referent_storage.hpp +++ /dev/null @@ -1,66 +0,0 @@ -// 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) -#ifndef REFERENT_STORAGE_DWA200278_HPP -# define REFERENT_STORAGE_DWA200278_HPP -# include -# include - -namespace boost { namespace python { namespace detail { - -struct alignment_dummy; -typedef void (*function_ptr)(); -typedef int (alignment_dummy::*member_ptr); -typedef int (alignment_dummy::*member_function_ptr)(); - -# define BOOST_PYTHON_ALIGNER(T, n) \ - typename mpl::if_c< \ - sizeof(T) <= size, T, char>::type t##n - -// Storage for size bytes, aligned to all fundamental types no larger than size -template -union aligned_storage -{ - BOOST_PYTHON_ALIGNER(char, 0); - BOOST_PYTHON_ALIGNER(short, 1); - BOOST_PYTHON_ALIGNER(int, 2); - BOOST_PYTHON_ALIGNER(long, 3); - BOOST_PYTHON_ALIGNER(float, 4); - BOOST_PYTHON_ALIGNER(double, 5); - BOOST_PYTHON_ALIGNER(long double, 6); - BOOST_PYTHON_ALIGNER(void*, 7); - BOOST_PYTHON_ALIGNER(function_ptr, 8); - BOOST_PYTHON_ALIGNER(member_ptr, 9); - BOOST_PYTHON_ALIGNER(member_function_ptr, 10); - char bytes[size]; -}; - -# undef BOOST_PYTHON_ALIGNER - - // Compute the size of T's referent. We wouldn't need this at all, - // but sizeof() is broken in CodeWarriors <= 8.0 - template struct referent_size; - - - template - struct referent_size - { - BOOST_STATIC_CONSTANT( - std::size_t, value = sizeof(T)); - }; - - -// A metafunction returning a POD type which can store U, where T == -// U&. If T is not a reference type, returns a POD which can store T. -template -struct referent_storage -{ - typedef aligned_storage< - ::boost::python::detail::referent_size::value - > type; -}; - -}}} // namespace boost::python::detail - -#endif // REFERENT_STORAGE_DWA200278_HPP diff --git a/include/boost/python/detail/result.hpp b/include/boost/python/detail/result.hpp deleted file mode 100644 index 8ccc3c50..00000000 --- a/include/boost/python/detail/result.hpp +++ /dev/null @@ -1,133 +0,0 @@ -#if !defined(BOOST_PP_IS_ITERATING) - -// 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) - -# ifndef RESULT_DWA2002521_HPP -# define RESULT_DWA2002521_HPP - -# include - -# include - -# include -# include - -# include -# include -# include -# include -# include - -namespace boost { namespace python { namespace detail { - -// Defines a family of overloaded function which, given x, a function -// pointer, member [function] pointer, or an AdaptableFunction object, -// returns a pointer to type*, where R is the result type of -// invoking the result of bind(x). -// -// In order to work around bugs in deficient compilers, if x might be -// an AdaptableFunction object, you must pass OL as a second argument -// to get this to work portably. - -# define BOOST_PP_ITERATION_PARAMS_1 \ - (4, (0, BOOST_PYTHON_MAX_ARITY, , BOOST_PYTHON_FUNCTION_POINTER)) -# include BOOST_PP_ITERATE() - -# define BOOST_PP_ITERATION_PARAMS_1 \ - (4, (0, BOOST_PYTHON_CV_COUNT - 1, , BOOST_PYTHON_POINTER_TO_MEMBER)) -# include BOOST_PP_ITERATE() - -template -boost::type* result(R (T::*), int = 0) { return 0; } - -# if (defined(__MWERKS__) && __MWERKS__ < 0x3000) -// This code actually works on all implementations, but why use it when we don't have to? -template -struct get_result_type -{ - typedef boost::type type; -}; - -struct void_type -{ - typedef void type; -}; - -template -struct result_result -{ - typedef typename mpl::if_c< - is_class::value - , get_result_type - , void_type - >::type t1; - - typedef typename t1::type* type; -}; - -template -typename result_result::type -result(X const&, short) { return 0; } - -# else // Simpler code for more-capable compilers -template -boost::type* -result(X const&, short = 0) { return 0; } - -# endif - -}}} // namespace boost::python::detail - -# endif // RESULT_DWA2002521_HPP - -/* --------------- function pointers --------------- */ -// For gcc 4.4 compatability, we must include the -// BOOST_PP_ITERATION_DEPTH test inside an #else clause. -#else // BOOST_PP_IS_ITERATING -#if BOOST_PP_ITERATION_DEPTH() == 1 && BOOST_PP_ITERATION_FLAGS() == BOOST_PYTHON_FUNCTION_POINTER -# if !(BOOST_WORKAROUND(__MWERKS__, > 0x3100) \ - && BOOST_WORKAROUND(__MWERKS__, BOOST_TESTED_AT(0x3201))) -# line BOOST_PP_LINE(__LINE__, result.hpp(function pointers)) -# endif - -# define N BOOST_PP_ITERATION() - -template -boost::type* result(R (*)(BOOST_PP_ENUM_PARAMS_Z(1, N, A)), int = 0) -{ - return 0; -} - -# undef N - -/* --------------- pointers-to-members --------------- */ -#elif BOOST_PP_ITERATION_DEPTH() == 1 && BOOST_PP_ITERATION_FLAGS() == BOOST_PYTHON_POINTER_TO_MEMBER -// Outer over cv-qualifiers - -# define BOOST_PP_ITERATION_PARAMS_2 (3, (0, BOOST_PYTHON_MAX_ARITY, )) -# include BOOST_PP_ITERATE() - -#elif BOOST_PP_ITERATION_DEPTH() == 2 -# if !(BOOST_WORKAROUND(__MWERKS__, > 0x3100) \ - && BOOST_WORKAROUND(__MWERKS__, BOOST_TESTED_AT(0x3201))) -# line BOOST_PP_LINE(__LINE__, result.hpp(pointers-to-members)) -# endif -// Inner over arities - -# define N BOOST_PP_ITERATION() -# define Q BOOST_PYTHON_CV_QUALIFIER(BOOST_PP_RELATIVE_ITERATION(1)) - -template -boost::type* result(R (T::*)(BOOST_PP_ENUM_PARAMS_Z(1, N, A)) Q, int = 0) -{ - return 0; -} - -# undef N -# undef Q - -#endif // BOOST_PP_ITERATION_DEPTH() -#endif diff --git a/include/boost/python/detail/scope.hpp b/include/boost/python/detail/scope.hpp deleted file mode 100644 index 5367bbd3..00000000 --- a/include/boost/python/detail/scope.hpp +++ /dev/null @@ -1,16 +0,0 @@ -// 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) -#ifndef SCOPE_DWA2002927_HPP -# define SCOPE_DWA2002927_HPP - -# include - -namespace boost { namespace python { namespace detail { - -void BOOST_PYTHON_DECL scope_setattr_doc(char const* name, object const& obj, char const* doc); - -}}} // namespace boost::python::detail - -#endif // SCOPE_DWA2002927_HPP diff --git a/include/boost/python/detail/sfinae.hpp b/include/boost/python/detail/sfinae.hpp deleted file mode 100755 index 62818751..00000000 --- a/include/boost/python/detail/sfinae.hpp +++ /dev/null @@ -1,13 +0,0 @@ -// Copyright David Abrahams 2004. 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 SFINAE_DWA2004723_HPP -# define SFINAE_DWA2004723_HPP - -# include - -# if defined(BOOST_NO_SFINAE) && !defined(BOOST_MSVC) -# define BOOST_PYTHON_NO_SFINAE -# endif - -#endif // SFINAE_DWA2004723_HPP diff --git a/include/boost/python/detail/signature.hpp b/include/boost/python/detail/signature.hpp deleted file mode 100644 index 11268b92..00000000 --- a/include/boost/python/detail/signature.hpp +++ /dev/null @@ -1,106 +0,0 @@ -#if !defined(BOOST_PP_IS_ITERATING) - -// 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) - -# ifndef SIGNATURE_DWA20021121_HPP -# define SIGNATURE_DWA20021121_HPP - -# include - -# include -# include -# include - -# include -# include - -# include -# include - -namespace boost { namespace python { namespace detail { - -struct signature_element -{ - char const* basename; - converter::pytype_function pytype_f; - bool lvalue; -}; - -struct py_func_sig_info -{ - signature_element const *signature; - signature_element const *ret; -}; - -template struct signature_arity; - -# define BOOST_PP_ITERATION_PARAMS_1 \ - (3, (0, BOOST_PYTHON_MAX_ARITY + 1, )) -# include BOOST_PP_ITERATE() - -// A metafunction returning the base class used for -// -// signature. -// -template -struct signature_base_select -{ - enum { arity = mpl::size::value - 1 }; - typedef typename signature_arity::template impl type; -}; - -template -struct signature - : signature_base_select::type -{ -}; - -}}} // namespace boost::python::detail - -# endif // SIGNATURE_DWA20021121_HPP - -#else - -# define N BOOST_PP_ITERATION() - -template <> -struct signature_arity -{ - template - struct impl - { - static signature_element const* elements() - { - static signature_element const result[N+2] = { - -#ifndef BOOST_PYTHON_NO_PY_SIGNATURES -# define BOOST_PP_LOCAL_MACRO(i) \ - { \ - type_id::type>().name() \ - , &converter::expected_pytype_for_arg::type>::get_pytype \ - , indirect_traits::is_reference_to_non_const::type>::value \ - }, -#else -# define BOOST_PP_LOCAL_MACRO(i) \ - { \ - type_id::type>().name() \ - , 0 \ - , indirect_traits::is_reference_to_non_const::type>::value \ - }, -#endif - -# define BOOST_PP_LOCAL_LIMITS (0, N) -# include BOOST_PP_LOCAL_ITERATE() - {0,0,0} - }; - return result; - } - }; -}; - -#endif // BOOST_PP_IS_ITERATING - - diff --git a/include/boost/python/detail/string_literal.hpp b/include/boost/python/detail/string_literal.hpp deleted file mode 100644 index a56e72ec..00000000 --- a/include/boost/python/detail/string_literal.hpp +++ /dev/null @@ -1,50 +0,0 @@ -// 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) -#ifndef STRING_LITERAL_DWA2002629_HPP -# define STRING_LITERAL_DWA2002629_HPP - -# include -# include -# include -# include -# include -# include - -namespace boost { namespace python { namespace detail { - -template -struct is_string_literal : mpl::false_ -{ -}; - -# if !defined(__MWERKS__) || __MWERKS__ > 0x2407 -template -struct is_string_literal : mpl::true_ -{ -}; - -# if BOOST_WORKAROUND(__DECCXX_VER, BOOST_TESTED_AT(60590040)) \ - || (defined(__sgi) && defined(_COMPILER_VERSION) && _COMPILER_VERSION <= 730) -// This compiler mistakenly gets the type of string literals as char* -// instead of char[NN]. -template <> -struct is_string_literal : mpl::true_ -{ -}; -# endif - -# else - -// CWPro7 has trouble with the array type deduction above -template -struct is_string_literal - : is_same -{ -}; -# endif - -}}} // namespace boost::python::detail - -#endif // STRING_LITERAL_DWA2002629_HPP diff --git a/include/boost/python/detail/target.hpp b/include/boost/python/detail/target.hpp deleted file mode 100644 index 137801bb..00000000 --- a/include/boost/python/detail/target.hpp +++ /dev/null @@ -1,86 +0,0 @@ -#if !defined(BOOST_PP_IS_ITERATING) - -// 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) - -# ifndef TARGET_DWA2002521_HPP -# define TARGET_DWA2002521_HPP - -# include - -# include - -# include -# include -# include -# include -# include -# include - -namespace boost { namespace python { namespace detail { - -# define BOOST_PP_ITERATION_PARAMS_1 \ - (4, (0, BOOST_PYTHON_MAX_ARITY, , BOOST_PYTHON_FUNCTION_POINTER)) -# include BOOST_PP_ITERATE() - -# define BOOST_PP_ITERATION_PARAMS_1 \ - (4, (0, BOOST_PYTHON_CV_COUNT - 1, , BOOST_PYTHON_POINTER_TO_MEMBER)) -# include BOOST_PP_ITERATE() - -template -T& (* target(R (T::*)) )() { return 0; } - -}}} // namespace boost::python::detail - -# endif // TARGET_DWA2002521_HPP - -/* --------------- function pointers --------------- */ -// For gcc 4.4 compatability, we must include the -// BOOST_PP_ITERATION_DEPTH test inside an #else clause. -#else // BOOST_PP_IS_ITERATING -#if BOOST_PP_ITERATION_DEPTH() == 1 && BOOST_PP_ITERATION_FLAGS() == BOOST_PYTHON_FUNCTION_POINTER -# if !(BOOST_WORKAROUND(__MWERKS__, > 0x3100) \ - && BOOST_WORKAROUND(__MWERKS__, BOOST_TESTED_AT(0x3201))) -# line BOOST_PP_LINE(__LINE__, target.hpp(function_pointers)) -# endif - -# define N BOOST_PP_ITERATION() - -template -BOOST_PP_IF(N, A0, void)(* target(R (*)(BOOST_PP_ENUM_PARAMS_Z(1, N, A))) )() -{ - return 0; -} - -# undef N - -/* --------------- pointers-to-members --------------- */ -#elif BOOST_PP_ITERATION_DEPTH() == 1 && BOOST_PP_ITERATION_FLAGS() == BOOST_PYTHON_POINTER_TO_MEMBER -// Outer over cv-qualifiers - -# define BOOST_PP_ITERATION_PARAMS_2 (3, (0, BOOST_PYTHON_MAX_ARITY, )) -# include BOOST_PP_ITERATE() - -#elif BOOST_PP_ITERATION_DEPTH() == 2 -# if !(BOOST_WORKAROUND(__MWERKS__, > 0x3100) \ - && BOOST_WORKAROUND(__MWERKS__, BOOST_TESTED_AT(0x3201))) -# line BOOST_PP_LINE(__LINE__, target.hpp(pointers-to-members)) -# endif -// Inner over arities - -# define N BOOST_PP_ITERATION() -# define Q BOOST_PYTHON_CV_QUALIFIER(BOOST_PP_RELATIVE_ITERATION(1)) - -template -T& (* target(R (T::*)(BOOST_PP_ENUM_PARAMS_Z(1, N, A)) Q) )() -{ - return 0; -} - -# undef N -# undef Q - -#endif // BOOST_PP_ITERATION_DEPTH() -#endif diff --git a/include/boost/python/detail/translate_exception.hpp b/include/boost/python/detail/translate_exception.hpp deleted file mode 100644 index df7ec2dd..00000000 --- a/include/boost/python/detail/translate_exception.hpp +++ /dev/null @@ -1,69 +0,0 @@ -// 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) -#ifndef TRANSLATE_EXCEPTION_TDS20091020_HPP -# define TRANSLATE_EXCEPTION_TDS20091020_HPP - -# include - -# include -# include -# include -# include - -# include - -namespace boost { namespace python { namespace detail { - -// A ternary function object used to translate C++ exceptions of type -// ExceptionType into Python exceptions by invoking an object of type -// Translate. Typically the translate function will be curried with -// boost::bind(). -template -struct translate_exception -{ -// workaround for broken gcc that ships with SuSE 9.0 and SuSE 9.1 -# if defined(__linux__) && defined(__GNUC__) \ - && BOOST_WORKAROUND(__GNUC__, == 3) \ - && BOOST_WORKAROUND(__GNUC_MINOR__, == 3) \ - && (BOOST_WORKAROUND(__GNUC_PATCHLEVEL__, == 1) \ - || BOOST_WORKAROUND(__GNUC_PATCHLEVEL__, == 3)) - typedef typename remove_reference< - typename add_const::type - >::type exception_non_ref; -# else - typedef typename add_reference< - typename add_const::type - >::type exception_cref; -# endif - - inline bool operator()( - exception_handler const& handler - , function0 const& f - , typename call_traits::param_type translate) const - { - try - { - return handler(f); - } -// workaround for broken gcc that ships with SuSE 9.0 and SuSE 9.1 -# if defined(__linux__) && defined(__GNUC__) \ - && BOOST_WORKAROUND(__GNUC__, == 3) \ - && BOOST_WORKAROUND(__GNUC_MINOR__, == 3) \ - && (BOOST_WORKAROUND(__GNUC_PATCHLEVEL__, == 1) \ - || BOOST_WORKAROUND(__GNUC_PATCHLEVEL__, == 3)) - catch(exception_non_ref& e) -# else - catch(exception_cref e) -# endif - { - translate(e); - return true; - } - } -}; - -}}} // namespace boost::python::detail - -#endif // TRANSLATE_EXCEPTION_DWA2002810_HPP diff --git a/include/boost/python/detail/type_list.hpp b/include/boost/python/detail/type_list.hpp deleted file mode 100644 index 0ad3f63d..00000000 --- a/include/boost/python/detail/type_list.hpp +++ /dev/null @@ -1,35 +0,0 @@ -// 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) -#ifndef TYPE_LIST_DWA2002913_HPP -# define TYPE_LIST_DWA2002913_HPP - -# include -# include -# include - -# if BOOST_PYTHON_MAX_ARITY + 2 > BOOST_PYTHON_MAX_BASES -# define BOOST_PYTHON_LIST_SIZE BOOST_PP_INC(BOOST_PP_INC(BOOST_PYTHON_MAX_ARITY)) -# else -# define BOOST_PYTHON_LIST_SIZE BOOST_PYTHON_MAX_BASES -# endif - -// Compute the MPL vector header to use for lists up to BOOST_PYTHON_LIST_SIZE in length -# if BOOST_PYTHON_LIST_SIZE > 48 -# error Arities above 48 not supported by Boost.Python due to MPL internal limit -# elif BOOST_PYTHON_LIST_SIZE > 38 -# include -# elif BOOST_PYTHON_LIST_SIZE > 28 -# include -# elif BOOST_PYTHON_LIST_SIZE > 18 -# include -# elif BOOST_PYTHON_LIST_SIZE > 8 -# include -# else -# include -# endif - -# include - -#endif // TYPE_LIST_DWA2002913_HPP diff --git a/include/boost/python/detail/type_list_impl.hpp b/include/boost/python/detail/type_list_impl.hpp deleted file mode 100644 index fdcfa850..00000000 --- a/include/boost/python/detail/type_list_impl.hpp +++ /dev/null @@ -1,57 +0,0 @@ -#ifndef BOOST_PP_IS_ITERATING -// 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) -# ifndef TYPE_LIST_IMPL_DWA2002913_HPP -# define TYPE_LIST_IMPL_DWA2002913_HPP - -# include - -# include -# include -# include -# include -# include -# include -# include - -namespace boost { namespace python { namespace detail { - -template -struct type_list - : BOOST_PP_CAT(mpl::vector,BOOST_PYTHON_LIST_SIZE) -{ -}; - -# define BOOST_PP_ITERATION_PARAMS_1 \ - (3, (0, BOOST_PP_DEC(BOOST_PYTHON_LIST_SIZE), )) -# include BOOST_PP_ITERATE() - - -}}} // namespace boost::python::detail - -# endif // TYPE_LIST_IMPL_DWA2002913_HPP - -#else // BOOST_PP_IS_ITERATING - -# define N BOOST_PP_ITERATION() -# define BOOST_PYTHON_VOID_ARGS BOOST_PP_SUB_D(1,BOOST_PYTHON_LIST_SIZE,N) - -template < - BOOST_PP_ENUM_PARAMS_Z(1, N, class T) - > -struct type_list< - BOOST_PP_ENUM_PARAMS_Z(1, N, T) - BOOST_PP_COMMA_IF(N) - BOOST_PP_ENUM( - BOOST_PYTHON_VOID_ARGS, BOOST_PYTHON_FIXED, mpl::void_) - > - : BOOST_PP_CAT(mpl::vector,N) -{ -}; - -# undef BOOST_PYTHON_VOID_ARGS -# undef N - -#endif // BOOST_PP_IS_ITERATING diff --git a/include/boost/python/detail/unwind_type.hpp b/include/boost/python/detail/unwind_type.hpp deleted file mode 100755 index 9a997c9d..00000000 --- a/include/boost/python/detail/unwind_type.hpp +++ /dev/null @@ -1,170 +0,0 @@ -// 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) -#ifndef UNWIND_TYPE_DWA200222_HPP -# define UNWIND_TYPE_DWA200222_HPP - -# include -# include -# include - -namespace boost { namespace python { namespace detail { - -#ifndef _MSC_VER //if forward declared, msvc6.5 does not recognize them as inline -// forward declaration, required (at least) by Tru64 cxx V6.5-042 -template -inline typename Generator::result_type -unwind_type(U const& p, Generator* = 0); - -// forward declaration, required (at least) by Tru64 cxx V6.5-042 -template -inline typename Generator::result_type -unwind_type(boost::type*p = 0, Generator* = 0); -#endif - -template -inline typename Generator::result_type -unwind_type_cv(U* p, cv_unqualified, Generator* = 0) -{ - return Generator::execute(p); -} - -template -inline typename Generator::result_type -unwind_type_cv(U const* p, const_, Generator* = 0) -{ - return unwind_type(const_cast(p), (Generator*)0); -} - -template -inline typename Generator::result_type -unwind_type_cv(U volatile* p, volatile_, Generator* = 0) -{ - return unwind_type(const_cast(p), (Generator*)0); -} - -template -inline typename Generator::result_type -unwind_type_cv(U const volatile* p, const_volatile_, Generator* = 0) -{ - return unwind_type(const_cast(p), (Generator*)0); -} - -template -inline typename Generator::result_type -unwind_ptr_type(U* p, Generator* = 0) -{ - typedef typename cv_category::type tag; - return unwind_type_cv(p, tag()); -} - -template -struct unwind_helper -{ - template - static typename Generator::result_type - execute(U p, Generator* = 0) - { - return unwind_ptr_type(p, (Generator*)0); - } -}; - -template <> -struct unwind_helper -{ - template - static typename Generator::result_type - execute(U& p, Generator* = 0) - { - return unwind_ptr_type(&p, (Generator*)0); - } -}; - -template -inline typename Generator::result_type -#ifndef _MSC_VER -unwind_type(U const& p, Generator*) -#else -unwind_type(U const& p, Generator* = 0) -#endif -{ - return unwind_helper::value>::execute(p, (Generator*)0); -} - -enum { direct_ = 0, pointer_ = 1, reference_ = 2, reference_to_pointer_ = 3 }; -template struct unwind_helper2; - -template <> -struct unwind_helper2 -{ - template - static typename Generator::result_type - execute(U(*)(), Generator* = 0) - { - return unwind_ptr_type((U*)0, (Generator*)0); - } -}; - -template <> -struct unwind_helper2 -{ - template - static typename Generator::result_type - execute(U*(*)(), Generator* = 0) - { - return unwind_ptr_type((U*)0, (Generator*)0); - } -}; - -template <> -struct unwind_helper2 -{ - template - static typename Generator::result_type - execute(U&(*)(), Generator* = 0) - { - return unwind_ptr_type((U*)0, (Generator*)0); - } -}; - -template <> -struct unwind_helper2 -{ - template - static typename Generator::result_type - execute(U&(*)(), Generator* = 0) - { - return unwind_ptr_type(U(0), (Generator*)0); - } -}; - -// Call this one with both template parameters explicitly specified -// and no function arguments: -// -// return unwind_type(); -// -// Doesn't work if T is an array type; we could handle that case, but -// why bother? -template -inline typename Generator::result_type -#ifndef _MSC_VER -unwind_type(boost::type*, Generator*) -#else -unwind_type(boost::type*p =0, Generator* =0) -#endif -{ - BOOST_STATIC_CONSTANT(int, indirection - = (boost::is_pointer::value ? pointer_ : 0) - + (indirect_traits::is_reference_to_pointer::value - ? reference_to_pointer_ - : boost::is_reference::value - ? reference_ - : 0)); - - return unwind_helper2::execute((U(*)())0,(Generator*)0); -} - -}}} // namespace boost::python::detail - -#endif // UNWIND_TYPE_DWA200222_HPP diff --git a/include/boost/python/detail/unwrap_type_id.hpp b/include/boost/python/detail/unwrap_type_id.hpp deleted file mode 100755 index 96c1f530..00000000 --- a/include/boost/python/detail/unwrap_type_id.hpp +++ /dev/null @@ -1,31 +0,0 @@ -// Copyright David Abrahams 2004. 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 UNWRAP_TYPE_ID_DWA2004722_HPP -# define UNWRAP_TYPE_ID_DWA2004722_HPP - -# include - -# include - -namespace boost { namespace python { - -template class wrapper; - -namespace detail { - -template -inline type_info unwrap_type_id(T*, ...) -{ - return type_id(); -} - -template -inline type_info unwrap_type_id(U*, wrapper*) -{ - return type_id(); -} - -}}} // namespace boost::python::detail - -#endif // UNWRAP_TYPE_ID_DWA2004722_HPP diff --git a/include/boost/python/detail/unwrap_wrapper.hpp b/include/boost/python/detail/unwrap_wrapper.hpp deleted file mode 100755 index 95bc233a..00000000 --- a/include/boost/python/detail/unwrap_wrapper.hpp +++ /dev/null @@ -1,34 +0,0 @@ -// Copyright David Abrahams 2004. 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 UNWRAP_WRAPPER_DWA2004723_HPP -# define UNWRAP_WRAPPER_DWA2004723_HPP - -# include -# include -# include -# include - -namespace boost { namespace python { namespace detail { - -template -struct unwrap_wrapper_helper -{ - typedef typename T::_wrapper_wrapped_type_ type; -}; - -template -struct unwrap_wrapper_ - : mpl::eval_if,unwrap_wrapper_helper,mpl::identity > -{}; - -template -typename unwrap_wrapper_::type* -unwrap_wrapper(T*) -{ - return 0; -} - -}}} // namespace boost::python::detail - -#endif // UNWRAP_WRAPPER_DWA2004723_HPP diff --git a/include/boost/python/detail/value_arg.hpp b/include/boost/python/detail/value_arg.hpp deleted file mode 100755 index 747588d6..00000000 --- a/include/boost/python/detail/value_arg.hpp +++ /dev/null @@ -1,27 +0,0 @@ -// Copyright David Abrahams 2004. 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 VALUE_ARG_DWA2004312_HPP -# define VALUE_ARG_DWA2004312_HPP - -# include -# include -# include -# include - -namespace boost { namespace python { namespace detail { - -template -struct value_arg - : mpl::if_< - copy_ctor_mutates_rhs - , T - , typename add_reference< - typename add_const::type - >::type - > -{}; - -}}} // namespace boost::python::detail - -#endif // VALUE_ARG_DWA2004312_HPP diff --git a/include/boost/python/detail/value_is_shared_ptr.hpp b/include/boost/python/detail/value_is_shared_ptr.hpp deleted file mode 100644 index 361c369b..00000000 --- a/include/boost/python/detail/value_is_shared_ptr.hpp +++ /dev/null @@ -1,17 +0,0 @@ -// 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 VALUE_IS_SHARED_PTR_DWA2003224_HPP -# define VALUE_IS_SHARED_PTR_DWA2003224_HPP - -# include -# include - -namespace boost { namespace python { namespace detail { - -BOOST_PYTHON_VALUE_IS_XXX_DEF(shared_ptr, shared_ptr, 1) - -}}} // namespace boost::python::detail - -#endif // VALUE_IS_SHARED_PTR_DWA2003224_HPP diff --git a/include/boost/python/detail/value_is_xxx.hpp b/include/boost/python/detail/value_is_xxx.hpp deleted file mode 100644 index fbb9defd..00000000 --- a/include/boost/python/detail/value_is_xxx.hpp +++ /dev/null @@ -1,32 +0,0 @@ -// 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 VALUE_IS_XXX_DWA2003224_HPP -# define VALUE_IS_XXX_DWA2003224_HPP - -# include -# include -# include - - -# include -# include -# include - -# define BOOST_PYTHON_VALUE_IS_XXX_DEF(name, qualified_name, nargs) \ -template \ -struct value_is_##name \ -{ \ - BOOST_PYTHON_IS_XXX_DEF(name,qualified_name,nargs) \ - BOOST_STATIC_CONSTANT(bool, value = is_##name< \ - typename remove_cv< \ - typename remove_reference::type \ - >::type \ - >::value); \ - typedef mpl::bool_ type; \ - \ -}; - - -#endif // VALUE_IS_XXX_DWA2003224_HPP diff --git a/include/boost/python/detail/void_ptr.hpp b/include/boost/python/detail/void_ptr.hpp deleted file mode 100644 index 06f68010..00000000 --- a/include/boost/python/detail/void_ptr.hpp +++ /dev/null @@ -1,35 +0,0 @@ -// 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) -#ifndef VOID_PTR_DWA200239_HPP -# define VOID_PTR_DWA200239_HPP - -# include - -namespace boost { namespace python { namespace detail { - -template -inline U& void_ptr_to_reference(void const volatile* p, U&(*)()) -{ - return *(U*)p; -} - -template -inline void write_void_ptr(void const volatile* storage, void* ptr, T*) -{ - *(T**)storage = (T*)ptr; -} - -// writes U(ptr) into the storage -template -inline void write_void_ptr_reference(void const volatile* storage, void* ptr, U&(*)()) -{ - // stripping CV qualification suppresses warnings on older EDGs - typedef typename remove_cv::type u_stripped; - write_void_ptr(storage, ptr, u_stripped(0)); -} - -}}} // namespace boost::python::detail - -#endif // VOID_PTR_DWA200239_HPP diff --git a/include/boost/python/detail/void_return.hpp b/include/boost/python/detail/void_return.hpp deleted file mode 100644 index 30db8251..00000000 --- a/include/boost/python/detail/void_return.hpp +++ /dev/null @@ -1,42 +0,0 @@ -// 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) -#ifndef VOID_RETURN_DWA200274_HPP -# define VOID_RETURN_DWA200274_HPP - -# include - -namespace boost { namespace python { namespace detail { - -struct void_return -{ - void_return() {} - private: - void operator=(void_return const&); -}; - -template -struct returnable -{ - typedef T type; -}; - -# ifdef BOOST_NO_VOID_RETURNS -template <> -struct returnable -{ - typedef void_return type; -}; - -# ifndef BOOST_NO_CV_VOID_SPECIALIZATIONS -template <> struct returnable : returnable {}; -template <> struct returnable : returnable {}; -template <> struct returnable : returnable {}; -# endif - -# endif // BOOST_NO_VOID_RETURNS - -}}} // namespace boost::python::detail - -#endif // VOID_RETURN_DWA200274_HPP diff --git a/include/boost/python/detail/wrap_python.hpp b/include/boost/python/detail/wrap_python.hpp deleted file mode 100644 index eaef7841..00000000 --- a/include/boost/python/detail/wrap_python.hpp +++ /dev/null @@ -1,205 +0,0 @@ -// (C) Copyright David Abrahams 2000. -// 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) -// -// The author gratefully acknowleges the support of Dragon Systems, Inc., in -// producing this work. - -// This file serves as a wrapper around which allows it to be -// compiled with GCC 2.95.2 under Win32 and which disables the default MSVC -// behavior so that a program may be compiled in debug mode without requiring a -// special debugging build of the Python library. - - -// To use the Python debugging library, #define BOOST_DEBUG_PYTHON on the -// compiler command-line. - -// Revision History: -// 05 Mar 01 Suppress warnings under Cygwin with Python 2.0 (Dave Abrahams) -// 04 Mar 01 Rolled in some changes from the Dragon fork (Dave Abrahams) -// 01 Mar 01 define PyObject_INIT() for Python 1.x (Dave Abrahams) - -#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 -#endif - -# include -# if defined(_SGI_COMPILER_VERSION) && _SGI_COMPILER_VERSION >= 740 -# undef _POSIX_C_SOURCE -# undef _XOPEN_SOURCE -# undef HAVE_STDINT_H // undo Python 2.5.1 define -# endif - -// -// Python's LongObject.h helpfully #defines ULONGLONG_MAX for us, -// which confuses Boost's config -// -#include -#ifndef ULONG_MAX -# define BOOST_PYTHON_ULONG_MAX_UNDEFINED -#endif -#ifndef LONGLONG_MAX -# define BOOST_PYTHON_LONGLONG_MAX_UNDEFINED -#endif -#ifndef ULONGLONG_MAX -# define BOOST_PYTHON_ULONGLONG_MAX_UNDEFINED -#endif - -// -// Get ahold of Python's version number -// -#include - -#if PY_MAJOR_VERSION<2 || PY_MAJOR_VERSION==2 && PY_MINOR_VERSION<2 -#error Python 2.2 or higher is required for this version of Boost.Python. -#endif - -// -// Some things we need in order to get Python.h to work with compilers other -// than MSVC on Win32 -// -#if defined(_WIN32) || defined(__CYGWIN__) -# if defined(__GNUC__) && defined(__CYGWIN__) - -# define SIZEOF_LONG 4 - -# if PY_MAJOR_VERSION < 2 || PY_MAJOR_VERSION == 2 && PY_MINOR_VERSION <= 2 - -typedef int pid_t; - -# define WORD_BIT 32 -# define hypot _hypot -# include - -# if PY_MAJOR_VERSION < 2 -# define HAVE_CLOCK -# define HAVE_STRFTIME -# define HAVE_STRERROR -# endif - -# define NT_THREADS - -# ifndef NETSCAPE_PI -# define USE_SOCKET -# endif - -# ifdef USE_DL_IMPORT -# define DL_IMPORT(RTYPE) __declspec(dllimport) RTYPE -# endif - -# ifdef USE_DL_EXPORT -# define DL_IMPORT(RTYPE) __declspec(dllexport) RTYPE -# define DL_EXPORT(RTYPE) __declspec(dllexport) RTYPE -# endif - -# define HAVE_LONG_LONG 1 -# define LONG_LONG long long -# endif - -# elif defined(__MWERKS__) - -# ifndef _MSC_VER -# define PY_MSC_VER_DEFINED_FROM_WRAP_PYTHON_H 1 -# define _MSC_VER 900 -# endif - -# undef hypot // undo the evil #define left by Python. - -# elif defined(__BORLANDC__) -# undef HAVE_HYPOT -# define HAVE_HYPOT 1 -# endif - -#endif // _WIN32 - -#if PY_MAJOR_VERSION == 2 && PY_MINOR_VERSION == 2 && PY_MICRO_VERSION < 2 -# include -#else -# include -#endif - -#ifdef BOOST_PYTHON_ULONG_MAX_UNDEFINED -# undef ULONG_MAX -# undef BOOST_PYTHON_ULONG_MAX_UNDEFINED -#endif - -#ifdef BOOST_PYTHON_LONGLONG_MAX_UNDEFINED -# undef LONGLONG_MAX -# undef BOOST_PYTHON_LONGLONG_MAX_UNDEFINED -#endif - -#ifdef BOOST_PYTHON_ULONGLONG_MAX_UNDEFINED -# undef ULONGLONG_MAX -# undef BOOST_PYTHON_ULONGLONG_MAX_UNDEFINED -#endif - -#ifdef PY_MSC_VER_DEFINED_FROM_WRAP_PYTHON_H -# undef _MSC_VER -#endif - -#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 -# define PyObject_INIT(op, typeobj) \ - ( (op)->ob_type = (typeobj), _Py_NewReference((PyObject *)(op)), (op) ) -#endif - -// Define Python 3 macros for Python 2.x -#if PY_VERSION_HEX < 0x02060000 - -# define Py_TYPE(o) (((PyObject*)(o))->ob_type) -# define Py_REFCNT(o) (((PyObject*)(o))->ob_refcnt) -# define Py_SIZE(o) (((PyVarObject*)(o))->ob_size) - -# define PyVarObject_HEAD_INIT(type, size) \ - PyObject_HEAD_INIT(type) size, - -#endif - - -#ifdef __MWERKS__ -# pragma warn_possunwant off -#elif _MSC_VER -# pragma warning(disable:4786) -#endif - -#if defined(HAVE_LONG_LONG) -# if defined(PY_LONG_LONG) -# define BOOST_PYTHON_LONG_LONG PY_LONG_LONG -# elif defined(LONG_LONG) -# define BOOST_PYTHON_LONG_LONG LONG_LONG -# else -# error "HAVE_LONG_LONG defined but not PY_LONG_LONG or LONG_LONG" -# endif -#endif diff --git a/include/boost/python/detail/wrapper_base.hpp b/include/boost/python/detail/wrapper_base.hpp deleted file mode 100755 index e5b93aa4..00000000 --- a/include/boost/python/detail/wrapper_base.hpp +++ /dev/null @@ -1,90 +0,0 @@ -// Copyright David Abrahams 2004. 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 WRAPPER_BASE_DWA2004722_HPP -# define WRAPPER_BASE_DWA2004722_HPP - -# include -# include -# include - -namespace boost { namespace python { - -class override; - -namespace detail -{ - class BOOST_PYTHON_DECL_FORWARD wrapper_base; - - namespace wrapper_base_ // ADL disabler - { - inline PyObject* get_owner(wrapper_base const volatile& w); - - inline PyObject* - owner_impl(void const volatile* /*x*/, mpl::false_) - { - return 0; - } - - template - inline PyObject* - owner_impl(T const volatile* x, mpl::true_); - - template - inline PyObject* - owner(T const volatile* x) - { - return wrapper_base_::owner_impl(x,is_polymorphic()); - } - } - - class BOOST_PYTHON_DECL wrapper_base - { - friend void initialize_wrapper(PyObject* self, wrapper_base* w); - friend PyObject* wrapper_base_::get_owner(wrapper_base const volatile& w); - protected: - wrapper_base() : m_self(0) {} - - override get_override( - char const* name, PyTypeObject* class_object) const; - - private: - void detach(); - - private: - PyObject* m_self; - }; - - namespace wrapper_base_ // ADL disabler - { - template - inline PyObject* - owner_impl(T const volatile* x, mpl::true_) - { - if (wrapper_base const volatile* w = dynamic_cast(x)) - { - return wrapper_base_::get_owner(*w); - } - return 0; - } - - inline PyObject* get_owner(wrapper_base const volatile& w) - { - return w.m_self; - } - } - - inline void initialize_wrapper(PyObject* self, wrapper_base* w) - { - w->m_self = self; - } - - inline void initialize_wrapper(PyObject* /*self*/, ...) {} - - - -} // namespace detail - -}} // namespace boost::python - -#endif // WRAPPER_BASE_DWA2004722_HPP diff --git a/include/boost/python/dict.hpp b/include/boost/python/dict.hpp deleted file mode 100644 index 6fcaf143..00000000 --- a/include/boost/python/dict.hpp +++ /dev/null @@ -1,152 +0,0 @@ -// 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) -#ifndef DICT_20020706_HPP -#define DICT_20020706_HPP - -# include - -#include -#include -#include -#include - -namespace boost { namespace python { - -class dict; - -namespace detail -{ - struct BOOST_PYTHON_DECL dict_base : object - { - // D.clear() -> None. Remove all items from D. - void clear(); - - // D.copy() -> a shallow copy of D - dict copy(); - - // D.get(k[,d]) -> D[k] if D.has_key(k), else d. d defaults to None. - object get(object_cref k) const; - - object get(object_cref k, object_cref d) const; - - // D.has_key(k) -> 1 if D has a key k, else 0 - bool has_key(object_cref k) const; - - // D.items() -> list of D's (key, value) pairs, as 2-tuples - list items() const; - - // D.iteritems() -> an iterator over the (key, value) items of D - object iteritems() const; - - // D.iterkeys() -> an iterator over the keys of D - object iterkeys() const; - - // D.itervalues() -> an iterator over the values of D - object itervalues() const; - - // D.keys() -> list of D's keys - list keys() const; - - // D.popitem() -> (k, v), remove and return some (key, value) pair as a - // 2-tuple; but raise KeyError if D is empty - tuple popitem(); - - // D.setdefault(k[,d]) -> D.get(k,d), also set D[k]=d if not D.has_key(k) - object setdefault(object_cref k); - - object setdefault(object_cref k, object_cref d); - - // D.update(E) -> None. Update D from E: for k in E.keys(): D[k] = E[k] - void update(object_cref E); - - // D.values() -> list of D's values - list values() const; - - protected: - // dict() -> new empty dictionary. - // dict(mapping) -> new dictionary initialized from a mapping object's - // (key, value) pairs. - // dict(seq) -> new dictionary initialized as if via: - dict_base(); // new dict - explicit dict_base(object_cref data); - - BOOST_PYTHON_FORWARD_OBJECT_CONSTRUCTORS(dict_base, object) - private: - static detail::new_reference call(object const&); - }; -} - -class dict : public detail::dict_base -{ - typedef detail::dict_base base; - public: - // dict() -> new empty dictionary. - // dict(mapping) -> new dictionary initialized from a mapping object's - // (key, value) pairs. - // dict(seq) -> new dictionary initialized as if via: - dict() {} // new dict - - template - explicit dict(T const& data) - : base(object(data)) - { - } - - template - object get(T const& k) const - { - return base::get(object(k)); - } - - template - object get(T1 const& k, T2 const& d) const - { - return base::get(object(k),object(d)); - } - - template - bool has_key(T const& k) const - { - return base::has_key(object(k)); - } - - template - object setdefault(T const& k) - { - return base::setdefault(object(k)); - } - - template - object setdefault(T1 const& k, T2 const& d) - { - return base::setdefault(object(k),object(d)); - } - - template - void update(T const& E) - { - base::update(object(E)); - } - - public: // implementation detail -- for internal use only - BOOST_PYTHON_FORWARD_OBJECT_CONSTRUCTORS(dict, base) -}; - -// -// Converter Specializations -// -namespace converter -{ - template <> - struct object_manager_traits - : pytype_object_manager_traits<&PyDict_Type,dict> - { - }; -} - -}} // namespace boost::python - -#endif - diff --git a/include/boost/python/docstring_options.hpp b/include/boost/python/docstring_options.hpp deleted file mode 100755 index 1914bd51..00000000 --- a/include/boost/python/docstring_options.hpp +++ /dev/null @@ -1,127 +0,0 @@ -// Copyright Ralf W. Grosse-Kunstleve 2006. -// 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 DOCSTRING_OPTIONS_RWGK20060111_HPP -# define DOCSTRING_OPTIONS_RWGK20060111_HPP - -#include - -namespace boost { namespace python { - -// Note: the static data members are defined in object/function.cpp - -class BOOST_PYTHON_DECL docstring_options : boost::noncopyable -{ - public: - docstring_options(bool show_all=true) - { - previous_show_user_defined_ = show_user_defined_; - previous_show_py_signatures_ = show_py_signatures_; - previous_show_cpp_signatures_ = show_cpp_signatures_; - show_user_defined_ = show_all; - show_cpp_signatures_ = show_all; - show_py_signatures_ = show_all; - } - - docstring_options(bool show_user_defined, bool show_signatures) - { - previous_show_user_defined_ = show_user_defined_; - previous_show_cpp_signatures_ = show_cpp_signatures_; - previous_show_py_signatures_ = show_py_signatures_; - show_user_defined_ = show_user_defined; - show_cpp_signatures_ = show_signatures; - show_py_signatures_ = show_signatures; - } - - docstring_options(bool show_user_defined, bool show_py_signatures, bool show_cpp_signatures) - { - previous_show_user_defined_ = show_user_defined_; - previous_show_cpp_signatures_ = show_cpp_signatures_; - previous_show_py_signatures_ = show_py_signatures_; - show_user_defined_ = show_user_defined; - show_cpp_signatures_ = show_cpp_signatures; - show_py_signatures_ = show_py_signatures; - } - - ~docstring_options() - { - show_user_defined_ = previous_show_user_defined_; - show_cpp_signatures_ = previous_show_cpp_signatures_; - show_py_signatures_ = previous_show_py_signatures_; - } - - void - disable_user_defined() { show_user_defined_ = false; } - - void - enable_user_defined() { show_user_defined_ = true; } - - void - disable_py_signatures() - { - show_py_signatures_ = false; - } - - void - enable_py_signatures() - { - show_py_signatures_ = true; - } - - void - disable_cpp_signatures() - { - show_cpp_signatures_ = false; - } - - void - enable_cpp_signatures() - { - show_cpp_signatures_ = true; - } - - void - disable_signatures() - { - show_cpp_signatures_ = false; - show_py_signatures_ = false; - } - - void - enable_signatures() - { - show_cpp_signatures_ = true; - show_py_signatures_ = true; - } - - void - disable_all() - { - show_user_defined_ = false; - show_cpp_signatures_ = false; - show_py_signatures_ = false; - } - - void - enable_all() - { - show_user_defined_ = true; - show_cpp_signatures_ = true; - show_py_signatures_ = true; - } - - friend struct objects::function; - - private: - static volatile bool show_user_defined_; - static volatile bool show_cpp_signatures_; - static volatile bool show_py_signatures_; - bool previous_show_user_defined_; - bool previous_show_cpp_signatures_; - bool previous_show_py_signatures_; -}; - -}} // namespace boost::python - -#endif // DOCSTRING_OPTIONS_RWGK20060111_HPP diff --git a/include/boost/python/enum.hpp b/include/boost/python/enum.hpp deleted file mode 100644 index 9631a0ed..00000000 --- a/include/boost/python/enum.hpp +++ /dev/null @@ -1,108 +0,0 @@ -// 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) -#ifndef ENUM_DWA200298_HPP -# define ENUM_DWA200298_HPP - -# include - -# include -# include -# include - -namespace boost { namespace python { - -template -struct enum_ : public objects::enum_base -{ - typedef objects::enum_base base; - - // Declare a new enumeration type in the current scope() - enum_(char const* name, char const* doc = 0); - - // Add a new enumeration value with the given name and value. - inline enum_& value(char const* name, T); - - // Add all of the defined enumeration values to the current scope with the - // same names used here. - inline enum_& export_values(); - private: - static PyObject* to_python(void const* x); - static void* convertible_from_python(PyObject* obj); - static void construct(PyObject* obj, converter::rvalue_from_python_stage1_data* data); -}; - -template -inline enum_::enum_(char const* name, char const* doc ) - : base( - name - , &enum_::to_python - , &enum_::convertible_from_python - , &enum_::construct - , type_id() - , doc - ) -{ -} - -// This is the conversion function that gets registered for converting -// these enums to Python. -template -PyObject* enum_::to_python(void const* x) -{ - return base::to_python( - converter::registered::converters.m_class_object - , static_cast(*(T const*)x)); -} - -// -// The following two static functions serve as the elements of an -// rvalue from_python converter for the enumeration type. -// - -// This checks that a given Python object can be converted to the -// enumeration type. -template -void* enum_::convertible_from_python(PyObject* obj) -{ - return PyObject_IsInstance( - obj - , upcast( - converter::registered::converters.m_class_object)) - - ? obj : 0; -} - -// Constructs an instance of the enumeration type in the from_python -// data. -template -void enum_::construct(PyObject* obj, converter::rvalue_from_python_stage1_data* data) -{ -#if PY_VERSION_HEX >= 0x03000000 - T x = static_cast(PyLong_AS_LONG(obj)); -#else - T x = static_cast(PyInt_AS_LONG(obj)); -#endif - void* const storage = ((converter::rvalue_from_python_storage*)data)->storage.bytes; - new (storage) T(x); - data->convertible = storage; -} - -template -inline enum_& enum_::value(char const* name, T x) -{ - this->add_value(name, static_cast(x)); - return *this; -} - -template -inline enum_& enum_::export_values() -{ - this->base::export_values(); - return *this; -} - -}} // namespace boost::python - -#endif // ENUM_DWA200298_HPP diff --git a/include/boost/python/errors.hpp b/include/boost/python/errors.hpp deleted file mode 100644 index 72960d9e..00000000 --- a/include/boost/python/errors.hpp +++ /dev/null @@ -1,55 +0,0 @@ -// (C) Copyright David Abrahams 2000. -// 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) -// -// The author gratefully acknowleges the support of Dragon Systems, Inc., in -// producing this work. - -#ifndef ERRORS_DWA052500_H_ -# define ERRORS_DWA052500_H_ - -# include -# include - -namespace boost { namespace python { - -struct BOOST_PYTHON_DECL_EXCEPTION error_already_set -{ - virtual ~error_already_set(); -}; - -// Handles exceptions caught just before returning to Python code. -// Returns true iff an exception was caught. -BOOST_PYTHON_DECL bool handle_exception_impl(function0); - -template -bool handle_exception(T f) -{ - return handle_exception_impl(function0(boost::ref(f))); -} - -namespace detail { inline void rethrow() { throw; } } - -inline void handle_exception() -{ - handle_exception(detail::rethrow); -} - -BOOST_PYTHON_DECL void throw_error_already_set(); - -template -inline T* expect_non_null(T* x) -{ - if (x == 0) - throw_error_already_set(); - return x; -} - -// Return source if it is an instance of pytype; throw an appropriate -// exception otherwise. -BOOST_PYTHON_DECL PyObject* pytype_check(PyTypeObject* pytype, PyObject* source); - -}} // namespace boost::python - -#endif // ERRORS_DWA052500_H_ diff --git a/include/boost/python/exception_translator.hpp b/include/boost/python/exception_translator.hpp deleted file mode 100644 index 75ed0e1e..00000000 --- a/include/boost/python/exception_translator.hpp +++ /dev/null @@ -1,28 +0,0 @@ -// 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) -#ifndef EXCEPTION_TRANSLATOR_DWA2002810_HPP -# define EXCEPTION_TRANSLATOR_DWA2002810_HPP - -# include - -# include -# include -# include -# include -# include - -namespace boost { namespace python { - -template -void register_exception_translator(Translate translate, boost::type* = 0) -{ - detail::register_exception_handler( - boost::bind(detail::translate_exception(), _1, _2, translate) - ); -} - -}} // namespace boost::python - -#endif // EXCEPTION_TRANSLATOR_DWA2002810_HPP diff --git a/include/boost/python/exec.hpp b/include/boost/python/exec.hpp deleted file mode 100644 index 3ed1e15c..00000000 --- a/include/boost/python/exec.hpp +++ /dev/null @@ -1,47 +0,0 @@ -// Copyright Stefan Seefeld 2005. -// 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 EXEC_SS20050616_HPP -# define EXEC_SS20050616_HPP - -# include -# include - -namespace boost -{ -namespace python -{ - -// Evaluate python expression from str. -// global and local are the global and local scopes respectively, -// used during evaluation. -object -BOOST_PYTHON_DECL -eval(str string, object global = object(), object local = object()); - -// Execute an individual python statement from str. -// global and local are the global and local scopes respectively, -// used during execution. -object -BOOST_PYTHON_DECL -exec_statement(str string, object global = object(), object local = object()); - -// Execute python source code from str. -// global and local are the global and local scopes respectively, -// used during execution. -object -BOOST_PYTHON_DECL -exec(str string, object global = object(), object local = object()); - -// Execute python source code from file filename. -// global and local are the global and local scopes respectively, -// used during execution. -object -BOOST_PYTHON_DECL -exec_file(str filename, object global = object(), object local = object()); - -} -} - -#endif diff --git a/include/boost/python/extract.hpp b/include/boost/python/extract.hpp deleted file mode 100644 index bfdeb83c..00000000 --- a/include/boost/python/extract.hpp +++ /dev/null @@ -1,259 +0,0 @@ -// 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) -#ifndef EXTRACT_DWA200265_HPP -# define EXTRACT_DWA200265_HPP - -# include - -# include -# include -# include -# include -# include - -# include -# include - -# include -# include -# include -# include - -#if BOOST_WORKAROUND(BOOST_INTEL_WIN, <= 900) -# define BOOST_EXTRACT_WORKAROUND () -#else -# define BOOST_EXTRACT_WORKAROUND -#endif - -namespace boost { namespace python { - -namespace api -{ - class object; -} - -namespace converter -{ - template - struct extract_pointer - { - typedef Ptr result_type; - extract_pointer(PyObject*); - - bool check() const; - Ptr operator()() const; - - private: - PyObject* m_source; - void* m_result; - }; - - template - struct extract_reference - { - typedef Ref result_type; - extract_reference(PyObject*); - - bool check() const; - Ref operator()() const; - - private: - PyObject* m_source; - void* m_result; - }; - - template - struct extract_rvalue : private noncopyable - { - typedef typename mpl::if_< - python::detail::copy_ctor_mutates_rhs - , T& - , typename call_traits::param_type - >::type result_type; - - extract_rvalue(PyObject*); - - bool check() const; - result_type operator()() const; - private: - PyObject* m_source; - mutable rvalue_from_python_data m_data; - }; - - template - struct extract_object_manager - { - typedef T result_type; - extract_object_manager(PyObject*); - - bool check() const; - result_type operator()() const; - private: - PyObject* m_source; - }; - - template - struct select_extract - { - BOOST_STATIC_CONSTANT( - bool, obj_mgr = is_object_manager::value); - - BOOST_STATIC_CONSTANT( - bool, ptr = is_pointer::value); - - BOOST_STATIC_CONSTANT( - bool, ref = is_reference::value); - - typedef typename mpl::if_c< - obj_mgr - , extract_object_manager - , typename mpl::if_c< - ptr - , extract_pointer - , typename mpl::if_c< - ref - , extract_reference - , extract_rvalue - >::type - >::type - >::type type; - }; -} - -template -struct extract - : converter::select_extract::type -{ - private: - typedef typename converter::select_extract::type base; - public: - typedef typename base::result_type result_type; - - operator result_type() const - { - return (*this)(); - } - - extract(PyObject*); - extract(api::object const&); -}; - -// -// Implementations -// -template -inline extract::extract(PyObject* o) - : base(o) -{ -} - -template -inline extract::extract(api::object const& o) - : base(o.ptr()) -{ -} - -namespace converter -{ - template - inline extract_rvalue::extract_rvalue(PyObject* x) - : m_source(x) - , m_data( - (rvalue_from_python_stage1)(x, registered::converters) - ) - { - } - - template - inline bool - extract_rvalue::check() const - { - return m_data.stage1.convertible; - } - - template - inline typename extract_rvalue::result_type - extract_rvalue::operator()() const - { - return *(T*)( - // Only do the stage2 conversion once - m_data.stage1.convertible == m_data.storage.bytes - ? m_data.storage.bytes - : (rvalue_from_python_stage2)(m_source, m_data.stage1, registered::converters) - ); - } - - template - inline extract_reference::extract_reference(PyObject* obj) - : m_source(obj) - , m_result( - (get_lvalue_from_python)(obj, registered::converters) - ) - { - } - - template - inline bool extract_reference::check() const - { - return m_result != 0; - } - - template - inline Ref extract_reference::operator()() const - { - if (m_result == 0) - (throw_no_reference_from_python)(m_source, registered::converters); - - return python::detail::void_ptr_to_reference(m_result, (Ref(*)())0); - } - - template - inline extract_pointer::extract_pointer(PyObject* obj) - : m_source(obj) - , m_result( - obj == Py_None ? 0 : (get_lvalue_from_python)(obj, registered_pointee::converters) - ) - { - } - - template - inline bool extract_pointer::check() const - { - return m_source == Py_None || m_result != 0; - } - - template - inline Ptr extract_pointer::operator()() const - { - if (m_result == 0 && m_source != Py_None) - (throw_no_pointer_from_python)(m_source, registered_pointee::converters); - - return Ptr(m_result); - } - - template - inline extract_object_manager::extract_object_manager(PyObject* obj) - : m_source(obj) - { - } - - template - inline bool extract_object_manager::check() const - { - return object_manager_traits::check(m_source); - } - - template - inline T extract_object_manager::operator()() const - { - return T( - object_manager_traits::adopt(python::incref(m_source)) - ); - } -} - -}} // namespace boost::python::converter - -#endif // EXTRACT_DWA200265_HPP diff --git a/include/boost/python/handle.hpp b/include/boost/python/handle.hpp deleted file mode 100644 index ee9a7cd0..00000000 --- a/include/boost/python/handle.hpp +++ /dev/null @@ -1,237 +0,0 @@ -// 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) -#ifndef HANDLE_DWA200269_HPP -# define HANDLE_DWA200269_HPP - -# include - -# include -# include -# include -# include -# include -# include -# include - -namespace boost { namespace python { - -template struct null_ok; - -template -inline null_ok* allow_null(T* p) -{ - return (null_ok*)p; -} - -namespace detail -{ - template - inline T* manage_ptr(detail::borrowed >* p, int) - { - return python::xincref((T*)p); - } - - template - inline T* manage_ptr(null_ok >* p, int) - { - return python::xincref((T*)p); - } - - template - inline T* manage_ptr(detail::borrowed* p, long) - { - return python::incref(expect_non_null((T*)p)); - } - - template - inline T* manage_ptr(null_ok* p, long) - { - return (T*)p; - } - - template - inline T* manage_ptr(T* p, ...) - { - return expect_non_null(p); - } -} - -template -class handle -{ - typedef T* (handle::* bool_type )() const; - - public: // types - typedef T element_type; - - public: // member functions - handle(); - ~handle(); - - template - explicit handle(Y* p) - : m_p( - python::upcast( - detail::manage_ptr(p, 0) - ) - ) - { - } - - handle& operator=(handle const& r) - { - python::xdecref(m_p); - m_p = python::xincref(r.m_p); - return *this; - } - - template - handle& operator=(handle const & r) // never throws - { - python::xdecref(m_p); - m_p = python::xincref(python::upcast(r.get())); - return *this; - } - - template - handle(handle const& r) - : m_p(python::xincref(python::upcast(r.get()))) - { - } - - handle(handle const& r) - : m_p(python::xincref(r.m_p)) - { - } - - T* operator-> () const; - T& operator* () const; - T* get() const; - T* release(); - void reset(); - - operator bool_type() const // never throws - { - return m_p ? &handle::get : 0; - } - bool operator! () const; // never throws - - public: // implementation details -- do not touch - // Defining this in the class body suppresses a VC7 link failure - inline handle(detail::borrowed_reference x) - : m_p( - python::incref( - downcast((PyObject*)x) - )) - { - } - - private: // data members - T* m_p; -}; - -#ifdef BOOST_NO_ARGUMENT_DEPENDENT_LOOKUP -} // namespace python -#endif - -template inline T * get_pointer(python::handle const & p) -{ - return p.get(); -} - -#ifdef BOOST_NO_ARGUMENT_DEPENDENT_LOOKUP -namespace python { -#else - -// We don't want get_pointer above to hide the others -using boost::get_pointer; - -#endif - -typedef handle type_handle; - -// -// Compile-time introspection -// -template -class is_handle -{ - public: - BOOST_STATIC_CONSTANT(bool, value = false); -}; - -template -class is_handle > -{ - public: - BOOST_STATIC_CONSTANT(bool, value = true); -}; - -// -// implementations -// -template -inline handle::handle() - : m_p(0) -{ -} - -template -inline handle::~handle() -{ - python::xdecref(m_p); -} - -template -inline T* handle::operator->() const -{ - return m_p; -} - -template -inline T& handle::operator*() const -{ - return *m_p; -} - -template -inline T* handle::get() const -{ - return m_p; -} - -template -inline bool handle::operator!() const -{ - return m_p == 0; -} - -template -inline T* handle::release() -{ - T* result = m_p; - m_p = 0; - return result; -} - -template -inline void handle::reset() -{ - python::xdecref(m_p); - m_p = 0; -} - -// Because get_managed_object must return a non-null PyObject*, we -// return Py_None if the handle is null. -template -inline PyObject* get_managed_object(handle const& h, tag_t) -{ - return h.get() ? python::upcast(h.get()) : Py_None; -} - -}} // namespace boost::python - - -#endif // HANDLE_DWA200269_HPP diff --git a/include/boost/python/handle_fwd.hpp b/include/boost/python/handle_fwd.hpp deleted file mode 100755 index 5987ec4f..00000000 --- a/include/boost/python/handle_fwd.hpp +++ /dev/null @@ -1,16 +0,0 @@ -// 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) -#ifndef HANDLE_FWD_DWA2002615_HPP -# define HANDLE_FWD_DWA2002615_HPP - -# include - -namespace boost { namespace python { - -template class handle; - -}} // namespace boost::python - -#endif // HANDLE_FWD_DWA2002615_HPP diff --git a/include/boost/python/has_back_reference.hpp b/include/boost/python/has_back_reference.hpp deleted file mode 100644 index 67fe24c5..00000000 --- a/include/boost/python/has_back_reference.hpp +++ /dev/null @@ -1,24 +0,0 @@ -// 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) -#ifndef HAS_BACK_REFERENCE_DWA2002323_HPP -# define HAS_BACK_REFERENCE_DWA2002323_HPP - -# include -# include - -namespace boost { namespace python { - -// traits class which users can specialize to indicate that a class -// contains a back-reference to its owning PyObject* -template -struct has_back_reference - : mpl::false_ -{ -}; - - -}} // namespace boost::python - -#endif // HAS_BACK_REFERENCE_DWA2002323_HPP diff --git a/include/boost/python/implicit.hpp b/include/boost/python/implicit.hpp deleted file mode 100644 index 4d01b2fb..00000000 --- a/include/boost/python/implicit.hpp +++ /dev/null @@ -1,36 +0,0 @@ -// 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) -#ifndef IMPLICIT_DWA2002325_HPP -# define IMPLICIT_DWA2002325_HPP - -# include -# include -# include -# include -#ifndef BOOST_PYTHON_NO_PY_SIGNATURES -# include -#endif -# include - -namespace boost { namespace python { - -template -void implicitly_convertible(boost::type* = 0, boost::type* = 0) -{ - typedef converter::implicit functions; - - converter::registry::push_back( - &functions::convertible - , &functions::construct - , type_id() -#ifndef BOOST_PYTHON_NO_PY_SIGNATURES - , &converter::expected_from_python_type_direct::get_pytype -#endif - ); -} - -}} // namespace boost::python - -#endif // IMPLICIT_DWA2002325_HPP diff --git a/include/boost/python/import.hpp b/include/boost/python/import.hpp deleted file mode 100644 index 45c02a93..00000000 --- a/include/boost/python/import.hpp +++ /dev/null @@ -1,22 +0,0 @@ -// Copyright Stefan Seefeld 2005. -// 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 IMPORT_SS20050624_HPP -# define IMPORT_SS20050624_HPP - -# include -# include - -namespace boost -{ -namespace python -{ - -// Import the named module and return a reference to it. -object BOOST_PYTHON_DECL import(str name); - -} -} - -#endif diff --git a/include/boost/python/init.hpp b/include/boost/python/init.hpp deleted file mode 100644 index b82ab01e..00000000 --- a/include/boost/python/init.hpp +++ /dev/null @@ -1,399 +0,0 @@ -/////////////////////////////////////////////////////////////////////////////// -// -// Copyright David Abrahams 2002, Joel de Guzman, 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) -// -/////////////////////////////////////////////////////////////////////////////// -#ifndef INIT_JDG20020820_HPP -#define INIT_JDG20020820_HPP - -# include - -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include - -#include -#include - -#include - -/////////////////////////////////////////////////////////////////////////////// -#define BOOST_PYTHON_OVERLOAD_TYPES_WITH_DEFAULT \ - BOOST_PP_ENUM_PARAMS_WITH_A_DEFAULT( \ - BOOST_PYTHON_MAX_ARITY, \ - class T, \ - mpl::void_) \ - -#define BOOST_PYTHON_OVERLOAD_TYPES \ - BOOST_PP_ENUM_PARAMS_Z(1, \ - BOOST_PYTHON_MAX_ARITY, \ - class T) \ - -#define BOOST_PYTHON_OVERLOAD_ARGS \ - BOOST_PP_ENUM_PARAMS_Z(1, \ - BOOST_PYTHON_MAX_ARITY, \ - T) \ - -/////////////////////////////////////////////////////////////////////////////// -namespace boost { namespace python { - -template -class init; // forward declaration - - -template -struct optional; // forward declaration - -namespace detail -{ - namespace error - { - template - struct more_keywords_than_init_arguments - { - typedef char too_many_keywords[init_args - keywords >= 0 ? 1 : -1]; - }; - } - - // is_optional::value - // - // This metaprogram checks if T is an optional - // - - template - struct is_optional - : mpl::false_ - {}; - - template - struct is_optional > - : mpl::true_ - {}; - - - template - struct define_class_init_helper; - -} // namespace detail - -template -struct init_base : def_visitor -{ - init_base(char const* doc_, detail::keyword_range const& keywords_) - : m_doc(doc_), m_keywords(keywords_) - {} - - init_base(char const* doc_) - : m_doc(doc_) - {} - - DerivedT const& derived() const - { - return *static_cast(this); - } - - char const* doc_string() const - { - return m_doc; - } - - detail::keyword_range const& keywords() const - { - return m_keywords; - } - - static default_call_policies call_policies() - { - return default_call_policies(); - } - - private: - // visit - // - // Defines a set of n_defaults + 1 constructors for its - // class_<...> argument. Each constructor after the first has - // one less argument to its right. Example: - // - // init > - // - // Defines: - // - // __init__(int, char, long, double) - // __init__(int, char, long) - // __init__(int, char) - // __init__(int) - template - void visit(classT& cl) const - { - typedef typename DerivedT::signature signature; - typedef typename DerivedT::n_arguments n_arguments; - typedef typename DerivedT::n_defaults n_defaults; - - detail::define_class_init_helper::apply( - cl - , derived().call_policies() - , signature() - , n_arguments() - , derived().doc_string() - , derived().keywords()); - } - - friend class python::def_visitor_access; - - private: // data members - char const* m_doc; - detail::keyword_range m_keywords; -}; - -template -class init_with_call_policies - : public init_base > -{ - typedef init_base > base; - public: - typedef typename InitT::n_arguments n_arguments; - typedef typename InitT::n_defaults n_defaults; - typedef typename InitT::signature signature; - - init_with_call_policies( - CallPoliciesT const& policies_ - , char const* doc_ - , detail::keyword_range const& keywords - ) - : base(doc_, keywords) - , m_policies(policies_) - {} - - CallPoliciesT const& call_policies() const - { - return this->m_policies; - } - - private: // data members - CallPoliciesT m_policies; -}; - -// -// drop1 is the initial length(S) elements of S -// -namespace detail -{ - template - struct drop1 - : mpl::iterator_range< - typename mpl::begin::type - , typename mpl::prior< - typename mpl::end::type - >::type - > - {}; -} - -template -class init : public init_base > -{ - typedef init_base > base; - public: - typedef init self_t; - - init(char const* doc_ = 0) - : base(doc_) - { - } - - template - init(char const* doc_, detail::keywords const& kw) - : base(doc_, kw.range()) - { - typedef typename detail::error::more_keywords_than_init_arguments< - N, n_arguments::value + 1 - >::too_many_keywords assertion; - } - - template - init(detail::keywords const& kw, char const* doc_ = 0) - : base(doc_, kw.range()) - { - typedef typename detail::error::more_keywords_than_init_arguments< - N, n_arguments::value + 1 - >::too_many_keywords assertion; - } - - template - init_with_call_policies - operator[](CallPoliciesT const& policies) const - { - return init_with_call_policies( - policies, this->doc_string(), this->keywords()); - } - - typedef detail::type_list signature_; - - typedef detail::is_optional< - typename mpl::eval_if< - mpl::empty - , mpl::false_ - , mpl::back - >::type - > back_is_optional; - - typedef typename mpl::eval_if< - back_is_optional - , mpl::back - , mpl::vector0<> - >::type optional_args; - - typedef typename mpl::eval_if< - back_is_optional - , mpl::if_< - mpl::empty - , detail::drop1 - , mpl::joint_view< - detail::drop1 - , optional_args - > - > - , signature_ - >::type signature; - - // TODO: static assert to make sure there are no other optional elements - - // Count the number of default args - typedef mpl::size n_defaults; - typedef mpl::size n_arguments; -}; - -/////////////////////////////////////////////////////////////////////////////// -// -// optional -// -// optional::type returns a typelist. -// -/////////////////////////////////////////////////////////////////////////////// -template -struct optional - : detail::type_list -{ -}; - -namespace detail -{ - template - inline void def_init_aux( - ClassT& cl - , Signature const& - , NArgs - , CallPoliciesT const& policies - , char const* doc - , detail::keyword_range const& keywords_ - ) - { - cl.def( - "__init__" - , detail::make_keyword_range_constructor( - policies - , keywords_ - , (typename ClassT::metadata::holder*)0 - ) - , doc - ); - } - - /////////////////////////////////////////////////////////////////////////////// - // - // define_class_init_helper::apply - // - // General case - // - // Accepts a class_ and an arguments list. Defines a constructor - // for the class given the arguments and recursively calls - // define_class_init_helper::apply with one fewer argument (the - // rightmost argument is shaved off) - // - /////////////////////////////////////////////////////////////////////////////// - template - struct define_class_init_helper - { - - template - static void apply( - ClassT& cl - , CallPoliciesT const& policies - , Signature const& args - , NArgs - , char const* doc - , detail::keyword_range keywords) - { - detail::def_init_aux(cl, args, NArgs(), policies, doc, keywords); - - if (keywords.second > keywords.first) - --keywords.second; - - typedef typename mpl::prior::type next_nargs; - define_class_init_helper::apply( - cl, policies, Signature(), next_nargs(), doc, keywords); - } - }; - - /////////////////////////////////////////////////////////////////////////////// - // - // define_class_init_helper<0>::apply - // - // Terminal case - // - // Accepts a class_ and an arguments list. Defines a constructor - // for the class given the arguments. - // - /////////////////////////////////////////////////////////////////////////////// - template <> - struct define_class_init_helper<0> { - - template - static void apply( - ClassT& cl - , CallPoliciesT const& policies - , Signature const& args - , NArgs - , char const* doc - , detail::keyword_range const& keywords) - { - detail::def_init_aux(cl, args, NArgs(), policies, doc, keywords); - } - }; -} - -}} // namespace boost::python - -#undef BOOST_PYTHON_OVERLOAD_TYPES_WITH_DEFAULT -#undef BOOST_PYTHON_OVERLOAD_TYPES -#undef BOOST_PYTHON_OVERLOAD_ARGS -#undef BOOST_PYTHON_IS_OPTIONAL_VALUE -#undef BOOST_PYTHON_APPEND_TO_INIT - -/////////////////////////////////////////////////////////////////////////////// -#endif // INIT_JDG20020820_HPP - - - - - - - - diff --git a/include/boost/python/instance_holder.hpp b/include/boost/python/instance_holder.hpp deleted file mode 100644 index 933f50d1..00000000 --- a/include/boost/python/instance_holder.hpp +++ /dev/null @@ -1,63 +0,0 @@ -// 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) -#ifndef INSTANCE_HOLDER_DWA2002517_HPP -# define INSTANCE_HOLDER_DWA2002517_HPP - -# include - -# include -# include -# include - -namespace boost { namespace python { - -// Base class for all holders -struct BOOST_PYTHON_DECL instance_holder : private noncopyable -{ - public: - instance_holder(); - virtual ~instance_holder(); - - // return the next holder in a chain - instance_holder* next() const; - - // When the derived holder actually holds by [smart] pointer and - // null_ptr_only is set, only report that the type is held when - // the pointer is null. This is needed for proper shared_ptr - // support, to prevent holding shared_ptrs from being found when - // converting from python so that we can use the conversion method - // that always holds the Python object. - virtual void* holds(type_info, bool null_ptr_only) = 0; - - void install(PyObject* inst) throw(); - - // These functions should probably be located elsewhere. - - // Allocate storage for an object of the given size at the given - // offset in the Python instance<> object if bytes are available - // there. Otherwise allocate size bytes of heap memory. - static void* allocate(PyObject*, std::size_t offset, std::size_t size); - - // Deallocate storage from the heap if it was not carved out of - // the given Python object by allocate(), above. - static void deallocate(PyObject*, void* storage) throw(); - private: - instance_holder* m_next; -}; - -// This macro is needed for implementation of derived holders -# define BOOST_PYTHON_UNFORWARD(N,ignored) (typename unforward::type)(a##N) - -// -// implementation -// -inline instance_holder* instance_holder::next() const -{ - return m_next; -} - -}} // namespace boost::python - -#endif // INSTANCE_HOLDER_DWA2002517_HPP diff --git a/include/boost/python/iterator.hpp b/include/boost/python/iterator.hpp deleted file mode 100644 index a64a9207..00000000 --- a/include/boost/python/iterator.hpp +++ /dev/null @@ -1,137 +0,0 @@ -// 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) -#ifndef ITERATOR_DWA2002512_HPP -# define ITERATOR_DWA2002512_HPP - -# include - -# include -# include -# include - -# include -# include - -# if defined(BOOST_MSVC) && (BOOST_MSVC == 1400) /* -> warning C4180: qualifier applied to function type has no meaning; ignored -Peter Dimov wrote: -This warning is caused by an overload resolution bug in VC8 that cannot be -worked around and will probably not be fixed by MS in the VC8 line. The -problematic overload is only instantiated and never called, and the code -works correctly. */ -# pragma warning(disable: 4180) -# endif - -# include -# include - -namespace boost { namespace python { - -namespace detail -{ - // Adds an additional layer of binding to - // objects::make_iterator(...), which allows us to pass member - // function and member data pointers. - template - inline object make_iterator( - Accessor1 get_start - , Accessor2 get_finish - , NextPolicies next_policies - , Target&(*)() - ) - { - return objects::make_iterator_function( - boost::protect(boost::bind(get_start, _1)) - , boost::protect(boost::bind(get_finish, _1)) - , next_policies - ); - } - - // Guts of template class iterators<>, below. - template - struct iterators_impl - { - template - struct apply - { - typedef typename T::iterator iterator; - static iterator begin(T& x) { return x.begin(); } - static iterator end(T& x) { return x.end(); } - }; - }; - - template <> - struct iterators_impl - { - template - struct apply - { - typedef typename T::const_iterator iterator; - static iterator begin(T& x) { return x.begin(); } - static iterator end(T& x) { return x.end(); } - }; - }; -} - -// An "ordinary function generator" which contains static begin(x) and -// end(x) functions that invoke T::begin() and T::end(), respectively. -template -struct iterators - : detail::iterators_impl< - boost::is_const::value - >::template apply -{ -}; - -// Create an iterator-building function which uses the given -// accessors. Deduce the Target type from the accessors. The iterator -// returns copies of the inderlying elements. -template -object range(Accessor1 start, Accessor2 finish) -{ - return detail::make_iterator( - start, finish - , objects::default_iterator_call_policies() - , detail::target(start) - ); -} - -// Create an iterator-building function which uses the given accessors -// and next() policies. Deduce the Target type. -template -object range(Accessor1 start, Accessor2 finish, NextPolicies* = 0) -{ - return detail::make_iterator(start, finish, NextPolicies(), detail::target(start)); -} - -// Create an iterator-building function which uses the given accessors -// and next() policies, operating on the given Target type -template -object range(Accessor1 start, Accessor2 finish, NextPolicies* = 0, boost::type* = 0) -{ - // typedef typename add_reference::type target; - return detail::make_iterator(start, finish, NextPolicies(), (Target&(*)())0); -} - -// A Python callable object which produces an iterator traversing -// [x.begin(), x.end()), where x is an instance of the Container -// type. NextPolicies are used as the CallPolicies for the iterator's -// next() function. -template -struct iterator : object -{ - iterator() - : object( - python::range( - &iterators::begin, &iterators::end - )) - { - } -}; - -}} // namespace boost::python - -#endif // ITERATOR_DWA2002512_HPP diff --git a/include/boost/python/list.hpp b/include/boost/python/list.hpp deleted file mode 100644 index 10fd40fd..00000000 --- a/include/boost/python/list.hpp +++ /dev/null @@ -1,148 +0,0 @@ -// 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) -#ifndef LIST_DWA2002627_HPP -# define LIST_DWA2002627_HPP - -# include - -# include -# include -# include - -namespace boost { namespace python { - -namespace detail -{ - struct BOOST_PYTHON_DECL list_base : object - { - void append(object_cref); // append object to end - - ssize_t count(object_cref value) const; // return number of occurrences of value - - void extend(object_cref sequence); // extend list by appending sequence elements - - long index(object_cref value) const; // return index of first occurrence of value - - void insert(ssize_t index, object_cref); // insert object before index - void insert(object const& index, object_cref); - - object pop(); // remove and return item at index (default last) - object pop(ssize_t index); - object pop(object const& index); - - void remove(object_cref value); // remove first occurrence of value - - void reverse(); // reverse *IN PLACE* - - void sort(); // sort *IN PLACE*; if given, cmpfunc(x, y) -> -1, 0, 1 -#if PY_VERSION_HEX >= 0x03000000 - void sort(args_proxy const &args, - kwds_proxy const &kwds); -#else - void sort(object_cref cmpfunc); -#endif - - protected: - list_base(); // new list - explicit list_base(object_cref sequence); // new list initialized from sequence's items - - BOOST_PYTHON_FORWARD_OBJECT_CONSTRUCTORS(list_base, object) - private: - static detail::new_non_null_reference call(object const&); - }; -} - -class list : public detail::list_base -{ - typedef detail::list_base base; - public: - list() {} // new list - - template - explicit list(T const& sequence) - : base(object(sequence)) - { - } - - template - void append(T const& x) - { - base::append(object(x)); - } - - template - long count(T const& value) const - { - return base::count(object(value)); - } - - template - void extend(T const& x) - { - base::extend(object(x)); - } - - template - long index(T const& x) const - { - return base::index(object(x)); - } - - template - void insert(ssize_t index, T const& x) // insert object before index - { - base::insert(index, object(x)); - } - - template - void insert(object const& index, T const& x) // insert object before index - { - base::insert(index, object(x)); - } - - object pop() { return base::pop(); } - object pop(ssize_t index) { return base::pop(index); } - - template - object pop(T const& index) - { - return base::pop(object(index)); - } - - template - void remove(T const& value) - { - base::remove(object(value)); - } - -#if PY_VERSION_HEX <= 0x03000000 - void sort() { base::sort(); } - - template - void sort(T const& value) - { - base::sort(object(value)); - } -#endif - - public: // implementation detail -- for internal use only - BOOST_PYTHON_FORWARD_OBJECT_CONSTRUCTORS(list, base) -}; - -// -// Converter Specializations -// -namespace converter -{ - template <> - struct object_manager_traits - : pytype_object_manager_traits<&PyList_Type,list> - { - }; -} - -}} // namespace boost::python - -#endif // LIST_DWA2002627_HPP diff --git a/include/boost/python/long.hpp b/include/boost/python/long.hpp deleted file mode 100644 index 129c61f9..00000000 --- a/include/boost/python/long.hpp +++ /dev/null @@ -1,68 +0,0 @@ -// 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) -#ifndef LONG_DWA2002627_HPP -# define LONG_DWA2002627_HPP - -# include - -# include -# include - -namespace boost { namespace python { - -namespace detail -{ - struct BOOST_PYTHON_DECL long_base : object - { - protected: - long_base(); // new long_ - explicit long_base(object_cref rhs); - explicit long_base(object_cref rhs, object_cref base); - - BOOST_PYTHON_FORWARD_OBJECT_CONSTRUCTORS(long_base, object) - - private: - static detail::new_non_null_reference call(object const&); - static detail::new_non_null_reference call(object const&, object const&); - }; -} - -class long_ : public detail::long_base -{ - typedef detail::long_base base; - public: - long_() {} // new long_ - - template - explicit long_(T const& rhs) - : detail::long_base(object(rhs)) - { - } - - template - explicit long_(T const& rhs, U const& base) - : detail::long_base(object(rhs), object(base)) - { - } - - public: // implementation detail -- for internal use only - BOOST_PYTHON_FORWARD_OBJECT_CONSTRUCTORS(long_, base) -}; - -// -// Converter Specializations -// -namespace converter -{ - template <> - struct object_manager_traits - : pytype_object_manager_traits<&PyLong_Type,long_> - { - }; -} - -}} // namespace boost::python - -#endif // LONG_DWA2002627_HPP diff --git a/include/boost/python/lvalue_from_pytype.hpp b/include/boost/python/lvalue_from_pytype.hpp deleted file mode 100644 index e15dfbbb..00000000 --- a/include/boost/python/lvalue_from_pytype.hpp +++ /dev/null @@ -1,116 +0,0 @@ -// 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) -#ifndef LVALUE_FROM_PYTYPE_DWA2002130_HPP -# define LVALUE_FROM_PYTYPE_DWA2002130_HPP - -# include -#ifndef BOOST_PYTHON_NO_PY_SIGNATURES -# include -#endif - -# include -# include -# include - -namespace boost { namespace python { - -namespace detail -{ - // Given a pointer-to-function of 1 parameter returning a reference - // type, return the type_id of the function's return type. - template - inline type_info extractor_type_id(T&(*)(U)) - { - return type_id(); - } - - // A function generator whose static execute() function is an lvalue - // from_python converter using the given Extractor. U is expected to - // be the actual type of the PyObject instance from which the result - // is being extracted. - template - struct normalized_extractor - { - static inline void* execute(PyObject* op) - { - typedef typename boost::add_reference::type param; - return &Extractor::execute( - boost::python::detail::void_ptr_to_reference( - op, (param(*)())0 ) - ); - } - }; - - // Given an Extractor type and a pointer to its execute function, - // return a new object whose static execute function does the same - // job but is a conforming lvalue from_python conversion function. - // - // usage: normalize(&Extractor::execute) - template - inline normalized_extractor - normalize(T(*)(U), Extractor* = 0) - { - return normalized_extractor(); - } -} - -// An Extractor which extracts the given member from a Python object -// whose instances are stored as InstanceType. -template -struct extract_member -{ - static MemberType& execute(InstanceType& c) - { - (void)Py_TYPE(&c); // static assertion - return c.*member; - } -}; - -// An Extractor which simply extracts the entire python object -// instance of InstanceType. -template -struct extract_identity -{ - static InstanceType& execute(InstanceType& c) - { - (void)Py_TYPE(&c); // static assertion - return c; - } -}; - -// Registers a from_python conversion which extracts lvalues using -// Extractor's static execute function from Python objects whose type -// object is python_type. -template -struct lvalue_from_pytype -{ - lvalue_from_pytype() - { - converter::registry::insert - ( &extract - , detail::extractor_type_id(&Extractor::execute) -#ifndef BOOST_PYTHON_NO_PY_SIGNATURES - , &get_pytype -#endif - ); - } - private: - static void* extract(PyObject* op) - { - return PyObject_TypeCheck(op, const_cast(python_type)) - ? const_cast( - static_cast( - detail::normalize(&Extractor::execute).execute(op))) - : 0 - ; - } -#ifndef BOOST_PYTHON_NO_PY_SIGNATURES - static PyTypeObject const*get_pytype() { return python_type; } -#endif -}; - -}} // namespace boost::python - -#endif // LVALUE_FROM_PYTYPE_DWA2002130_HPP diff --git a/include/boost/python/make_constructor.hpp b/include/boost/python/make_constructor.hpp deleted file mode 100644 index 47cdf469..00000000 --- a/include/boost/python/make_constructor.hpp +++ /dev/null @@ -1,281 +0,0 @@ -// Copyright David Abrahams 2001. -// 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 MAKE_CONSTRUCTOR_DWA20011221_HPP -# define MAKE_CONSTRUCTOR_DWA20011221_HPP - -# include - -# include -# include -# include - -# include -# include -# include -# include - -# include -# include - -# include -# include -# include -# include -# include - -namespace boost { namespace python { - -namespace detail -{ - template - struct install_holder : converter::context_result_converter - { - install_holder(PyObject* args_) - : m_self(PyTuple_GetItem(args_, 0)) {} - - PyObject* operator()(T x) const - { - dispatch(x, is_pointer()); - return none(); - } - - private: - template - void dispatch(U* x, mpl::true_) const - { - std::auto_ptr owner(x); - dispatch(owner, mpl::false_()); - } - - template - void dispatch(Ptr x, mpl::false_) const - { - typedef typename pointee::type value_type; - typedef objects::pointer_holder holder; - typedef objects::instance instance_t; - - void* memory = holder::allocate(this->m_self, offsetof(instance_t, storage), sizeof(holder)); - try { - (new (memory) holder(x))->install(this->m_self); - } - catch(...) { - holder::deallocate(this->m_self, memory); - throw; - } - } - - PyObject* m_self; - }; - - struct constructor_result_converter - { - template - struct apply - { - typedef install_holder type; - }; - }; - - template - struct offset_args - { - offset_args(BaseArgs base_) : base(base_) {} - BaseArgs base; - }; - - template - inline PyObject* get(mpl::int_, offset_args const& args_) - { - return get(mpl::int_<(N+Offset::value)>(), args_.base); - } - - template - inline unsigned arity(offset_args const& args_) - { - return arity(args_.base) - Offset::value; - } - - template - struct constructor_policy : BasePolicy_ - { - constructor_policy(BasePolicy_ base) : BasePolicy_(base) {} - - // If the BasePolicy_ supplied a result converter it would be - // ignored; issue an error if it's not the default. - BOOST_MPL_ASSERT_MSG( - (is_same< - typename BasePolicy_::result_converter - , default_result_converter - >::value) - , MAKE_CONSTRUCTOR_SUPPLIES_ITS_OWN_RESULT_CONVERTER_THAT_WOULD_OVERRIDE_YOURS - , (typename BasePolicy_::result_converter) - ); - typedef constructor_result_converter result_converter; - typedef offset_args > argument_package; - }; - - template - struct outer_constructor_signature - { - typedef typename mpl::pop_front::type inner_args; - typedef typename mpl::push_front::type outer_args; - typedef typename mpl::push_front::type type; - }; - - // ETI workaround - template <> - struct outer_constructor_signature - { - typedef int type; - }; - - // - // These helper functions for make_constructor (below) do the raw work - // of constructing a Python object from some invokable entity. See - // for more information about how - // the Sig arguments is used. - // - // @group make_constructor_aux { - template - object make_constructor_aux( - F f // An object that can be invoked by detail::invoke() - , CallPolicies const& p // CallPolicies to use in the invocation - , Sig const& // An MPL sequence of argument types expected by F - ) - { - typedef typename outer_constructor_signature::type outer_signature; - - typedef constructor_policy inner_policy; - - return objects::function_object( - objects::py_function( - detail::caller(f, inner_policy(p)) - , outer_signature() - ) - ); - } - - // As above, except that it accepts argument keywords. NumKeywords - // is used only for a compile-time assertion to make sure the user - // doesn't pass more keywords than the function can accept. To - // disable all checking, pass mpl::int_<0> for NumKeywords. - template - object make_constructor_aux( - F f - , CallPolicies const& p - , Sig const& - , detail::keyword_range const& kw // a [begin,end) pair of iterators over keyword names - , NumKeywords // An MPL integral type wrapper: the size of kw - ) - { - enum { arity = mpl::size::value - 1 }; - - typedef typename detail::error::more_keywords_than_function_arguments< - NumKeywords::value, arity - >::too_many_keywords assertion; - - typedef typename outer_constructor_signature::type outer_signature; - - typedef constructor_policy inner_policy; - - return objects::function_object( - objects::py_function( - detail::caller(f, inner_policy(p)) - , outer_signature() - ) - , kw - ); - } - // } - - // - // These dispatch functions are used to discriminate between the - // cases when the 3rd argument is keywords or when it is a - // signature. - // - // @group Helpers for make_constructor when called with 3 arguments. { - // - template - object make_constructor_dispatch(F f, CallPolicies const& policies, Keywords const& kw, mpl::true_) - { - return detail::make_constructor_aux( - f - , policies - , detail::get_signature(f) - , kw.range() - , mpl::int_() - ); - } - - template - object make_constructor_dispatch(F f, CallPolicies const& policies, Signature const& sig, mpl::false_) - { - return detail::make_constructor_aux( - f - , policies - , sig - ); - } - // } -} - -// These overloaded functions wrap a function or member function -// pointer as a Python object, using optional CallPolicies, -// Keywords, and/or Signature. @group { -// -template -object make_constructor(F f) -{ - return detail::make_constructor_aux( - f,default_call_policies(), detail::get_signature(f)); -} - -template -object make_constructor(F f, CallPolicies const& policies) -{ - return detail::make_constructor_aux( - f, policies, detail::get_signature(f)); -} - -template -object make_constructor( - F f - , CallPolicies const& policies - , KeywordsOrSignature const& keywords_or_signature) -{ - typedef typename - detail::is_reference_to_keywords::type - is_kw; - - return detail::make_constructor_dispatch( - f - , policies - , keywords_or_signature - , is_kw() - ); -} - -template -object make_constructor( - F f - , CallPolicies const& policies - , Keywords const& kw - , Signature const& sig - ) -{ - return detail::make_constructor_aux( - f - , policies - , sig - , kw.range() - , mpl::int_() - ); -} -// } - -}} - - -#endif // MAKE_CONSTRUCTOR_DWA20011221_HPP diff --git a/include/boost/python/make_function.hpp b/include/boost/python/make_function.hpp deleted file mode 100644 index f2f2a9e5..00000000 --- a/include/boost/python/make_function.hpp +++ /dev/null @@ -1,153 +0,0 @@ -// Copyright David Abrahams 2001. -// 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 MAKE_FUNCTION_DWA20011221_HPP -# define MAKE_FUNCTION_DWA20011221_HPP - -# include - -# include -# include -# include - -# include - -# include -# include - -namespace boost { namespace python { - -namespace detail -{ - // make_function_aux -- - // - // These helper functions for make_function (below) do the raw work - // of constructing a Python object from some invokable entity. See - // for more information about how - // the Sig arguments is used. - template - object make_function_aux( - F f // An object that can be invoked by detail::invoke() - , CallPolicies const& p // CallPolicies to use in the invocation - , Sig const& // An MPL sequence of argument types expected by F - ) - { - return objects::function_object( - detail::caller(f, p) - ); - } - - // As above, except that it accepts argument keywords. NumKeywords - // is used only for a compile-time assertion to make sure the user - // doesn't pass more keywords than the function can accept. To - // disable all checking, pass mpl::int_<0> for NumKeywords. - template - object make_function_aux( - F f - , CallPolicies const& p - , Sig const& - , detail::keyword_range const& kw // a [begin,end) pair of iterators over keyword names - , NumKeywords // An MPL integral type wrapper: the size of kw - ) - { - enum { arity = mpl::size::value - 1 }; - - typedef typename detail::error::more_keywords_than_function_arguments< - NumKeywords::value, arity - >::too_many_keywords assertion; - - return objects::function_object( - detail::caller(f, p) - , kw); - } - - // Helpers for make_function when called with 3 arguments. These - // dispatch functions are used to discriminate between the cases - // when the 3rd argument is keywords or when it is a signature. - // - // @group { - template - object make_function_dispatch(F f, CallPolicies const& policies, Keywords const& kw, mpl::true_) - { - return detail::make_function_aux( - f - , policies - , detail::get_signature(f) - , kw.range() - , mpl::int_() - ); - } - - template - object make_function_dispatch(F f, CallPolicies const& policies, Signature const& sig, mpl::false_) - { - return detail::make_function_aux( - f - , policies - , sig - ); - } - // } - - } - -// These overloaded functions wrap a function or member function -// pointer as a Python object, using optional CallPolicies, -// Keywords, and/or Signature. -// -// @group { -template -object make_function(F f) -{ - return detail::make_function_aux( - f,default_call_policies(), detail::get_signature(f)); -} - -template -object make_function(F f, CallPolicies const& policies) -{ - return detail::make_function_aux( - f, policies, detail::get_signature(f)); -} - -template -object make_function( - F f - , CallPolicies const& policies - , KeywordsOrSignature const& keywords_or_signature) -{ - typedef typename - detail::is_reference_to_keywords::type - is_kw; - - return detail::make_function_dispatch( - f - , policies - , keywords_or_signature - , is_kw() - ); -} - -template -object make_function( - F f - , CallPolicies const& policies - , Keywords const& kw - , Signature const& sig - ) -{ - return detail::make_function_aux( - f - , policies - , sig - , kw.range() - , mpl::int_() - ); -} -// } - -}} - - -#endif // MAKE_FUNCTION_DWA20011221_HPP diff --git a/include/boost/python/manage_new_object.hpp b/include/boost/python/manage_new_object.hpp deleted file mode 100644 index 9585b13a..00000000 --- a/include/boost/python/manage_new_object.hpp +++ /dev/null @@ -1,41 +0,0 @@ -// 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) -#ifndef MANAGE_NEW_OBJECT_DWA200222_HPP -# define MANAGE_NEW_OBJECT_DWA200222_HPP - -# include -# include -# include -# include -# include - -namespace boost { namespace python { - -namespace detail -{ - template - struct manage_new_object_requires_a_pointer_return_type -# if defined(__GNUC__) || defined(__EDG__) - {} -# endif - ; -} - -struct manage_new_object -{ - template - struct apply - { - typedef typename mpl::if_c< - boost::is_pointer::value - , to_python_indirect - , detail::manage_new_object_requires_a_pointer_return_type - >::type type; - }; -}; - -}} // namespace boost::python - -#endif // MANAGE_NEW_OBJECT_DWA200222_HPP diff --git a/include/boost/python/module.hpp b/include/boost/python/module.hpp deleted file mode 100644 index 8ad69f5a..00000000 --- a/include/boost/python/module.hpp +++ /dev/null @@ -1,13 +0,0 @@ -// Copyright David Abrahams 2001. -// 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 MODULE_DWA2001128_HPP -# define MODULE_DWA2001128_HPP - -# include - -# include -# define BOOST_PYTHON_MODULE BOOST_PYTHON_MODULE_INIT - -#endif // MODULE_DWA20011221_HPP diff --git a/include/boost/python/module_init.hpp b/include/boost/python/module_init.hpp deleted file mode 100644 index a9536c88..00000000 --- a/include/boost/python/module_init.hpp +++ /dev/null @@ -1,91 +0,0 @@ -// 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) -#ifndef MODULE_INIT_DWA20020722_HPP -# define MODULE_INIT_DWA20020722_HPP - -# include -# include -# include - -# ifndef BOOST_PYTHON_MODULE_INIT - -namespace boost { namespace python { namespace detail { - -# if PY_VERSION_HEX >= 0x03000000 - -BOOST_PYTHON_DECL PyObject* init_module(PyModuleDef&, void(*)()); - -#else - -BOOST_PYTHON_DECL PyObject* init_module(char const* name, void(*)()); - -#endif - -}}} - -# if PY_VERSION_HEX >= 0x03000000 - -# define _BOOST_PYTHON_MODULE_INIT(name) \ - PyObject* BOOST_PP_CAT(PyInit_, name)() \ - { \ - static PyModuleDef_Base initial_m_base = { \ - PyObject_HEAD_INIT(NULL) \ - 0, /* m_init */ \ - 0, /* m_index */ \ - 0 /* m_copy */ }; \ - static PyMethodDef initial_methods[] = { { 0, 0, 0, 0 } }; \ - \ - static struct PyModuleDef moduledef = { \ - initial_m_base, \ - BOOST_PP_STRINGIZE(name), \ - 0, /* m_doc */ \ - -1, /* m_size */ \ - initial_methods, \ - 0, /* m_reload */ \ - 0, /* m_traverse */ \ - 0, /* m_clear */ \ - 0, /* m_free */ \ - }; \ - \ - return boost::python::detail::init_module( \ - moduledef, BOOST_PP_CAT(init_module_, name) ); \ - } \ - void BOOST_PP_CAT(init_module_, name)() - -# else - -# define _BOOST_PYTHON_MODULE_INIT(name) \ - void BOOST_PP_CAT(init,name)() \ -{ \ - boost::python::detail::init_module( \ - BOOST_PP_STRINGIZE(name),&BOOST_PP_CAT(init_module_,name)); \ -} \ - void BOOST_PP_CAT(init_module_,name)() - -# endif - -# if (defined(_WIN32) || defined(__CYGWIN__)) && !defined(BOOST_PYTHON_STATIC_MODULE) - -# define BOOST_PYTHON_MODULE_INIT(name) \ - void BOOST_PP_CAT(init_module_,name)(); \ -extern "C" __declspec(dllexport) _BOOST_PYTHON_MODULE_INIT(name) - -# elif BOOST_PYTHON_USE_GCC_SYMBOL_VISIBILITY - -# define BOOST_PYTHON_MODULE_INIT(name) \ - void BOOST_PP_CAT(init_module_,name)(); \ -extern "C" __attribute__ ((__visibility__("default"))) _BOOST_PYTHON_MODULE_INIT(name) - -# else - -# define BOOST_PYTHON_MODULE_INIT(name) \ - void BOOST_PP_CAT(init_module_,name)(); \ -extern "C" _BOOST_PYTHON_MODULE_INIT(name) - -# endif - -# endif - -#endif // MODULE_INIT_DWA20020722_HPP diff --git a/include/boost/python/numeric.hpp b/include/boost/python/numeric.hpp deleted file mode 100644 index ab4db8c3..00000000 --- a/include/boost/python/numeric.hpp +++ /dev/null @@ -1,242 +0,0 @@ -// 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) -#ifndef NUMARRAY_DWA2002922_HPP -# define NUMARRAY_DWA2002922_HPP - -# include - -# include -# include -# include -# include -# include -# include -# include - -namespace boost { namespace python { namespace numeric { - -class array; - -namespace aux -{ - struct BOOST_PYTHON_DECL array_base : object - { -# define BOOST_PP_LOCAL_MACRO(n) \ - array_base(BOOST_PP_ENUM_PARAMS_Z(1, n, object const& x)); -# define BOOST_PP_LOCAL_LIMITS (1, 7) -# include BOOST_PP_LOCAL_ITERATE() - - object argmax(long axis=-1); - object argmin(long axis=-1); - object argsort(long axis=-1); - object astype(object const& type = object()); - void byteswap(); - object copy() const; - object diagonal(long offset = 0, long axis1 = 0, long axis2 = 1) const; - void info() const; - bool is_c_array() const; - bool isbyteswapped() const; - array new_(object type) const; - void sort(); - object trace(long offset = 0, long axis1 = 0, long axis2 = 1) const; - object type() const; - char typecode() const; - - object factory( - object const& sequence = object() - , object const& typecode = object() - , bool copy = true - , bool savespace = false - , object type = object() - , object shape = object()); - - object getflat() const; - long getrank() const; - object getshape() const; - bool isaligned() const; - bool iscontiguous() const; - long itemsize() const; - long nelements() const; - object nonzero() const; - - void put(object const& indices, object const& values); - - void ravel(); - - object repeat(object const& repeats, long axis=0); - - void resize(object const& shape); - - void setflat(object const& flat); - void setshape(object const& shape); - - void swapaxes(long axis1, long axis2); - - object take(object const& sequence, long axis = 0) const; - - void tofile(object const& file) const; - - str tostring() const; - - void transpose(object const& axes = object()); - - object view() const; - - public: // implementation detail - do not touch. - BOOST_PYTHON_FORWARD_OBJECT_CONSTRUCTORS(array_base, object); - }; - - struct BOOST_PYTHON_DECL array_object_manager_traits - { - static bool check(PyObject* obj); - static detail::new_non_null_reference adopt(PyObject* obj); - static PyTypeObject const* get_pytype() ; - }; -} // namespace aux - -class array : public aux::array_base -{ - typedef aux::array_base base; - public: - - object astype() { return base::astype(); } - - template - object astype(Type const& type_) - { - return base::astype(object(type_)); - } - - template - array new_(Type const& type_) const - { - return base::new_(object(type_)); - } - - template - void resize(Sequence const& x) - { - base::resize(object(x)); - } - -# define BOOST_PP_LOCAL_MACRO(n) \ - void resize(BOOST_PP_ENUM_PARAMS_Z(1, n, long x)) \ - { \ - resize(make_tuple(BOOST_PP_ENUM_PARAMS_Z(1, n, x))); \ - } -# define BOOST_PP_LOCAL_LIMITS (1, BOOST_PYTHON_MAX_ARITY) -# include BOOST_PP_LOCAL_ITERATE() - - template - void setshape(Sequence const& x) - { - base::setshape(object(x)); - } - -# define BOOST_PP_LOCAL_MACRO(n) \ - void setshape(BOOST_PP_ENUM_PARAMS_Z(1, n, long x)) \ - { \ - setshape(make_tuple(BOOST_PP_ENUM_PARAMS_Z(1, n, x))); \ - } -# define BOOST_PP_LOCAL_LIMITS (1, BOOST_PYTHON_MAX_ARITY) -# include BOOST_PP_LOCAL_ITERATE() - - template - void put(Indices const& indices, Values const& values) - { - base::put(object(indices), object(values)); - } - - template - object take(Sequence const& sequence, long axis = 0) - { - return base::take(object(sequence), axis); - } - - template - void tofile(File const& f) const - { - base::tofile(object(f)); - } - - object factory() - { - return base::factory(); - } - - template - object factory(Sequence const& sequence) - { - return base::factory(object(sequence)); - } - - template - object factory( - Sequence const& sequence - , Typecode const& typecode_ - , bool copy = true - , bool savespace = false - ) - { - return base::factory(object(sequence), object(typecode_), copy, savespace); - } - - template - object factory( - Sequence const& sequence - , Typecode const& typecode_ - , bool copy - , bool savespace - , Type const& type - ) - { - return base::factory(object(sequence), object(typecode_), copy, savespace, object(type)); - } - - template - object factory( - Sequence const& sequence - , Typecode const& typecode_ - , bool copy - , bool savespace - , Type const& type - , Shape const& shape - ) - { - return base::factory(object(sequence), object(typecode_), copy, savespace, object(type), object(shape)); - } - -# define BOOST_PYTHON_ENUM_AS_OBJECT(z, n, x) object(BOOST_PP_CAT(x,n)) -# define BOOST_PP_LOCAL_MACRO(n) \ - template \ - explicit array(BOOST_PP_ENUM_BINARY_PARAMS_Z(1, n, T, const& x)) \ - : base(BOOST_PP_ENUM_1(n, BOOST_PYTHON_ENUM_AS_OBJECT, x)) \ - {} -# define BOOST_PP_LOCAL_LIMITS (1, 7) -# include BOOST_PP_LOCAL_ITERATE() -# undef BOOST_PYTHON_AS_OBJECT - - static BOOST_PYTHON_DECL void set_module_and_type(char const* package_name = 0, char const* type_attribute_name = 0); - static BOOST_PYTHON_DECL std::string get_module_name(); - - public: // implementation detail -- for internal use only - BOOST_PYTHON_FORWARD_OBJECT_CONSTRUCTORS(array, base); -}; - -} // namespace boost::python::numeric - -namespace converter -{ - template <> - struct object_manager_traits< numeric::array > - : numeric::aux::array_object_manager_traits - { - BOOST_STATIC_CONSTANT(bool, is_specialized = true); - }; -} - -}} // namespace boost::python - -#endif // NUMARRAY_DWA2002922_HPP diff --git a/include/boost/python/object.hpp b/include/boost/python/object.hpp deleted file mode 100755 index 9adec90f..00000000 --- a/include/boost/python/object.hpp +++ /dev/null @@ -1,27 +0,0 @@ -// 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) -#ifndef OBJECT_DWA2002612_HPP -# define OBJECT_DWA2002612_HPP - -# include -# include -# include -# include -# include -# include -# include - -namespace boost { namespace python { - - inline ssize_t len(object const& obj) - { - ssize_t result = PyObject_Length(obj.ptr()); - if (PyErr_Occurred()) throw_error_already_set(); - return result; - } - -}} // namespace boost::python - -#endif // OBJECT_DWA2002612_HPP diff --git a/include/boost/python/object/add_to_namespace.hpp b/include/boost/python/object/add_to_namespace.hpp deleted file mode 100644 index 9f4167d6..00000000 --- a/include/boost/python/object/add_to_namespace.hpp +++ /dev/null @@ -1,23 +0,0 @@ -// 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) -#ifndef ADD_TO_NAMESPACE_DWA200286_HPP -# define ADD_TO_NAMESPACE_DWA200286_HPP - -# include - -namespace boost { namespace python { namespace objects { - -// -// A setattr that's "smart" about function overloading (and docstrings). -// -BOOST_PYTHON_DECL void add_to_namespace( - object const& name_space, char const* name, object const& attribute); - -BOOST_PYTHON_DECL void add_to_namespace( - object const& name_space, char const* name, object const& attribute, char const* doc); - -}}} // namespace boost::python::objects - -#endif // ADD_TO_NAMESPACE_DWA200286_HPP diff --git a/include/boost/python/object/class.hpp b/include/boost/python/object/class.hpp deleted file mode 100644 index f57ceda7..00000000 --- a/include/boost/python/object/class.hpp +++ /dev/null @@ -1,63 +0,0 @@ -// Copyright David Abrahams 2001. -// 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 CLASS_DWA20011214_HPP -# define CLASS_DWA20011214_HPP - -# include -# include -# include -# include - -namespace boost { namespace python { - -namespace objects { - -struct BOOST_PYTHON_DECL class_base : python::api::object -{ - // constructor - class_base( - char const* name // The name of the class - - , std::size_t num_types // A list of class_ids. The first is the type - , type_info const*const types // this is wrapping. The rest are the types of - // any bases. - - , char const* doc = 0 // Docstring, if any. - ); - - - // Implementation detail. Hiding this in the private section would - // require use of template friend declarations. - void enable_pickling_(bool getstate_manages_dict); - - protected: - void add_property( - char const* name, object const& fget, char const* docstr); - void add_property(char const* name, - object const& fget, object const& fset, char const* docstr); - - void add_static_property(char const* name, object const& fget); - void add_static_property(char const* name, object const& fget, object const& fset); - - // Retrieve the underlying object - void setattr(char const* name, object const&); - - // Set a special attribute in the class which tells Boost.Python - // to allocate extra bytes for embedded C++ objects in Python - // instances. - void set_instance_size(std::size_t bytes); - - // Set an __init__ function which throws an appropriate exception - // for abstract classes. - void def_no_init(); - - // Effects: - // setattr(self, staticmethod(getattr(self, method_name))) - void make_method_static(const char *method_name); -}; - -}}} // namespace boost::python::objects - -#endif // CLASS_DWA20011214_HPP diff --git a/include/boost/python/object/class_detail.hpp b/include/boost/python/object/class_detail.hpp deleted file mode 100644 index a17a4f43..00000000 --- a/include/boost/python/object/class_detail.hpp +++ /dev/null @@ -1,19 +0,0 @@ -// 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) -#ifndef CLASS_DETAIL_DWA200295_HPP -# define CLASS_DETAIL_DWA200295_HPP - -# include -# include - -namespace boost { namespace python { namespace objects { - -BOOST_PYTHON_DECL type_handle registered_class_object(type_info id); -BOOST_PYTHON_DECL type_handle class_metatype(); -BOOST_PYTHON_DECL type_handle class_type(); - -}}} // namespace boost::python::object - -#endif // CLASS_DETAIL_DWA200295_HPP diff --git a/include/boost/python/object/class_metadata.hpp b/include/boost/python/object/class_metadata.hpp deleted file mode 100644 index c71cf67c..00000000 --- a/include/boost/python/object/class_metadata.hpp +++ /dev/null @@ -1,293 +0,0 @@ -// Copyright David Abrahams 2004. 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 CLASS_METADATA_DWA2004719_HPP -# define CLASS_METADATA_DWA2004719_HPP -# include - -# include -# include -# include -# include -# include -# include - -# include -# include - -# include -# include - -# include -# include -# include - -# include -# include -# include -# include -# include -# include -# include -# include - -# include -# include - -# include - -# include -# include - -namespace boost { namespace python { namespace objects { - -BOOST_PYTHON_DECL -void copy_class_object(type_info const& src, type_info const& dst); - -// -// Support for registering base/derived relationships -// -template -struct register_base_of -{ - template - inline void operator()(Base*) const - { - BOOST_MPL_ASSERT_NOT((is_same)); - - // Register the Base class - register_dynamic_id(); - - // Register the up-cast - register_conversion(false); - - // Register the down-cast, if appropriate. - this->register_downcast((Base*)0, is_polymorphic()); - } - - private: - static inline void register_downcast(void*, mpl::false_) {} - - template - static inline void register_downcast(Base*, mpl::true_) - { - register_conversion(true); - } - -}; - -// -// Preamble of register_class. Also used for callback classes, which -// need some registration of their own. -// -template -inline void register_shared_ptr_from_python_and_casts(T*, Bases) -{ - // Constructor performs registration - python::detail::force_instantiate(converter::shared_ptr_from_python()); - - // - // register all up/downcasts here. We're using the alternate - // interface to mpl::for_each to avoid an MSVC 6 bug. - // - register_dynamic_id(); - mpl::for_each(register_base_of(), (Bases*)0, (add_pointer*)0); -} - -// -// Helper for choosing the unnamed held_type argument -// -template -struct select_held_type - : mpl::if_< - mpl::or_< - python::detail::specifies_bases - , is_same - > - , Prev - , T - > -{ -}; - -template < - class T // class being wrapped - , class X1 // = detail::not_specified - , class X2 // = detail::not_specified - , class X3 // = detail::not_specified -> -struct class_metadata -{ - // - // Calculate the unnamed template arguments - // - - // held_type_arg -- not_specified, [a class derived from] T or a - // smart pointer to [a class derived from] T. Preserving - // not_specified allows us to give class_ a back-reference. - typedef typename select_held_type< - X1 - , typename select_held_type< - X2 - , typename select_held_type< - X3 - , python::detail::not_specified - >::type - >::type - >::type held_type_arg; - - // bases - typedef typename python::detail::select_bases< - X1 - , typename python::detail::select_bases< - X2 - , typename python::detail::select_bases< - X3 - , python::bases<> - >::type - >::type - >::type bases; - - typedef mpl::or_< - is_same - , is_same - , is_same - > is_noncopyable; - - // - // Holder computation. - // - - // Compute the actual type that will be held in the Holder. - typedef typename mpl::if_< - is_same, T, held_type_arg - >::type held_type; - - // Determine if the object will be held by value - typedef is_convertible use_value_holder; - - // Compute the "wrapped type", that is, if held_type is a smart - // pointer, we're talking about the pointee. - typedef typename mpl::eval_if< - use_value_holder - , mpl::identity - , pointee - >::type wrapped; - - // Determine whether to use a "back-reference holder" - typedef mpl::or_< - has_back_reference - , is_same - , is_base_and_derived - > use_back_reference; - - // Select the holder. - typedef typename mpl::eval_if< - use_back_reference - , mpl::if_< - use_value_holder - , value_holder_back_reference - , pointer_holder_back_reference - > - , mpl::if_< - use_value_holder - , value_holder - , pointer_holder - > - >::type holder; - - inline static void register_() // Register the runtime metadata. - { - class_metadata::register_aux((T*)0); - } - - private: - template - inline static void register_aux(python::wrapper*) - { - typedef typename mpl::not_ >::type use_callback; - class_metadata::register_aux2((T2*)0, use_callback()); - } - - inline static void register_aux(void*) - { - typedef typename is_base_and_derived::type use_callback; - class_metadata::register_aux2((T*)0, use_callback()); - } - - template - inline static void register_aux2(T2*, Callback) - { - objects::register_shared_ptr_from_python_and_casts((T2*)0, bases()); - - class_metadata::maybe_register_callback_class((T2*)0, Callback()); - - class_metadata::maybe_register_class_to_python((T2*)0, is_noncopyable()); - - class_metadata::maybe_register_pointer_to_python( - (T2*)0, (use_value_holder*)0, (use_back_reference*)0); - } - - - // - // Support for converting smart pointers to python - // - inline static void maybe_register_pointer_to_python(...) {} - -#ifndef BOOST_PYTHON_NO_PY_SIGNATURES - inline static void maybe_register_pointer_to_python(void*,void*,mpl::true_*) - { - objects::copy_class_object(python::type_id(), python::type_id >()); - objects::copy_class_object(python::type_id(), python::type_id >()); - } -#endif - - template - inline static void maybe_register_pointer_to_python(T2*, mpl::false_*, mpl::false_*) - { - python::detail::force_instantiate( - objects::class_value_wrapper< - held_type - , make_ptr_instance > - >() - ); -#ifndef BOOST_PYTHON_NO_PY_SIGNATURES - // explicit qualification of type_id makes msvc6 happy - objects::copy_class_object(python::type_id(), python::type_id()); -#endif - } - // - // Support for registering to-python converters - // - inline static void maybe_register_class_to_python(void*, mpl::true_) {} - - - template - inline static void maybe_register_class_to_python(T2*, mpl::false_) - { - python::detail::force_instantiate(class_cref_wrapper >()); -#ifndef BOOST_PYTHON_NO_PY_SIGNATURES - // explicit qualification of type_id makes msvc6 happy - objects::copy_class_object(python::type_id(), python::type_id()); -#endif - } - - // - // Support for registering callback classes - // - inline static void maybe_register_callback_class(void*, mpl::false_) {} - - template - inline static void maybe_register_callback_class(T2*, mpl::true_) - { - objects::register_shared_ptr_from_python_and_casts( - (wrapped*)0, mpl::single_view()); - - // explicit qualification of type_id makes msvc6 happy - objects::copy_class_object(python::type_id(), python::type_id()); - } -}; - -}}} // namespace boost::python::object - -#endif // CLASS_METADATA_DWA2004719_HPP diff --git a/include/boost/python/object/class_wrapper.hpp b/include/boost/python/object/class_wrapper.hpp deleted file mode 100644 index ffee7457..00000000 --- a/include/boost/python/object/class_wrapper.hpp +++ /dev/null @@ -1,51 +0,0 @@ -// Copyright David Abrahams 2001. -// 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 CLASS_WRAPPER_DWA20011221_HPP -# define CLASS_WRAPPER_DWA20011221_HPP - -# include -#ifndef BOOST_PYTHON_NO_PY_SIGNATURES -# include -#endif -# include - -namespace boost { namespace python { namespace objects { - -// -// These two classes adapt the static execute function of a class -// MakeInstance execute() function returning a new PyObject* -// reference. The first one is used for class copy constructors, and -// the second one is used to handle smart pointers. -// - -template -struct class_cref_wrapper - : to_python_converter ,true> -{ - static PyObject* convert(Src const& x) - { - return MakeInstance::execute(boost::ref(x)); - } -#ifndef BOOST_PYTHON_NO_PY_SIGNATURES - static PyTypeObject const *get_pytype() { return converter::registered_pytype_direct::get_pytype(); } -#endif -}; - -template -struct class_value_wrapper - : to_python_converter ,true> -{ - static PyObject* convert(Src x) - { - return MakeInstance::execute(x); - } -#ifndef BOOST_PYTHON_NO_PY_SIGNATURES - static PyTypeObject const *get_pytype() { return MakeInstance::get_pytype(); } -#endif -}; - -}}} // namespace boost::python::objects - -#endif // CLASS_WRAPPER_DWA20011221_HPP diff --git a/include/boost/python/object/enum_base.hpp b/include/boost/python/object/enum_base.hpp deleted file mode 100644 index be342742..00000000 --- a/include/boost/python/object/enum_base.hpp +++ /dev/null @@ -1,36 +0,0 @@ -// 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) -#ifndef ENUM_BASE_DWA200298_HPP -# define ENUM_BASE_DWA200298_HPP - -# include -# include -# include -# include -# include - -namespace boost { namespace python { namespace objects { - -struct BOOST_PYTHON_DECL enum_base : python::api::object -{ - protected: - enum_base( - char const* name - , converter::to_python_function_t - , converter::convertible_function - , converter::constructor_function - , type_info - , const char *doc = 0 - ); - - void add_value(char const* name, long value); - void export_values(); - - static PyObject* to_python(PyTypeObject* type, long x); -}; - -}}} // namespace boost::python::object - -#endif // ENUM_BASE_DWA200298_HPP diff --git a/include/boost/python/object/find_instance.hpp b/include/boost/python/object/find_instance.hpp deleted file mode 100644 index 3202c1cd..00000000 --- a/include/boost/python/object/find_instance.hpp +++ /dev/null @@ -1,21 +0,0 @@ -// 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) -#ifndef FIND_INSTANCE_DWA2002312_HPP -# define FIND_INSTANCE_DWA2002312_HPP - -# include - -namespace boost { namespace python { namespace objects { - -// Given a type_id, find the instance data which corresponds to it, or -// return 0 in case no such type is held. If null_shared_ptr_only is -// true and the type being sought is a shared_ptr, only find an -// instance if it turns out to be NULL. Needed for shared_ptr rvalue -// from_python support. -BOOST_PYTHON_DECL void* find_instance_impl(PyObject*, type_info, bool null_shared_ptr_only = false); - -}}} // namespace boost::python::objects - -#endif // FIND_INSTANCE_DWA2002312_HPP diff --git a/include/boost/python/object/forward.hpp b/include/boost/python/object/forward.hpp deleted file mode 100644 index 30613d8e..00000000 --- a/include/boost/python/object/forward.hpp +++ /dev/null @@ -1,95 +0,0 @@ -// Copyright David Abrahams 2001. -// 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 FORWARD_DWA20011215_HPP -# define FORWARD_DWA20011215_HPP - -# include -# include -# include -# include -# include -# include -# include -# include - -namespace boost { namespace python { namespace objects { - -// Very much like boost::reference_wrapper, except that in this -// case T can be a reference already without causing a -// reference-to-reference error. -template -struct reference_to_value -{ - typedef typename add_reference::type>::type reference; - - reference_to_value(reference x) : m_value(x) {} - reference get() const { return m_value; } - private: - reference m_value; -}; - -// A little metaprogram which selects the type to pass through an -// intermediate forwarding function when the destination argument type -// is T. -template -struct forward - : mpl::if_< - mpl::or_, is_scalar > - , T - , reference_to_value - > -{ -}; - -template -struct unforward -{ - typedef typename unwrap_reference::type& type; -}; - -template -struct unforward > -{ - typedef T type; -}; - -template -struct unforward_cref - : python::detail::value_arg< - typename unwrap_reference::type - > -{ -}; - -template -struct unforward_cref > - : add_reference::type> -{ -}; - - -template -typename reference_to_value::reference -do_unforward(reference_to_value const& x, int) -{ - return x.get(); -} - -template -typename reference_wrapper::type& -do_unforward(reference_wrapper const& x, int) -{ - return x.get(); -} - -template -T const& do_unforward(T const& x, ...) -{ - return x; -} - -}}} // namespace boost::python::objects - -#endif // FORWARD_DWA20011215_HPP diff --git a/include/boost/python/object/function.hpp b/include/boost/python/object/function.hpp deleted file mode 100644 index f29d3448..00000000 --- a/include/boost/python/object/function.hpp +++ /dev/null @@ -1,82 +0,0 @@ -// Copyright David Abrahams 2001. -// 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 FUNCTION_DWA20011214_HPP -# define FUNCTION_DWA20011214_HPP - -# include -# include -# include -# include -# include -# include - -namespace boost { namespace python { namespace objects { - - -struct BOOST_PYTHON_DECL function : PyObject -{ - function( - py_function const& - , python::detail::keyword const* names_and_defaults - , unsigned num_keywords); - - ~function(); - - PyObject* call(PyObject*, PyObject*) const; - - // Add an attribute to the name_space with the given name. If it is - // a function object (this class), and an existing function is - // already there, add it as an overload. - static void add_to_namespace( - object const& name_space, char const* name, object const& attribute); - - static void add_to_namespace( - object const& name_space, char const* name, object const& attribute, char const* doc); - - object const& doc() const; - void doc(object const& x); - - object const& name() const; - - object const& get_namespace() const { return m_namespace; } - - private: // helper functions - object signature(bool show_return_type=false) const; - object signatures(bool show_return_type=false) const; - void argument_error(PyObject* args, PyObject* keywords) const; - void add_overload(handle const&); - - private: // data members - py_function m_fn; - handle m_overloads; - object m_name; - object m_namespace; - object m_doc; - object m_arg_names; - unsigned m_nkeyword_values; - friend class function_doc_signature_generator; -}; - -// -// implementations -// -inline object const& function::doc() const -{ - return this->m_doc; -} - -inline void function::doc(object const& x) -{ - this->m_doc = x; -} - -inline object const& function::name() const -{ - return this->m_name; -} - -}}} // namespace boost::python::objects - -#endif // FUNCTION_DWA20011214_HPP diff --git a/include/boost/python/object/function_doc_signature.hpp b/include/boost/python/object/function_doc_signature.hpp deleted file mode 100755 index 4f00cb38..00000000 --- a/include/boost/python/object/function_doc_signature.hpp +++ /dev/null @@ -1,36 +0,0 @@ -// Copyright Nikolay Mladenov 2007. -// 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 FUNCTION_SIGNATURE_20070531_HPP -# define FUNCTION_SIGNATURE_20070531_HPP - -#include -#include -#include -#include - -#include - - -#include - -namespace boost { namespace python { namespace objects { - -class function_doc_signature_generator{ - static const char * py_type_str(const python::detail::signature_element &s); - static bool arity_cmp( function const *f1, function const *f2 ); - static bool are_seq_overloads( function const *f1, function const *f2 , bool check_docs); - static std::vector flatten(function const *f); - static std::vector split_seq_overloads( const std::vector &funcs, bool split_on_doc_change); - static str raw_function_pretty_signature(function const *f, size_t n_overloads, bool cpp_types = false); - static str parameter_string(py_function const &f, size_t n, object arg_names, bool cpp_types); - static str pretty_signature(function const *f, size_t n_overloads, bool cpp_types = false); - -public: - static list function_doc_signatures( function const * f); -}; - -}}}//end of namespace boost::python::objects - -#endif //FUNCTION_SIGNATURE_20070531_HPP diff --git a/include/boost/python/object/function_handle.hpp b/include/boost/python/object/function_handle.hpp deleted file mode 100644 index 7edaf2ce..00000000 --- a/include/boost/python/object/function_handle.hpp +++ /dev/null @@ -1,44 +0,0 @@ -// 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) -#ifndef FUNCTION_HANDLE_DWA2002725_HPP -# define FUNCTION_HANDLE_DWA2002725_HPP -# include -# include -# include -# include -# include - -namespace boost { namespace python { namespace objects { - -BOOST_PYTHON_DECL handle<> function_handle_impl(py_function const& f); - -// Just like function_object, but returns a handle<> instead. Using -// this for arg_to_python<> allows us to break a circular dependency -// between object and arg_to_python. -template -inline handle<> function_handle(F const& f, Signature) -{ - enum { n_arguments = mpl::size::value - 1 }; - - return objects::function_handle_impl( - python::detail::caller< - F,default_call_policies,Signature - >( - f, default_call_policies() - ) - ); -} - -// Just like make_function, but returns a handle<> intead. Same -// reasoning as above. -template -handle<> make_function_handle(F f) -{ - return objects::function_handle(f, python::detail::get_signature(f)); -} - -}}} // namespace boost::python::objects - -#endif // FUNCTION_HANDLE_DWA2002725_HPP diff --git a/include/boost/python/object/function_object.hpp b/include/boost/python/object/function_object.hpp deleted file mode 100644 index eaa079fb..00000000 --- a/include/boost/python/object/function_object.hpp +++ /dev/null @@ -1,40 +0,0 @@ -// 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) -#ifndef FUNCTION_OBJECT_DWA2002725_HPP -# define FUNCTION_OBJECT_DWA2002725_HPP -# include -# include -# include -# include -# include - -namespace boost { namespace python { - -namespace objects -{ - BOOST_PYTHON_DECL api::object function_object( - py_function const& f - , python::detail::keyword_range const&); - - BOOST_PYTHON_DECL api::object function_object( - py_function const& f - , python::detail::keyword_range const&); - - BOOST_PYTHON_DECL api::object function_object(py_function const& f); - - // Add an attribute to the name_space with the given name. If it is - // a Boost.Python function object - // (boost/python/object/function.hpp), and an existing function is - // already there, add it as an overload. - BOOST_PYTHON_DECL void add_to_namespace( - object const& name_space, char const* name, object const& attribute); - - BOOST_PYTHON_DECL void add_to_namespace( - object const& name_space, char const* name, object const& attribute, char const* doc); -} - -}} // namespace boost::python::objects - -#endif // FUNCTION_OBJECT_DWA2002725_HPP diff --git a/include/boost/python/object/inheritance.hpp b/include/boost/python/object/inheritance.hpp deleted file mode 100644 index b49a0442..00000000 --- a/include/boost/python/object/inheritance.hpp +++ /dev/null @@ -1,132 +0,0 @@ -// 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) -#ifndef INHERITANCE_DWA200216_HPP -# define INHERITANCE_DWA200216_HPP - -# include -# include -# include -# include -# include -# include - -namespace boost { namespace python { namespace objects { - -typedef type_info class_id; -using python::type_id; - -// Types used to get address and id of most derived type -typedef std::pair dynamic_id_t; -typedef dynamic_id_t (*dynamic_id_function)(void*); - -BOOST_PYTHON_DECL void register_dynamic_id_aux( - class_id static_id, dynamic_id_function get_dynamic_id); - -BOOST_PYTHON_DECL void add_cast( - class_id src_t, class_id dst_t, void* (*cast)(void*), bool is_downcast); - -// -// a generator with an execute() function which, given a source type -// and a pointer to an object of that type, returns its most-derived -// /reachable/ type identifier and object pointer. -// - -// first, the case where T has virtual functions -template -struct polymorphic_id_generator -{ - static dynamic_id_t execute(void* p_) - { - T* p = static_cast(p_); - return std::make_pair(dynamic_cast(p), class_id(typeid(*p))); - } -}; - -// now, the non-polymorphic case. -template -struct non_polymorphic_id_generator -{ - static dynamic_id_t execute(void* p_) - { - return std::make_pair(p_, python::type_id()); - } -}; - -// Now the generalized selector -template -struct dynamic_id_generator - : mpl::if_< - boost::is_polymorphic - , boost::python::objects::polymorphic_id_generator - , boost::python::objects::non_polymorphic_id_generator - > -{}; - -// Register the dynamic id function for T with the type-conversion -// system. -template -void register_dynamic_id(T* = 0) -{ - typedef typename dynamic_id_generator::type generator; - register_dynamic_id_aux( - python::type_id(), &generator::execute); -} - -// -// a generator with an execute() function which, given a void* -// pointing to an object of type Source will attempt to convert it to -// an object of type Target. -// - -template -struct dynamic_cast_generator -{ - static void* execute(void* source) - { - return dynamic_cast( - static_cast(source)); - } - -}; - -template -struct implicit_cast_generator -{ - static void* execute(void* source) - { - Target* result = static_cast(source); - return result; - } -}; - -template -struct cast_generator - : mpl::if_< - is_base_and_derived - , implicit_cast_generator - , dynamic_cast_generator - > -{ -}; - -template -inline void register_conversion( - bool is_downcast = ::boost::is_base_and_derived::value - // These parameters shouldn't be used; they're an MSVC bug workaround - , Source* = 0, Target* = 0) -{ - typedef typename cast_generator::type generator; - - add_cast( - python::type_id() - , python::type_id() - , &generator::execute - , is_downcast - ); -} - -}}} // namespace boost::python::object - -#endif // INHERITANCE_DWA200216_HPP diff --git a/include/boost/python/object/inheritance_query.hpp b/include/boost/python/object/inheritance_query.hpp deleted file mode 100755 index 916e161f..00000000 --- a/include/boost/python/object/inheritance_query.hpp +++ /dev/null @@ -1,17 +0,0 @@ -// 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 INHERITANCE_QUERY_DWA2003520_HPP -# define INHERITANCE_QUERY_DWA2003520_HPP - -# include - -namespace boost { namespace python { namespace objects { - -BOOST_PYTHON_DECL void* find_static_type(void* p, type_info src, type_info dst); -BOOST_PYTHON_DECL void* find_dynamic_type(void* p, type_info src, type_info dst); - -}}} // namespace boost::python::object - -#endif // INHERITANCE_QUERY_DWA2003520_HPP diff --git a/include/boost/python/object/instance.hpp b/include/boost/python/object/instance.hpp deleted file mode 100644 index 177576ef..00000000 --- a/include/boost/python/object/instance.hpp +++ /dev/null @@ -1,51 +0,0 @@ -// 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) -#ifndef INSTANCE_DWA200295_HPP -# define INSTANCE_DWA200295_HPP - -# include -# include -# include - -namespace boost { namespace python -{ - struct BOOST_PYTHON_DECL_FORWARD instance_holder; -}} // namespace boost::python - -namespace boost { namespace python { namespace objects { - -// Each extension instance will be one of these -template -struct instance -{ - PyObject_VAR_HEAD - PyObject* dict; - PyObject* weakrefs; - instance_holder* objects; - - typedef typename type_with_alignment< - ::boost::alignment_of::value - >::type align_t; - - union - { - align_t align; - char bytes[sizeof(Data)]; - } storage; -}; - -template -struct additional_instance_size -{ - typedef instance instance_data; - typedef instance instance_char; - BOOST_STATIC_CONSTANT( - std::size_t, value = sizeof(instance_data) - - BOOST_PYTHON_OFFSETOF(instance_char,storage)); -}; - -}}} // namespace boost::python::object - -#endif // INSTANCE_DWA200295_HPP diff --git a/include/boost/python/object/iterator.hpp b/include/boost/python/object/iterator.hpp deleted file mode 100644 index db522471..00000000 --- a/include/boost/python/object/iterator.hpp +++ /dev/null @@ -1,230 +0,0 @@ -// 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) -#ifndef ITERATOR_DWA2002510_HPP -# define ITERATOR_DWA2002510_HPP - -# include - -# include -# include -# include -# include -# include - -# include -# include -# include - -# include -# include - -# include - -# include - -# include -# include -# include - -# include - -namespace boost { namespace python { namespace objects { - -// CallPolicies for the next() method of iterators. We don't want -// users to have to explicitly specify that the references returned by -// iterators are copied, so we just replace the result_converter from -// the default_iterator_call_policies with a permissive one which -// always copies the result. -typedef return_value_policy default_iterator_call_policies; - -// Instantiations of these are wrapped to produce Python iterators. -template -struct iterator_range -{ - iterator_range(object sequence, Iterator start, Iterator finish); - - typedef boost::detail::iterator_traits traits_t; - - struct next - { - typedef typename mpl::if_< - is_reference< - typename traits_t::reference - > - , typename traits_t::reference - , typename traits_t::value_type - >::type result_type; - - result_type - operator()(iterator_range& self) - { - if (self.m_start == self.m_finish) - stop_iteration_error(); - return *self.m_start++; - } - -# if BOOST_WORKAROUND(__MWERKS__, BOOST_TESTED_AT(0x3003)) - // CWPro8 has a codegen problem when this is an empty class - int garbage; -# endif - }; - - typedef next next_fn; - - object m_sequence; // Keeps the sequence alive while iterating. - Iterator m_start; - Iterator m_finish; -}; - -namespace detail -{ - // Get a Python class which contains the given iterator and - // policies, creating it if necessary. Requires: NextPolicies is - // default-constructible. - template - object demand_iterator_class(char const* name, Iterator* = 0, NextPolicies const& policies = NextPolicies()) - { - typedef iterator_range range_; - - // Check the registry. If one is already registered, return it. - handle<> class_obj( - objects::registered_class_object(python::type_id())); - - if (class_obj.get() != 0) - return object(class_obj); - - typedef typename range_::next_fn next_fn; - typedef typename next_fn::result_type result_type; - - return class_(name, no_init) - .def("__iter__", identity_function()) - .def( -#if PY_VERSION_HEX >= 0x03000000 - "__next__" -#else - "next" -#endif - , make_function( - next_fn() - , policies - , mpl::vector2() - )); - } - - // A function object which builds an iterator_range. - template < - class Target - , class Iterator - , class Accessor1 - , class Accessor2 - , class NextPolicies - > - struct py_iter_ - { - py_iter_(Accessor1 const& get_start, Accessor2 const& get_finish) - : m_get_start(get_start) - , m_get_finish(get_finish) - {} - - // Extract an object x of the Target type from the first Python - // argument, and invoke get_start(x)/get_finish(x) to produce - // iterators, which are used to construct a new iterator_range<> - // object that gets wrapped into a Python iterator. - iterator_range - operator()(back_reference x) const - { - // Make sure the Python class is instantiated. - detail::demand_iterator_class("iterator", (Iterator*)0, NextPolicies()); - - return iterator_range( - x.source() - , m_get_start(x.get()) - , m_get_finish(x.get()) - ); - } - private: - Accessor1 m_get_start; - Accessor2 m_get_finish; - }; - - template - inline object make_iterator_function( - Accessor1 const& get_start - , Accessor2 const& get_finish - , NextPolicies const& /*next_policies*/ - , Iterator const& (*)() - , boost::type* - , int - ) - { - return make_function( - py_iter_(get_start, get_finish) - , default_call_policies() - , mpl::vector2, back_reference >() - ); - } - - template - inline object make_iterator_function( - Accessor1 const& get_start - , Accessor2 const& get_finish - , NextPolicies const& next_policies - , Iterator& (*)() - , boost::type* - , ...) - { - return make_iterator_function( - get_start - , get_finish - , next_policies - , (Iterator const&(*)())0 - , (boost::type*)0 - , 0 - ); - } - -} - -// Create a Python callable object which accepts a single argument -// convertible to the C++ Target type and returns a Python -// iterator. The Python iterator uses get_start(x) and get_finish(x) -// (where x is an instance of Target) to produce begin and end -// iterators for the range, and an instance of NextPolicies is used as -// CallPolicies for the Python iterator's next() function. -template -inline object make_iterator_function( - Accessor1 const& get_start - , Accessor2 const& get_finish - , NextPolicies const& next_policies - , boost::type* = 0 -) -{ - typedef typename Accessor1::result_type iterator; - typedef typename add_const::type iterator_const; - typedef typename add_reference::type iterator_cref; - - return detail::make_iterator_function( - get_start - , get_finish - , next_policies - , (iterator_cref(*)())0 - , (boost::type*)0 - , 0 - ); -} - -// -// implementation -// -template -inline iterator_range::iterator_range( - object sequence, Iterator start, Iterator finish) - : m_sequence(sequence), m_start(start), m_finish(finish) -{ -} - -}}} // namespace boost::python::objects - -#endif // ITERATOR_DWA2002510_HPP diff --git a/include/boost/python/object/iterator_core.hpp b/include/boost/python/object/iterator_core.hpp deleted file mode 100644 index 064accc5..00000000 --- a/include/boost/python/object/iterator_core.hpp +++ /dev/null @@ -1,17 +0,0 @@ -// 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) -#ifndef ITERATOR_CORE_DWA2002512_HPP -# define ITERATOR_CORE_DWA2002512_HPP - -# include - -namespace boost { namespace python { namespace objects { - -BOOST_PYTHON_DECL object const& identity_function(); -BOOST_PYTHON_DECL void stop_iteration_error(); - -}}} // namespace boost::python::object - -#endif // ITERATOR_CORE_DWA2002512_HPP diff --git a/include/boost/python/object/life_support.hpp b/include/boost/python/object/life_support.hpp deleted file mode 100644 index 9a1b16b6..00000000 --- a/include/boost/python/object/life_support.hpp +++ /dev/null @@ -1,15 +0,0 @@ -// 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) -#ifndef LIFE_SUPPORT_DWA200222_HPP -# define LIFE_SUPPORT_DWA200222_HPP -# include - -namespace boost { namespace python { namespace objects { - -BOOST_PYTHON_DECL PyObject* make_nurse_and_patient(PyObject* nurse, PyObject* patient); - -}}} // namespace boost::python::object - -#endif // LIFE_SUPPORT_DWA200222_HPP diff --git a/include/boost/python/object/make_holder.hpp b/include/boost/python/object/make_holder.hpp deleted file mode 100644 index 0d54dd9f..00000000 --- a/include/boost/python/object/make_holder.hpp +++ /dev/null @@ -1,109 +0,0 @@ -#if !defined(BOOST_PP_IS_ITERATING) - -// Copyright David Abrahams 2001. -// 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 MAKE_HOLDER_DWA20011215_HPP -# define MAKE_HOLDER_DWA20011215_HPP - -# include - -# include -# include -#if !defined( BOOST_PYTHON_NO_PY_SIGNATURES) && defined( BOOST_PYTHON_PY_SIGNATURES_PROPER_INIT_SELF_TYPE) -# include -#endif - -# include -# include - -# include -# include -# include - -# include -# include -# include -# include -# include - -# include - -namespace boost { namespace python { namespace objects { - -template struct make_holder; - -# define BOOST_PYTHON_DO_FORWARD_ARG(z, index, _) , f##index(a##index) - -// specializations... -# define BOOST_PP_ITERATION_PARAMS_1 (3, (0, BOOST_PYTHON_MAX_ARITY, )) -# include BOOST_PP_ITERATE() - -# undef BOOST_PYTHON_DO_FORWARD_ARG - -}}} // namespace boost::python::objects - -# endif // MAKE_HOLDER_DWA20011215_HPP - -// For gcc 4.4 compatability, we must include the -// BOOST_PP_ITERATION_DEPTH test inside an #else clause. -#else // BOOST_PP_IS_ITERATING -#if BOOST_PP_ITERATION_DEPTH() == 1 -# if !(BOOST_WORKAROUND(__MWERKS__, > 0x3100) \ - && BOOST_WORKAROUND(__MWERKS__, BOOST_TESTED_AT(0x3201))) -# line BOOST_PP_LINE(__LINE__, make_holder.hpp) -# endif - -# define N BOOST_PP_ITERATION() - -template <> -struct make_holder -{ - template - struct apply - { -# if N - // Unrolled iteration through each argument type in ArgList, - // choosing the type that will be forwarded on to the holder's - // templated constructor. - typedef typename mpl::begin::type iter0; - -# define BOOST_PP_LOCAL_MACRO(n) \ - typedef typename mpl::deref::type t##n; \ - typedef typename forward::type f##n; \ - typedef typename mpl::next::type \ - BOOST_PP_CAT(iter,BOOST_PP_INC(n)); // Next iterator type - -# define BOOST_PP_LOCAL_LIMITS (0, N-1) -# include BOOST_PP_LOCAL_ITERATE() -# endif - - static void execute( -#if !defined( BOOST_PYTHON_NO_PY_SIGNATURES) && defined( BOOST_PYTHON_PY_SIGNATURES_PROPER_INIT_SELF_TYPE) - boost::python::detail::python_class *p -#else - PyObject *p -#endif - BOOST_PP_ENUM_TRAILING_BINARY_PARAMS_Z(1, N, t, a)) - { - typedef instance instance_t; - - void* memory = Holder::allocate(p, offsetof(instance_t, storage), sizeof(Holder)); - try { - (new (memory) Holder( - p BOOST_PP_REPEAT_1ST(N, BOOST_PYTHON_DO_FORWARD_ARG, nil)))->install(p); - } - catch(...) { - Holder::deallocate(p, memory); - throw; - } - } - }; -}; - -# undef N - -#endif // BOOST_PP_ITERATION_DEPTH() -#endif diff --git a/include/boost/python/object/make_instance.hpp b/include/boost/python/object/make_instance.hpp deleted file mode 100644 index 5f2630ad..00000000 --- a/include/boost/python/object/make_instance.hpp +++ /dev/null @@ -1,78 +0,0 @@ -// 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) -#ifndef MAKE_INSTANCE_DWA200296_HPP -# define MAKE_INSTANCE_DWA200296_HPP - -# include -# include -# include -# include -# include -# include -# include -# include - -namespace boost { namespace python { namespace objects { - -template -struct make_instance_impl -{ - typedef objects::instance instance_t; - - template - static inline PyObject* execute(Arg& x) - { - BOOST_MPL_ASSERT((mpl::or_, is_union >)); - - PyTypeObject* type = Derived::get_class_object(x); - - if (type == 0) - return python::detail::none(); - - PyObject* raw_result = type->tp_alloc( - type, objects::additional_instance_size::value); - - if (raw_result != 0) - { - python::detail::decref_guard protect(raw_result); - - instance_t* instance = (instance_t*)raw_result; - - // construct the new C++ object and install the pointer - // in the Python object. - Derived::construct(&instance->storage, (PyObject*)instance, x)->install(raw_result); - - // Note the position of the internally-stored Holder, - // for the sake of destruction - Py_SIZE(instance) = offsetof(instance_t, storage); - - // Release ownership of the python object - protect.cancel(); - } - return raw_result; - } -}; - - -template -struct make_instance - : make_instance_impl > -{ - template - static inline PyTypeObject* get_class_object(U&) - { - return converter::registered::converters.get_class_object(); - } - - static inline Holder* construct(void* storage, PyObject* instance, reference_wrapper x) - { - return new (storage) Holder(instance, x); - } -}; - - -}}} // namespace boost::python::object - -#endif // MAKE_INSTANCE_DWA200296_HPP diff --git a/include/boost/python/object/make_ptr_instance.hpp b/include/boost/python/object/make_ptr_instance.hpp deleted file mode 100644 index 9fdb23f6..00000000 --- a/include/boost/python/object/make_ptr_instance.hpp +++ /dev/null @@ -1,72 +0,0 @@ -// 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) -#ifndef MAKE_PTR_INSTANCE_DWA200296_HPP -# define MAKE_PTR_INSTANCE_DWA200296_HPP - -# include -# include -# include -# include -# include -# include - -namespace boost { namespace python { namespace objects { - -template -struct make_ptr_instance - : make_instance_impl > -{ - template - static inline Holder* construct(void* storage, PyObject*, Arg& x) - { - return new (storage) Holder(x); - } - - template - static inline PyTypeObject* get_class_object(Ptr const& x) - { - return get_class_object_impl(get_pointer(x)); - } -#ifndef BOOST_PYTHON_NO_PY_SIGNATURES - static inline PyTypeObject const* get_pytype() - { - return converter::registered::converters.get_class_object(); - } -#endif - private: - template - static inline PyTypeObject* get_class_object_impl(U const volatile* p) - { - if (p == 0) - return 0; // means "return None". - - PyTypeObject* derived = get_derived_class_object( - BOOST_DEDUCED_TYPENAME is_polymorphic::type(), p); - - if (derived) - return derived; - return converter::registered::converters.get_class_object(); - } - - template - static inline PyTypeObject* get_derived_class_object(mpl::true_, U const volatile* x) - { - converter::registration const* r = converter::registry::query( - type_info(typeid(*get_pointer(x))) - ); - return r ? r->m_class_object : 0; - } - - template - static inline PyTypeObject* get_derived_class_object(mpl::false_, U*) - { - return 0; - } -}; - - -}}} // namespace boost::python::object - -#endif // MAKE_PTR_INSTANCE_DWA200296_HPP diff --git a/include/boost/python/object/pickle_support.hpp b/include/boost/python/object/pickle_support.hpp deleted file mode 100644 index cbdbcbb9..00000000 --- a/include/boost/python/object/pickle_support.hpp +++ /dev/null @@ -1,124 +0,0 @@ -// (C) Copyright R.W. Grosse-Kunstleve 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) -#ifndef BOOST_PYTHON_OBJECT_PICKLE_SUPPORT_RWGK20020603_HPP -# define BOOST_PYTHON_OBJECT_PICKLE_SUPPORT_RWGK20020603_HPP - -# include - -namespace boost { namespace python { - -namespace api -{ - class object; -} -using api::object; -class tuple; - -BOOST_PYTHON_DECL object const& make_instance_reduce_function(); - -struct pickle_suite; - -namespace error_messages { - - template - struct missing_pickle_suite_function_or_incorrect_signature {}; - - inline void must_be_derived_from_pickle_suite(pickle_suite const&) {} -} - -namespace detail { struct pickle_suite_registration; } - -struct pickle_suite -{ - private: - struct inaccessible {}; - friend struct detail::pickle_suite_registration; - public: - static inaccessible* getinitargs() { return 0; } - static inaccessible* getstate() { return 0; } - static inaccessible* setstate() { return 0; } - static bool getstate_manages_dict() { return false; } -}; - -namespace detail { - - struct pickle_suite_registration - { - typedef pickle_suite::inaccessible inaccessible; - - template - static - void - register_( - Class_& cl, - tuple (*getinitargs_fn)(Tgetinitargs), - inaccessible* (* /*getstate_fn*/)(), - inaccessible* (* /*setstate_fn*/)(), - bool) - { - cl.enable_pickling_(false); - cl.def("__getinitargs__", getinitargs_fn); - } - - template - static - void - register_( - Class_& cl, - inaccessible* (* /*getinitargs_fn*/)(), - Rgetstate (*getstate_fn)(Tgetstate), - void (*setstate_fn)(Tsetstate, Ttuple), - bool getstate_manages_dict) - { - cl.enable_pickling_(getstate_manages_dict); - cl.def("__getstate__", getstate_fn); - cl.def("__setstate__", setstate_fn); - } - - template - static - void - register_( - Class_& cl, - tuple (*getinitargs_fn)(Tgetinitargs), - Rgetstate (*getstate_fn)(Tgetstate), - void (*setstate_fn)(Tsetstate, Ttuple), - bool getstate_manages_dict) - { - cl.enable_pickling_(getstate_manages_dict); - cl.def("__getinitargs__", getinitargs_fn); - cl.def("__getstate__", getstate_fn); - cl.def("__setstate__", setstate_fn); - } - - template - static - void - register_( - Class_&, - ...) - { - typedef typename - error_messages::missing_pickle_suite_function_or_incorrect_signature< - Class_>::error_type error_type; - } - }; - - template - struct pickle_suite_finalize - : PickleSuiteType, - pickle_suite_registration - {}; - -} // namespace detail - -}} // namespace boost::python - -#endif // BOOST_PYTHON_OBJECT_PICKLE_SUPPORT_RWGK20020603_HPP diff --git a/include/boost/python/object/pointer_holder.hpp b/include/boost/python/object/pointer_holder.hpp deleted file mode 100644 index 27d95193..00000000 --- a/include/boost/python/object/pointer_holder.hpp +++ /dev/null @@ -1,220 +0,0 @@ -#if !defined(BOOST_PP_IS_ITERATING) - -// Copyright David Abrahams 2001. -// 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 POINTER_HOLDER_DWA20011215_HPP -# define POINTER_HOLDER_DWA20011215_HPP - -# include -# include - -# include -# include -# include - -# include -# include - -# include -# include -# include - - -# include -# include - -# include -# include -# include -# include -# include -# include - -# include - -# include - -namespace boost { namespace python { - -template class wrapper; - -}} - - -namespace boost { namespace python { namespace objects { - -#define BOOST_PYTHON_UNFORWARD_LOCAL(z, n, _) BOOST_PP_COMMA_IF(n) objects::do_unforward(a##n,0) - -template -struct pointer_holder : instance_holder -{ - typedef Value value_type; - - pointer_holder(Pointer); - - // Forward construction to the held object - -# define BOOST_PP_ITERATION_PARAMS_1 (4, (0, BOOST_PYTHON_MAX_ARITY, , 1)) -# include BOOST_PP_ITERATE() - - private: // types - - private: // required holder implementation - void* holds(type_info, bool null_ptr_only); - - template - inline void* holds_wrapped(type_info dst_t, wrapper*,T* p) - { - return python::type_id() == dst_t ? p : 0; - } - - inline void* holds_wrapped(type_info, ...) - { - return 0; - } - - private: // data members - Pointer m_p; -}; - -template -struct pointer_holder_back_reference : instance_holder -{ - private: - typedef typename python::pointee::type held_type; - public: - typedef Value value_type; - - // Not sure about this one -- can it work? The source object - // undoubtedly does not carry the correct back reference pointer. - pointer_holder_back_reference(Pointer); - - // Forward construction to the held object -# define BOOST_PP_ITERATION_PARAMS_1 (4, (0, BOOST_PYTHON_MAX_ARITY, , 2)) -# include BOOST_PP_ITERATE() - - private: // required holder implementation - void* holds(type_info, bool null_ptr_only); - - private: // data members - Pointer m_p; -}; - -# undef BOOST_PYTHON_UNFORWARD_LOCAL - -template -inline pointer_holder::pointer_holder(Pointer p) - : m_p(p) -{ -} - -template -inline pointer_holder_back_reference::pointer_holder_back_reference(Pointer p) - : m_p(p) -{ -} - -template -void* pointer_holder::holds(type_info dst_t, bool null_ptr_only) -{ - typedef typename boost::remove_const< Value >::type non_const_value; - - if (dst_t == python::type_id() - && !(null_ptr_only && get_pointer(this->m_p)) - ) - return &this->m_p; - - Value* p0 -# if BOOST_WORKAROUND(__SUNPRO_CC, BOOST_TESTED_AT(0x590)) - = static_cast( get_pointer(this->m_p) ) -# else - = get_pointer(this->m_p) -# endif - ; - non_const_value* p = const_cast( p0 ); - - if (p == 0) - return 0; - - if (void* wrapped = holds_wrapped(dst_t, p, p)) - return wrapped; - - type_info src_t = python::type_id(); - return src_t == dst_t ? p : find_dynamic_type(p, src_t, dst_t); -} - -template -void* pointer_holder_back_reference::holds(type_info dst_t, bool null_ptr_only) -{ - if (dst_t == python::type_id() - && !(null_ptr_only && get_pointer(this->m_p)) - ) - return &this->m_p; - - if (!get_pointer(this->m_p)) - return 0; - - Value* p = get_pointer(m_p); - - if (dst_t == python::type_id()) - return p; - - type_info src_t = python::type_id(); - return src_t == dst_t ? p : find_dynamic_type(p, src_t, dst_t); -} - -}}} // namespace boost::python::objects - -# endif // POINTER_HOLDER_DWA20011215_HPP - -/* --------------- pointer_holder --------------- */ -// For gcc 4.4 compatability, we must include the -// BOOST_PP_ITERATION_DEPTH test inside an #else clause. -#else // BOOST_PP_IS_ITERATING -#if BOOST_PP_ITERATION_DEPTH() == 1 && BOOST_PP_ITERATION_FLAGS() == 1 -# if !(BOOST_WORKAROUND(__MWERKS__, > 0x3100) \ - && BOOST_WORKAROUND(__MWERKS__, BOOST_TESTED_AT(0x3201))) -# line BOOST_PP_LINE(__LINE__, pointer_holder.hpp) -# endif - -# define N BOOST_PP_ITERATION() - -# if (N != 0) - template< BOOST_PP_ENUM_PARAMS_Z(1, N, class A) > -# endif - pointer_holder(PyObject* self BOOST_PP_COMMA_IF(N) BOOST_PP_ENUM_BINARY_PARAMS_Z(1, N, A, a)) - : m_p(new Value( - BOOST_PP_REPEAT_1ST(N, BOOST_PYTHON_UNFORWARD_LOCAL, nil) - )) - { - python::detail::initialize_wrapper(self, get_pointer(this->m_p)); - } - -# undef N - -/* --------------- pointer_holder_back_reference --------------- */ -#elif BOOST_PP_ITERATION_DEPTH() == 1 && BOOST_PP_ITERATION_FLAGS() == 2 -# if !(BOOST_WORKAROUND(__MWERKS__, > 0x3100) \ - && BOOST_WORKAROUND(__MWERKS__, BOOST_TESTED_AT(0x3201))) -# line BOOST_PP_LINE(__LINE__, pointer_holder.hpp(pointer_holder_back_reference)) -# endif - -# define N BOOST_PP_ITERATION() - -# if (N != 0) - template < BOOST_PP_ENUM_PARAMS_Z(1, N, class A) > -# endif - pointer_holder_back_reference( - PyObject* p BOOST_PP_COMMA_IF(N) BOOST_PP_ENUM_BINARY_PARAMS_Z(1, N, A, a)) - : m_p(new held_type( - p BOOST_PP_COMMA_IF(N) BOOST_PP_REPEAT_1ST(N, BOOST_PYTHON_UNFORWARD_LOCAL, nil) - )) - {} - -# undef N - -#endif // BOOST_PP_ITERATION_DEPTH() -#endif diff --git a/include/boost/python/object/py_function.hpp b/include/boost/python/object/py_function.hpp deleted file mode 100644 index ba9aadf4..00000000 --- a/include/boost/python/object/py_function.hpp +++ /dev/null @@ -1,172 +0,0 @@ -// 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) -#ifndef PY_FUNCTION_DWA200286_HPP -# define PY_FUNCTION_DWA200286_HPP - -# include -# include -# include -# include - -namespace boost { namespace python { namespace objects { - -// This type is used as a "generalized Python callback", wrapping the -// function signature: -// -// PyObject* (PyObject* args, PyObject* keywords) - -struct BOOST_PYTHON_DECL py_function_impl_base -{ - virtual ~py_function_impl_base(); - virtual PyObject* operator()(PyObject*, PyObject*) = 0; - virtual unsigned min_arity() const = 0; - virtual unsigned max_arity() const; - virtual python::detail::py_func_sig_info signature() const = 0; -}; - -template -struct caller_py_function_impl : py_function_impl_base -{ - caller_py_function_impl(Caller const& caller) - : m_caller(caller) - {} - - PyObject* operator()(PyObject* args, PyObject* kw) - { - return m_caller(args, kw); - } - - virtual unsigned min_arity() const - { - return m_caller.min_arity(); - } - - virtual python::detail::py_func_sig_info signature() const - { - return m_caller.signature(); - } - - private: - Caller m_caller; -}; - -template -struct signature_py_function_impl : py_function_impl_base -{ - signature_py_function_impl(Caller const& caller) - : m_caller(caller) - {} - - PyObject* operator()(PyObject* args, PyObject* kw) - { - return m_caller(args, kw); - } - - virtual unsigned min_arity() const - { - return mpl::size::value - 1; - } - - virtual python::detail::py_func_sig_info signature() const - { - python::detail::signature_element const* sig = python::detail::signature::elements(); - python::detail::py_func_sig_info res = {sig, sig}; - return res; - } - - private: - Caller m_caller; -}; - -template -struct full_py_function_impl : py_function_impl_base -{ - full_py_function_impl(Caller const& caller, unsigned min_arity, unsigned max_arity) - : m_caller(caller) - , m_min_arity(min_arity) - , m_max_arity(max_arity > min_arity ? max_arity : min_arity) - {} - - PyObject* operator()(PyObject* args, PyObject* kw) - { - return m_caller(args, kw); - } - - virtual unsigned min_arity() const - { - return m_min_arity; - } - - virtual unsigned max_arity() const - { - return m_max_arity; - } - - virtual python::detail::py_func_sig_info signature() const - { - python::detail::signature_element const* sig = python::detail::signature::elements(); - python::detail::py_func_sig_info res = {sig, sig}; - return res; - } - - private: - Caller m_caller; - unsigned m_min_arity; - unsigned m_max_arity; -}; - -struct py_function -{ - template - py_function(Caller const& caller) - : m_impl(new caller_py_function_impl(caller)) - {} - - template - py_function(Caller const& caller, Sig) - : m_impl(new signature_py_function_impl(caller)) - {} - - template - py_function(Caller const& caller, Sig, int min_arity, int max_arity = 0) - : m_impl(new full_py_function_impl(caller, min_arity, max_arity)) - {} - - py_function(py_function const& rhs) - : m_impl(rhs.m_impl) - {} - - PyObject* operator()(PyObject* args, PyObject* kw) const - { - return (*m_impl)(args, kw); - } - - unsigned min_arity() const - { - return m_impl->min_arity(); - } - - unsigned max_arity() const - { - return m_impl->max_arity(); - } - - python::detail::signature_element const* signature() const - { - return m_impl->signature().signature; - } - - python::detail::signature_element const& get_return_type() const - { - return *m_impl->signature().ret; - } - - private: - mutable std::auto_ptr m_impl; -}; - -}}} // namespace boost::python::objects - -#endif // PY_FUNCTION_DWA200286_HPP diff --git a/include/boost/python/object/stl_iterator_core.hpp b/include/boost/python/object/stl_iterator_core.hpp deleted file mode 100755 index 68e0c244..00000000 --- a/include/boost/python/object/stl_iterator_core.hpp +++ /dev/null @@ -1,27 +0,0 @@ -// Copyright Eric Niebler 2005. -// 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 STL_ITERATOR_CORE_EAN20051028_HPP -# define STL_ITERATOR_CORE_EAN20051028_HPP - -# include -# include - -namespace boost { namespace python { namespace objects { - -struct BOOST_PYTHON_DECL stl_input_iterator_impl -{ - stl_input_iterator_impl(); - stl_input_iterator_impl(boost::python::object const &ob); - void increment(); - bool equal(stl_input_iterator_impl const &that) const; - boost::python::handle<> const ¤t() const; -private: - boost::python::object it_; - boost::python::handle<> ob_; -}; - -}}} // namespace boost::python::object - -#endif // STL_ITERATOR_CORE_EAN20051028_HPP diff --git a/include/boost/python/object/value_holder.hpp b/include/boost/python/object/value_holder.hpp deleted file mode 100644 index a4e91786..00000000 --- a/include/boost/python/object/value_holder.hpp +++ /dev/null @@ -1,166 +0,0 @@ -#if !defined(BOOST_PP_IS_ITERATING) - -// Copyright David Abrahams 2001. -// 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 VALUE_HOLDER_DWA20011215_HPP -# define VALUE_HOLDER_DWA20011215_HPP - -# include - -# include -# include -# include - -# include -# include - -# include -# include - -# include -# include -# include -# include -# include - -# include -# include - -# include - -namespace boost { namespace python { namespace objects { - -#define BOOST_PYTHON_UNFORWARD_LOCAL(z, n, _) BOOST_PP_COMMA_IF(n) objects::do_unforward(a##n,0) - -template -struct value_holder : instance_holder -{ - typedef Value held_type; - typedef Value value_type; - - // Forward construction to the held object -# define BOOST_PP_ITERATION_PARAMS_1 (4, (0, BOOST_PYTHON_MAX_ARITY, , 1)) -# include BOOST_PP_ITERATE() - - private: // required holder implementation - void* holds(type_info, bool null_ptr_only); - - template - inline void* holds_wrapped(type_info dst_t, wrapper*,T* p) - { - return python::type_id() == dst_t ? p : 0; - } - - inline void* holds_wrapped(type_info, ...) - { - return 0; - } - private: // data members - Value m_held; -}; - -template -struct value_holder_back_reference : instance_holder -{ - typedef Held held_type; - typedef Value value_type; - - // Forward construction to the held object -# define BOOST_PP_ITERATION_PARAMS_1 (4, (0, BOOST_PYTHON_MAX_ARITY, , 2)) -# include BOOST_PP_ITERATE() - -private: // required holder implementation - void* holds(type_info, bool null_ptr_only); - - private: // data members - Held m_held; -}; - -# undef BOOST_PYTHON_UNFORWARD_LOCAL - -template -void* value_holder::holds(type_info dst_t, bool /*null_ptr_only*/) -{ - if (void* wrapped = holds_wrapped(dst_t, boost::addressof(m_held), boost::addressof(m_held))) - return wrapped; - - type_info src_t = python::type_id(); - return src_t == dst_t ? boost::addressof(m_held) - : find_static_type(boost::addressof(m_held), src_t, dst_t); -} - -template -void* value_holder_back_reference::holds( - type_info dst_t, bool /*null_ptr_only*/) -{ - type_info src_t = python::type_id(); - Value* x = &m_held; - - if (dst_t == src_t) - return x; - else if (dst_t == python::type_id()) - return &m_held; - else - return find_static_type(x, src_t, dst_t); -} - -}}} // namespace boost::python::objects - -# endif // VALUE_HOLDER_DWA20011215_HPP - -// --------------- value_holder --------------- - -// For gcc 4.4 compatability, we must include the -// BOOST_PP_ITERATION_DEPTH test inside an #else clause. -#else // BOOST_PP_IS_ITERATING -#if BOOST_PP_ITERATION_DEPTH() == 1 && BOOST_PP_ITERATION_FLAGS() == 1 -# if !(BOOST_WORKAROUND(__MWERKS__, > 0x3100) \ - && BOOST_WORKAROUND(__MWERKS__, BOOST_TESTED_AT(0x3201))) -# line BOOST_PP_LINE(__LINE__, value_holder.hpp(value_holder)) -# endif - -# define N BOOST_PP_ITERATION() - -# if (N != 0) - template -# endif - value_holder( - PyObject* self BOOST_PP_COMMA_IF(N) BOOST_PP_ENUM_BINARY_PARAMS_Z(1, N, A, a)) - : m_held( - BOOST_PP_REPEAT_1ST(N, BOOST_PYTHON_UNFORWARD_LOCAL, nil) - ) - { - python::detail::initialize_wrapper(self, boost::addressof(this->m_held)); - } - -# undef N - -// --------------- value_holder_back_reference --------------- - -#elif BOOST_PP_ITERATION_DEPTH() == 1 && BOOST_PP_ITERATION_FLAGS() == 2 -# if !(BOOST_WORKAROUND(__MWERKS__, > 0x3100) \ - && BOOST_WORKAROUND(__MWERKS__, BOOST_TESTED_AT(0x3201))) -# line BOOST_PP_LINE(__LINE__, value_holder.hpp(value_holder_back_reference)) -# endif - -# define N BOOST_PP_ITERATION() - -# if (N != 0) - template -# endif - value_holder_back_reference( - PyObject* p BOOST_PP_COMMA_IF(N) BOOST_PP_ENUM_BINARY_PARAMS_Z(1, N, A, a)) - : m_held( - p BOOST_PP_COMMA_IF(N) - BOOST_PP_REPEAT_1ST(N, BOOST_PYTHON_UNFORWARD_LOCAL, nil) - ) - { - } - -# undef N - -#endif // BOOST_PP_ITERATION_DEPTH() -#endif diff --git a/include/boost/python/object/value_holder_fwd.hpp b/include/boost/python/object/value_holder_fwd.hpp deleted file mode 100644 index 3454bac4..00000000 --- a/include/boost/python/object/value_holder_fwd.hpp +++ /dev/null @@ -1,16 +0,0 @@ -// 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) -#ifndef VALUE_HOLDER_FWD_DWA2002311_HPP -# define VALUE_HOLDER_FWD_DWA2002311_HPP - -namespace boost { namespace python { namespace objects { - -struct no_back_reference; - -template struct value_holder_generator; - -}}} // namespace boost::python::object - -#endif // VALUE_HOLDER_FWD_DWA2002311_HPP diff --git a/include/boost/python/object_attributes.hpp b/include/boost/python/object_attributes.hpp deleted file mode 100644 index 26d59911..00000000 --- a/include/boost/python/object_attributes.hpp +++ /dev/null @@ -1,116 +0,0 @@ -// 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) -#ifndef OBJECT_ATTRIBUTES_DWA2002615_HPP -# define OBJECT_ATTRIBUTES_DWA2002615_HPP - -# include - -# include -# include -# include - -namespace boost { namespace python { namespace api { - -struct const_attribute_policies -{ - typedef char const* key_type; - static object get(object const& target, char const* key); - static object get(object const& target, object const& key); -}; - -struct attribute_policies : const_attribute_policies -{ - static object const& set(object const& target, char const* key, object const& value); - static void del(object const&target, char const* key); -}; - -struct const_objattribute_policies -{ - typedef object const key_type; - static object get(object const& target, object const& key); -}; - -struct objattribute_policies : const_objattribute_policies -{ - static object const& set(object const& target, object const& key, object const& value); - static void del(object const&target, object const& key); -}; - -// -// implementation -// -template -inline object_attribute object_operators::attr(char const* name) -{ - object_cref2 x = *static_cast(this); - return object_attribute(x, name); -} - -template -inline const_object_attribute object_operators::attr(char const* name) const -{ - object_cref2 x = *static_cast(this); - return const_object_attribute(x, name); -} - -template -inline object_objattribute object_operators::attr(object const& name) -{ - object_cref2 x = *static_cast(this); - return object_objattribute(x, name); -} - -template -inline const_object_objattribute object_operators::attr(object const& name) const -{ - object_cref2 x = *static_cast(this); - return const_object_objattribute(x, name); -} - -inline object const_attribute_policies::get(object const& target, char const* key) -{ - return python::getattr(target, key); -} - -inline object const_objattribute_policies::get(object const& target, object const& key) -{ - return python::getattr(target, key); -} - -inline object const& attribute_policies::set( - object const& target - , char const* key - , object const& value) -{ - python::setattr(target, key, value); - return value; -} - -inline object const& objattribute_policies::set( - object const& target - , object const& key - , object const& value) -{ - python::setattr(target, key, value); - return value; -} - -inline void attribute_policies::del( - object const& target - , char const* key) -{ - python::delattr(target, key); -} - -inline void objattribute_policies::del( - object const& target - , object const& key) -{ - python::delattr(target, key); -} - -}}} // namespace boost::python::api - -#endif // OBJECT_ATTRIBUTES_DWA2002615_HPP diff --git a/include/boost/python/object_call.hpp b/include/boost/python/object_call.hpp deleted file mode 100644 index 5c4d0f2f..00000000 --- a/include/boost/python/object_call.hpp +++ /dev/null @@ -1,23 +0,0 @@ -# if !defined(BOOST_PYTHON_SYNOPSIS) -# // 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) - -# if !defined(BOOST_PP_IS_ITERATING) -# error Boost.Python - do not include this file! -# endif - -# define N BOOST_PP_ITERATION() - - template - typename detail::dependent::type - operator()(BOOST_PP_ENUM_BINARY_PARAMS_Z(1, N, A, const& a)) const - { - typedef typename detail::dependent::type obj; - U const& self = *static_cast(this); - return call(get_managed_object(self, tag), BOOST_PP_ENUM_PARAMS_Z(1, N, a)); - } - -# undef N -# endif // BOOST_PYTHON_SYNOPSIS diff --git a/include/boost/python/object_core.hpp b/include/boost/python/object_core.hpp deleted file mode 100644 index 61857796..00000000 --- a/include/boost/python/object_core.hpp +++ /dev/null @@ -1,482 +0,0 @@ -// 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) -#ifndef OBJECT_CORE_DWA2002615_HPP -# define OBJECT_CORE_DWA2002615_HPP - -# define BOOST_PYTHON_OBJECT_HAS_IS_NONE // added 2010-03-15 by rwgk - -# include - -# include - -# include -# include -# include -# include -# include -# include -# include - -# include -# include - -# include -# include - -# include -# include - -# include -# include -# include - -# include -# include -# include - -namespace boost { namespace python { - -namespace detail -{ - class kwds_proxy; - class args_proxy; -} - -namespace converter -{ - template struct arg_to_python; -} - -// Put this in an inner namespace so that the generalized operators won't take over -namespace api -{ - -// This file contains the definition of the object class and enough to -// construct/copy it, but not enough to do operations like -// attribute/item access or addition. - - template class proxy; - - struct const_attribute_policies; - struct attribute_policies; - struct const_objattribute_policies; - struct objattribute_policies; - struct const_item_policies; - struct item_policies; - struct const_slice_policies; - struct slice_policies; - class slice_nil; - - typedef proxy const_object_attribute; - typedef proxy object_attribute; - typedef proxy const_object_objattribute; - typedef proxy object_objattribute; - typedef proxy const_object_item; - typedef proxy object_item; - typedef proxy const_object_slice; - typedef proxy object_slice; - - // - // is_proxy -- proxy type detection - // - BOOST_PYTHON_IS_XXX_DEF(proxy, boost::python::api::proxy, 1) - - template struct object_initializer; - - class object; - typedef PyObject* (object::*bool_type)() const; - - template - class object_operators : public def_visitor - { - protected: - typedef object const& object_cref; - public: - // function call - // - object operator()() const; - -# define BOOST_PP_ITERATION_PARAMS_1 (3, (1, BOOST_PYTHON_MAX_ARITY, )) -# include BOOST_PP_ITERATE() - - detail::args_proxy operator* () const; - object operator()(detail::args_proxy const &args) const; - object operator()(detail::args_proxy const &args, - detail::kwds_proxy const &kwds) const; - - // truth value testing - // - operator bool_type() const; - bool operator!() const; // needed for vc6 - - // Attribute access - // - const_object_attribute attr(char const*) const; - object_attribute attr(char const*); - const_object_objattribute attr(object const&) const; - object_objattribute attr(object const&); - - // Wrap 'in' operator (aka. __contains__) - template - object contains(T const& key) const; - - // item access - // - const_object_item operator[](object_cref) const; - object_item operator[](object_cref); - - template - const_object_item - operator[](T const& key) const; - - template - object_item - operator[](T const& key); - - // slicing - // - const_object_slice slice(object_cref, object_cref) const; - object_slice slice(object_cref, object_cref); - - const_object_slice slice(slice_nil, object_cref) const; - object_slice slice(slice_nil, object_cref); - - const_object_slice slice(object_cref, slice_nil) const; - object_slice slice(object_cref, slice_nil); - - const_object_slice slice(slice_nil, slice_nil) const; - object_slice slice(slice_nil, slice_nil); - - template - const_object_slice - slice(T const& start, V const& end) const; - - template - object_slice - slice(T const& start, V const& end); - - private: // def visitation for adding callable objects as class methods - - template - void visit(ClassT& cl, char const* name, python::detail::def_helper const& helper) const - { - // It's too late to specify anything other than docstrings if - // the callable object is already wrapped. - BOOST_STATIC_ASSERT( - (is_same::value - || detail::is_string_literal::value)); - - objects::add_to_namespace(cl, name, this->derived_visitor(), helper.doc()); - } - - friend class python::def_visitor_access; - - private: - // there is a confirmed CWPro8 codegen bug here. We prevent the - // early destruction of a temporary by binding a named object - // instead. -# if __MWERKS__ < 0x3000 || __MWERKS__ > 0x3003 - typedef object const& object_cref2; -# else - typedef object const object_cref2; -# endif - }; - - - // VC6 and VC7 require this base class in order to generate the - // correct copy constructor for object. We can't define it there - // explicitly or it will complain of ambiguity. - struct object_base : object_operators - { - // copy constructor without NULL checking, for efficiency. - inline object_base(object_base const&); - inline object_base(PyObject* ptr); - - inline object_base& operator=(object_base const& rhs); - inline ~object_base(); - - // Underlying object access -- returns a borrowed reference - inline PyObject* ptr() const; - - inline bool is_none() const; - - private: - PyObject* m_ptr; - }; - - template - struct is_derived - : is_convertible< - typename remove_reference::type* - , U const* - > - {}; - - template - typename objects::unforward_cref::type do_unforward_cref(T const& x) - { - return x; - } - - class object; - - template - PyObject* object_base_initializer(T const& x) - { - typedef typename is_derived< - BOOST_DEDUCED_TYPENAME objects::unforward_cref::type - , object - >::type is_obj; - - return object_initializer< - BOOST_DEDUCED_TYPENAME unwrap_reference::type - >::get( - x - , is_obj() - ); - } - - class object : public object_base - { - public: - // default constructor creates a None object - object(); - - // explicit conversion from any C++ object to Python - template - explicit object(T const& x) - : object_base(object_base_initializer(x)) - { - } - - // Throw error_already_set() if the handle is null. - BOOST_PYTHON_DECL explicit object(handle<> const&); - private: - - public: // implementation detail -- for internal use only - explicit object(detail::borrowed_reference); - explicit object(detail::new_reference); - explicit object(detail::new_non_null_reference); - }; - - // Macros for forwarding constructors in classes derived from - // object. Derived classes will usually want these as an - // implementation detail -# define BOOST_PYTHON_FORWARD_OBJECT_CONSTRUCTORS(derived, base) \ - inline explicit derived(::boost::python::detail::borrowed_reference p) \ - : base(p) {} \ - inline explicit derived(::boost::python::detail::new_reference p) \ - : base(p) {} \ - inline explicit derived(::boost::python::detail::new_non_null_reference p) \ - : base(p) {} - - // - // object_initializer -- get the handle to construct the object with, - // based on whether T is a proxy or derived from object - // - template - struct object_initializer_impl - { - static PyObject* - get(object const& x, mpl::true_) - { - return python::incref(x.ptr()); - } - - template - static PyObject* - get(T const& x, mpl::false_) - { - return python::incref(converter::arg_to_python(x).get()); - } - }; - - template <> - struct object_initializer_impl - { - template - static PyObject* - get(proxy const& x, mpl::false_) - { - return python::incref(x.operator object().ptr()); - } - }; - - template <> - struct object_initializer_impl - { - template - static PyObject* - get(T const& x, U) - { - return python::incref(get_managed_object(x, boost::python::tag)); - } - }; - - template <> - struct object_initializer_impl - {}; // empty implementation should cause an error - - template - struct object_initializer : object_initializer_impl< - is_proxy::value - , converter::is_object_manager::value - > - {}; - -} -using api::object; -template struct extract; - -// -// implementation -// - -namespace detail -{ - -class call_proxy -{ -public: - call_proxy(object target) : m_target(target) {} - operator object() const { return m_target;} - - private: - object m_target; -}; - -class kwds_proxy : public call_proxy -{ -public: - kwds_proxy(object o = object()) : call_proxy(o) {} -}; -class args_proxy : public call_proxy -{ -public: - args_proxy(object o) : call_proxy(o) {} - kwds_proxy operator* () const { return kwds_proxy(*this);} -}; -} - -template -detail::args_proxy api::object_operators::operator* () const -{ - object_cref2 x = *static_cast(this); - return boost::python::detail::args_proxy(x); -} - -template -object api::object_operators::operator()(detail::args_proxy const &args) const -{ - U const& self = *static_cast(this); - PyObject *result = PyObject_Call(get_managed_object(self, boost::python::tag), - args.operator object().ptr(), - 0); - return object(boost::python::detail::new_reference(result)); - -} - -template -object api::object_operators::operator()(detail::args_proxy const &args, - detail::kwds_proxy const &kwds) const -{ - U const& self = *static_cast(this); - PyObject *result = PyObject_Call(get_managed_object(self, boost::python::tag), - args.operator object().ptr(), - kwds.operator object().ptr()); - return object(boost::python::detail::new_reference(result)); - -} - - -template -template -object api::object_operators::contains(T const& key) const -{ - return this->attr("__contains__")(object(key)); -} - - -inline object::object() - : object_base(python::incref(Py_None)) -{} - -// copy constructor without NULL checking, for efficiency -inline api::object_base::object_base(object_base const& rhs) - : m_ptr(python::incref(rhs.m_ptr)) -{} - -inline api::object_base::object_base(PyObject* p) - : m_ptr(p) -{} - -inline api::object_base& api::object_base::operator=(api::object_base const& rhs) -{ - Py_INCREF(rhs.m_ptr); - Py_DECREF(this->m_ptr); - this->m_ptr = rhs.m_ptr; - return *this; -} - -inline api::object_base::~object_base() -{ - Py_DECREF(m_ptr); -} - -inline object::object(detail::borrowed_reference p) - : object_base(python::incref((PyObject*)p)) -{} - -inline object::object(detail::new_reference p) - : object_base(expect_non_null((PyObject*)p)) -{} - -inline object::object(detail::new_non_null_reference p) - : object_base((PyObject*)p) -{} - -inline PyObject* api::object_base::ptr() const -{ - return m_ptr; -} - -inline bool api::object_base::is_none() const -{ - return (m_ptr == Py_None); -} - -// -// Converter specialization implementations -// -namespace converter -{ - template struct object_manager_traits; - - template <> - struct object_manager_traits - { - BOOST_STATIC_CONSTANT(bool, is_specialized = true); - static bool check(PyObject*) { return true; } - - static python::detail::new_non_null_reference adopt(PyObject* x) - { - return python::detail::new_non_null_reference(x); - } -#ifndef BOOST_PYTHON_NO_PY_SIGNATURES - static PyTypeObject const *get_pytype() {return 0;} -#endif - }; -} - -inline PyObject* get_managed_object(object const& x, tag_t) -{ - return x.ptr(); -} - -}} // namespace boost::python - -# include - -#endif // OBJECT_CORE_DWA2002615_HPP diff --git a/include/boost/python/object_fwd.hpp b/include/boost/python/object_fwd.hpp deleted file mode 100644 index 11efcc70..00000000 --- a/include/boost/python/object_fwd.hpp +++ /dev/null @@ -1,18 +0,0 @@ -// 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) -#ifndef OBJECT_FWD_DWA2002724_HPP -# define OBJECT_FWD_DWA2002724_HPP - -# include - -namespace boost { namespace python { -namespace api -{ - class object; -} -using api::object; -}} // namespace boost::python - -#endif // OBJECT_FWD_DWA2002724_HPP diff --git a/include/boost/python/object_items.hpp b/include/boost/python/object_items.hpp deleted file mode 100644 index b048689a..00000000 --- a/include/boost/python/object_items.hpp +++ /dev/null @@ -1,86 +0,0 @@ -// 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) -#ifndef OBJECT_ITEMS_DWA2002615_HPP -# define OBJECT_ITEMS_DWA2002615_HPP - -# include - -# include -# include -# include - -namespace boost { namespace python { namespace api { - -struct const_item_policies -{ - typedef object key_type; - static object get(object const& target, object const& key); -}; - -struct item_policies : const_item_policies -{ - static object const& set(object const& target, object const& key, object const& value); - static void del(object const& target, object const& key); -}; - -// -// implementation -// -template -inline object_item -object_operators::operator[](object_cref key) -{ - object_cref2 x = *static_cast(this); - return object_item(x, key); -} - -template -inline const_object_item -object_operators::operator[](object_cref key) const -{ - object_cref2 x = *static_cast(this); - return const_object_item(x, key); -} - -template -template -inline const_object_item -object_operators::operator[](T const& key) const -{ - return (*this)[object(key)]; -} - -template -template -inline object_item -object_operators::operator[](T const& key) -{ - return (*this)[object(key)]; -} - -inline object const_item_policies::get(object const& target, object const& key) -{ - return getitem(target, key); -} - -inline object const& item_policies::set( - object const& target - , object const& key - , object const& value) -{ - setitem(target, key, value); - return value; -} - -inline void item_policies::del( - object const& target - , object const& key) -{ - delitem(target, key); -} - -}}} // namespace boost::python::api - -#endif // OBJECT_ITEMS_DWA2002615_HPP diff --git a/include/boost/python/object_operators.hpp b/include/boost/python/object_operators.hpp deleted file mode 100644 index d436bb01..00000000 --- a/include/boost/python/object_operators.hpp +++ /dev/null @@ -1,136 +0,0 @@ -// 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) -#ifndef OBJECT_OPERATORS_DWA2002617_HPP -# define OBJECT_OPERATORS_DWA2002617_HPP - -# include - -# include -# include -# include -# include - -# include - -namespace boost { namespace python { namespace api { - -template -char is_object_operators_helper(object_operators const*); - -typedef char (&no_type)[2]; -no_type is_object_operators_helper(...); - -template X* make_ptr(); - -template -struct is_object_operators -{ - enum { - value - = (sizeof(api::is_object_operators_helper(api::make_ptr())) - + sizeof(api::is_object_operators_helper(api::make_ptr())) - < 4 - ) - }; - typedef mpl::bool_ type; -}; - -# if !defined(BOOST_NO_SFINAE) && !defined(BOOST_NO_IS_CONVERTIBLE) -template -struct enable_binary - : boost::iterators::enable_if, T> -{}; -# define BOOST_PYTHON_BINARY_RETURN(T) typename enable_binary::type -# else -# define BOOST_PYTHON_BINARY_RETURN(T) T -# endif - -template -object object_operators::operator()() const -{ - object_cref2 f = *static_cast(this); - return call(f.ptr()); -} - - -template -inline -object_operators::operator bool_type() const -{ - object_cref2 x = *static_cast(this); - int is_true = PyObject_IsTrue(x.ptr()); - if (is_true < 0) throw_error_already_set(); - return is_true ? &object::ptr : 0; -} - -template -inline bool -object_operators::operator!() const -{ - object_cref2 x = *static_cast(this); - int is_true = PyObject_IsTrue(x.ptr()); - if (is_true < 0) throw_error_already_set(); - return !is_true; -} - -# define BOOST_PYTHON_COMPARE_OP(op, opid) \ -template \ -BOOST_PYTHON_BINARY_RETURN(object) operator op(L const& l, R const& r) \ -{ \ - return PyObject_RichCompare( \ - object(l).ptr(), object(r).ptr(), opid); \ -} -# undef BOOST_PYTHON_COMPARE_OP - -# define BOOST_PYTHON_BINARY_OPERATOR(op) \ -BOOST_PYTHON_DECL object operator op(object const& l, object const& r); \ -template \ -BOOST_PYTHON_BINARY_RETURN(object) operator op(L const& l, R const& r) \ -{ \ - return object(l) op object(r); \ -} -BOOST_PYTHON_BINARY_OPERATOR(>) -BOOST_PYTHON_BINARY_OPERATOR(>=) -BOOST_PYTHON_BINARY_OPERATOR(<) -BOOST_PYTHON_BINARY_OPERATOR(<=) -BOOST_PYTHON_BINARY_OPERATOR(==) -BOOST_PYTHON_BINARY_OPERATOR(!=) -BOOST_PYTHON_BINARY_OPERATOR(+) -BOOST_PYTHON_BINARY_OPERATOR(-) -BOOST_PYTHON_BINARY_OPERATOR(*) -BOOST_PYTHON_BINARY_OPERATOR(/) -BOOST_PYTHON_BINARY_OPERATOR(%) -BOOST_PYTHON_BINARY_OPERATOR(<<) -BOOST_PYTHON_BINARY_OPERATOR(>>) -BOOST_PYTHON_BINARY_OPERATOR(&) -BOOST_PYTHON_BINARY_OPERATOR(^) -BOOST_PYTHON_BINARY_OPERATOR(|) -# undef BOOST_PYTHON_BINARY_OPERATOR - - -# define BOOST_PYTHON_INPLACE_OPERATOR(op) \ -BOOST_PYTHON_DECL object& operator op(object& l, object const& r); \ -template \ -object& operator op(object& l, R const& r) \ -{ \ - return l op object(r); \ -} -BOOST_PYTHON_INPLACE_OPERATOR(+=) -BOOST_PYTHON_INPLACE_OPERATOR(-=) -BOOST_PYTHON_INPLACE_OPERATOR(*=) -BOOST_PYTHON_INPLACE_OPERATOR(/=) -BOOST_PYTHON_INPLACE_OPERATOR(%=) -BOOST_PYTHON_INPLACE_OPERATOR(<<=) -BOOST_PYTHON_INPLACE_OPERATOR(>>=) -BOOST_PYTHON_INPLACE_OPERATOR(&=) -BOOST_PYTHON_INPLACE_OPERATOR(^=) -BOOST_PYTHON_INPLACE_OPERATOR(|=) -# undef BOOST_PYTHON_INPLACE_OPERATOR - -}}} // namespace boost::python - -#include - -#endif // OBJECT_OPERATORS_DWA2002617_HPP diff --git a/include/boost/python/object_protocol.hpp b/include/boost/python/object_protocol.hpp deleted file mode 100644 index 7c1c0283..00000000 --- a/include/boost/python/object_protocol.hpp +++ /dev/null @@ -1,90 +0,0 @@ -// 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) -#ifndef OBJECT_PROTOCOL_DWA2002615_HPP -# define OBJECT_PROTOCOL_DWA2002615_HPP - -# include - -# include -# include - -# include - -namespace boost { namespace python { namespace api { - -# if BOOST_WORKAROUND(__SUNPRO_CC, BOOST_TESTED_AT(0x590)) -// attempt to use SFINAE to prevent functions accepting T const& from -// coming up as ambiguous with the one taking a char const* when a -// string literal is passed -# define BOOST_PYTHON_NO_ARRAY_ARG(T) , T (*)() = 0 -# else -# define BOOST_PYTHON_NO_ARRAY_ARG(T) -# endif - -template -object getattr(Target const& target, Key const& key BOOST_PYTHON_NO_ARRAY_ARG(Key)) -{ - return getattr(object(target), object(key)); -} - -template -object getattr(Target const& target, Key const& key, Default const& default_ BOOST_PYTHON_NO_ARRAY_ARG(Key)) -{ - return getattr(object(target), object(key), object(default_)); -} - - -template -void setattr(object const& target, Key const& key, Value const& value BOOST_PYTHON_NO_ARRAY_ARG(Key)) -{ - setattr(target, object(key), object(value)); -} - -template -void delattr(object const& target, Key const& key BOOST_PYTHON_NO_ARRAY_ARG(Key)) -{ - delattr(target, object(key)); -} - -template -object getitem(Target const& target, Key const& key BOOST_PYTHON_NO_ARRAY_ARG(Key)) -{ - return getitem(object(target), object(key)); -} - - -template -void setitem(object const& target, Key const& key, Value const& value BOOST_PYTHON_NO_ARRAY_ARG(Key)) -{ - setitem(target, object(key), object(value)); -} - -template -void delitem(object const& target, Key const& key BOOST_PYTHON_NO_ARRAY_ARG(Key)) -{ - delitem(target, object(key)); -} - -template -object getslice(Target const& target, Begin const& begin, End const& end) -{ - return getslice(object(target), object(begin), object(end)); -} - -template -void setslice(object const& target, Begin const& begin, End const& end, Value const& value) -{ - setslice(target, object(begin), object(end), object(value)); -} - -template -void delslice(object const& target, Begin const& begin, End const& end) -{ - delslice(target, object(begin), object(end)); -} - -}}} // namespace boost::python::api - -#endif // OBJECT_PROTOCOL_DWA2002615_HPP diff --git a/include/boost/python/object_protocol_core.hpp b/include/boost/python/object_protocol_core.hpp deleted file mode 100755 index a5bd9afc..00000000 --- a/include/boost/python/object_protocol_core.hpp +++ /dev/null @@ -1,53 +0,0 @@ -// 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) -#ifndef OBJECT_PROTOCOL_CORE_DWA2002615_HPP -# define OBJECT_PROTOCOL_CORE_DWA2002615_HPP - -# include - -# include - -namespace boost { namespace python { - -namespace api -{ - class object; - - BOOST_PYTHON_DECL object getattr(object const& target, object const& key); - BOOST_PYTHON_DECL object getattr(object const& target, object const& key, object const& default_); - BOOST_PYTHON_DECL void setattr(object const& target, object const& key, object const& value); - BOOST_PYTHON_DECL void delattr(object const& target, object const& key); - - // These are defined for efficiency, since attributes are commonly - // accessed through literal strings. - BOOST_PYTHON_DECL object getattr(object const& target, char const* key); - BOOST_PYTHON_DECL object getattr(object const& target, char const* key, object const& default_); - BOOST_PYTHON_DECL void setattr(object const& target, char const* key, object const& value); - BOOST_PYTHON_DECL void delattr(object const& target, char const* key); - - BOOST_PYTHON_DECL object getitem(object const& target, object const& key); - BOOST_PYTHON_DECL void setitem(object const& target, object const& key, object const& value); - BOOST_PYTHON_DECL void delitem(object const& target, object const& key); - - BOOST_PYTHON_DECL object getslice(object const& target, handle<> const& begin, handle<> const& end); - BOOST_PYTHON_DECL void setslice(object const& target, handle<> const& begin, handle<> const& end, object const& value); - BOOST_PYTHON_DECL void delslice(object const& target, handle<> const& begin, handle<> const& end); -} - -using api::getattr; -using api::setattr; -using api::delattr; - -using api::getitem; -using api::setitem; -using api::delitem; - -using api::getslice; -using api::setslice; -using api::delslice; - -}} // namespace boost::python - -#endif // OBJECT_PROTOCOL_CORE_DWA2002615_HPP diff --git a/include/boost/python/object_slices.hpp b/include/boost/python/object_slices.hpp deleted file mode 100644 index 6cd3dc29..00000000 --- a/include/boost/python/object_slices.hpp +++ /dev/null @@ -1,146 +0,0 @@ -// 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) -#ifndef OBJECT_SLICES_DWA2002615_HPP -# define OBJECT_SLICES_DWA2002615_HPP - -# include - -# include -# include -# include -# include -# include - -namespace boost { namespace python { namespace api { - -struct const_slice_policies -{ - typedef std::pair, handle<> > key_type; - static object get(object const& target, key_type const& key); -}; - -struct slice_policies : const_slice_policies -{ - static object const& set(object const& target, key_type const& key, object const& value); - static void del(object const& target, key_type const& key); -}; - -template -inline slice_policies::key_type slice_key(T x, U y) -{ - return slice_policies::key_type(handle<>(x), handle<>(y)); -} - -// -// implementation -// -template -object_slice -object_operators::slice(object_cref start, object_cref finish) -{ - object_cref2 x = *static_cast(this); - return object_slice(x, api::slice_key(borrowed(start.ptr()), borrowed(finish.ptr()))); -} - -template -const_object_slice -object_operators::slice(object_cref start, object_cref finish) const -{ - object_cref2 x = *static_cast(this); - return const_object_slice(x, api::slice_key(borrowed(start.ptr()), borrowed(finish.ptr()))); -} - -template -object_slice -object_operators::slice(slice_nil, object_cref finish) -{ - object_cref2 x = *static_cast(this); - return object_slice(x, api::slice_key(allow_null((PyObject*)0), borrowed(finish.ptr()))); -} - -template -const_object_slice -object_operators::slice(slice_nil, object_cref finish) const -{ - object_cref2 x = *static_cast(this); - return const_object_slice(x, api::slice_key(allow_null((PyObject*)0), borrowed(finish.ptr()))); -} - -template -object_slice -object_operators::slice(slice_nil, slice_nil) -{ - object_cref2 x = *static_cast(this); - return object_slice(x, api::slice_key(allow_null((PyObject*)0), allow_null((PyObject*)0))); -} - -template -const_object_slice -object_operators::slice(slice_nil, slice_nil) const -{ - object_cref2 x = *static_cast(this); - return const_object_slice(x, api::slice_key(allow_null((PyObject*)0), allow_null((PyObject*)0))); -} - -template -object_slice -object_operators::slice(object_cref start, slice_nil) -{ - object_cref2 x = *static_cast(this); - return object_slice(x, api::slice_key(borrowed(start.ptr()), allow_null((PyObject*)0))); -} - -template -const_object_slice -object_operators::slice(object_cref start, slice_nil) const -{ - object_cref2 x = *static_cast(this); - return const_object_slice(x, api::slice_key(borrowed(start.ptr()), allow_null((PyObject*)0))); -} - -template -template -inline const_object_slice -object_operators::slice(T const& start, V const& end) const -{ - return this->slice( - typename slice_bound::type(start) - , typename slice_bound::type(end)); -} - -template -template -inline object_slice -object_operators::slice(T const& start, V const& end) -{ - return this->slice( - typename slice_bound::type(start) - , typename slice_bound::type(end)); -} - -inline object const_slice_policies::get(object const& target, key_type const& key) -{ - return getslice(target, key.first, key.second); -} - -inline object const& slice_policies::set( - object const& target - , key_type const& key - , object const& value) -{ - setslice(target, key.first, key.second, value); - return value; -} - -inline void slice_policies::del( - object const& target - , key_type const& key) -{ - delslice(target, key.first, key.second); -} - -}}} // namespace boost::python::api - -#endif // OBJECT_SLICES_DWA2002615_HPP diff --git a/include/boost/python/opaque_pointer_converter.hpp b/include/boost/python/opaque_pointer_converter.hpp deleted file mode 100644 index e95c49bb..00000000 --- a/include/boost/python/opaque_pointer_converter.hpp +++ /dev/null @@ -1,190 +0,0 @@ -// Copyright Gottfried Ganauge 2003..2006. -// 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) -/* - * Generic Conversion of opaque C++-pointers to a Python-Wrapper. - */ -# ifndef OPAQUE_POINTER_CONVERTER_HPP_ -# define OPAQUE_POINTER_CONVERTER_HPP_ - -# include -# include -# include -# include -# include -# include -# include -# include - -# include -# include -# include - -# include - -# include -# include -# include - -// opaque -- -// -// registers to- and from- python conversions for a type Pointee. -// -// Note: -// In addition you need to define specializations for type_id -// on the type pointed to by Pointer using -// BOOST_PYTHON_OPAQUE_SPECIALIZED_TYPE_ID(Pointee) -// -// For an example see libs/python/test/opaque.cpp -// -namespace boost { namespace python { - -template -struct opaque -{ - opaque() - { - if (type_object.tp_name == 0) - { - type_object.tp_name = const_cast(type_id().name()); - if (PyType_Ready (&type_object) < 0) - { - throw error_already_set(); - } - - this->register_self(); - } - } - - static opaque instance; -private: - - static void* extract(PyObject* op) - { - return PyObject_TypeCheck(op, &type_object) - ? static_cast(implicit_cast(op))->x - : 0 - ; - } - - static PyObject* wrap(void const* px) - { - Pointee* x = *static_cast(px); - - if (x == 0) - return detail::none(); - - if ( python_instance *o = PyObject_New(python_instance, &type_object) ) - { - o->x = x; - return static_cast(implicit_cast(o)); - } - else - { - throw error_already_set(); - } - } - - void register_self() - { - converter::registration const *existing = - converter::registry::query (type_id()); - - if ((existing == 0) || (existing->m_to_python == 0)) - { -#ifndef BOOST_PYTHON_NO_PY_SIGNATURES - converter::registry::insert(&extract, type_id(), &get_pytype); - converter::registry::insert(&wrap, type_id(), &get_pytype); -#else - converter::registry::insert(&extract, type_id()); - converter::registry::insert(&wrap, type_id()); -#endif - } - } - - struct python_instance - { - PyObject_HEAD - Pointee* x; - }; - - static PyTypeObject type_object; -#ifndef BOOST_PYTHON_NO_PY_SIGNATURES - static PyTypeObject const *get_pytype(){return &type_object; } -#endif -}; - -template -opaque opaque::instance; - -template -PyTypeObject opaque::type_object = -{ - PyVarObject_HEAD_INIT(NULL, 0) - 0, - sizeof( BOOST_DEDUCED_TYPENAME opaque::python_instance ), - 0, - ::boost::python::detail::dealloc, - 0, /* tp_print */ - 0, /* tp_getattr */ - 0, /* tp_setattr */ - 0, /* tp_compare */ - 0, /* tp_repr */ - 0, /* tp_as_number */ - 0, /* tp_as_sequence */ - 0, /* tp_as_mapping */ - 0, /* tp_hash */ - 0, /* tp_call */ - 0, /* tp_str */ - 0, /* tp_getattro */ - 0, /* tp_setattro */ - 0, /* tp_as_buffer */ - 0, /* tp_flags */ - 0, /* tp_doc */ - 0, /* tp_traverse */ - 0, /* tp_clear */ - 0, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - 0, /* tp_iter */ - 0, /* tp_iternext */ - 0, /* tp_methods */ - 0, /* tp_members */ - 0, /* tp_getset */ - 0, /* tp_base */ - 0, /* tp_dict */ - 0, /* tp_descr_get */ - 0, /* tp_descr_set */ - 0, /* tp_dictoffset */ - 0, /* tp_init */ - 0, /* tp_alloc */ - 0, /* tp_new */ - 0, /* tp_free */ - 0, /* tp_is_gc */ - 0, /* tp_bases */ - 0, /* tp_mro */ - 0, /* tp_cache */ - 0, /* tp_subclasses */ - 0, /* tp_weaklist */ -#if PYTHON_API_VERSION >= 1012 - 0 /* tp_del */ -#endif -}; -}} // namespace boost::python - -// If you change the below, don't forget to alter the end of type_id.hpp -# define BOOST_PYTHON_OPAQUE_SPECIALIZED_TYPE_ID(Pointee) \ - namespace boost { namespace python { \ - template<> \ - inline type_info type_id() \ - { \ - return type_info (typeid (Pointee *)); \ - } \ - template<> \ - inline type_info type_id() \ - { \ - return type_info (typeid (Pointee *)); \ - } \ - }} - -# endif // OPAQUE_POINTER_CONVERTER_HPP_ diff --git a/include/boost/python/operators.hpp b/include/boost/python/operators.hpp deleted file mode 100644 index ea2be7b9..00000000 --- a/include/boost/python/operators.hpp +++ /dev/null @@ -1,374 +0,0 @@ -// 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) -#ifndef OPERATORS_DWA2002530_HPP -# define OPERATORS_DWA2002530_HPP - -# include - -# include -# include -# include -# include -# include -# include -# include -# include -# include -# include -# include -# include -# include -# include - -namespace boost { namespace python { - -namespace detail -{ - // This is essentially the old v1 to_python(). It will be eliminated - // once the public interface for to_python is settled on. - template - PyObject* convert_result(T const& x) - { - return converter::arg_to_python(x).release(); - } - - // Operator implementation template declarations. The nested apply - // declaration here keeps MSVC6 happy. - template struct operator_l - { - template struct apply; - }; - - template struct operator_r - { - template struct apply; - }; - - template struct operator_1 - { - template struct apply; - }; - - // MSVC6 doesn't want us to do this sort of inheritance on a nested - // class template, so we use this layer of indirection to avoid - // ::template<...> on the nested apply functions below - template - struct operator_l_inner - : operator_l::template apply - {}; - - template - struct operator_r_inner - : operator_r::template apply - {}; - - template - struct operator_1_inner - : operator_1::template apply - {}; - - // Define three different binary_op templates which take care of - // these cases: - // self op self - // self op R - // L op self - // - // The inner apply metafunction is used to adjust the operator to - // the class type being defined. Inheritance of the outer class is - // simply used to provide convenient access to the operation's - // name(). - - // self op self - template - struct binary_op : operator_l - { - template - struct apply : operator_l_inner - { - }; - }; - - // self op R - template - struct binary_op_l : operator_l - { - template - struct apply : operator_l_inner - { - }; - }; - - // L op self - template - struct binary_op_r : operator_r - { - template - struct apply : operator_r_inner - { - }; - }; - - template - struct unary_op : operator_1 - { - template - struct apply : operator_1_inner - { - }; - }; - - // This type is what actually gets returned from operators used on - // self_t - template - struct operator_ - : def_visitor > - { - private: - template - void visit(ClassT& cl) const - { - typedef typename mpl::eval_if< - is_same - , mpl::if_< - is_same - , binary_op - , binary_op_l< - id - , BOOST_DEDUCED_TYPENAME unwrap_other::type - > - > - , mpl::if_< - is_same - , unary_op - , binary_op_r< - id - , BOOST_DEDUCED_TYPENAME unwrap_other::type - > - > - >::type generator; - - cl.def( - generator::name() - , &generator::template apply< - BOOST_DEDUCED_TYPENAME ClassT::wrapped_type - >::execute - ); - } - - friend class python::def_visitor_access; - }; -} - -# define BOOST_PYTHON_BINARY_OPERATION(id, rid, expr) \ -namespace detail \ -{ \ - template <> \ - struct operator_l \ - { \ - template \ - struct apply \ - { \ - typedef typename unwrap_wrapper_::type lhs; \ - typedef typename unwrap_wrapper_::type rhs; \ - static PyObject* execute(lhs& l, rhs const& r) \ - { \ - return detail::convert_result(expr); \ - } \ - }; \ - static char const* name() { return "__" #id "__"; } \ - }; \ - \ - template <> \ - struct operator_r \ - { \ - template \ - struct apply \ - { \ - typedef typename unwrap_wrapper_::type lhs; \ - typedef typename unwrap_wrapper_::type rhs; \ - static PyObject* execute(rhs& r, lhs const& l) \ - { \ - return detail::convert_result(expr); \ - } \ - }; \ - static char const* name() { return "__" #rid "__"; } \ - }; \ -} - -# define BOOST_PYTHON_BINARY_OPERATOR(id, rid, op) \ -BOOST_PYTHON_BINARY_OPERATION(id, rid, l op r) \ -namespace self_ns \ -{ \ - template \ - inline detail::operator_ \ - operator op(L const&, R const&) \ - { \ - return detail::operator_(); \ - } \ -} - -BOOST_PYTHON_BINARY_OPERATOR(add, radd, +) -BOOST_PYTHON_BINARY_OPERATOR(sub, rsub, -) -BOOST_PYTHON_BINARY_OPERATOR(mul, rmul, *) -#if PY_VERSION_HEX >= 0x03000000 - BOOST_PYTHON_BINARY_OPERATOR(truediv, rtruediv, /) -#else - BOOST_PYTHON_BINARY_OPERATOR(div, rdiv, /) -#endif -BOOST_PYTHON_BINARY_OPERATOR(mod, rmod, %) -BOOST_PYTHON_BINARY_OPERATOR(lshift, rlshift, <<) -BOOST_PYTHON_BINARY_OPERATOR(rshift, rrshift, >>) -BOOST_PYTHON_BINARY_OPERATOR(and, rand, &) -BOOST_PYTHON_BINARY_OPERATOR(xor, rxor, ^) -BOOST_PYTHON_BINARY_OPERATOR(or, ror, |) -BOOST_PYTHON_BINARY_OPERATOR(gt, lt, >) -BOOST_PYTHON_BINARY_OPERATOR(ge, le, >=) -BOOST_PYTHON_BINARY_OPERATOR(lt, gt, <) -BOOST_PYTHON_BINARY_OPERATOR(le, ge, <=) -BOOST_PYTHON_BINARY_OPERATOR(eq, eq, ==) -BOOST_PYTHON_BINARY_OPERATOR(ne, ne, !=) -# undef BOOST_PYTHON_BINARY_OPERATOR - -// pow isn't an operator in C++; handle it specially. -BOOST_PYTHON_BINARY_OPERATION(pow, rpow, pow(l,r)) -# undef BOOST_PYTHON_BINARY_OPERATION - -namespace self_ns -{ -# ifndef BOOST_NO_ARGUMENT_DEPENDENT_LOOKUP - template - inline detail::operator_ - pow(L const&, R const&) - { - return detail::operator_(); - } -# else - // When there's no argument-dependent lookup, we need these - // overloads to handle the case when everything is imported into the - // global namespace. Note that the plain overload below does /not/ - // take const& arguments. This is needed by MSVC6 at least, or it - // complains of ambiguities, since there's no partial ordering. - inline detail::operator_ - pow(self_t, self_t) - { - return detail::operator_(); - } - template - inline detail::operator_ - pow(self_t const&, R const&) - { - return detail::operator_(); - } - template - inline detail::operator_ - pow(L const&, self_t const&) - { - return detail::operator_(); - } -# endif -} - - -# define BOOST_PYTHON_INPLACE_OPERATOR(id, op) \ -namespace detail \ -{ \ - template <> \ - struct operator_l \ - { \ - template \ - struct apply \ - { \ - typedef typename unwrap_wrapper_::type lhs; \ - typedef typename unwrap_wrapper_::type rhs; \ - static PyObject* \ - execute(back_reference l, rhs const& r) \ - { \ - l.get() op r; \ - return python::incref(l.source().ptr()); \ - } \ - }; \ - static char const* name() { return "__" #id "__"; } \ - }; \ -} \ -namespace self_ns \ -{ \ - template \ - inline detail::operator_ \ - operator op(self_t const&, R const&) \ - { \ - return detail::operator_(); \ - } \ -} - -BOOST_PYTHON_INPLACE_OPERATOR(iadd,+=) -BOOST_PYTHON_INPLACE_OPERATOR(isub,-=) -BOOST_PYTHON_INPLACE_OPERATOR(imul,*=) -BOOST_PYTHON_INPLACE_OPERATOR(idiv,/=) -BOOST_PYTHON_INPLACE_OPERATOR(imod,%=) -BOOST_PYTHON_INPLACE_OPERATOR(ilshift,<<=) -BOOST_PYTHON_INPLACE_OPERATOR(irshift,>>=) -BOOST_PYTHON_INPLACE_OPERATOR(iand,&=) -BOOST_PYTHON_INPLACE_OPERATOR(ixor,^=) -BOOST_PYTHON_INPLACE_OPERATOR(ior,|=) - -# define BOOST_PYTHON_UNARY_OPERATOR(id, op, func_name) \ -namespace detail \ -{ \ - template <> \ - struct operator_1 \ - { \ - template \ - struct apply \ - { \ - typedef typename unwrap_wrapper_::type self_t; \ - static PyObject* execute(self_t& x) \ - { \ - return detail::convert_result(op(x)); \ - } \ - }; \ - static char const* name() { return "__" #id "__"; } \ - }; \ -} \ -namespace self_ns \ -{ \ - inline detail::operator_ \ - func_name(self_t const&) \ - { \ - return detail::operator_(); \ - } \ -} -# undef BOOST_PYTHON_INPLACE_OPERATOR - -BOOST_PYTHON_UNARY_OPERATOR(neg, -, operator-) -BOOST_PYTHON_UNARY_OPERATOR(pos, +, operator+) -BOOST_PYTHON_UNARY_OPERATOR(abs, abs, abs) -BOOST_PYTHON_UNARY_OPERATOR(invert, ~, operator~) -#if PY_VERSION_HEX >= 0x03000000 -BOOST_PYTHON_UNARY_OPERATOR(bool, !!, operator!) -#else -BOOST_PYTHON_UNARY_OPERATOR(nonzero, !!, operator!) -#endif -BOOST_PYTHON_UNARY_OPERATOR(int, long, int_) -BOOST_PYTHON_UNARY_OPERATOR(long, PyLong_FromLong, long_) -BOOST_PYTHON_UNARY_OPERATOR(float, double, float_) -BOOST_PYTHON_UNARY_OPERATOR(complex, std::complex, complex_) -BOOST_PYTHON_UNARY_OPERATOR(str, lexical_cast, str) -BOOST_PYTHON_UNARY_OPERATOR(repr, lexical_cast, repr) -# undef BOOST_PYTHON_UNARY_OPERATOR - -}} // namespace boost::python - -# ifdef BOOST_NO_ARGUMENT_DEPENDENT_LOOKUP -using boost::python::self_ns::abs; -using boost::python::self_ns::int_; -using boost::python::self_ns::long_; -using boost::python::self_ns::float_; -using boost::python::self_ns::complex_; -using boost::python::self_ns::str; -using boost::python::self_ns::repr; -using boost::python::self_ns::pow; -# endif - -#endif // OPERATORS_DWA2002530_HPP diff --git a/include/boost/python/other.hpp b/include/boost/python/other.hpp deleted file mode 100644 index 24a24ad8..00000000 --- a/include/boost/python/other.hpp +++ /dev/null @@ -1,54 +0,0 @@ -#ifndef OTHER_DWA20020601_HPP -# define OTHER_DWA20020601_HPP - -# include -// 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) - -# pragma once - -# include - -namespace boost { namespace python { - -template struct other -{ - typedef T type; -}; - -namespace detail -{ - template - class is_other - { - public: - BOOST_STATIC_CONSTANT(bool, value = false); - }; - - template - class is_other > - { - public: - BOOST_STATIC_CONSTANT(bool, value = true); - }; - - template - class unwrap_other - { - public: - typedef T type; - }; - - template - class unwrap_other > - { - public: - typedef T type; - }; -} - -}} // namespace boost::python - -#endif // #ifndef OTHER_DWA20020601_HPP diff --git a/include/boost/python/overloads.hpp b/include/boost/python/overloads.hpp deleted file mode 100644 index e60dc179..00000000 --- a/include/boost/python/overloads.hpp +++ /dev/null @@ -1,13 +0,0 @@ -// 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) -#ifndef OVERLOADS_DWA2002101_HPP -# define OVERLOADS_DWA2002101_HPP - -# include - -# include -# include - -#endif // OVERLOADS_DWA2002101_HPP diff --git a/include/boost/python/override.hpp b/include/boost/python/override.hpp deleted file mode 100644 index 39714257..00000000 --- a/include/boost/python/override.hpp +++ /dev/null @@ -1,144 +0,0 @@ -#if !defined(BOOST_PP_IS_ITERATING) - -// Copyright David Abrahams 2004. 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 OVERRIDE_DWA2004721_HPP -# define OVERRIDE_DWA2004721_HPP - -# include - -# include - -# include -# include - -# include -# include -# include -# include -# include - -# include - -namespace boost { namespace python { - -class override; - -namespace detail -{ - class wrapper_base; - - // The result of calling a method. - class method_result - { - private: - friend class boost::python::override; - explicit method_result(PyObject* x) - : m_obj(x) - {} - - public: - template - operator T() - { - converter::return_from_python converter; - return converter(m_obj.release()); - } - -# if BOOST_WORKAROUND(_MSC_FULL_VER, BOOST_TESTED_AT(140050215)) - template - operator T*() - { - converter::return_from_python converter; - return converter(m_obj.release()); - } -# endif - -# if BOOST_WORKAROUND(BOOST_MSVC, BOOST_TESTED_AT(1400)) || BOOST_WORKAROUND(BOOST_INTEL_WIN, >= 900) - // No operator T& -# else - - template - operator T&() const - { - converter::return_from_python converter; - return converter(const_cast&>(m_obj).release()); - } -# endif - - template - T as(type* = 0) - { - converter::return_from_python converter; - return converter(m_obj.release()); - } - - template - T unchecked(type* = 0) - { - return extract(m_obj.get())(); - } - private: - mutable handle<> m_obj; - }; -} - -class override : public object -{ - private: - friend class detail::wrapper_base; - override(handle<> x) - : object(x) - {} - - public: - detail::method_result - operator()() const - { - detail::method_result x( - PyEval_CallFunction( - this->ptr() - , const_cast("()") - )); - return x; - } - -# define BOOST_PYTHON_fast_arg_to_python_get(z, n, _) \ - , converter::arg_to_python(a##n).get() - -# define BOOST_PP_ITERATION_PARAMS_1 (3, (1, BOOST_PYTHON_MAX_ARITY, )) -# include BOOST_PP_ITERATE() - -# undef BOOST_PYTHON_fast_arg_to_python_get -}; - -}} // namespace boost::python - -#endif // OVERRIDE_DWA2004721_HPP - -#else -# if !(BOOST_WORKAROUND(__MWERKS__, > 0x3100) \ - && BOOST_WORKAROUND(__MWERKS__, BOOST_TESTED_AT(0x3201))) -# line BOOST_PP_LINE(__LINE__, override.hpp) -# endif - -# define N BOOST_PP_ITERATION() - -template < - BOOST_PP_ENUM_PARAMS_Z(1, N, class A) - > -detail::method_result -operator()( BOOST_PP_ENUM_BINARY_PARAMS_Z(1, N, A, const& a) ) const -{ - detail::method_result x( - PyEval_CallFunction( - this->ptr() - , const_cast("(" BOOST_PP_REPEAT_1ST(N, BOOST_PYTHON_FIXED, "O") ")") - BOOST_PP_REPEAT_1ST(N, BOOST_PYTHON_fast_arg_to_python_get, nil) - )); - return x; -} - -# undef N -#endif diff --git a/include/boost/python/pointee.hpp b/include/boost/python/pointee.hpp deleted file mode 100644 index ab8bb874..00000000 --- a/include/boost/python/pointee.hpp +++ /dev/null @@ -1,43 +0,0 @@ -// 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) -#ifndef POINTEE_DWA2002323_HPP -# define POINTEE_DWA2002323_HPP - -# include - -# include -# include - -namespace boost { namespace python { - -namespace detail -{ - template - struct pointee_impl - { - template struct apply : remove_pointer {}; - }; - - template <> - struct pointee_impl - { - template struct apply - { - typedef typename T::element_type type; - }; - }; -} - -template -struct pointee - : detail::pointee_impl< - ::boost::is_pointer::value - >::template apply -{ -}; - -}} // namespace boost::python::detail - -#endif // POINTEE_DWA2002323_HPP diff --git a/include/boost/python/proxy.hpp b/include/boost/python/proxy.hpp deleted file mode 100644 index d3331d56..00000000 --- a/include/boost/python/proxy.hpp +++ /dev/null @@ -1,97 +0,0 @@ -// 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) -#ifndef PROXY_DWA2002615_HPP -# define PROXY_DWA2002615_HPP -# include -# include -# include - -namespace boost { namespace python { namespace api { - -template -class proxy : public object_operators > -{ - typedef typename Policies::key_type key_type; - - typedef proxy const& assignment_self; - public: - proxy(object const& target, key_type const& key); - operator object() const; - - // to support a[b] = c[d] - proxy const& operator=(assignment_self) const; - - template - inline proxy const& operator=(T const& rhs) const - { - Policies::set(m_target, m_key, object(rhs)); - return *this; - } - - public: // implementation detail - void del() const; - - private: - object m_target; - key_type m_key; -}; - - -template -inline void del(proxy const& x) -{ - x.del(); -} - -// -// implementation -// - -template -inline proxy::proxy(object const& target, key_type const& key) - : m_target(target), m_key(key) -{} - -template -inline proxy::operator object() const -{ - return Policies::get(m_target, m_key); -} - -// to support a[b] = c[d] -template -inline proxy const& proxy::operator=(typename proxy::assignment_self rhs) const -{ - return *this = python::object(rhs); -} - -# define BOOST_PYTHON_PROXY_INPLACE(op) \ -template \ -proxy const& operator op(proxy const& lhs, R const& rhs) \ -{ \ - object old(lhs); \ - return lhs = (old op rhs); \ -} -BOOST_PYTHON_PROXY_INPLACE(+=) -BOOST_PYTHON_PROXY_INPLACE(-=) -BOOST_PYTHON_PROXY_INPLACE(*=) -BOOST_PYTHON_PROXY_INPLACE(/=) -BOOST_PYTHON_PROXY_INPLACE(%=) -BOOST_PYTHON_PROXY_INPLACE(<<=) -BOOST_PYTHON_PROXY_INPLACE(>>=) -BOOST_PYTHON_PROXY_INPLACE(&=) -BOOST_PYTHON_PROXY_INPLACE(^=) -BOOST_PYTHON_PROXY_INPLACE(|=) -# undef BOOST_PYTHON_PROXY_INPLACE - -template -inline void proxy::del() const -{ - Policies::del(m_target, m_key); -} - -}}} // namespace boost::python::api - -#endif // PROXY_DWA2002615_HPP diff --git a/include/boost/python/ptr.hpp b/include/boost/python/ptr.hpp deleted file mode 100644 index 287daba4..00000000 --- a/include/boost/python/ptr.hpp +++ /dev/null @@ -1,67 +0,0 @@ -#ifndef PTR_DWA20020601_HPP -# define PTR_DWA20020601_HPP - -# include -// 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) -// -// Based on boost/ref.hpp, thus: -// Copyright (C) 1999, 2000 Jaakko Jarvi (jaakko.jarvi@cs.utu.fi) -// Copyright (C) 2001 Peter Dimov - -# pragma once - -# include -# include - -namespace boost { namespace python { - -template class pointer_wrapper -{ - public: - typedef Ptr type; - - explicit pointer_wrapper(Ptr x): p_(x) {} - operator Ptr() const { return p_; } - Ptr get() const { return p_; } - private: - Ptr p_; -}; - -template -inline pointer_wrapper ptr(T t) -{ - return pointer_wrapper(t); -} - -template -class is_pointer_wrapper - : public mpl::false_ -{ -}; - -template -class is_pointer_wrapper > - : public mpl::true_ -{ -}; - -template -class unwrap_pointer -{ - public: - typedef T type; -}; - -template -class unwrap_pointer > -{ - public: - typedef T type; -}; - -}} // namespace boost::python - -#endif // #ifndef PTR_DWA20020601_HPP diff --git a/include/boost/python/pure_virtual.hpp b/include/boost/python/pure_virtual.hpp deleted file mode 100644 index 58e9aede..00000000 --- a/include/boost/python/pure_virtual.hpp +++ /dev/null @@ -1,124 +0,0 @@ -// 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 PURE_VIRTUAL_DWA2003810_HPP -# define PURE_VIRTUAL_DWA2003810_HPP - -# include -# include -# include -# include - -# include - -namespace boost { namespace python { - -namespace detail -{ - // - // @group Helpers for pure_virtual_visitor. { - // - - // Raises a Python RuntimeError reporting that a pure virtual - // function was called. - void BOOST_PYTHON_DECL pure_virtual_called(); - - // Replace the two front elements of S with T1 and T2 - template - struct replace_front2 - { - // Metafunction forwarding seemed to confound vc6 - typedef typename mpl::push_front< - typename mpl::push_front< - typename mpl::pop_front< - typename mpl::pop_front< - S - >::type - >::type - , T2 - >::type - , T1 - >::type type; - }; - - // Given an MPL sequence representing a member function [object] - // signature, returns a new MPL sequence whose return type is - // replaced by void, and whose first argument is replaced by C&. - template - typename replace_front2::type - error_signature(S) - { - typedef typename replace_front2::type r; - return r(); - } - - // - // } - // - - // - // A def_visitor which defines a method as usual, then adds a - // corresponding function which raises a "pure virtual called" - // exception unless it's been overridden. - // - template - struct pure_virtual_visitor - : def_visitor > - { - pure_virtual_visitor(PointerToMemberFunction pmf) - : m_pmf(pmf) - {} - - private: - friend class python::def_visitor_access; - - template - void visit(C_& c, char const* name, Options& options) const - { - // This should probably be a nicer error message - BOOST_STATIC_ASSERT(!Options::has_default_implementation); - - // Add the virtual function dispatcher - c.def( - name - , m_pmf - , options.doc() - , options.keywords() - , options.policies() - ); - - typedef BOOST_DEDUCED_TYPENAME C_::metadata::held_type held_type; - - // Add the default implementation which raises the exception - c.def( - name - , make_function( - detail::nullary_function_adaptor(pure_virtual_called) - , default_call_policies() - , detail::error_signature(detail::get_signature(m_pmf)) - ) - ); - } - - private: // data members - PointerToMemberFunction m_pmf; - }; -} - -// -// Passed a pointer to member function, generates a def_visitor which -// creates a method that only dispatches to Python if the function has -// been overridden, either in C++ or in Python, raising a "pure -// virtual called" exception otherwise. -// -template -detail::pure_virtual_visitor -pure_virtual(PointerToMemberFunction pmf) -{ - return detail::pure_virtual_visitor(pmf); -} - -}} // namespace boost::python - -#endif // PURE_VIRTUAL_DWA2003810_HPP diff --git a/include/boost/python/raw_function.hpp b/include/boost/python/raw_function.hpp deleted file mode 100755 index 9d9f6b8b..00000000 --- a/include/boost/python/raw_function.hpp +++ /dev/null @@ -1,61 +0,0 @@ -// 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 RAW_FUNCTION_DWA200336_HPP -# define RAW_FUNCTION_DWA200336_HPP - -# include - -# include -# include -# include -# include - -# include -# include - -namespace boost { namespace python { - -namespace detail -{ - template - struct raw_dispatcher - { - raw_dispatcher(F f) : f(f) {} - - PyObject* operator()(PyObject* args, PyObject* keywords) - { - return incref( - object( - f( - tuple(borrowed_reference(args)) - , keywords ? dict(borrowed_reference(keywords)) : dict() - ) - ).ptr() - ); - } - - private: - F f; - }; - - object BOOST_PYTHON_DECL make_raw_function(objects::py_function); -} - -template -object raw_function(F f, std::size_t min_args = 0) -{ - return detail::make_raw_function( - objects::py_function( - detail::raw_dispatcher(f) - , mpl::vector1() - , min_args - , (std::numeric_limits::max)() - ) - ); -} - -}} // namespace boost::python - -#endif // RAW_FUNCTION_DWA200336_HPP diff --git a/include/boost/python/refcount.hpp b/include/boost/python/refcount.hpp deleted file mode 100755 index 5ba5433c..00000000 --- a/include/boost/python/refcount.hpp +++ /dev/null @@ -1,41 +0,0 @@ -// 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) -#ifndef REFCOUNT_DWA2002615_HPP -# define REFCOUNT_DWA2002615_HPP - -# include -# include - -namespace boost { namespace python { - -template -inline T* incref(T* p) -{ - Py_INCREF(python::upcast(p)); - return p; -} - -template -inline T* xincref(T* p) -{ - Py_XINCREF(python::upcast(p)); - return p; -} - -template -inline void decref(T* p) -{ - Py_DECREF(python::upcast(p)); -} - -template -inline void xdecref(T* p) -{ - Py_XDECREF(python::upcast(p)); -} - -}} // namespace boost::python - -#endif // REFCOUNT_DWA2002615_HPP diff --git a/include/boost/python/reference_existing_object.hpp b/include/boost/python/reference_existing_object.hpp deleted file mode 100644 index 8c241071..00000000 --- a/include/boost/python/reference_existing_object.hpp +++ /dev/null @@ -1,46 +0,0 @@ -// 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) -#ifndef REFERENCE_EXISTING_OBJECT_DWA200222_HPP -# define REFERENCE_EXISTING_OBJECT_DWA200222_HPP - -# include -# include -# include -# include -# include - -namespace boost { namespace python { - -namespace detail -{ - template - struct reference_existing_object_requires_a_pointer_or_reference_return_type -# if defined(__GNUC__) || defined(__EDG__) - {} -# endif - ; -} - -template struct to_python_value; - -struct reference_existing_object -{ - template - struct apply - { - BOOST_STATIC_CONSTANT( - bool, ok = is_pointer::value || is_reference::value); - - typedef typename mpl::if_c< - ok - , to_python_indirect - , detail::reference_existing_object_requires_a_pointer_or_reference_return_type - >::type type; - }; -}; - -}} // namespace boost::python - -#endif // REFERENCE_EXISTING_OBJECT_DWA200222_HPP diff --git a/include/boost/python/register_ptr_to_python.hpp b/include/boost/python/register_ptr_to_python.hpp deleted file mode 100644 index d39bd0cf..00000000 --- a/include/boost/python/register_ptr_to_python.hpp +++ /dev/null @@ -1,31 +0,0 @@ -// 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) -#ifndef REGISTER_PTR_TO_PYTHON_HPP -#define REGISTER_PTR_TO_PYTHON_HPP - -#include -#include -#include - -namespace boost { namespace python { - -template -void register_ptr_to_python() -{ - typedef typename boost::python::pointee

::type X; - objects::class_value_wrapper< - P - , objects::make_ptr_instance< - X - , objects::pointer_holder - > - >(); -} - -}} // namespace boost::python - -#endif // REGISTER_PTR_TO_PYTHON_HPP - - diff --git a/include/boost/python/return_arg.hpp b/include/boost/python/return_arg.hpp deleted file mode 100644 index e869a58d..00000000 --- a/include/boost/python/return_arg.hpp +++ /dev/null @@ -1,110 +0,0 @@ -// Copyright David Abrahams and Nikolay Mladenov 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 RETURN_ARG_DWA2003719_HPP -# define RETURN_ARG_DWA2003719_HPP -# include -# include -# include - -#ifndef BOOST_PYTHON_NO_PY_SIGNATURES -# include -#endif - -# include -# include - -# include -# include - -# include -# include - -# include - -namespace boost { namespace python { - -namespace detail -{ - template - struct return_arg_pos_argument_must_be_positive -# if defined(__GNUC__) || defined(__EDG__) - {} -# endif - ; - - struct return_none - { - template struct apply - { - struct type - { - static bool convertible() - { - return true; - } - - PyObject *operator()( typename value_arg::type ) const - { - return none(); - } -#ifndef BOOST_PYTHON_NO_PY_SIGNATURES - PyTypeObject const *get_pytype() const { return converter::expected_pytype_for_arg::get_pytype() ; } -#endif - }; - }; - }; -} - -template < - std::size_t arg_pos=1 - , class Base = default_call_policies -> -struct return_arg : Base -{ - private: - BOOST_STATIC_CONSTANT(bool, legal = arg_pos > 0); - - public: - typedef typename mpl::if_c< - legal - , detail::return_none - , detail::return_arg_pos_argument_must_be_positive - // we could default to the base result_converter in case or - // arg_pos==0 since return arg 0 means return result, but I - // think it is better to issue an error instead, cause it can - // lead to confusions - >::type result_converter; - - template - static PyObject* postcall(ArgumentPackage const& args, PyObject* result) - { - // In case of arg_pos == 0 we could simply return Base::postcall, - // but this is redundant - BOOST_STATIC_ASSERT(arg_pos > 0); - - result = Base::postcall(args,result); - if (!result) - return 0; - Py_DECREF(result); - return incref( detail::get(mpl::int_(),args) ); - } - - template - struct extract_return_type : mpl::at_c - { - }; - -}; - -template < - class Base = default_call_policies - > -struct return_self - : return_arg<1,Base> -{}; - -}} // namespace boost::python - -#endif // RETURN_ARG_DWA2003719_HPP diff --git a/include/boost/python/return_by_value.hpp b/include/boost/python/return_by_value.hpp deleted file mode 100644 index 593fc59c..00000000 --- a/include/boost/python/return_by_value.hpp +++ /dev/null @@ -1,31 +0,0 @@ -// 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) -#ifndef BY_VALUE_DWA20021015_HPP -# define BY_VALUE_DWA20021015_HPP - -# include - -# include -# include -# include - -# include - -namespace boost { namespace python { - -struct return_by_value -{ - template - struct apply - { - typedef to_python_value< - typename detail::value_arg::type - > type; - }; -}; - -}} // namespace boost::python - -#endif // BY_VALUE_DWA20021015_HPP diff --git a/include/boost/python/return_internal_reference.hpp b/include/boost/python/return_internal_reference.hpp deleted file mode 100644 index cc60f442..00000000 --- a/include/boost/python/return_internal_reference.hpp +++ /dev/null @@ -1,43 +0,0 @@ -// 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) -#ifndef RETURN_INTERNAL_REFERENCE_DWA2002131_HPP -# define RETURN_INTERNAL_REFERENCE_DWA2002131_HPP - -# include - -# include -# include -# include -# include - -namespace boost { namespace python { - -namespace detail -{ - template - struct return_internal_reference_owner_arg_must_be_greater_than_zero -# if defined(__GNUC__) || defined(__EDG__) - {} -# endif - ; -} - -template -struct return_internal_reference - : with_custodian_and_ward_postcall<0, owner_arg, BasePolicy_> -{ - private: - BOOST_STATIC_CONSTANT(bool, legal = owner_arg > 0); - public: - typedef typename mpl::if_c< - legal - , reference_existing_object - , detail::return_internal_reference_owner_arg_must_be_greater_than_zero - >::type result_converter; -}; - -}} // namespace boost::python - -#endif // RETURN_INTERNAL_REFERENCE_DWA2002131_HPP diff --git a/include/boost/python/return_opaque_pointer.hpp b/include/boost/python/return_opaque_pointer.hpp deleted file mode 100644 index cf544d80..00000000 --- a/include/boost/python/return_opaque_pointer.hpp +++ /dev/null @@ -1,47 +0,0 @@ -// Copyright Gottfried Ganauge 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) -/* - * Generic Return value converter generator for opaque C++-pointers - */ -# ifndef RETURN_OPAQUE_POINTER_HPP_ -# define RETURN_OPAQUE_POINTER_HPP_ - -# include -# include -# include -# include -# include -# include - -namespace boost { namespace python { - -namespace detail -{ - template - static void opaque_pointee(Pointee const volatile*) - { - force_instantiate(opaque::instance); - } -} - -struct return_opaque_pointer -{ - template - struct apply - { - BOOST_MPL_ASSERT_MSG( is_pointer::value, RETURN_OPAQUE_POINTER_EXPECTS_A_POINTER_TYPE, (R)); - - struct type : - boost::python::to_python_value< - typename detail::value_arg::type - > - { - type() { detail::opaque_pointee(R()); } - }; - }; -}; - -}} // namespace boost::python -# endif // RETURN_OPAQUE_POINTER_HPP_ diff --git a/include/boost/python/return_value_policy.hpp b/include/boost/python/return_value_policy.hpp deleted file mode 100644 index 9a5fba38..00000000 --- a/include/boost/python/return_value_policy.hpp +++ /dev/null @@ -1,21 +0,0 @@ -// 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) -#ifndef RETURN_VALUE_POLICY_DWA2002131_HPP -# define RETURN_VALUE_POLICY_DWA2002131_HPP - -# include -# include - -namespace boost { namespace python { - -template -struct return_value_policy : BasePolicy_ -{ - typedef ResultConverterGenerator result_converter; -}; - -}} // namespace boost::python - -#endif // RETURN_VALUE_POLICY_DWA2002131_HPP diff --git a/include/boost/python/scope.hpp b/include/boost/python/scope.hpp deleted file mode 100644 index 8be3e054..00000000 --- a/include/boost/python/scope.hpp +++ /dev/null @@ -1,77 +0,0 @@ -// 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) -#ifndef SCOPE_DWA2002724_HPP -# define SCOPE_DWA2002724_HPP - -# include -# include -# include - -namespace boost { namespace python { - -namespace detail -{ - // Making this a namespace-scope variable to avoid Cygwin issues. - // Use a PyObject* to avoid problems with static destruction after Py_Finalize - extern BOOST_PYTHON_DECL PyObject* current_scope; -} - -class scope - : public object -{ - public: - inline scope(scope const&); - inline scope(object const&); - inline scope(); - inline ~scope(); - - private: // data members - PyObject* m_previous_scope; - - private: // unimplemented functions - void operator=(scope const&); -}; - -inline scope::scope(object const& new_scope) - : object(new_scope) - , m_previous_scope(detail::current_scope) -{ - detail::current_scope = python::incref(new_scope.ptr()); -} - -inline scope::scope() - : object(detail::borrowed_reference( - detail::current_scope ? detail::current_scope : Py_None - )) - , m_previous_scope(python::xincref(detail::current_scope)) -{ -} - -inline scope::~scope() -{ - python::xdecref(detail::current_scope); - detail::current_scope = m_previous_scope; -} - -namespace converter -{ - template <> - struct object_manager_traits - : object_manager_traits - { - }; -} - -// Placing this after the specialization above suppresses a CWPro8.3 bug -inline scope::scope(scope const& new_scope) - : object(new_scope) - , m_previous_scope(detail::current_scope) -{ - detail::current_scope = python::incref(new_scope.ptr()); -} - -}} // namespace boost::python - -#endif // SCOPE_DWA2002724_HPP diff --git a/include/boost/python/self.hpp b/include/boost/python/self.hpp deleted file mode 100755 index 99ec5b8f..00000000 --- a/include/boost/python/self.hpp +++ /dev/null @@ -1,33 +0,0 @@ -// 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) -#ifndef SELF_DWA2002531_HPP -# define SELF_DWA2002531_HPP - -# include - -namespace boost { namespace python { - -#define BOOST_PYTHON_SELF_IS_CLASS - -// Sink self_t into its own namespace so that we have a safe place to -// put the completely general operator templates which operate on -// it. It is possible to avoid this, but it turns out to be much more -// complicated and finally GCC 2.95.2 chokes on it. -namespace self_ns -{ -# ifndef BOOST_PYTHON_SELF_IS_CLASS - enum self_t { self }; -# else - struct self_t {}; - extern BOOST_PYTHON_DECL self_t self; -# endif -} - -using self_ns::self_t; -using self_ns::self; - -}} // namespace boost::python - -#endif // SELF_DWA2002531_HPP diff --git a/include/boost/python/signature.hpp b/include/boost/python/signature.hpp deleted file mode 100644 index f1143e3a..00000000 --- a/include/boost/python/signature.hpp +++ /dev/null @@ -1,252 +0,0 @@ -/////////////////////////////////////////////////////////////////////////////// -// -// Copyright David Abrahams 2002, Joel de Guzman, 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) -// -/////////////////////////////////////////////////////////////////////////////// -#if !defined(BOOST_PP_IS_ITERATING) - -# ifndef SIGNATURE_JDG20020813_HPP -# define SIGNATURE_JDG20020813_HPP - -# include - -# include -# include - -# include -# include -# include -# include -# include -# include -# include -# include - -# include -# include -# include -# include - -# define BOOST_PYTHON_LIST_INC(n) \ - BOOST_PP_CAT(mpl::vector, BOOST_PP_INC(n)) - -/////////////////////////////////////////////////////////////////////////////// -namespace boost { namespace python { namespace detail { - -// A metafunction returning C1 if C1 is derived from C2, and C2 -// otherwise -template -struct most_derived -{ - typedef typename mpl::if_< - is_convertible - , C1 - , C2 - >::type type; -}; - -// The following macros generate expansions for:: -// -// template -// inline mpl::vector -// get_signature(RT(BOOST_PYTHON_FN_CC *)(T0...TN), void* = 0) -// { -// return mpl::list(); -// } -// -// where BOOST_PYTHON_FN_CC is a calling convention keyword, can be -// -// empty, for default calling convention -// __cdecl (if BOOST_PYTHON_ENABLE_CDECL is defined) -// __stdcall (if BOOST_PYTHON_ENABLE_STDCALL is defined) -// __fastcall (if BOOST_PYTHON_ENABLE_FASTCALL is defined) -// -// And, for an appropriate assortment of cv-qualifications:: -// -// template -// inline mpl::vector -// get_signature(RT(BOOST_PYTHON_FN_CC ClassT::*)(T0...TN) cv)) -// { -// return mpl::list(); -// } -// -// template -// inline mpl::vector< -// RT -// , typename most_derived::type& -// , T0...TN -// > -// get_signature(RT(BOOST_PYTHON_FN_CC ClassT::*)(T0...TN) cv), Target*) -// { -// return mpl::list(); -// } -// -// There are two forms for invoking get_signature:: -// -// get_signature(f) -// -// and :: -// -// get_signature(f,(Target*)0) -// -// These functions extract the return type, class (for member -// functions) and arguments of the input signature and stuff them in -// an mpl type sequence (the calling convention is dropped). -// Note that cv-qualification is dropped from -// the "hidden this" argument of member functions; that is a -// necessary sacrifice to ensure that an lvalue from_python converter -// is used. A pointer is not used so that None will be rejected for -// overload resolution. -// -// The second form of get_signature essentially downcasts the "hidden -// this" argument of member functions to Target, because the function -// may actually be a member of a base class which is not wrapped, and -// in that case conversion from python would fail. -// -// @group { - -// 'default' calling convention - -# define BOOST_PYTHON_FN_CC - -# define BOOST_PP_ITERATION_PARAMS_1 \ - (3, (0, BOOST_PYTHON_MAX_ARITY, )) - -# include BOOST_PP_ITERATE() - -# undef BOOST_PYTHON_FN_CC - -// __cdecl calling convention - -# if defined(BOOST_PYTHON_ENABLE_CDECL) - -# define BOOST_PYTHON_FN_CC __cdecl -# define BOOST_PYTHON_FN_CC_IS_CDECL - -# define BOOST_PP_ITERATION_PARAMS_1 \ - (3, (0, BOOST_PYTHON_MAX_ARITY, )) - -# include BOOST_PP_ITERATE() - -# undef BOOST_PYTHON_FN_CC -# undef BOOST_PYTHON_FN_CC_IS_CDECL - -# endif // defined(BOOST_PYTHON_ENABLE_CDECL) - -// __stdcall calling convention - -# if defined(BOOST_PYTHON_ENABLE_STDCALL) - -# define BOOST_PYTHON_FN_CC __stdcall - -# define BOOST_PP_ITERATION_PARAMS_1 \ - (3, (0, BOOST_PYTHON_MAX_ARITY, )) - -# include BOOST_PP_ITERATE() - -# undef BOOST_PYTHON_FN_CC - -# endif // defined(BOOST_PYTHON_ENABLE_STDCALL) - -// __fastcall calling convention - -# if defined(BOOST_PYTHON_ENABLE_FASTCALL) - -# define BOOST_PYTHON_FN_CC __fastcall - -# define BOOST_PP_ITERATION_PARAMS_1 \ - (3, (0, BOOST_PYTHON_MAX_ARITY, )) - -# include BOOST_PP_ITERATE() - -# undef BOOST_PYTHON_FN_CC - -# endif // defined(BOOST_PYTHON_ENABLE_FASTCALL) - -# undef BOOST_PYTHON_LIST_INC - -// } - -}}} // namespace boost::python::detail - - -# endif // SIGNATURE_JDG20020813_HPP - -// For gcc 4.4 compatability, we must include the -// BOOST_PP_ITERATION_DEPTH test inside an #else clause. -#else // BOOST_PP_IS_ITERATING -#if BOOST_PP_ITERATION_DEPTH() == 1 // defined(BOOST_PP_IS_ITERATING) - -# define N BOOST_PP_ITERATION() - - // as 'get_signature(RT(*)(T0...TN), void* = 0)' is the same - // function as 'get_signature(RT(__cdecl *)(T0...TN), void* = 0)', - // we don't define it twice -# if !defined(BOOST_PYTHON_FN_CC_IS_CDECL) - -template < - class RT BOOST_PP_ENUM_TRAILING_PARAMS_Z(1, N, class T)> -inline BOOST_PYTHON_LIST_INC(N)< - RT BOOST_PP_ENUM_TRAILING_PARAMS_Z(1, N, T)> -get_signature(RT(BOOST_PYTHON_FN_CC *)(BOOST_PP_ENUM_PARAMS_Z(1, N, T)), void* = 0) -{ - return BOOST_PYTHON_LIST_INC(N)< - RT BOOST_PP_ENUM_TRAILING_PARAMS_Z(1, N, T) - >(); -} - -# endif // !defined(BOOST_PYTHON_FN_CC_IS_CDECL) - -# undef N - -# define BOOST_PP_ITERATION_PARAMS_2 \ - (3, (0, 3, )) -# include BOOST_PP_ITERATE() - -#else - -# define N BOOST_PP_RELATIVE_ITERATION(1) -# define Q BOOST_PYTHON_CV_QUALIFIER(BOOST_PP_ITERATION()) - -template < - class RT, class ClassT BOOST_PP_ENUM_TRAILING_PARAMS_Z(1, N, class T)> -inline BOOST_PYTHON_LIST_INC(BOOST_PP_INC(N))< - RT, ClassT& BOOST_PP_ENUM_TRAILING_PARAMS_Z(1, N, T)> -get_signature(RT(BOOST_PYTHON_FN_CC ClassT::*)(BOOST_PP_ENUM_PARAMS_Z(1, N, T)) Q) -{ - return BOOST_PYTHON_LIST_INC(BOOST_PP_INC(N))< - RT, ClassT& BOOST_PP_ENUM_TRAILING_PARAMS_Z(1, N, T) - >(); -} - -template < - class Target - , class RT - , class ClassT - BOOST_PP_ENUM_TRAILING_PARAMS_Z(1, N, class T) -> -inline BOOST_PYTHON_LIST_INC(BOOST_PP_INC(N))< - RT - , typename most_derived::type& - BOOST_PP_ENUM_TRAILING_PARAMS_Z(1, N, T) -> -get_signature( - RT(BOOST_PYTHON_FN_CC ClassT::*)(BOOST_PP_ENUM_PARAMS_Z(1, N, T)) Q - , Target* -) -{ - return BOOST_PYTHON_LIST_INC(BOOST_PP_INC(N))< - RT - , BOOST_DEDUCED_TYPENAME most_derived::type& - BOOST_PP_ENUM_TRAILING_PARAMS_Z(1, N, T) - >(); -} - -# undef Q -# undef N - -#endif // BOOST_PP_ITERATION_DEPTH() -#endif // !defined(BOOST_PP_IS_ITERATING) diff --git a/include/boost/python/slice.hpp b/include/boost/python/slice.hpp deleted file mode 100644 index 19f316a1..00000000 --- a/include/boost/python/slice.hpp +++ /dev/null @@ -1,276 +0,0 @@ -#ifndef BOOST_PYTHON_SLICE_JDB20040105_HPP -#define BOOST_PYTHON_SLICE_JDB20040105_HPP - -// Copyright (c) 2004 Jonathan Brandmeyer -// Use, modification and distribution are subject to 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 -#include -#include -#include -#include - -#include - -#include -#include - -namespace boost { namespace python { - -namespace detail -{ - class BOOST_PYTHON_DECL slice_base : public object - { - public: - // Get the Python objects associated with the slice. In principle, these - // may be any arbitrary Python type, but in practice they are usually - // integers. If one or more parameter is ommited in the Python expression - // that created this slice, than that parameter is None here, and compares - // equal to a default-constructed boost::python::object. - // If a user-defined type wishes to support slicing, then support for the - // special meaning associated with negative indices is up to the user. - object start() const; - object stop() const; - object step() const; - - protected: - explicit slice_base(PyObject*, PyObject*, PyObject*); - - BOOST_PYTHON_FORWARD_OBJECT_CONSTRUCTORS(slice_base, object) - }; -} - -class slice : public detail::slice_base -{ - typedef detail::slice_base base; - public: - // Equivalent to slice(::) - slice() : base(0,0,0) {} - - // Each argument must be slice_nil, or implicitly convertable to object. - // They should normally be integers. - template - slice( Integer1 start, Integer2 stop) - : base( object(start).ptr(), object(stop).ptr(), 0 ) - {} - - template - slice( Integer1 start, Integer2 stop, Integer3 stride) - : base( object(start).ptr(), object(stop).ptr(), object(stride).ptr() ) - {} - - // The following algorithm is intended to automate the process of - // determining a slice range when you want to fully support negative - // indices and non-singular step sizes. Its functionallity is simmilar to - // PySlice_GetIndicesEx() in the Python/C API, but tailored for C++ users. - // This template returns a slice::range struct that, when used in the - // following iterative loop, will traverse a slice of the function's - // arguments. - // while (start != end) { - // do_foo(...); - // std::advance( start, step); - // } - // do_foo(...); // repeat exactly once more. - - // Arguments: a [begin, end) pair of STL-conforming random-access iterators. - - // Return: slice::range, where start and stop define a _closed_ interval - // that covers at most [begin, end-1] of the provided arguments, and a step - // that is non-zero. - - // Throws: error_already_set() if any of the indices are neither None nor - // integers, or the slice has a step value of zero. - // std::invalid_argument if the resulting range would be empty. Normally, - // you should catch this exception and return an empty sequence of the - // appropriate type. - - // Performance: constant time for random-access iterators. - - // Rationale: - // closed-interval: If an open interval were used, then for a non-singular - // value for step, the required state for the end iterator could be - // beyond the one-past-the-end postion of the specified range. While - // probably harmless, the behavior of STL-conforming iterators is - // undefined in this case. - // exceptions on zero-length range: It is impossible to define a closed - // interval over an empty range, so some other form of error checking - // would have to be used by the user to prevent undefined behavior. In - // the case where the user fails to catch the exception, it will simply - // be translated to Python by the default exception handling mechanisms. - - template - struct range - { - RandomAccessIterator start; - RandomAccessIterator stop; - typename iterator_difference::type step; - }; - - template - slice::range - get_indices( const RandomAccessIterator& begin, - const RandomAccessIterator& end) const - { - // This is based loosely on PySlice_GetIndicesEx(), but it has been - // carefully crafted to ensure that these iterators never fall out of - // the range of the container. - slice::range ret; - - typedef typename iterator_difference::type difference_type; - difference_type max_dist = boost::detail::distance(begin, end); - - object slice_start = this->start(); - object slice_stop = this->stop(); - object slice_step = this->step(); - - // Extract the step. - if (slice_step == object()) { - ret.step = 1; - } - else { - ret.step = extract( slice_step); - if (ret.step == 0) { - PyErr_SetString( PyExc_IndexError, "step size cannot be zero."); - throw_error_already_set(); - } - } - - // Setup the start iterator. - if (slice_start == object()) { - if (ret.step < 0) { - ret.start = end; - --ret.start; - } - else - ret.start = begin; - } - else { - difference_type i = extract( slice_start); - if (i >= max_dist && ret.step > 0) - throw std::invalid_argument( "Zero-length slice"); - if (i >= 0) { - ret.start = begin; - BOOST_USING_STD_MIN(); - std::advance( ret.start, min BOOST_PREVENT_MACRO_SUBSTITUTION(i, max_dist-1)); - } - else { - if (i < -max_dist && ret.step < 0) - throw std::invalid_argument( "Zero-length slice"); - ret.start = end; - // Advance start (towards begin) not farther than begin. - std::advance( ret.start, (-i < max_dist) ? i : -max_dist ); - } - } - - // Set up the stop iterator. This one is a little trickier since slices - // define a [) range, and we are returning a [] range. - if (slice_stop == object()) { - if (ret.step < 0) { - ret.stop = begin; - } - else { - ret.stop = end; - std::advance( ret.stop, -1); - } - } - else { - difference_type i = extract(slice_stop); - // First, branch on which direction we are going with this. - if (ret.step < 0) { - if (i+1 >= max_dist || i == -1) - throw std::invalid_argument( "Zero-length slice"); - - if (i >= 0) { - ret.stop = begin; - std::advance( ret.stop, i+1); - } - else { // i is negative, but more negative than -1. - ret.stop = end; - std::advance( ret.stop, (-i < max_dist) ? i : -max_dist); - } - } - else { // stepping forward - if (i == 0 || -i >= max_dist) - throw std::invalid_argument( "Zero-length slice"); - - if (i > 0) { - ret.stop = begin; - std::advance( ret.stop, (std::min)( i-1, max_dist-1)); - } - else { // i is negative, but not more negative than -max_dist - ret.stop = end; - std::advance( ret.stop, i-1); - } - } - } - - // Now the fun part, handling the possibilites surrounding step. - // At this point, step has been initialized, ret.stop, and ret.step - // represent the widest possible range that could be traveled - // (inclusive), and final_dist is the maximum distance covered by the - // slice. - typename iterator_difference::type final_dist = - boost::detail::distance( ret.start, ret.stop); - - // First case, if both ret.start and ret.stop are equal, then step - // is irrelevant and we can return here. - if (final_dist == 0) - return ret; - - // Second, if there is a sign mismatch, than the resulting range and - // step size conflict: std::advance( ret.start, ret.step) goes away from - // ret.stop. - if ((final_dist > 0) != (ret.step > 0)) - throw std::invalid_argument( "Zero-length slice."); - - // Finally, if the last step puts us past the end, we move ret.stop - // towards ret.start in the amount of the remainder. - // I don't remember all of the oolies surrounding negative modulii, - // so I am handling each of these cases separately. - if (final_dist < 0) { - difference_type remainder = -final_dist % -ret.step; - std::advance( ret.stop, remainder); - } - else { - difference_type remainder = final_dist % ret.step; - std::advance( ret.stop, -remainder); - } - - return ret; - } - - // Incorrect spelling. DO NOT USE. Only here for backward compatibility. - // Corrected 2011-06-14. - template - slice::range - get_indicies( const RandomAccessIterator& begin, - const RandomAccessIterator& end) const - { - return get_indices(begin, end); - } - - public: - // This declaration, in conjunction with the specialization of - // object_manager_traits<> below, allows C++ functions accepting slice - // arguments to be called from from Python. These constructors should never - // be used in client code. - BOOST_PYTHON_FORWARD_OBJECT_CONSTRUCTORS(slice, detail::slice_base) -}; - - -namespace converter { - -template<> -struct object_manager_traits - : pytype_object_manager_traits<&PySlice_Type, slice> -{ -}; - -} // !namesapce converter - -} } // !namespace ::boost::python - - -#endif // !defined BOOST_PYTHON_SLICE_JDB20040105_HPP diff --git a/include/boost/python/slice_nil.hpp b/include/boost/python/slice_nil.hpp deleted file mode 100644 index e911f068..00000000 --- a/include/boost/python/slice_nil.hpp +++ /dev/null @@ -1,44 +0,0 @@ -// 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) -#ifndef SLICE_NIL_DWA2002620_HPP -# define SLICE_NIL_DWA2002620_HPP - -# include -# include - -namespace boost { namespace python { namespace api { - -class slice_nil : public object -{ - public: - slice_nil() : object() {} -}; - -# ifndef _ // Watch out for GNU gettext users, who #define _(x) -static const slice_nil _ = slice_nil(); -# endif - -template -struct slice_bound -{ - typedef object type; -}; - -template <> -struct slice_bound -{ - typedef slice_nil type; -}; - -} - -using api::slice_nil; -# ifndef _ // Watch out for GNU gettext users, who #define _(x) -using api::_; -# endif - -}} // namespace boost::python - -#endif // SLICE_NIL_DWA2002620_HPP diff --git a/include/boost/python/ssize_t.hpp b/include/boost/python/ssize_t.hpp deleted file mode 100644 index e8a2d92f..00000000 --- a/include/boost/python/ssize_t.hpp +++ /dev/null @@ -1,29 +0,0 @@ -// Copyright Ralf W. Grosse-Kunstleve & David Abrahams 2006. -// 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 BOOST_PYTHON_SSIZE_T_RWGK20060924_HPP -# define BOOST_PYTHON_SSIZE_T_RWGK20060924_HPP - -# include - -namespace boost { namespace python { - -#if PY_VERSION_HEX >= 0x02050000 - -typedef Py_ssize_t ssize_t; -ssize_t const ssize_t_max = PY_SSIZE_T_MAX; -ssize_t const ssize_t_min = PY_SSIZE_T_MIN; - -#else - -typedef int ssize_t; -ssize_t const ssize_t_max = INT_MAX; -ssize_t const ssize_t_min = INT_MIN; - -#endif - -}} // namespace boost::python - -#endif // BOOST_PYTHON_SSIZE_T_RWGK20060924_HPP diff --git a/include/boost/python/stl_iterator.hpp b/include/boost/python/stl_iterator.hpp deleted file mode 100755 index 83895487..00000000 --- a/include/boost/python/stl_iterator.hpp +++ /dev/null @@ -1,61 +0,0 @@ -// Copyright Eric Niebler 2005. -// 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 STL_ITERATOR_EAN20051028_HPP -# define STL_ITERATOR_EAN20051028_HPP - -# include - -# include - -# include - -namespace boost { namespace python -{ - -// An STL input iterator over a python sequence -template -struct stl_input_iterator - : boost::iterator_facade< - stl_input_iterator - , ValueT - , std::input_iterator_tag - , ValueT - > -{ - stl_input_iterator() - : impl_() - { - } - - // ob is the python sequence - stl_input_iterator(boost::python::object const &ob) - : impl_(ob) - { - } - -private: - friend class boost::iterator_core_access; - - void increment() - { - this->impl_.increment(); - } - - ValueT dereference() const - { - return extract(this->impl_.current().get())(); - } - - bool equal(stl_input_iterator const &that) const - { - return this->impl_.equal(that.impl_); - } - - objects::stl_input_iterator_impl impl_; -}; - -}} // namespace boost::python - -#endif // STL_ITERATOR_EAN20051028_HPP diff --git a/include/boost/python/str.hpp b/include/boost/python/str.hpp deleted file mode 100644 index 426a3a25..00000000 --- a/include/boost/python/str.hpp +++ /dev/null @@ -1,422 +0,0 @@ -// 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) -#ifndef STR_20020703_HPP -#define STR_20020703_HPP - -# include - -#include -#include -#include - -// disable defines in provided by some system libraries -#undef isspace -#undef islower -#undef isalpha -#undef isdigit -#undef isalnum -#undef isupper - -namespace boost { namespace python { - -class str; - -namespace detail -{ - struct BOOST_PYTHON_DECL str_base : object - { - str capitalize() const; - - str center(object_cref width) const; - - long count(object_cref sub) const; - - long count(object_cref sub, object_cref start) const; - - long count(object_cref sub, object_cref start, object_cref end) const; - -#if PY_VERSION_HEX < 0x03000000 - object decode() const; - object decode(object_cref encoding) const; - - object decode(object_cref encoding, object_cref errors) const; -#endif - - object encode() const; - object encode(object_cref encoding) const; - object encode(object_cref encoding, object_cref errors) const; - - bool endswith(object_cref suffix) const; - - bool endswith(object_cref suffix, object_cref start) const; - bool endswith(object_cref suffix, object_cref start, object_cref end) const; - - str expandtabs() const; - str expandtabs(object_cref tabsize) const; - - long find(object_cref sub) const; - long find(object_cref sub, object_cref start) const; - - long find(object_cref sub, object_cref start, object_cref end) const; - - long index(object_cref sub) const; - - long index(object_cref sub, object_cref start) const; - long index(object_cref sub, object_cref start, object_cref end) const; - - bool isalnum() const; - bool isalpha() const; - bool isdigit() const; - bool islower() const; - bool isspace() const; - bool istitle() const; - bool isupper() const; - - str join(object_cref sequence) const; - - str ljust(object_cref width) const; - str lower() const; - str lstrip() const; - - str replace(object_cref old, object_cref new_) const; - str replace(object_cref old, object_cref new_, object_cref maxsplit) const; - long rfind(object_cref sub) const; - - long rfind(object_cref sub, object_cref start) const; - - long rfind(object_cref sub, object_cref start, object_cref end) const; - long rindex(object_cref sub) const; - long rindex(object_cref sub, object_cref start) const; - - - long rindex(object_cref sub, object_cref start, object_cref end) const; - - str rjust(object_cref width) const; - - str rstrip() const; - - list split() const; - list split(object_cref sep) const; - - list split(object_cref sep, object_cref maxsplit) const; - - - list splitlines() const; - list splitlines(object_cref keepends) const; - - bool startswith(object_cref prefix) const; - - - bool startswith(object_cref prefix, object_cref start) const; - bool startswith(object_cref prefix, object_cref start, object_cref end) const; - - str strip() const; - str swapcase() const; - str title() const; - - str translate(object_cref table) const; - - str translate(object_cref table, object_cref deletechars) const; - - - str upper() const; - - protected: - str_base(); // new str - - str_base(const char* s); // new str - - str_base(char const* start, char const* finish); - - str_base(char const* start, std::size_t length); - - explicit str_base(object_cref other); - - BOOST_PYTHON_FORWARD_OBJECT_CONSTRUCTORS(str_base, object) - private: - static new_reference call(object const&); - }; -} - - -class str : public detail::str_base -{ - typedef detail::str_base base; - public: - str() {} // new str - - str(const char* s) : base(s) {} // new str - - str(char const* start, char const* finish) // new str - : base(start, finish) - {} - - str(char const* start, std::size_t length) // new str - : base(start, length) - {} - - template - explicit str(T const& other) - : base(object(other)) - { - } - - template - str center(T const& width) const - { - return base::center(object(width)); - } - - template - long count(T const& sub) const - { - return base::count(object(sub)); - } - - template - long count(T1 const& sub,T2 const& start) const - { - return base::count(object(sub), object(start)); - } - - template - long count(T1 const& sub,T2 const& start, T3 const& end) const - { - return base::count(object(sub), object(start)); - } - -#if PY_VERSION_HEX < 0x03000000 - object decode() const { return base::decode(); } - - template - object decode(T const& encoding) const - { - return base::decode(object(encoding)); - } - - template - object decode(T1 const& encoding, T2 const& errors) const - { - return base::decode(object(encoding),object(errors)); - } -#endif - - object encode() const { return base::encode(); } - - template - object encode(T const& encoding) const - { - return base::encode(object(encoding)); - } - - template - object encode(T1 const& encoding, T2 const& errors) const - { - return base::encode(object(encoding),object(errors)); - } - - template - bool endswith(T const& suffix) const - { - return base::endswith(object(suffix)); - } - - template - bool endswith(T1 const& suffix, T2 const& start) const - { - return base::endswith(object(suffix), object(start)); - } - - template - bool endswith(T1 const& suffix, T2 const& start, T3 const& end) const - { - return base::endswith(object(suffix), object(start), object(end)); - } - - str expandtabs() const { return base::expandtabs(); } - - template - str expandtabs(T const& tabsize) const - { - return base::expandtabs(object(tabsize)); - } - - template - long find(T const& sub) const - { - return base::find(object(sub)); - } - - template - long find(T1 const& sub, T2 const& start) const - { - return base::find(object(sub), object(start)); - } - - template - long find(T1 const& sub, T2 const& start, T3 const& end) const - { - return base::find(object(sub), object(start), object(end)); - } - - template - long index(T const& sub) const - { - return base::index(object(sub)); - } - - template - long index(T1 const& sub, T2 const& start) const - { - return base::index(object(sub), object(start)); - } - - template - long index(T1 const& sub, T2 const& start, T3 const& end) const - { - return base::index(object(sub), object(start), object(end)); - } - - template - str join(T const& sequence) const - { - return base::join(object(sequence)); - } - - template - str ljust(T const& width) const - { - return base::ljust(object(width)); - } - - template - str replace(T1 const& old, T2 const& new_) const - { - return base::replace(object(old),object(new_)); - } - - template - str replace(T1 const& old, T2 const& new_, T3 const& maxsplit) const - { - return base::replace(object(old),object(new_), object(maxsplit)); - } - - template - long rfind(T const& sub) const - { - return base::rfind(object(sub)); - } - - template - long rfind(T1 const& sub, T2 const& start) const - { - return base::rfind(object(sub), object(start)); - } - - template - long rfind(T1 const& sub, T2 const& start, T3 const& end) const - { - return base::rfind(object(sub), object(start), object(end)); - } - - template - long rindex(T const& sub) const - { - return base::rindex(object(sub)); - } - - template - long rindex(T1 const& sub, T2 const& start) const - { - return base::rindex(object(sub), object(start)); - } - - template - long rindex(T1 const& sub, T2 const& start, T3 const& end) const - { - return base::rindex(object(sub), object(start), object(end)); - } - - template - str rjust(T const& width) const - { - return base::rjust(object(width)); - } - - list split() const { return base::split(); } - - template - list split(T const& sep) const - { - return base::split(object(sep)); - } - - template - list split(T1 const& sep, T2 const& maxsplit) const - { - return base::split(object(sep), object(maxsplit)); - } - - list splitlines() const { return base::splitlines(); } - - template - list splitlines(T const& keepends) const - { - return base::splitlines(object(keepends)); - } - - template - bool startswith(T const& prefix) const - { - return base::startswith(object(prefix)); - } - - template - bool startswith(T1 const& prefix, T2 const& start) const - { - return base::startswith(object(prefix), object(start)); - } - - template - bool startswith(T1 const& prefix, T2 const& start, T3 const& end) const - { - return base::startswith(object(prefix), object(start), object(end)); - } - - template - str translate(T const& table) const - { - return base::translate(object(table)); - } - - template - str translate(T1 const& table, T2 const& deletechars) const - { - return base::translate(object(table), object(deletechars)); - } - - public: // implementation detail -- for internal use only - BOOST_PYTHON_FORWARD_OBJECT_CONSTRUCTORS(str, base) -}; - -// -// Converter Specializations -// -namespace converter -{ - template <> - struct object_manager_traits -#if PY_VERSION_HEX >= 0x03000000 - : pytype_object_manager_traits<&PyUnicode_Type,str> -#else - : pytype_object_manager_traits<&PyString_Type,str> -#endif - { - }; -} - -}} // namespace boost::python - -#endif // STR_20020703_HPP diff --git a/include/boost/python/suite/indexing/container_utils.hpp b/include/boost/python/suite/indexing/container_utils.hpp deleted file mode 100644 index 72710bb8..00000000 --- a/include/boost/python/suite/indexing/container_utils.hpp +++ /dev/null @@ -1,57 +0,0 @@ - -// (C) Copyright Joel de Guzman 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 PY_CONTAINER_UTILS_JDG20038_HPP -# define PY_CONTAINER_UTILS_JDG20038_HPP - -# include -# include -# include -# include -# include -# include - -namespace boost { namespace python { namespace container_utils { - - template - void - extend_container(Container& container, object l) - { - typedef typename Container::value_type data_type; - - // l must be iterable - BOOST_FOREACH(object elem, - std::make_pair( - boost::python::stl_input_iterator(l), - boost::python::stl_input_iterator() - )) - { - extract x(elem); - // try if elem is an exact data_type type - if (x.check()) - { - container.push_back(x()); - } - else - { - // try to convert elem to data_type type - extract x(elem); - if (x.check()) - { - container.push_back(x()); - } - else - { - PyErr_SetString(PyExc_TypeError, "Incompatible Data Type"); - throw_error_already_set(); - } - } - } - } - -}}} // namespace boost::python::container_utils - -#endif diff --git a/include/boost/python/suite/indexing/detail/indexing_suite_detail.hpp b/include/boost/python/suite/indexing/detail/indexing_suite_detail.hpp deleted file mode 100644 index 70df8a72..00000000 --- a/include/boost/python/suite/indexing/detail/indexing_suite_detail.hpp +++ /dev/null @@ -1,759 +0,0 @@ -// (C) Copyright Joel de Guzman 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 INDEXING_SUITE_DETAIL_JDG20036_HPP -# define INDEXING_SUITE_DETAIL_JDG20036_HPP - -# include -# include -# include -# include -# include -# include -# include -# include -#include - -namespace boost { namespace python { namespace detail { - -#if defined(NDEBUG) -#define BOOST_PYTHON_INDEXING_CHECK_INVARIANT -#else -#define BOOST_PYTHON_INDEXING_CHECK_INVARIANT check_invariant() -#endif - - template - struct compare_proxy_index - { - // This functor compares a proxy and an index. - // This is used by proxy_group::first_proxy to - // get first proxy with index i. - - template - bool operator()(PyObject* prox, Index i) const - { - typedef typename Proxy::policies_type policies_type; - Proxy& proxy = extract(prox)(); - return policies_type:: - compare_index(proxy.get_container(), proxy.get_index(), i); - } - }; - - // The proxy_group class holds a vector of container element - // proxies. First, what is a container element proxy? A container - // element proxy acts like a smart pointer holding a reference to - // a container and an index (see container_element, for details). - // - // The proxies are held in a vector always sorted by its index. - // Various functions manage the addition, removal and searching - // of proxies from the vector. - // - template - class proxy_group - { - public: - - typedef typename std::vector::const_iterator const_iterator; - typedef typename std::vector::iterator iterator; - typedef typename Proxy::index_type index_type; - typedef typename Proxy::policies_type policies_type; - - iterator - first_proxy(index_type i) - { - // Return the first proxy with index <= i - return boost::detail::lower_bound( - proxies.begin(), proxies.end(), - i, compare_proxy_index()); - } - - void - remove(Proxy& proxy) - { - // Remove a proxy - for (iterator iter = first_proxy(proxy.get_index()); - iter != proxies.end(); ++iter) - { - if (&extract(*iter)() == &proxy) - { - proxies.erase(iter); - break; - } - } - BOOST_PYTHON_INDEXING_CHECK_INVARIANT; - } - - void - add(PyObject* prox) - { - BOOST_PYTHON_INDEXING_CHECK_INVARIANT; - // Add a proxy - proxies.insert( - first_proxy(extract(prox)().get_index()), prox); - BOOST_PYTHON_INDEXING_CHECK_INVARIANT; - } - - void - erase(index_type i, mpl::false_) - { - BOOST_PYTHON_INDEXING_CHECK_INVARIANT; - // Erase the proxy with index i - replace(i, i+1, 0); - BOOST_PYTHON_INDEXING_CHECK_INVARIANT; - } - - void - erase(index_type i, mpl::true_) - { - BOOST_PYTHON_INDEXING_CHECK_INVARIANT; - // Erase the proxy with index i - - iterator iter = first_proxy(i); - extract p(*iter); - - if (iter != proxies.end() && p().get_index() == i) - { - extract p(*iter); - p().detach(); - proxies.erase(iter); - } - BOOST_PYTHON_INDEXING_CHECK_INVARIANT; - } - - void - erase(index_type from, index_type to) - { - // note: this cannot be called when container is not sliceable - - BOOST_PYTHON_INDEXING_CHECK_INVARIANT; - // Erase all proxies with indexes from..to - replace(from, to, 0); - BOOST_PYTHON_INDEXING_CHECK_INVARIANT; - } - - void - replace( - index_type from, - index_type to, - typename std::vector::size_type len) - { - // note: this cannot be called when container is not sliceable - - BOOST_PYTHON_INDEXING_CHECK_INVARIANT; - // Erase all proxies with indexes from..to. - // Adjust the displaced indexes such that the - // final effect is that we have inserted *len* - // number of proxies in the vacated region. This - // procedure involves adjusting the indexes of - // the proxies. - - iterator left = first_proxy(from); - iterator right = proxies.end(); // we'll adjust this later - - for (iterator iter = left; iter != right; ++iter) - { - if (extract(*iter)().get_index() > to) - { - right = iter; // adjust right - break; - } - extract p(*iter); - p().detach(); - } - - typename std::vector::size_type - offset = left-proxies.begin(); - proxies.erase(left, right); - right = proxies.begin()+offset; - - while (right != proxies.end()) - { - typedef typename Proxy::container_type::difference_type difference_type; - extract p(*right); - p().set_index( - extract(*right)().get_index() - - (difference_type(to) - from - len) - ); - - ++right; - } - BOOST_PYTHON_INDEXING_CHECK_INVARIANT; - } - - PyObject* - find(index_type i) - { - BOOST_PYTHON_INDEXING_CHECK_INVARIANT; - // Find the proxy with *exact* index i. - // Return 0 (null) if no proxy with the - // given index is found. - iterator iter = first_proxy(i); - if (iter != proxies.end() - && extract(*iter)().get_index() == i) - { - BOOST_PYTHON_INDEXING_CHECK_INVARIANT; - return *iter; - } - BOOST_PYTHON_INDEXING_CHECK_INVARIANT; - return 0; - } - - typename std::vector::size_type - size() const - { - BOOST_PYTHON_INDEXING_CHECK_INVARIANT; - // How many proxies are there so far? - return proxies.size(); - } - - private: - -#if !defined(NDEBUG) - void - check_invariant() const - { - for (const_iterator i = proxies.begin(); i != proxies.end(); ++i) - { - if ((*i)->ob_refcnt <= 0) - { - PyErr_SetString(PyExc_RuntimeError, - "Invariant: Proxy vector in an inconsistent state"); - throw_error_already_set(); - } - - if (i+1 != proxies.end()) - { - if (extract(*(i+1))().get_index() == - extract(*(i))().get_index()) - { - PyErr_SetString(PyExc_RuntimeError, - "Invariant: Proxy vector in an inconsistent state (duplicate proxy)"); - throw_error_already_set(); - } - } - } - } -#endif - - std::vector proxies; - }; - - // proxy_links holds a map of Container pointers (keys) - // with proxy_group(s) (data). Various functions manage - // the addition, removal and searching of proxies from - // the map. - // - template - class proxy_links - { - public: - - typedef std::map > links_t; - typedef typename Proxy::index_type index_type; - - void - remove(Proxy& proxy) - { - // Remove a proxy. - typename links_t::iterator r = links.find(&proxy.get_container()); - if (r != links.end()) - { - r->second.remove(proxy); - if (r->second.size() == 0) - links.erase(r); - } - } - - void - add(PyObject* prox, Container& container) - { - // Add a proxy - links[&container].add(prox); - } - - template - void erase(Container& container, index_type i, NoSlice no_slice) - { - // Erase the proxy with index i - typename links_t::iterator r = links.find(&container); - if (r != links.end()) - { - r->second.erase(i, no_slice); - if (r->second.size() == 0) - links.erase(r); - } - } - - void - erase(Container& container, index_type from, index_type to) - { - // Erase all proxies with indexes from..to - typename links_t::iterator r = links.find(&container); - if (r != links.end()) - { - r->second.erase(from, to); - if (r->second.size() == 0) - links.erase(r); - } - } - - void - replace( - Container& container, - index_type from, index_type to, index_type len) - { - // Erase all proxies with indexes from..to. - // Adjust the displaced indexes such that the - // final effect is that we have inserted *len* - // number of proxies in the vacated region. This - // procedure involves adjusting the indexes of - // the proxies. - - typename links_t::iterator r = links.find(&container); - if (r != links.end()) - { - r->second.replace(from, to, len); - if (r->second.size() == 0) - links.erase(r); - } - } - - PyObject* - find(Container& container, index_type i) - { - // Find the proxy with *exact* index i. - // Return 0 (null) if no proxy with the given - // index is found. - typename links_t::iterator r = links.find(&container); - if (r != links.end()) - return r->second.find(i); - return 0; - } - - private: - - links_t links; - }; - - // container_element is our container proxy class. - // This class acts like a smart pointer to a container - // element. The class holds an index and a reference to - // a container. Dereferencing the smart pointer will - // retrieve the nth (index) element from the container. - // - // A container_element can also be detached from the - // container. In such a detached state, the container_element - // holds a copy of the nth (index) element, which it - // returns when dereferenced. - // - template - class container_element - { - public: - - typedef Index index_type; - typedef Container container_type; - typedef typename Policies::data_type element_type; - typedef Policies policies_type; - typedef container_element self_t; - typedef proxy_group links_type; - - container_element(object container, Index index) - : ptr() - , container(container) - , index(index) - { - } - - container_element(container_element const& ce) - : ptr(ce.ptr.get() == 0 ? 0 : new element_type(*ce.ptr.get())) - , container(ce.container) - , index(ce.index) - { - } - - ~container_element() - { - if (!is_detached()) - get_links().remove(*this); - } - - element_type& operator*() const - { - if (is_detached()) - return *get_pointer(ptr); - return Policies::get_item(get_container(), index); - } - - element_type* get() const - { - if (is_detached()) - return get_pointer(ptr); - return &Policies::get_item(get_container(), index); - } - - void - detach() - { - if (!is_detached()) - { - ptr.reset( - new element_type( - Policies::get_item(get_container(), index))); - container = object(); // free container. reset it to None - } - } - - bool - is_detached() const - { - return get_pointer(ptr) != 0; - } - - Container& - get_container() const - { - return extract(container)(); - } - - Index - get_index() const - { - return index; - } - - void - set_index(Index i) - { - index = i; - } - - static proxy_links& - get_links() - { - // All container_element(s) maintain links to - // its container in a global map (see proxy_links). - // This global "links" map is a singleton. - - static proxy_links links; - return links; // singleton - } - - private: - - container_element& operator=(container_element const& ce); - - scoped_ptr ptr; - object container; - Index index; - }; - - template < - class Container - , class DerivedPolicies - , class ContainerElement - , class Index - > - struct no_proxy_helper - { - static void - register_container_element() - { - } - - template - static object - base_get_item_helper(DataType const& p, mpl::true_) - { - return object(ptr(p)); - } - - template - static object - base_get_item_helper(DataType const& x, mpl::false_) - { - return object(x); - } - - static object - base_get_item_(back_reference const& container, PyObject* i) - { - return base_get_item_helper( - DerivedPolicies::get_item( - container.get(), DerivedPolicies:: - convert_index(container.get(), i)) - , is_pointer() - ); - } - - static void - base_replace_indexes( - Container& /*container*/, Index /*from*/, - Index /*to*/, Index /*n*/) - { - } - - template - static void - base_erase_index( - Container& /*container*/, Index /*i*/, NoSlice /*no_slice*/) - { - } - - static void - base_erase_indexes(Container& /*container*/, Index /*from*/, Index /*to*/) - { - } - }; - - template < - class Container - , class DerivedPolicies - , class ContainerElement - , class Index - > - struct proxy_helper - { - static void - register_container_element() - { - register_ptr_to_python(); - } - - static object - base_get_item_(back_reference const& container, PyObject* i) - { - // Proxy - Index idx = DerivedPolicies::convert_index(container.get(), i); - - if (PyObject* shared = - ContainerElement::get_links().find(container.get(), idx)) - { - handle<> h(python::borrowed(shared)); - return object(h); - } - else - { - object prox(ContainerElement(container.source(), idx)); - ContainerElement:: - get_links().add(prox.ptr(), container.get()); - return prox; - } - } - - static void - base_replace_indexes( - Container& container, Index from, - Index to, Index n) - { - ContainerElement::get_links().replace(container, from, to, n); - } - - template - static void - base_erase_index( - Container& container, Index i, NoSlice no_slice) - { - ContainerElement::get_links().erase(container, i, no_slice); - } - - static void - base_erase_indexes( - Container& container, Index from, Index to) - { - ContainerElement::get_links().erase(container, from, to); - } - }; - - template < - class Container - , class DerivedPolicies - , class ProxyHandler - , class Data - , class Index - > - struct slice_helper - { - static object - base_get_slice(Container& container, PySliceObject* slice) - { - Index from, to; - base_get_slice_data(container, slice, from, to); - return DerivedPolicies::get_slice(container, from, to); - } - - static void - base_get_slice_data( - Container& container, PySliceObject* slice, Index& from_, Index& to_) - { - if (Py_None != slice->step) { - PyErr_SetString( PyExc_IndexError, "slice step size not supported."); - throw_error_already_set(); - } - - Index min_index = DerivedPolicies::get_min_index(container); - Index max_index = DerivedPolicies::get_max_index(container); - - if (Py_None == slice->start) { - from_ = min_index; - } - else { - long from = extract( slice->start); - if (from < 0) // Negative slice index - from += max_index; - if (from < 0) // Clip lower bounds to zero - from = 0; - from_ = boost::numeric_cast(from); - if (from_ > max_index) // Clip upper bounds to max_index. - from_ = max_index; - } - - if (Py_None == slice->stop) { - to_ = max_index; - } - else { - long to = extract( slice->stop); - if (to < 0) - to += max_index; - if (to < 0) - to = 0; - to_ = boost::numeric_cast(to); - if (to_ > max_index) - to_ = max_index; - } - } - - static void - base_set_slice(Container& container, PySliceObject* slice, PyObject* v) - { - Index from, to; - base_get_slice_data(container, slice, from, to); - - extract elem(v); - // try if elem is an exact Data - if (elem.check()) - { - ProxyHandler::base_replace_indexes(container, from, to, 1); - DerivedPolicies::set_slice(container, from, to, elem()); - } - else - { - // try to convert elem to Data - extract elem(v); - if (elem.check()) - { - ProxyHandler::base_replace_indexes(container, from, to, 1); - DerivedPolicies::set_slice(container, from, to, elem()); - } - else - { - // Otherwise, it must be a list or some container - handle<> l_(python::borrowed(v)); - object l(l_); - - std::vector temp; - for (int i = 0; i < l.attr("__len__")(); i++) - { - object elem(l[i]); - extract x(elem); - // try if elem is an exact Data type - if (x.check()) - { - temp.push_back(x()); - } - else - { - // try to convert elem to Data type - extract x(elem); - if (x.check()) - { - temp.push_back(x()); - } - else - { - PyErr_SetString(PyExc_TypeError, - "Invalid sequence element"); - throw_error_already_set(); - } - } - } - - ProxyHandler::base_replace_indexes(container, from, to, - temp.end()-temp.begin()); - DerivedPolicies::set_slice(container, from, to, - temp.begin(), temp.end()); - } - } - } - - static void - base_delete_slice(Container& container, PySliceObject* slice) - { - Index from, to; - base_get_slice_data(container, slice, from, to); - ProxyHandler::base_erase_indexes(container, from, to); - DerivedPolicies::delete_slice(container, from, to); - } - }; - - template < - class Container - , class DerivedPolicies - , class ProxyHandler - , class Data - , class Index - > - struct no_slice_helper - { - static void - slicing_not_suported() - { - PyErr_SetString(PyExc_RuntimeError, "Slicing not supported"); - throw_error_already_set(); - } - - static object - base_get_slice(Container& /*container*/, PySliceObject* /*slice*/) - { - slicing_not_suported(); - return object(); - } - - static void - base_set_slice(Container& /*container*/, PySliceObject* /*slice*/, PyObject* /*v*/) - { - slicing_not_suported(); - } - - static void - base_delete_slice(Container& /*container*/, PySliceObject* /*slice*/) - { - slicing_not_suported(); - } - }; - -#ifdef BOOST_NO_ARGUMENT_DEPENDENT_LOOKUP -}} // namespace python::detail -#endif - - template - inline typename Policies::data_type* - get_pointer( - python::detail::container_element const& p) - { - // Get the pointer of a container_element smart pointer - return p.get(); - } - -#ifndef BOOST_NO_ARGUMENT_DEPENDENT_LOOKUP - // Don't hide these other get_pointer overloads - using boost::python::get_pointer; - using boost::get_pointer; -}} // namespace python::detail -#endif - -} // namespace boost - -#endif // INDEXING_SUITE_DETAIL_JDG20036_HPP diff --git a/include/boost/python/suite/indexing/indexing_suite.hpp b/include/boost/python/suite/indexing/indexing_suite.hpp deleted file mode 100644 index 40301fdf..00000000 --- a/include/boost/python/suite/indexing/indexing_suite.hpp +++ /dev/null @@ -1,295 +0,0 @@ -// (C) Copyright Joel de Guzman 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 INDEXING_SUITE_JDG20036_HPP -# define INDEXING_SUITE_JDG20036_HPP - -# include -# include -# include -# include -# include -# include -# include -# include -# include - -namespace boost { namespace python { - - // indexing_suite class. This class is the facade class for - // the management of C++ containers intended to be integrated - // to Python. The objective is make a C++ container look and - // feel and behave exactly as we'd expect a Python container. - // By default indexed elements are returned by proxy. This can be - // disabled by supplying *true* in the NoProxy template parameter. - // - // Derived classes provide the hooks needed by the indexing_suite - // to do its job: - // - // static data_type& - // get_item(Container& container, index_type i); - // - // static object - // get_slice(Container& container, index_type from, index_type to); - // - // static void - // set_item(Container& container, index_type i, data_type const& v); - // - // static void - // set_slice( - // Container& container, index_type from, - // index_type to, data_type const& v - // ); - // - // template - // static void - // set_slice(Container& container, index_type from, - // index_type to, Iter first, Iter last - // ); - // - // static void - // delete_item(Container& container, index_type i); - // - // static void - // delete_slice(Container& container, index_type from, index_type to); - // - // static size_t - // size(Container& container); - // - // template - // static bool - // contains(Container& container, T const& val); - // - // static index_type - // convert_index(Container& container, PyObject* i); - // - // static index_type - // adjust_index(index_type current, index_type from, - // index_type to, size_type len - // ); - // - // Most of these policies are self explanatory. convert_index and - // adjust_index, however, deserves some explanation. - // - // convert_index converts an Python index into a C++ index that the - // container can handle. For instance, negative indexes in Python, by - // convention, indexes from the right (e.g. C[-1] indexes the rightmost - // element in C). convert_index should handle the necessary conversion - // for the C++ container (e.g. convert -1 to C.size()-1). convert_index - // should also be able to convert the type of the index (A dynamic Python - // type) to the actual type that the C++ container expects. - // - // When a container expands or contracts, held indexes to its elements - // must be adjusted to follow the movement of data. For instance, if - // we erase 3 elements, starting from index 0 from a 5 element vector, - // what used to be at index 4 will now be at index 1: - // - // [a][b][c][d][e] ---> [d][e] - // ^ ^ - // 4 1 - // - // adjust_index takes care of the adjustment. Given a current index, - // the function should return the adjusted index when data in the - // container at index from..to is replaced by *len* elements. - // - - template < - class Container - , class DerivedPolicies - , bool NoProxy = false - , bool NoSlice = false - , class Data = typename Container::value_type - , class Index = typename Container::size_type - , class Key = typename Container::value_type - > - class indexing_suite - : public def_visitor< - indexing_suite< - Container - , DerivedPolicies - , NoProxy - , NoSlice - , Data - , Index - , Key - > > - { - private: - - typedef mpl::or_< - mpl::bool_ - , mpl::not_ > - , typename mpl::or_< - is_same - , is_same > - , is_same > - , is_same > >::type> - no_proxy; - - typedef detail::container_element - container_element_t; - - typedef return_internal_reference<> return_policy; - - typedef typename mpl::if_< - no_proxy - , iterator - , iterator >::type - def_iterator; - - typedef typename mpl::if_< - no_proxy - , detail::no_proxy_helper< - Container - , DerivedPolicies - , container_element_t - , Index> - , detail::proxy_helper< - Container - , DerivedPolicies - , container_element_t - , Index> >::type - proxy_handler; - - typedef typename mpl::if_< - mpl::bool_ - , detail::no_slice_helper< - Container - , DerivedPolicies - , proxy_handler - , Data - , Index> - , detail::slice_helper< - Container - , DerivedPolicies - , proxy_handler - , Data - , Index> >::type - slice_handler; - - public: - - template - void visit(Class& cl) const - { - // Hook into the class_ generic visitation .def function - proxy_handler::register_container_element(); - - cl - .def("__len__", base_size) - .def("__setitem__", &base_set_item) - .def("__delitem__", &base_delete_item) - .def("__getitem__", &base_get_item) - .def("__contains__", &base_contains) - .def("__iter__", def_iterator()) - ; - - DerivedPolicies::extension_def(cl); - } - - template - static void - extension_def(Class& cl) - { - // default. - // no more extensions - } - - private: - - static object - base_get_item(back_reference container, PyObject* i) - { - if (PySlice_Check(i)) - return slice_handler::base_get_slice( - container.get(), static_cast(static_cast(i))); - - return proxy_handler::base_get_item_(container, i); - } - - static void - base_set_item(Container& container, PyObject* i, PyObject* v) - { - if (PySlice_Check(i)) - { - slice_handler::base_set_slice(container, - static_cast(static_cast(i)), v); - } - else - { - extract elem(v); - // try if elem is an exact Data - if (elem.check()) - { - DerivedPolicies:: - set_item(container, - DerivedPolicies:: - convert_index(container, i), elem()); - } - else - { - // try to convert elem to Data - extract elem(v); - if (elem.check()) - { - DerivedPolicies:: - set_item(container, - DerivedPolicies:: - convert_index(container, i), elem()); - } - else - { - PyErr_SetString(PyExc_TypeError, "Invalid assignment"); - throw_error_already_set(); - } - } - } - } - - static void - base_delete_item(Container& container, PyObject* i) - { - if (PySlice_Check(i)) - { - slice_handler::base_delete_slice( - container, static_cast(static_cast(i))); - return; - } - - Index index = DerivedPolicies::convert_index(container, i); - proxy_handler::base_erase_index(container, index, mpl::bool_()); - DerivedPolicies::delete_item(container, index); - } - - static size_t - base_size(Container& container) - { - return DerivedPolicies::size(container); - } - - static bool - base_contains(Container& container, PyObject* key) - { - extract x(key); - // try if key is an exact Key type - if (x.check()) - { - return DerivedPolicies::contains(container, x()); - } - else - { - // try to convert key to Key type - extract x(key); - if (x.check()) - return DerivedPolicies::contains(container, x()); - else - return false; - } - } - }; - -}} // namespace boost::python - -#endif // INDEXING_SUITE_JDG20036_HPP diff --git a/include/boost/python/suite/indexing/map_indexing_suite.hpp b/include/boost/python/suite/indexing/map_indexing_suite.hpp deleted file mode 100644 index 7fbad4ca..00000000 --- a/include/boost/python/suite/indexing/map_indexing_suite.hpp +++ /dev/null @@ -1,181 +0,0 @@ -// (C) Copyright Joel de Guzman 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 MAP_INDEXING_SUITE_JDG20038_HPP -# define MAP_INDEXING_SUITE_JDG20038_HPP - -# include -# include -# include -# include - -namespace boost { namespace python { - - // Forward declaration - template - class map_indexing_suite; - - namespace detail - { - template - class final_map_derived_policies - : public map_indexing_suite > {}; - } - - // The map_indexing_suite class is a predefined indexing_suite derived - // class for wrapping std::map (and std::map like) classes. It provides - // all the policies required by the indexing_suite (see indexing_suite). - // Example usage: - // - // class X {...}; - // - // ... - // - // class_ >("XMap") - // .def(map_indexing_suite >()) - // ; - // - // By default indexed elements are returned by proxy. This can be - // disabled by supplying *true* in the NoProxy template parameter. - // - template < - class Container, - bool NoProxy = false, - class DerivedPolicies - = detail::final_map_derived_policies > - class map_indexing_suite - : public indexing_suite< - Container - , DerivedPolicies - , NoProxy - , true - , typename Container::value_type::second_type - , typename Container::key_type - , typename Container::key_type - > - { - public: - - typedef typename Container::value_type value_type; - typedef typename Container::value_type::second_type data_type; - typedef typename Container::key_type key_type; - typedef typename Container::key_type index_type; - typedef typename Container::size_type size_type; - typedef typename Container::difference_type difference_type; - - template - static void - extension_def(Class& cl) - { - // Wrap the map's element (value_type) - std::string elem_name = "map_indexing_suite_"; - object class_name(cl.attr("__name__")); - extract class_name_extractor(class_name); - elem_name += class_name_extractor(); - elem_name += "_entry"; - - typedef typename mpl::if_< - mpl::and_, mpl::bool_ > - , return_internal_reference<> - , default_call_policies - >::type get_data_return_policy; - - class_(elem_name.c_str()) - .def("__repr__", &DerivedPolicies::print_elem) - .def("data", &DerivedPolicies::get_data, get_data_return_policy()) - .def("key", &DerivedPolicies::get_key) - ; - } - - static object - print_elem(typename Container::value_type const& e) - { - return "(%s, %s)" % python::make_tuple(e.first, e.second); - } - - static - typename mpl::if_< - mpl::and_, mpl::bool_ > - , data_type& - , data_type - >::type - get_data(typename Container::value_type& e) - { - return e.second; - } - - static typename Container::key_type - get_key(typename Container::value_type& e) - { - return e.first; - } - - static data_type& - get_item(Container& container, index_type i_) - { - typename Container::iterator i = container.find(i_); - if (i == container.end()) - { - PyErr_SetString(PyExc_KeyError, "Invalid key"); - throw_error_already_set(); - } - return i->second; - } - - static void - set_item(Container& container, index_type i, data_type const& v) - { - container[i] = v; - } - - static void - delete_item(Container& container, index_type i) - { - container.erase(i); - } - - static size_t - size(Container& container) - { - return container.size(); - } - - static bool - contains(Container& container, key_type const& key) - { - return container.find(key) != container.end(); - } - - static bool - compare_index(Container& container, index_type a, index_type b) - { - return container.key_comp()(a, b); - } - - static index_type - convert_index(Container& /*container*/, PyObject* i_) - { - extract i(i_); - if (i.check()) - { - return i(); - } - else - { - extract i(i_); - if (i.check()) - return i(); - } - - PyErr_SetString(PyExc_TypeError, "Invalid index type"); - throw_error_already_set(); - return index_type(); - } - }; - -}} // namespace boost::python - -#endif // MAP_INDEXING_SUITE_JDG20038_HPP diff --git a/include/boost/python/suite/indexing/vector_indexing_suite.hpp b/include/boost/python/suite/indexing/vector_indexing_suite.hpp deleted file mode 100644 index 34c29ecc..00000000 --- a/include/boost/python/suite/indexing/vector_indexing_suite.hpp +++ /dev/null @@ -1,242 +0,0 @@ -// (C) Copyright Joel de Guzman 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 VECTOR_INDEXING_SUITE_JDG20036_HPP -# define VECTOR_INDEXING_SUITE_JDG20036_HPP - -# include -# include -# include - -namespace boost { namespace python { - - // Forward declaration - template - class vector_indexing_suite; - - namespace detail - { - template - class final_vector_derived_policies - : public vector_indexing_suite > {}; - } - - // The vector_indexing_suite class is a predefined indexing_suite derived - // class for wrapping std::vector (and std::vector like) classes. It provides - // all the policies required by the indexing_suite (see indexing_suite). - // Example usage: - // - // class X {...}; - // - // ... - // - // class_ >("XVec") - // .def(vector_indexing_suite >()) - // ; - // - // By default indexed elements are returned by proxy. This can be - // disabled by supplying *true* in the NoProxy template parameter. - // - template < - class Container, - bool NoProxy = false, - class DerivedPolicies - = detail::final_vector_derived_policies > - class vector_indexing_suite - : public indexing_suite - { - public: - - typedef typename Container::value_type data_type; - typedef typename Container::value_type key_type; - typedef typename Container::size_type index_type; - typedef typename Container::size_type size_type; - typedef typename Container::difference_type difference_type; - - template - static void - extension_def(Class& cl) - { - cl - .def("append", &base_append) - .def("extend", &base_extend) - ; - } - - static - typename mpl::if_< - is_class - , data_type& - , data_type - >::type - get_item(Container& container, index_type i) - { - return container[i]; - } - - static object - get_slice(Container& container, index_type from, index_type to) - { - if (from > to) - return object(Container()); - return object(Container(container.begin()+from, container.begin()+to)); - } - - static void - set_item(Container& container, index_type i, data_type const& v) - { - container[i] = v; - } - - static void - set_slice(Container& container, index_type from, - index_type to, data_type const& v) - { - if (from > to) { - return; - } - else { - container.erase(container.begin()+from, container.begin()+to); - container.insert(container.begin()+from, v); - } - } - - template - static void - set_slice(Container& container, index_type from, - index_type to, Iter first, Iter last) - { - if (from > to) { - container.insert(container.begin()+from, first, last); - } - else { - container.erase(container.begin()+from, container.begin()+to); - container.insert(container.begin()+from, first, last); - } - } - - static void - delete_item(Container& container, index_type i) - { - container.erase(container.begin()+i); - } - - static void - delete_slice(Container& container, index_type from, index_type to) - { - if (from > to) { - // A null-op. - return; - } - container.erase(container.begin()+from, container.begin()+to); - } - - static size_t - size(Container& container) - { - return container.size(); - } - - static bool - contains(Container& container, key_type const& key) - { - return std::find(container.begin(), container.end(), key) - != container.end(); - } - - static index_type - get_min_index(Container& /*container*/) - { - return 0; - } - - static index_type - get_max_index(Container& container) - { - return container.size(); - } - - static bool - compare_index(Container& /*container*/, index_type a, index_type b) - { - return a < b; - } - - static index_type - convert_index(Container& container, PyObject* i_) - { - extract i(i_); - if (i.check()) - { - long index = i(); - if (index < 0) - index += DerivedPolicies::size(container); - if (index >= long(container.size()) || index < 0) - { - PyErr_SetString(PyExc_IndexError, "Index out of range"); - throw_error_already_set(); - } - return index; - } - - PyErr_SetString(PyExc_TypeError, "Invalid index type"); - throw_error_already_set(); - return index_type(); - } - - static void - append(Container& container, data_type const& v) - { - container.push_back(v); - } - - template - static void - extend(Container& container, Iter first, Iter last) - { - container.insert(container.end(), first, last); - } - - private: - - static void - base_append(Container& container, object v) - { - extract elem(v); - // try if elem is an exact Data - if (elem.check()) - { - DerivedPolicies::append(container, elem()); - } - else - { - // try to convert elem to data_type - extract elem(v); - if (elem.check()) - { - DerivedPolicies::append(container, elem()); - } - else - { - PyErr_SetString(PyExc_TypeError, - "Attempting to append an invalid type"); - throw_error_already_set(); - } - } - } - - static void - base_extend(Container& container, object v) - { - std::vector temp; - container_utils::extend_container(temp, v); - DerivedPolicies::extend(container, temp.begin(), temp.end()); - } - }; - -}} // namespace boost::python - -#endif // VECTOR_INDEXING_SUITE_JDG20036_HPP diff --git a/include/boost/python/tag.hpp b/include/boost/python/tag.hpp deleted file mode 100644 index ccff9f1a..00000000 --- a/include/boost/python/tag.hpp +++ /dev/null @@ -1,18 +0,0 @@ -// 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) -#ifndef TAG_DWA2002720_HPP -# define TAG_DWA2002720_HPP - -# include - -namespace boost { namespace python { - -// used only to prevent argument-dependent lookup from finding the -// wrong function in some cases. Cheaper than qualification. -enum tag_t { tag }; - -}} // namespace boost::python - -#endif // TAG_DWA2002720_HPP diff --git a/include/boost/python/to_python_converter.hpp b/include/boost/python/to_python_converter.hpp deleted file mode 100644 index 4391b6dc..00000000 --- a/include/boost/python/to_python_converter.hpp +++ /dev/null @@ -1,94 +0,0 @@ -// 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) -#ifndef TO_PYTHON_CONVERTER_DWA200221_HPP -# define TO_PYTHON_CONVERTER_DWA200221_HPP - -# include - -# include -# include -#ifndef BOOST_PYTHON_NO_PY_SIGNATURES -# include -#endif -# include - -namespace boost { namespace python { - -#if 0 //get_pytype member detection -namespace detail -{ - typedef char yes_type; - typedef struct {char a[2]; } no_type; - template struct test_get_pytype1 { }; - template struct test_get_pytype2 { }; - - template yes_type tester(test_get_pytype1<&T::get_pytype>*); - - template yes_type tester(test_get_pytype2<&T::get_pytype>*); - - template no_type tester(...); - - template - struct test_get_pytype_base - { - BOOST_STATIC_CONSTANT(bool, value= (sizeof(detail::tester(0)) == sizeof(yes_type))); - }; - - template - struct test_get_pytype : boost::mpl::bool_::value> - { - }; - -} -#endif - -template < class T, class Conversion, bool has_get_pytype=false > -struct to_python_converter -{ -#ifndef BOOST_PYTHON_NO_PY_SIGNATURES - typedef boost::mpl::bool_ HasGetPytype; - - static PyTypeObject const* get_pytype_1(boost::mpl::true_ *) - { - return Conversion::get_pytype(); - } - - static PyTypeObject const* get_pytype_1(boost::mpl::false_ *) - { - return 0; - } - static PyTypeObject const* get_pytype_impl() - { - return get_pytype_1((HasGetPytype*)0); - } -#endif - - to_python_converter(); -}; - -// -// implementation -// - -template -to_python_converter::to_python_converter() -{ - typedef converter::as_to_python_function< - T, Conversion - > normalized; - - converter::registry::insert( - &normalized::convert - , type_id() -#ifndef BOOST_PYTHON_NO_PY_SIGNATURES - , &get_pytype_impl -#endif - ); -} - -}} // namespace boost::python - -#endif // TO_PYTHON_CONVERTER_DWA200221_HPP - diff --git a/include/boost/python/to_python_indirect.hpp b/include/boost/python/to_python_indirect.hpp deleted file mode 100644 index 23ad0263..00000000 --- a/include/boost/python/to_python_indirect.hpp +++ /dev/null @@ -1,113 +0,0 @@ -// 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) -#ifndef TO_PYTHON_INDIRECT_DWA200221_HPP -# define TO_PYTHON_INDIRECT_DWA200221_HPP - -# include - -# include -# include - -# include - -#ifndef BOOST_PYTHON_NO_PY_SIGNATURES -# include -#endif - -# include - -# include -# include - -# include - -# if defined(__ICL) && __ICL < 600 -# include -# else -# include -# endif - -namespace boost { namespace python { - -template -struct to_python_indirect -{ - template - inline PyObject* - operator()(U const& ref) const - { - return this->execute(const_cast(ref), is_pointer()); - } -#ifndef BOOST_PYTHON_NO_PY_SIGNATURES - inline PyTypeObject const* - get_pytype()const - { - return converter::registered_pytype::get_pytype(); - } -#endif - private: - template - inline PyObject* execute(U* ptr, mpl::true_) const - { - // No special NULL treatment for references - if (ptr == 0) - return python::detail::none(); - else - return this->execute(*ptr, mpl::false_()); - } - - template - inline PyObject* execute(U const& x, mpl::false_) const - { - U* const p = &const_cast(x); - if (is_polymorphic::value) - { - if (PyObject* o = detail::wrapper_base_::owner(p)) - return incref(o); - } - return MakeHolder::execute(p); - } -}; - -// -// implementations -// -namespace detail -{ - struct make_owning_holder - { - template - static PyObject* execute(T* p) - { - // can't use auto_ptr with Intel 5 and VC6 Dinkum library - // for some reason. We get link errors against the auto_ptr - // copy constructor. -# if defined(__ICL) && __ICL < 600 - typedef boost::shared_ptr smart_pointer; -# else - typedef std::auto_ptr smart_pointer; -# endif - typedef objects::pointer_holder holder_t; - - smart_pointer ptr(const_cast(p)); - return objects::make_ptr_instance::execute(ptr); - } - }; - - struct make_reference_holder - { - template - static PyObject* execute(T* p) - { - typedef objects::pointer_holder holder_t; - T* q = const_cast(p); - return objects::make_ptr_instance::execute(q); - } - }; -} - -}} // namespace boost::python - -#endif // TO_PYTHON_INDIRECT_DWA200221_HPP diff --git a/include/boost/python/to_python_value.hpp b/include/boost/python/to_python_value.hpp deleted file mode 100644 index aaabb9cf..00000000 --- a/include/boost/python/to_python_value.hpp +++ /dev/null @@ -1,171 +0,0 @@ -// 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) -#ifndef TO_PYTHON_VALUE_DWA200221_HPP -# define TO_PYTHON_VALUE_DWA200221_HPP - -# include - -# include -# include -# include - -# include -# include -# include -# include -# include - -# include -# include - -# include - -# include -# include -# include - -namespace boost { namespace python { - -namespace detail -{ -#ifndef BOOST_PYTHON_NO_PY_SIGNATURES - -template -struct object_manager_get_pytype -{ - template - static PyTypeObject const* get( U& (*)() =0) - { - return converter::object_manager_traits::get_pytype(); - } -}; - -template <> -struct object_manager_get_pytype -{ - template - static PyTypeObject const* get( U const& (*)() =0) - { - return converter::object_manager_traits::get_pytype(); - } -}; - -#endif - - template - struct object_manager_to_python_value - { - typedef typename value_arg::type argument_type; - - PyObject* operator()(argument_type) const; -#ifndef BOOST_PYTHON_NO_PY_SIGNATURES - typedef boost::mpl::bool_::value> is_t_handle; - typedef boost::detail::indirect_traits::is_reference_to_const is_t_const; - PyTypeObject const* get_pytype() const { - return get_pytype_aux((is_t_handle*)0); - } - - inline static PyTypeObject const* get_pytype_aux(mpl::true_*) {return converter::object_manager_traits::get_pytype();} - - inline static PyTypeObject const* get_pytype_aux(mpl::false_* ) - { - return object_manager_get_pytype::get((T(*)())0); - } - -#endif - - // This information helps make_getter() decide whether to try to - // return an internal reference or not. I don't like it much, - // but it will have to serve for now. - BOOST_STATIC_CONSTANT(bool, uses_registry = false); - }; - - - template - struct registry_to_python_value - { - typedef typename value_arg::type argument_type; - - PyObject* operator()(argument_type) const; -#ifndef BOOST_PYTHON_NO_PY_SIGNATURES - PyTypeObject const* get_pytype() const {return converter::registered::converters.to_python_target_type();} -#endif - - // This information helps make_getter() decide whether to try to - // return an internal reference or not. I don't like it much, - // but it will have to serve for now. - BOOST_STATIC_CONSTANT(bool, uses_registry = true); - }; - - template - struct shared_ptr_to_python_value - { - typedef typename value_arg::type argument_type; - - PyObject* operator()(argument_type) const; -#ifndef BOOST_PYTHON_NO_PY_SIGNATURES - PyTypeObject const* get_pytype() const {return get_pytype((boost::type*)0);} -#endif - // This information helps make_getter() decide whether to try to - // return an internal reference or not. I don't like it much, - // but it will have to serve for now. - BOOST_STATIC_CONSTANT(bool, uses_registry = false); - private: -#ifndef BOOST_PYTHON_NO_PY_SIGNATURES - template - PyTypeObject const* get_pytype(boost::type &> *) const {return converter::registered::converters.to_python_target_type();} - template - PyTypeObject const* get_pytype(boost::type &> *) const {return converter::registered::converters.to_python_target_type();} -#endif - }; -} - -template -struct to_python_value - : mpl::if_< - detail::value_is_shared_ptr - , detail::shared_ptr_to_python_value - , typename mpl::if_< - mpl::or_< - converter::is_object_manager - , converter::is_reference_to_object_manager - > - , detail::object_manager_to_python_value - , detail::registry_to_python_value - >::type - >::type -{ -}; - -// -// implementation -// -namespace detail -{ - template - inline PyObject* registry_to_python_value::operator()(argument_type x) const - { - return converter::registered::converters.to_python(&x); - } - - template - inline PyObject* object_manager_to_python_value::operator()(argument_type x) const - { - return python::upcast( - python::xincref( - get_managed_object(x, tag)) - ); - } - - template - inline PyObject* shared_ptr_to_python_value::operator()(argument_type x) const - { - return converter::shared_ptr_to_python(x); - } -} - -}} // namespace boost::python - -#endif // TO_PYTHON_VALUE_DWA200221_HPP diff --git a/include/boost/python/tuple.hpp b/include/boost/python/tuple.hpp deleted file mode 100644 index babfb63f..00000000 --- a/include/boost/python/tuple.hpp +++ /dev/null @@ -1,70 +0,0 @@ -// 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) -#ifndef TUPLE_20020706_HPP -#define TUPLE_20020706_HPP - -# include - -#include -#include -#include -#include - -namespace boost { namespace python { - -namespace detail -{ - struct BOOST_PYTHON_DECL tuple_base : object - { - protected: - tuple_base(); - tuple_base(object_cref sequence); - - BOOST_PYTHON_FORWARD_OBJECT_CONSTRUCTORS(tuple_base, object) - - private: - static detail::new_reference call(object const&); - }; -} - -class tuple : public detail::tuple_base -{ - typedef detail::tuple_base base; - public: - tuple() {} - - template - explicit tuple(T const& sequence) - : base(object(sequence)) - { - } - - public: // implementation detail -- for internal use only - BOOST_PYTHON_FORWARD_OBJECT_CONSTRUCTORS(tuple, base) -}; - -// -// Converter Specializations // $$$ JDG $$$ moved here to prevent -// // G++ bug complaining specialization - // provided after instantiation -namespace converter -{ - template <> - struct object_manager_traits - : pytype_object_manager_traits<&PyTuple_Type,tuple> - { - }; -} - -// for completeness -inline tuple make_tuple() { return tuple(); } - -# define BOOST_PP_ITERATION_PARAMS_1 (3, (1, BOOST_PYTHON_MAX_ARITY, )) -# include BOOST_PP_ITERATE() - -}} // namespace boost::python - -#endif - diff --git a/include/boost/python/type_id.hpp b/include/boost/python/type_id.hpp deleted file mode 100644 index 38b7f7b4..00000000 --- a/include/boost/python/type_id.hpp +++ /dev/null @@ -1,184 +0,0 @@ -// 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) -#ifndef TYPE_ID_DWA2002517_HPP -# define TYPE_ID_DWA2002517_HPP - -# include - -# include -# include -# include -# include -# include -# include -# include -# include - -# ifndef BOOST_PYTHON_HAVE_GCC_CP_DEMANGLE -# if defined(__GNUC__) \ - && !defined(__EDG_VERSION__) -# define BOOST_PYTHON_HAVE_GCC_CP_DEMANGLE -# endif -# endif - -namespace boost { namespace python { - -// for this compiler at least, cross-shared-library type_info -// comparisons don't work, so use typeid(x).name() instead. It's not -// yet clear what the best default strategy is. -# if defined(__GNUC__) \ - || defined(_AIX) \ - || ( defined(__sgi) && defined(__host_mips)) \ - || (defined(__hpux) && defined(__HP_aCC)) \ - || (defined(linux) && defined(__INTEL_COMPILER) && defined(__ICC)) -# define BOOST_PYTHON_TYPE_ID_NAME -# endif - -#ifdef BOOST_PYTHON_HAVE_GCC_CP_DEMANGLE -// Runtime detection of broken cxxabi::__cxa_demangle versions, -// to avoid #ifdef clutter. -bool cxxabi_cxa_demangle_is_broken(); -#define BOOST_PYTHON_HAVE_CXXABI_CXA_DEMANGLE_IS_BROKEN -#endif - -// type ids which represent the same information as std::type_info -// (i.e. the top-level reference and cv-qualifiers are stripped), but -// which works across shared libraries. -struct type_info : private totally_ordered -{ - inline type_info(std::type_info const& = typeid(void)); - - inline bool operator<(type_info const& rhs) const; - inline bool operator==(type_info const& rhs) const; - - char const* name() const; - friend BOOST_PYTHON_DECL std::ostream& operator<<( - std::ostream&, type_info const&); - - private: // data members -# ifdef BOOST_PYTHON_TYPE_ID_NAME - typedef char const* base_id_t; -# else - typedef std::type_info const* base_id_t; -# endif - - base_id_t m_base_type; -}; - - -// This macro is obsolete. Port away and remove. -# define BOOST_PYTHON_EXPLICIT_TT_DEF(T) - -template -inline type_info type_id() -{ - return type_info( -# if !defined(_MSC_VER) \ - || !BOOST_WORKAROUND(BOOST_INTEL_CXX_VERSION, <= 700) - typeid(T) -# else // strip the decoration which Intel mistakenly leaves in - python::detail::msvc_typeid((boost::type*)0) -# endif - ); -} - -# if (defined(__EDG_VERSION__) && __EDG_VERSION__ < 245) \ - || (defined(__sgi) && defined(_COMPILER_VERSION) && _COMPILER_VERSION <= 744) -// Older EDG-based compilers seems to mistakenly distinguish "int" from -// "signed int", etc., but only in typeid() expressions. However -// though int == signed int, the "signed" decoration is propagated -// down into template instantiations. Explicit specialization stops -// that from taking hold. - -# define BOOST_PYTHON_SIGNED_INTEGRAL_TYPE_ID(T) \ -template <> \ -inline type_info type_id() \ -{ \ - return type_info(typeid(T)); \ -} - -BOOST_PYTHON_SIGNED_INTEGRAL_TYPE_ID(short) -BOOST_PYTHON_SIGNED_INTEGRAL_TYPE_ID(int) -BOOST_PYTHON_SIGNED_INTEGRAL_TYPE_ID(long) -// using Python's macro instead of Boost's - we don't seem to get the -// config right all the time. -# ifdef HAVE_LONG_LONG -BOOST_PYTHON_SIGNED_INTEGRAL_TYPE_ID(long long) -# endif -# undef BOOST_PYTHON_SIGNED_INTEGRAL_TYPE_ID -# endif - -// -inline type_info::type_info(std::type_info const& id) - : m_base_type( -# ifdef BOOST_PYTHON_TYPE_ID_NAME - id.name() -# else - &id -# endif - ) -{ -} - -inline bool type_info::operator<(type_info const& rhs) const -{ -# ifdef BOOST_PYTHON_TYPE_ID_NAME - return std::strcmp(m_base_type, rhs.m_base_type) < 0; -# else - return m_base_type->before(*rhs.m_base_type); -# endif -} - -inline bool type_info::operator==(type_info const& rhs) const -{ -# ifdef BOOST_PYTHON_TYPE_ID_NAME - return !std::strcmp(m_base_type, rhs.m_base_type); -# else - return *m_base_type == *rhs.m_base_type; -# endif -} - -# ifdef BOOST_PYTHON_HAVE_GCC_CP_DEMANGLE -namespace detail -{ - BOOST_PYTHON_DECL char const* gcc_demangle(char const*); -} -# endif - -inline char const* type_info::name() const -{ - char const* raw_name - = m_base_type -# ifndef BOOST_PYTHON_TYPE_ID_NAME - ->name() -# endif - ; - -# ifdef BOOST_PYTHON_HAVE_GCC_CP_DEMANGLE - return detail::gcc_demangle(raw_name); -# else - return raw_name; -# endif -} - - -BOOST_PYTHON_DECL std::ostream& operator<<(std::ostream&, type_info const&); - -template<> -inline type_info type_id() -{ - return type_info (typeid (void *)); -} -# ifndef BOOST_NO_CV_VOID_SPECIALIZATIONS -template<> -inline type_info type_id() -{ - return type_info (typeid (void *)); -} -# endif - -}} // namespace boost::python - -#endif // TYPE_ID_DWA2002517_HPP diff --git a/include/boost/python/with_custodian_and_ward.hpp b/include/boost/python/with_custodian_and_ward.hpp deleted file mode 100644 index 3431c6f2..00000000 --- a/include/boost/python/with_custodian_and_ward.hpp +++ /dev/null @@ -1,121 +0,0 @@ -// 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) -#ifndef WITH_CUSTODIAN_AND_WARD_DWA2002131_HPP -# define WITH_CUSTODIAN_AND_WARD_DWA2002131_HPP - -# include - -# include -# include -# include - -namespace boost { namespace python { - -namespace detail -{ - template - struct get_prev - { - template - static PyObject* execute(ArgumentPackage const& args, PyObject* = 0) - { - int const pre_n = static_cast(N) - 1; // separate line is gcc-2.96 workaround - return detail::get(mpl::int_(), args); - } - }; - template <> - struct get_prev<0> - { - template - static PyObject* execute(ArgumentPackage const&, PyObject* zeroth) - { - return zeroth; - } - }; -} -template < - std::size_t custodian - , std::size_t ward - , class BasePolicy_ = default_call_policies -> -struct with_custodian_and_ward : BasePolicy_ -{ - BOOST_STATIC_ASSERT(custodian != ward); - BOOST_STATIC_ASSERT(custodian > 0); - BOOST_STATIC_ASSERT(ward > 0); - - template - static bool precall(ArgumentPackage const& args_) - { - unsigned arity_ = detail::arity(args_); - if (custodian > arity_ || ward > arity_) - { - PyErr_SetString( - PyExc_IndexError - , "boost::python::with_custodian_and_ward: argument index out of range" - ); - return false; - } - - PyObject* patient = detail::get_prev::execute(args_); - PyObject* nurse = detail::get_prev::execute(args_); - - PyObject* life_support = python::objects::make_nurse_and_patient(nurse, patient); - if (life_support == 0) - return false; - - bool result = BasePolicy_::precall(args_); - - if (!result) { - Py_DECREF(life_support); - } - - return result; - } -}; - -template -struct with_custodian_and_ward_postcall : BasePolicy_ -{ - BOOST_STATIC_ASSERT(custodian != ward); - - template - static PyObject* postcall(ArgumentPackage const& args_, PyObject* result) - { - std::size_t arity_ = detail::arity(args_); - // check if either custodian or ward exceeds the arity - // (this weird formulation avoids "always false" warnings - // for arity_ = 0) - if ( (std::max)(custodian, ward) > arity_ ) - { - PyErr_SetString( - PyExc_IndexError - , "boost::python::with_custodian_and_ward_postcall: argument index out of range" - ); - return 0; - } - - PyObject* patient = detail::get_prev::execute(args_, result); - PyObject* nurse = detail::get_prev::execute(args_, result); - - if (nurse == 0) return 0; - - result = BasePolicy_::postcall(args_, result); - if (result == 0) - return 0; - - if (python::objects::make_nurse_and_patient(nurse, patient) == 0) - { - Py_XDECREF(result); - return 0; - } - return result; - } -}; - - -}} // namespace boost::python - -#endif // WITH_CUSTODIAN_AND_WARD_DWA2002131_HPP diff --git a/include/boost/python/wrapper.hpp b/include/boost/python/wrapper.hpp deleted file mode 100755 index 166c8e23..00000000 --- a/include/boost/python/wrapper.hpp +++ /dev/null @@ -1,35 +0,0 @@ -// Copyright David Abrahams 2004. 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 WRAPPER_DWA2004720_HPP -# define WRAPPER_DWA2004720_HPP - -# include -# include -# include -# include - -namespace boost { namespace python { - -template -class wrapper : public detail::wrapper_base -{ - public: - // Do not touch this implementation detail! - typedef T _wrapper_wrapped_type_; - - protected: - override get_override(char const* name) const - { - typedef detail::wrapper_base base; - converter::registration const& r - = converter::registered::converters; - PyTypeObject* type = r.get_class_object(); - - return this->base::get_override(name, type); - } -}; - -}} // namespace boost::python - -#endif // WRAPPER_DWA2004720_HPP diff --git a/meta/libraries.json b/meta/libraries.json deleted file mode 100644 index e2f2a054..00000000 --- a/meta/libraries.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "key": "python", - "name": "Python", - "authors": [ - "Dave Abrahams" - ], - "description": "The Boost Python Library is a framework for interfacing Python and C++. It allows you to quickly and seamlessly expose C++ classes functions and objects to Python, and vice-versa, using no special tools -- just your C++ compiler.", - "category": [ - "Inter-language" - ], - "maintainers": [ - "Stefan Seefeld " - ] -} diff --git a/pyste/NEWS b/pyste/NEWS deleted file mode 100644 index 31a5ceba..00000000 --- a/pyste/NEWS +++ /dev/null @@ -1,212 +0,0 @@ -.. Copyright Bruno da Silva de Oliveira 2006. 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) - -25 April 2005 -- Fixed bug where the code for wrappers of member functions were defined outside -the pyste namespace. Reported by Dan Haffey. - -9 October 2004 -- Applied a patch by Christian Hudon that fixed an issue with files -that had a tail and relative includes. - -18 July 2004 -- Applied a patch by Paul Bridger that solves some problems for wrapper -methods. -- Applied a patch by Baptiste Lepilleur that allows the user to inject -code inside the class definition. -- Applied another patch by Baptiste Lepilleur that inserts two new command-line -options that helps with writing makefiles. - -27 May 2004 -Applied patch by Paul Bridger that solves a problem on windows regarding -spaces on paths. Thanks Paul! - -Applied another patch that fixes the module name if pyste is run from -another directory of where the .pyste file is located. Patch contributted -by Paul Bridger. - -17 May 2004 -Applied a patch by Roman Yakovenko that makes the export of unnamed enums -better. Thanks Roman! - -23 October 2003 -Fixed bug where a class would appear more than one in the generated code. - -6 October 2003 -Fixed bug reported by Niall Douglas (using his patch) about UniqueInt not -appearing correctly with --multiple. - -Added precompiled header support on windows systems (using #pragma hdrstop). -Suggested by Niall Douglas. - -Fixed a bug with -I directive and AllFromHeader. Reported by Scott Snyder. - -4 October 2003 -Added return_self, thanks for Niall Douglas for pointing out that it was -missing. - -Added --file-list, where you can pass a file where the pyste files are listed -one per line. Also suggested by Niall Douglas. - -Documentation has been finally updated, after a long wait. Please let me know -if you spot any mistake! - -2 October 2003 -Scott Snyder found a typo in ClassExporter that prevented -= and *= operators -from being exported. Thanks Scott! - -20 September 2003 -Added return_by_value in the list of policies supported. Thanks to Niall -Douglas for the remainder. - -19 September 2003 -Better support for unnamed enums, plus they are by default exported to the -parent's namespace. Normal enums can have the same behaviour using the function -export_values on the Enum object. Feature requested by Niall Douglas. - -10 September 2003 -A new variable is accessible in the Pyste files: INTERFACE_FILE contains the -full path of the pyste file. - -4 September 2003 -Now it is possible to override protected and private pure virtual functions -in Python, as requested by Roman Yakovenko. - -23 August 2003 -Fixed bug where some Imports where not writing their include files. -Now whenever the declarations change, the cache files are rebuilt -automatically. - -19 August 2003 -Fixed a bug related to the generation of the bases<> template. - -17 August 2003 -Added support for insertion of user code in the generated code. - -16 August 2003 -Applied a patch by Gottfried Ganssauge that adds exception specifiers to -wrapper functions and pointer declarations. Thanks a lot Gottfried!! - -Applied a patch by Prabhu Ramachandran that fixes ae problem with the -pure virtual method generation. Thanks again Prabhu! - -10 August 2003 -Support for incremental generation of the code has been added. This changes -how --multiple works; documentation of this new feature will follow. Thanks -to Prabhu Ramachandran, that saw the need for this feature and discussed a -solution. - -Automatically convert \ to / in Windows systems before passing the paths to -gccxml. - -Fixed a bug reported by Prabhu Ramachandran, where in some classes the virtual -methods were being definied incorrectly. Thanks a lot Prabhu! - -7 July 2003 -Applied 2 patches by Prabhu Ramachandran: a fix in the new --multiple method, -and two new functions "hold_with_shared_ptr" and its counterpart for auto_ptr. -Thanks a lot Prabhu! - -Fixed a bug where the macro BOOST_PYTHON_OPAQUE_SPECIALIZED_TYPE_ID was being -called multiple times for the same type. -Thanks to Gottfried Ganauge for reporting this! - -Fixed bug where using AllFromHeader didn't use bases<> when exporting -hierarchies. - -Fixed the staticmethod bug. - -5 July 2003 -Changed how --multiple works: now it generates one cpp file for each pyste -file, makeing easier to integrate Pyste with build systems. - -4 July 2003 -Applied patch that solved a bug in ClassExporter and added a distutils install -script (install/setup.py), both contributed by Prabhu Ramachandran. -Thanks Prabhu! - -2 July 2003 -Jim Wilson found a bug where types like "char**" were being interpreted as -"char*". Thanks Jim! - -16 June 2003 -Thanks to discussions with David Abrahams and Roman Sulzhyk, some behaviours -have changed: - -- If you export a derived class without exporting its base classes, the derived - class will explicitly export the bases's methods and attributes. Before, if - you were interested in the bases's methods, you had to export the base - classes too. - -- Added a new function, no_override. When a member function is specified as - "no_override", no virtual wrappers are generated for it, improving - performance and letting the code more clean. - -- There was a bug in which the policy of virtual member functions was being - ignored (patch by Roman Sulzhyk). - -Thanks again to Roman Sulzhyk for the patches and discussion in the c++-sig. - -4 June 2003 -Major improvements in memory usage. - -3 June 2003 -Appliced a patch from Giulio Eulisse that allows unnamed enumerations to be -exported with an AllFromHeader construct. Thanks a lot Giulio! - -2 June 2003 -Added a new construct, add_method. See documentation. - -23 May 2003 -Support for global variables added. -Various bug fixes. - -08 May 2003 -Fixed bug where in a certain cases the GCCXMLParser would end up with multiple -declarations of the same class - -22 Apr 2003 -- Now shows a warning when the user tries to export a forward-declared class. - Forward-declared classes are ignored by the AllFromHeader construct. -- Fixed a bug where classes, functions and enums where being exported, even if - excluded from a AllFromHeader construct. - -16 Apr 2003 -Added a more generic (but ugly) code to declare the smart pointer converters. - -07 Apr 2003 -- Removed the warnings about forward declarations: it was not accurate enough. - Another strategy must be thought of. -- Fixed bug in the --multiple mode, where the order of the class instantiations - could end up wrong. -- Lots of fixes in the documentation, pointed out by Dirk Gerrits. Thanks Dirk! -- Fixed support for the return_opaque_pointer policy (the support macro was not - being declared). - - -06 Apr 2003 -Support for the improved static data members support of Boost.Python. - -05 Apr 2003 -New option for generating the bindings: --multiple. - -02 Apr 2003 -Forward declarations are now detected and a warning is generated. - -24 Mar 2003 -Default policy for functions/methods that return const T& is now -return_value_policy(). - -22 Mar 2003 -Exporting virtual methods of the base classes in the derived classes too. - -21 Mar 2003 -Added manual support for boost::shared_ptr and std::auto_ptr (see doc). - -19 Mar 2003 -Added support for int, double, float and long operators acting as expected in -python. - -14 Mar 2003 -Fixed bug: Wrappers for protected and virtual methods were not being generated. diff --git a/pyste/README b/pyste/README deleted file mode 100644 index c378f391..00000000 --- a/pyste/README +++ /dev/null @@ -1,35 +0,0 @@ -.. Copyright Bruno da Silva de Oliveira 2006. 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) - -Pyste - Python Semi-Automatic Exporter -====================================== - -Pyste is a Boost.Python code generator. The user specifies the classes and -functions to be exported using a simple interface file, which following the -Boost.Python's philosophy, is simple Python code. Pyste then uses GCCXML to -parse all the headers and extract the necessary information to automatically -generate C++ code. - -The documentation can be found in the file index.html accompaning this README. - -Enjoy! -Bruno da Silva de Oliveira (nicodemus@esss.com.br) - -Thanks -====== - -- David Abrahams, creator of Boost.Python, for tips on the syntax of the interface - file and support. -- Marcelo Camelo, for design tips, support and inspiration for this project. - Also, the name was his idea. 8) -- Brad King, creator of the excellent GCCXML (http://www.gccxml.org) -- Fredrik Lundh, creator of the elementtree library (http://effbot.org) - -Bugs -==== - -Pyste is a young tool, so please help it to get better! Send bug reports to -nicodemus@esss.com.br, accompaining the stack trace in case of exceptions. -If possible, run pyste with --debug, and send the resulting xmls too (pyste -will output a xml file with the same of each header it parsed). diff --git a/pyste/TODO b/pyste/TODO deleted file mode 100644 index 0b3c9024..00000000 --- a/pyste/TODO +++ /dev/null @@ -1,18 +0,0 @@ -.. Copyright Bruno da Silva de Oliveira 2006. 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) - -- Make Pyste accept already-generated xml files - -- throw() declaration in virtual wrapper's member functions - -- Allow protected methods to be overriden in Python - -- Expose programmability to the Pyste files (listing members of a class, for - instance) - -- Virtual operators - -- args() support - -- set policies to methods with the same name diff --git a/pyste/dist/create_build.py b/pyste/dist/create_build.py deleted file mode 100644 index a6836995..00000000 --- a/pyste/dist/create_build.py +++ /dev/null @@ -1,55 +0,0 @@ -# Copyright Bruno da Silva de Oliveira 2006. 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) - -import os -import sys -import shutil -import fnmatch -from zipfile import ZipFile, ZIP_DEFLATED - -def findfiles(directory, mask): - def visit(files, dir, names): - for name in names: - if fnmatch.fnmatch(name, mask): - files.append(os.path.join(dir, name)) - files = [] - os.path.walk(directory, visit, files) - return files - - -def main(): - # test if PyXML is installed - try: - import _xmlplus.parsers.expat - pyxml = '--includes _xmlplus.parsers.expat' - except ImportError: - pyxml = '' - # create exe - status = os.system('python setup.py py2exe %s >& build.log' % pyxml) - if status != 0: - raise RuntimeError, 'Error creating EXE' - - # create distribution - import pyste - version = pyste.__VERSION__ - zip = ZipFile('pyste-%s.zip' % version, 'w', ZIP_DEFLATED) - # include the base files - dist_dir = 'dist/pyste' - for basefile in os.listdir(dist_dir): - zip.write(os.path.join(dist_dir, basefile), os.path.join('pyste', basefile)) - # include documentation - for doc_file in findfiles('../doc', '*.*'): - dest_name = os.path.join('pyste/doc', doc_file[3:]) - zip.write(doc_file, dest_name) - zip.write('../index.html', 'pyste/doc/index.html') - zip.close() - # cleanup - os.remove('build.log') - shutil.rmtree('build') - shutil.rmtree('dist') - - -if __name__ == '__main__': - sys.path.append('../src') - main() diff --git a/pyste/dist/setup.py b/pyste/dist/setup.py deleted file mode 100644 index fc7c74e2..00000000 --- a/pyste/dist/setup.py +++ /dev/null @@ -1,10 +0,0 @@ -# Copyright Bruno da Silva de Oliveira 2006. 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) - -from distutils.core import setup -import py2exe -import sys - -sys.path.append('../src') -setup(name='pyste', scripts=['../src/pyste.py']) diff --git a/pyste/doc/adding_new_methods.html b/pyste/doc/adding_new_methods.html deleted file mode 100644 index afa772bc..00000000 --- a/pyste/doc/adding_new_methods.html +++ /dev/null @@ -1,79 +0,0 @@ - - - -Adding New Methods - - - - - - - - - - -
- - Adding New Methods -
-
- - - - - - -
-

-Suppose that you want to add a function to a class, turning it into a member -function:

-
-    struct World
-    {
-        void set(std::string msg) { this->msg = msg; }
-        std::string msg;
-    };
-
-    std::string greet(World& w)
-    {
-        return w.msg;
-    }
-
-

-Here, we want to make greet work as a member function of the class World. We do -that using the add_method construct:

-
-    W = Class("World", "hello.h")
-    add_method(W, "greet")
-
-

-Notice also that then you can rename it, set its policy, just like a regular -member function:

-
-    rename(W.greet, 'Greet')
-
-

-Now from Python:

-
-    >>> import hello
-    >>> w = hello.World()
-    >>> w.set('Ni')
-    >>> w.greet()
-    'Ni'
-    >>> print 'Oh no! The knights who say Ni!'
-    Oh no! The knights who say Ni!
-
- - - - - - -
-
-
- - diff --git a/pyste/doc/exporting_an_entire_header.html b/pyste/doc/exporting_an_entire_header.html deleted file mode 100644 index db25325c..00000000 --- a/pyste/doc/exporting_an_entire_header.html +++ /dev/null @@ -1,85 +0,0 @@ - - - -Exporting An Entire Header - - - - - - - - - - -
- - Exporting An Entire Header -
-
- - - - - - -
-

-Pyste also supports a mechanism to export all declarations found in a header -file. Suppose again our file, hello.h:

-
-    struct World
-    {
-        World(std::string msg): msg(msg) {} 
-        void set(std::string msg) { this->msg = msg; }
-        std::string greet() { return msg; }
-        std::string msg;
-    };
-
-    enum choice { red, blue };
-    
-    void show(choice c) { std::cout << "value: " << (int)c << std::endl; } 
-
-

-You can just use the AllFromHeader construct:

-
-    hello = AllFromHeader("hello.h")
-
-

-this will export all the declarations found in hello.h, which is equivalent -to write:

-
-    Class("World", "hello.h")
-    Enum("choice", "hello.h")
-    Function("show", "hello.h")
-
-

-Note that you can still use the functions rename, set_policy, exclude, etc. Just access -the members of the header object like this:

-
-    rename(hello.World.greet, "Greet")
-    exclude(hello.World.set, "Set")
-
- - - - -
- - AllFromHeader is broken in some cases. Until it is fixed, -use at you own risk. -
- - - - - - -
-
-
- - diff --git a/pyste/doc/global_variables.html b/pyste/doc/global_variables.html deleted file mode 100644 index 0efd2950..00000000 --- a/pyste/doc/global_variables.html +++ /dev/null @@ -1,49 +0,0 @@ - - - -Global Variables - - - - - - - - - - -
- - Global Variables -
-
- - - - - - -
-

-To export global variables, use the Var construct:

-
-    Var("myglobal", "foo.h")
-
-

-Beware of non-const global variables: changes in Python won't reflect in C++! -If you really must change them in Python, you will have to write some accessor -functions, and export those.

- - - - - - -
-
-
- - diff --git a/pyste/doc/inserting_code.html b/pyste/doc/inserting_code.html deleted file mode 100644 index 97eb70f3..00000000 --- a/pyste/doc/inserting_code.html +++ /dev/null @@ -1,72 +0,0 @@ - - - -Inserting Code - - - - - - - - - -
- - Inserting Code -
-
- - - - - - -
-

-You can insert arbitrary code in the generated cpps, just use the functions -declaration_code and module_code. This will insert the given string in the -respective sections. Example:

-
-    ##file A.pyste
-    Class("A", "A.h")
-    declaration_code("/* declaration_code() comes here */\n")
-    module_code("/* module_code() comes here */\n")
-
-

-Will generate:

-
-    // Includes ====================================================================
-    #include <boost/python.hpp>
-
-    // Using =======================================================================
-    using namespace boost::python;
-
-    // Declarations ================================================================
-
-    /* declaration_code() comes here */
-
-    // Module ======================================================================
-    BOOST_PYTHON_MODULE(A)
-    {
-        class_< A >("A", init<  >())
-            .def(init< const A& >())
-        ;
-
-    /* module_code() comes here */
-    }
-
- - - - - - -
-
-
- - diff --git a/pyste/doc/introduction.html b/pyste/doc/introduction.html deleted file mode 100644 index 94388493..00000000 --- a/pyste/doc/introduction.html +++ /dev/null @@ -1,73 +0,0 @@ - - - -Introduction - - - - - - - - - -
- - Introduction -
-
- - - - - - -
-

What is Pyste?

-Pyste is a -Boost.Python code generator. The user specifies the classes and -functions to be exported using a simple interface file, which following the - -Boost.Python's philosophy, is simple Python code. Pyste then uses -GCCXML to -parse all the headers and extract the necessary information to automatically -generate C++ code.

-

Example

-Let's borrow the class World from the -tutorial:

-
-    struct World
-    {
-        void set(std::string msg) { this->msg = msg; }
-        std::string greet() { return msg; }
-        std::string msg;
-    };
-
-

-Here's the interface file for it, named world.pyste:

-
-    Class("World", "world.h")
-
-

-and that's it!

-

-The next step is invoke Pyste in the command-line:

-
python pyste.py --module=hello world.pyste

-this will create a file "hello.cpp" in the directory where the command was -run.

-

-Pyste supports the following features:

-
  • Functions
  • Classes
  • Class Templates
  • Virtual Methods
  • Overloading
  • Attributes
  • Enums (both "free" enums and class enums)
  • Nested Classes
  • Support for boost::shared_ptr and std::auto_ptr
  • Global Variables
- - - - - -
-
-
- - diff --git a/pyste/doc/policies.html b/pyste/doc/policies.html deleted file mode 100644 index 3628093b..00000000 --- a/pyste/doc/policies.html +++ /dev/null @@ -1,90 +0,0 @@ - - - -Policies - - - - - - - - - - -
- - Policies -
-
- - - - - - -
-

-Even thought Pyste can identify various elements in the C++ code, like virtual -member functions, attributes, and so on, one thing that it can't do is to -guess the semantics of functions that return pointers or references. In this -case, the user must manually specify the policy. Policies are explained in the - -tutorial.

-

-The policies in Pyste are named exactly as in -Boost.Python, only the syntax is -slightly different. For instance, this policy:

-
-    return_internal_reference<1, with_custodian_and_ward<1, 2> >()
-
-

-becomes in Pyste:

-
-    return_internal_reference(1, with_custodian_and_ward(1, 2))
-
-

-The user can specify policies for functions and virtual member functions with -the set_policy function:

-
-    set_policy(f, return_internal_reference())
-    set_policy(C.foo, return_value_policy(manage_new_object))
-
- - - - -
- - What if a function or member function needs a policy and -the user doesn't set one?

If a function needs a policy and one -was not set, Pyste will issue a error. The user should then go in the -interface file and set the policy for it, otherwise the generated cpp won't -compile. -
- - - - -
- - -Note that for functions that return const T&, the policy -return_value_policy<copy_const_reference>() wil be used by default, because -that's normally what you want. You can change it to something else if you need -to, though. -
- - - - - - -
-
-
- - diff --git a/pyste/doc/pyste.txt b/pyste/doc/pyste.txt deleted file mode 100644 index 186a31cb..00000000 --- a/pyste/doc/pyste.txt +++ /dev/null @@ -1,664 +0,0 @@ -[doc Pyste Documentation] - -[/ Copyright 2003 Bruno da Silva de Oliveira and Joel de Guzman. -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) ] - -[def GCCXML [@http://www.gccxml.org GCCXML]] -[def Boost.Python [@../../index.html Boost.Python]] - -[page Introduction] - -[h2 What is Pyste?] - -Pyste is a Boost.Python code generator. The user specifies the classes and -functions to be exported using a simple ['interface file], which following the -Boost.Python's philosophy, is simple Python code. Pyste then uses GCCXML to -parse all the headers and extract the necessary information to automatically -generate C++ code. - -[h2 Example] - -Let's borrow the class [^World] from the [@../../doc/tutorial/doc/exposing_classes.html tutorial]: - - struct World - { - void set(std::string msg) { this->msg = msg; } - std::string greet() { return msg; } - std::string msg; - }; - -Here's the interface file for it, named [^world.pyste]: - - Class("World", "world.h") - -and that's it! - -The next step is invoke Pyste in the command-line: - -[pre python pyste.py --module=hello world.pyste] - -this will create a file "[^hello.cpp]" in the directory where the command was -run. - -Pyste supports the following features: - -* Functions -* Classes -* Class Templates -* Virtual Methods -* Overloading -* Attributes -* Enums (both "free" enums and class enums) -* Nested Classes -* Support for [^boost::shared_ptr] and [^std::auto_ptr] -* Global Variables - -[page Running Pyste] - -To run Pyste, you will need: - -* Python 2.2, available at [@http://www.python.org python's website]. -* The great [@http://effbot.org elementtree] library, from Fredrik Lundh. -* The excellent GCCXML, from Brad King. - -Installation for the tools is available in their respective webpages. - -[blurb -[$theme/note.gif] GCCXML must be accessible in the PATH environment variable, so -that Pyste can call it. How to do this varies from platform to platform. -] - -[h2 Ok, now what?] - -Well, now let's fire it up: - -[pre -''' ->python pyste.py - -Pyste version 0.9.26 - -Usage: - pyste [options] interface-files - -where options are: - --module= The name of the module that will be generated; - defaults to the first interface filename, without - the extension. - -I Add an include path - -D Define symbol - --multiple Create various cpps, instead of only one - (useful during development) - --out= Specify output filename (default: .cpp) - in --multiple mode, this will be a directory - --no-using Do not declare "using namespace boost"; - use explicit declarations instead - --pyste-ns= Set the namespace where new types will be declared; - default is the empty namespace - --debug Writes the xml for each file parsed in the current - directory - --cache-dir= Directory for cache files (speeds up future runs) - --only-create-cache Recreates all caches (doesn't generate code). - --generate-main Generates the _main.cpp file (in multiple mode) - --file-list A file with one pyste file per line. Use as a - substitute for passing the files in the command - line. - -h, --help Print this help and exit - -v, --version Print version information - -''' -] - -Options explained: - -The [^-I] and [^-D] are preprocessor flags, which are needed by GCCXML to parse -the header files correctly and by Pyste to find the header files declared in the -interface files. - -[^--out] names the output file (default: [^.cpp]), or in multiple mode, -names a output directory for the files (default: [^]). - -[^--no-using] tells Pyste to don't declare "[^using namespace boost;]" in the -generated cpp, using the namespace boost::python explicitly in all declarations. -Use only if you're having a name conflict in one of the files. - -Use [^--pyste-ns] to change the namespace where new types are declared (for -instance, the virtual wrappers). Use only if you are having any problems. By -default, Pyste uses the empty namespace. - -[^--debug] will write in the current directory a xml file as outputted by GCCXML -for each header parsed. Useful for bug reports. - -[^--file-list] names a file where each line points to a Pyste file. Use this instead -to pass the pyste files if you have a lot of them and your shell has some command line -size limit. - -The other options are explained below, in [@#multiple_mode [*Multiple Mode]] and -[@#cache [*Cache]]. - -[^-h, --help, -v, --version] are self-explaining, I believe. ;) - -So, the usage is simple enough: - -[pre >python pyste.py --module=mymodule file.pyste file2.pyste ...] - -will generate a file [^mymodule.cpp] in the same dir where the command was -executed. Now you can compile the file using the same instructions of the -[@../../doc/tutorial/doc/building_hello_world.html tutorial]. - -[h2 Wait... how do I set those I and D flags?] - -Don't worry: normally GCCXML is already configured correctly for your plataform, -so the search path to the standard libraries and the standard defines should -already be set. You only have to set the paths to other libraries that your code -needs, like Boost, for example. - -Plus, Pyste automatically uses the contents of the environment variable -[^INCLUDE] if it exists. Visual C++ users should run the [^Vcvars32.bat] file, -which for Visual C++ 6 is normally located at: - - C:\Program Files\Microsoft Visual Studio\VC98\bin\Vcvars32.bat - -with that, you should have little trouble setting up the flags. - -[blurb [$theme/note.gif][*A note about Psyco][br][br] -Although you don't have to install [@http://psyco.sourceforge.net/ Psyco] to -use Pyste, if you do, Pyste will make use of it to speed up the wrapper -generation. Speed ups of 30% can be achieved, so it's highly recommended. -] - - -[h2 Multiple Mode] - -The multiple mode is useful in large projects, where the presence of multiple -classes in a single file makes the compilation unpractical (excessive memory -usage, mostly). - -The solution is make Pyste generate multiple files, more specifically one cpp -file for each Pyste file. This files will contain a function named after the -file, for instance Export_MyPysteFile, which will contain all the code to export -the classes, enums, etc. You can pass as much files as you want this way: - -[pre >python pyste.py --module=mymodule file1.pyste file2.pyste] - -This will create the files [^mymodule/file1.cpp] and [^mymodule/file2.cpp]. You -can then later do: - -[pre >python pyste.py --module=mymodule file3.pyste] - -and [^mymodule/file3.cpp] will be generated. - -But compiling and linking this files won't be sufficient to generate your -extension. You have to also generate a file named [^main.cpp]; call pyste with -[*all] the Pyste files of your extension, and use the [^--generate-main] option: - -[pre >python pyste.py --module=mymodule --generate-main file1.pyste file2.pyste file3.pyste] - -Now compile and link all this files together and your extension is ready for -use. - -[h2 Cache] - -Pyste now supports a form of cache, which is a way to speed up the code -generation. Most of the time that Pyste takes to generate the code comes from -having to execute GCCXML (since being a front-end to GCC, it has to compile the -header files) and reading back the XML generated. - -When you use the [^--cache-dir=] option, Pyste will dump in the specified -directory the generated XMLs to a file named after the Pyste file, with the -extension [^.pystec]. The next time you run with this option, Pyste will use -the cache, instead of calling GCCXML again: - -[pre >python pyste.py --module=mymodule --cache-dir=cache file1.pyste] - -Will generate [^file1.cpp] and [^cache/file1.pystec]. Next time you execute -this command, the cache file will be used. Note that Pyste doesn't do any check -to ensure that the cache is up to date, but you can configure your build system to do that for you. - -When you run Pyste with [^--only-create-cache], all the cache files will be -created again, but no code will be generated. - -[page The Interface Files] - -The interface files are the heart of Pyste. The user creates one or more -interface files declaring the classes and functions he wants to export, and then -invokes Pyste passing the interface files to it. Pyste then generates a single -cpp file with Boost.Python code, with all the classes and functions exported. - -Besides declaring the classes and functions, the user has a number of other -options, like renaming e excluding classes and member functionis. Those are -explained later on. - -[h2 Basics] - -Suppose we have a class and some functions that we want to expose to Python -declared in the header [^hello.h]: - - struct World - { - World(std::string msg): msg(msg) {} - void set(std::string msg) { this->msg = msg; } - std::string greet() { return msg; } - std::string msg; - }; - - enum choice { red, blue }; - - namespace test { - - void show(choice c) { std::cout << "value: " << (int)c << std::endl; } - - } - -We create a file named [^hello.pyste] and create instances of the classes -[^Function], [^Class] and [^Enum]: - - Function("test::show", "hello.h") - Class("World", "hello.h") - Enum("choice", "hello.h") - -That will expose the class, the free function and the enum found in [^hello.h]. - -[h2 Inheritance] - -Pyste automatically generates the correct code (specifying [^bases<>] in the -[^class_] declaration) [*if] the Class() function that exports the base classes -and their children are in the same Pyste file. If that's not the case, you have -to indicate that there's a relationship between the Pyste files using the -[^Import] function specifying the other Pyste file. - -Suppose we have two classes, [^A] and [^B], and A is a base class for B. We -create two Pyste files: - -[^A.pyste]: - - Class("A", "A.h") - -[^B.pyste]: - - Import("A.pyste") - Class("B", "B.h") - -Note that we specify that [^B] needs to know about [^A] to be properly exported. - -[page:1 Renaming and Excluding] - -You can easily rename functions, classes, member functions, attributes, etc. Just use the -function [^rename], like this: - - World = Class("World", "hello.h") - rename(World, "IWorld") - show = Function("choice", "hello.h") - rename(show, "Show") - -You can rename member functions and attributes using this syntax: - - rename(World.greet, "Greet") - rename(World.set, "Set") - choice = Enum("choice", "hello.h") - rename(choice.red, "Red") - rename(choice.blue, "Blue") - -You can exclude functions, classes, member functions, attributes, etc, in the same way, -with the function [^exclude]: - - exclude(World.greet) - exclude(World.msg) - -To access the operators of a class, access the member [^operator] like this -(supposing that [^C] is a class being exported): - - exclude(C.operator['+']) - exclude(C.operator['*']) - exclude(C.operator['<<']) - -The string inside the brackets is the same as the name of the operator in C++.[br] - -[h2 Virtual Member Functions] - -Pyste automatically generates wrappers for virtual member functions, but you may -want to disable this behaviour (for performance reasons, for instance) if you do -not plan to override the functions in Python. To do this, use the function -[^final]: - - C = Class('C', 'C.h') - final(C.foo) # C::foo is a virtual member function - -No virtual wrapper code will be generated for the virtual member function -C::foo that way. - -[page:1 Policies] - -Even thought Pyste can identify various elements in the C++ code, like virtual -member functions, attributes, and so on, one thing that it can't do is to -guess the semantics of functions that return pointers or references. In this -case, the user must manually specify the policy. Policies are explained in the -[@../../doc/tutorial/doc/call_policies.html tutorial]. - -The policies in Pyste are named exactly as in Boost.Python, only the syntax is -slightly different. For instance, this policy: - - return_internal_reference<1, with_custodian_and_ward<1, 2> >() - -becomes in Pyste: - - return_internal_reference(1, with_custodian_and_ward(1, 2)) - -The user can specify policies for functions and virtual member functions with -the [^set_policy] function: - - set_policy(f, return_internal_reference()) - set_policy(C.foo, return_value_policy(manage_new_object)) - -[blurb -[$theme/note.gif] [*What if a function or member function needs a policy and -the user doesn't set one?][br][br] If a function needs a policy and one -was not set, Pyste will issue a error. The user should then go in the -interface file and set the policy for it, otherwise the generated cpp won't -compile. -] - -[blurb -[$theme/note.gif] -Note that for functions that return [^const T&], the policy -[^return_value_policy()] wil be used by default, because -that's normally what you want. You can change it to something else if you need -to, though. -] - -[page:1 Templates] - -Template classes can easily be exported too, but you can't export the template -itself... you have to export instantiations of it! So, if you want to export a -[^std::vector], you will have to export vectors of int, doubles, etc. - -Suppose we have this code: - - template - struct Point - { - T x; - T y; - }; - -And we want to export [^Point]s of int and double: - - Point = Template("Point", "point.h") - Point("int") - Point("double") - -Pyste will assign default names for each instantiation. In this example, those -would be "[^Point_int]" and "[^Point_double]", but most of the time users will want to -rename the instantiations: - - Point("int", "IPoint") // renames the instantiation - double_inst = Point("double") // another way to do the same - rename(double_inst, "DPoint") - -Note that you can rename, exclude, set policies, etc, in the [^Template] object -like you would do with a [^Function] or a [^Class]. This changes affect all -[*future] instantiations: - - Point = Template("Point", "point.h") - Point("float", "FPoint") // will have x and y as data members - rename(Point.x, "X") - rename(Point.y, "Y") - Point("int", "IPoint") // will have X and Y as data members - Point("double", "DPoint") // also will have X and Y as data member - -If you want to change a option of a particular instantiation, you can do so: - - Point = Template("Point", "point.h") - Point("int", "IPoint") - d_inst = Point("double", "DPoint") - rename(d_inst.x, "X") // only DPoint is affect by this renames, - rename(d_inst.y, "Y") // IPoint stays intact - -[blurb [$theme/note.gif] [*What if my template accepts more than one type?] -[br][br] -When you want to instantiate a template with more than one type, you can pass -either a string with the types separated by whitespace, or a list of strings -'''("int double" or ["int", "double"]''' would both work). -] - -[page:1 Wrappers] - -Suppose you have this function: - - std::vector names(); - -But you don't want to [@../../doc/v2/faq.html#question2 to export std::vector], -you want this function to return a python list of strings. Boost.Python has -excellent support for things like that: - - list names_wrapper() - { - list result; - // call original function - vector v = names(); - // put all the strings inside the python list - vector::iterator it; - for (it = v.begin(); it != v.end(); ++it){ - result.append(*it); - } - return result; - } - - BOOST_PYTHON_MODULE(test) - { - def("names", &names_wrapper); - } - -Nice heh? Pyste supports this mechanism too. You declare the [^names_wrapper] -function in a header named "[^test_wrappers.h]" and in the interface file: - - Include("test_wrappers.h") - names = Function("names", "test.h") - set_wrapper(names, "names_wrapper") - -You can optionally declare the function in the interface file itself: - - names_wrapper = Wrapper("names_wrapper", - """ - list names_wrapper() - { - // code to call name() and convert the vector to a list... - } - """) - names = Function("names", "test.h") - set_wrapper(names, names_wrapper) - -The same mechanism can be used with member functions too. Just remember that -the first parameter of wrappers for member functions is a pointer to the -class, as in: - - struct C - { - std::vector names(); - } - - list names_wrapper(C* c) - { - // same as before, calling c->names() and converting result to a list - } - -And then in the interface file: - - C = Class("C", "test.h") - set_wrapper(C.names, "names_wrapper") - -[blurb -[$theme/note.gif]Even though Boost.Python accepts either a pointer or a -reference to the class in wrappers for member functions as the first parameter, -Pyste expects them to be a [*pointer]. Doing otherwise will prevent your -code to compile when you set a wrapper for a virtual member function. -] - -[page:1 Exporting An Entire Header] - -Pyste also supports a mechanism to export all declarations found in a header -file. Suppose again our file, [^hello.h]: - - struct World - { - World(std::string msg): msg(msg) {} - void set(std::string msg) { this->msg = msg; } - std::string greet() { return msg; } - std::string msg; - }; - - enum choice { red, blue }; - - void show(choice c) { std::cout << "value: " << (int)c << std::endl; } - -You can just use the [^AllFromHeader] construct: - - hello = AllFromHeader("hello.h") - -this will export all the declarations found in [^hello.h], which is equivalent -to write: - - Class("World", "hello.h") - Enum("choice", "hello.h") - Function("show", "hello.h") - -Note that you can still use the functions [^rename], [^set_policy], [^exclude], etc. Just access -the members of the header object like this: - - rename(hello.World.greet, "Greet") - exclude(hello.World.set, "Set") - -[blurb -[$theme/note.gif] [*AllFromHeader is broken] in some cases. Until it is fixed, -use at you own risk. -] - - -[page:1 Smart Pointers] - -Pyste for now has manual support for smart pointers. Suppose: - - struct C - { - int value; - }; - - boost::shared_ptr newC(int value) - { - boost::shared_ptr c( new C() ); - c->value = value; - return c; - } - - void printC(boost::shared_ptr c) - { - std::cout << c->value << std::endl; - } - -To make [^newC] and [^printC] work correctly, you have to tell Pyste that a -convertor for [^boost::shared_ptr] is needed. - - C = Class('C', 'C.h') - use_shared_ptr(C) - Function('newC', 'C.h') - Function('printC', 'C.h') - -For [^std::auto_ptr]'s, use the function [^use_auto_ptr]. - -This system is temporary, and in the future the converters will automatically be -exported if needed, without the need to tell Pyste about them explicitly. - -[h2 Holders] - -If only the converter for the smart pointers is not enough and you need to -specify the smart pointer as the holder for a class, use the functions -[^hold_with_shared_ptr] and [^hold_with_auto_ptr]: - - C = Class('C', 'C.h') - hold_with_shared_ptr(C) - Function('newC', 'C.h') - Function('printC', 'C.h') - -[page:1 Global Variables] - -To export global variables, use the [^Var] construct: - - Var("myglobal", "foo.h") - -Beware of non-const global variables: changes in Python won't reflect in C++! -If you really must change them in Python, you will have to write some accessor -functions, and export those. - - -[page:1 Adding New Methods] - -Suppose that you want to add a function to a class, turning it into a member -function: - - struct World - { - void set(std::string msg) { this->msg = msg; } - std::string msg; - }; - - std::string greet(World& w) - { - return w.msg; - } - -Here, we want to make [^greet] work as a member function of the class [^World]. We do -that using the [^add_method] construct: - - W = Class("World", "hello.h") - add_method(W, "greet") - -Notice also that then you can rename it, set its policy, just like a regular -member function: - - rename(W.greet, 'Greet') - -Now from Python: - - >>> import hello - >>> w = hello.World() - >>> w.set('Ni') - >>> w.greet() - 'Ni' - >>> print 'Oh no! The knights who say Ni!' - Oh no! The knights who say Ni! - - -[page:1 Inserting Code] - -You can insert arbitrary code in the generated cpps, just use the functions -[^declaration_code] and [^module_code]. This will insert the given string in the -respective sections. Example: - - # file A.pyste - Class("A", "A.h") - declaration_code("/* declaration_code() comes here */\n") - module_code("/* module_code() comes here */\n") - -Will generate: - - // Includes ==================================================================== - #include - - // Using ======================================================================= - using namespace boost::python; - - // Declarations ================================================================ - - /* declaration_code() comes here */ - - // Module ====================================================================== - BOOST_PYTHON_MODULE(A) - { - class_< A >("A", init< >()) - .def(init< const A& >()) - ; - - /* module_code() comes here */ - } diff --git a/pyste/doc/renaming_and_excluding.html b/pyste/doc/renaming_and_excluding.html deleted file mode 100644 index ce6654c4..00000000 --- a/pyste/doc/renaming_and_excluding.html +++ /dev/null @@ -1,87 +0,0 @@ - - - -Renaming and Excluding - - - - - - - - - - -
- - Renaming and Excluding -
-
- - - - - - -
-

-You can easily rename functions, classes, member functions, attributes, etc. Just use the -function rename, like this:

-
-    World = Class("World", "hello.h")
-    rename(World, "IWorld")
-    show = Function("choice", "hello.h")
-    rename(show, "Show")
-
-

-You can rename member functions and attributes using this syntax:

-
-    rename(World.greet, "Greet")
-    rename(World.set, "Set")
-    choice = Enum("choice", "hello.h")
-    rename(choice.red, "Red")
-    rename(choice.blue, "Blue")
-
-

-You can exclude functions, classes, member functions, attributes, etc, in the same way, -with the function exclude:

-
-    exclude(World.greet)
-    exclude(World.msg)
-
-

-To access the operators of a class, access the member operator like this -(supposing that C is a class being exported):

-
-    exclude(C.operator['+'])
-    exclude(C.operator['*'])
-    exclude(C.operator['<<'])
-
-

-The string inside the brackets is the same as the name of the operator in C++.

-

Virtual Member Functions

-Pyste automatically generates wrappers for virtual member functions, but you may -want to disable this behaviour (for performance reasons, for instance) if you do -not plan to override the functions in Python. To do this, use the function -final:

-
-    C = Class('C', 'C.h')
-    final(C.foo) ##C::foo is a virtual member function
-
-

-No virtual wrapper code will be generated for the virtual member function -C::foo that way.

- - - - - - -
-
-
- - diff --git a/pyste/doc/running_pyste.html b/pyste/doc/running_pyste.html deleted file mode 100644 index 9bd9a3ae..00000000 --- a/pyste/doc/running_pyste.html +++ /dev/null @@ -1,200 +0,0 @@ - - - -Running Pyste - - - - - - - - - - -
- - Running Pyste -
-
- - - - - - -
-

-To run Pyste, you will need:

-

-Installation for the tools is available in their respective webpages.

- - - - -
- - -GCCXML must be accessible in the PATH environment variable, so -that Pyste can call it. How to do this varies from platform to platform. -
-

Ok, now what?

-Well, now let's fire it up:

-
-
->python pyste.py
-
-Pyste version 0.9.26
-
-Usage:
-    pyste [options] interface-files
-
-where options are:
-    --module=<name>         The name of the module that will be generated;
-                            defaults to the first interface filename, without
-                            the extension.
-    -I <path>               Add an include path
-    -D <symbol>             Define symbol
-    --multiple              Create various cpps, instead of only one
-                            (useful during development)
-    --out=<name>            Specify output filename (default: <module>.cpp)
-                            in --multiple mode, this will be a directory
-    --no-using              Do not declare "using namespace boost";
-                            use explicit declarations instead
-    --pyste-ns=<name>       Set the namespace where new types will be declared;
-                            default is the empty namespace
-    --debug                 Writes the xml for each file parsed in the current
-                            directory
-    --cache-dir=<dir>       Directory for cache files (speeds up future runs)
-    --only-create-cache     Recreates all caches (doesn't generate code).
-    --generate-main         Generates the _main.cpp file (in multiple mode)
-    --file-list             A file with one pyste file per line. Use as a 
-                            substitute for passing the files in the command
-                            line.
-    -h, --help              Print this help and exit
-    -v, --version           Print version information
-  
-                        
-

-Options explained:

-

-The -I and -D are preprocessor flags, which are needed by -GCCXML to parse -the header files correctly and by Pyste to find the header files declared in the -interface files.

-

---out names the output file (default: <module>.cpp), or in multiple mode, -names a output directory for the files (default: <module>).

-

---no-using tells Pyste to don't declare "using namespace boost;" in the -generated cpp, using the namespace boost::python explicitly in all declarations. -Use only if you're having a name conflict in one of the files.

-

-Use --pyste-ns to change the namespace where new types are declared (for -instance, the virtual wrappers). Use only if you are having any problems. By -default, Pyste uses the empty namespace.

-

---debug will write in the current directory a xml file as outputted by -GCCXML -for each header parsed. Useful for bug reports.

-

---file-list names a file where each line points to a Pyste file. Use this instead -to pass the pyste files if you have a lot of them and your shell has some command line -size limit.

-

-The other options are explained below, in -Multiple Mode and - -Cache.

-

--h, --help, -v, --version are self-explaining, I believe. ;)

-

-So, the usage is simple enough:

-
>python pyste.py --module=mymodule file.pyste file2.pyste ...

-will generate a file mymodule.cpp in the same dir where the command was -executed. Now you can compile the file using the same instructions of the - -tutorial.

-

Wait... how do I set those I and D flags?

-Don't worry: normally -GCCXML is already configured correctly for your plataform, -so the search path to the standard libraries and the standard defines should -already be set. You only have to set the paths to other libraries that your code -needs, like Boost, for example.

-

-Plus, Pyste automatically uses the contents of the environment variable -INCLUDE if it exists. Visual C++ users should run the Vcvars32.bat file, -which for Visual C++ 6 is normally located at:

-
-    C:\Program Files\Microsoft Visual Studio\VC98\bin\Vcvars32.bat
-
-

-with that, you should have little trouble setting up the flags.

- - - - -
-A note about Psyco

-Although you don't have to install -Psyco to -use Pyste, if you do, Pyste will make use of it to speed up the wrapper -generation. Speed ups of 30% can be achieved, so it's highly recommended. -
-

Multiple Mode

-The multiple mode is useful in large projects, where the presence of multiple -classes in a single file makes the compilation unpractical (excessive memory -usage, mostly).

-

-The solution is make Pyste generate multiple files, more specifically one cpp -file for each Pyste file. This files will contain a function named after the -file, for instance Export_MyPysteFile, which will contain all the code to export -the classes, enums, etc. You can pass as much files as you want this way:

-
>python pyste.py --module=mymodule file1.pyste file2.pyste

-This will create the files mymodule/file1.cpp and mymodule/file2.cpp. You -can then later do:

-
>python pyste.py --module=mymodule file3.pyste

-and mymodule/file3.cpp will be generated.

-

-But compiling and linking this files won't be sufficient to generate your -extension. You have to also generate a file named main.cpp; call pyste with -all the Pyste files of your extension, and use the --generate-main option:

-
>python pyste.py --module=mymodule --generate-main file1.pyste file2.pyste file3.pyste

-Now compile and link all this files together and your extension is ready for -use.

-

Cache

-Pyste now supports a form of cache, which is a way to speed up the code -generation. Most of the time that Pyste takes to generate the code comes from -having to execute -GCCXML (since being a front-end to GCC, it has to compile the -header files) and reading back the XML generated.

-

-When you use the --cache-dir=<dir> option, Pyste will dump in the specified -directory the generated XMLs to a file named after the Pyste file, with the -extension .pystec. The next time you run with this option, Pyste will use -the cache, instead of calling -GCCXML again:

-
>python pyste.py --module=mymodule --cache-dir=cache file1.pyste

-Will generate file1.cpp and cache/file1.pystec. Next time you execute -this command, the cache file will be used. Note that Pyste doesn't do any check -to ensure that the cache is up to date, but you can configure your build system to do that for you.

-

-When you run Pyste with --only-create-cache, all the cache files will be -created again, but no code will be generated.

- - - - - - -
-
-
- - diff --git a/pyste/doc/smart_pointers.html b/pyste/doc/smart_pointers.html deleted file mode 100644 index cddc96f2..00000000 --- a/pyste/doc/smart_pointers.html +++ /dev/null @@ -1,84 +0,0 @@ - - - -Smart Pointers - - - - - - - - - - -
- - Smart Pointers -
-
- - - - - - -
-

-Pyste for now has manual support for smart pointers. Suppose:

-
-    struct C
-    {
-        int value;
-    };
-
-    boost::shared_ptr<C> newC(int value)
-    {
-        boost::shared_ptr<C> c( new C() );
-        c->value = value;
-        return c;
-    }
-
-    void printC(boost::shared_ptr<C> c)
-    {
-        std::cout << c->value << std::endl;
-    }
-
-

-To make newC and printC work correctly, you have to tell Pyste that a -convertor for boost::shared_ptr<C> is needed.

-
-    C = Class('C', 'C.h')
-    use_shared_ptr(C)
-    Function('newC', 'C.h')
-    Function('printC', 'C.h')
-
-

-For std::auto_ptr's, use the function use_auto_ptr.

-

-This system is temporary, and in the future the converters will automatically be -exported if needed, without the need to tell Pyste about them explicitly.

-

Holders

-If only the converter for the smart pointers is not enough and you need to -specify the smart pointer as the holder for a class, use the functions -hold_with_shared_ptr and hold_with_auto_ptr:

-
-    C = Class('C', 'C.h')
-    hold_with_shared_ptr(C)
-    Function('newC', 'C.h')
-    Function('printC', 'C.h') 
-
- - - - - - -
-
-
- - diff --git a/pyste/doc/templates.html b/pyste/doc/templates.html deleted file mode 100644 index a1c1cfef..00000000 --- a/pyste/doc/templates.html +++ /dev/null @@ -1,102 +0,0 @@ - - - -Templates - - - - - - - - - - -
- - Templates -
-
- - - - - - -
-

-Template classes can easily be exported too, but you can't export the template -itself... you have to export instantiations of it! So, if you want to export a -std::vector, you will have to export vectors of int, doubles, etc.

-

-Suppose we have this code:

-
-    template <class T>
-    struct Point
-    {
-        T x;
-        T y;
-    };
-
-

-And we want to export Points of int and double:

-
-    Point = Template("Point", "point.h")
-    Point("int")
-    Point("double")
-
-

-Pyste will assign default names for each instantiation. In this example, those -would be "Point_int" and "Point_double", but most of the time users will want to -rename the instantiations:

-
-    Point("int", "IPoint")         // renames the instantiation
-    double_inst = Point("double")  // another way to do the same
-    rename(double_inst, "DPoint")
-
-

-Note that you can rename, exclude, set policies, etc, in the Template object -like you would do with a Function or a Class. This changes affect all -future instantiations:

-
-    Point = Template("Point", "point.h")
-    Point("float", "FPoint")        // will have x and y as data members
-    rename(Point.x, "X")
-    rename(Point.y, "Y")
-    Point("int", "IPoint")          // will have X and Y as data members
-    Point("double", "DPoint")       // also will have X and Y as data member
-
-

-If you want to change a option of a particular instantiation, you can do so:

-
-    Point = Template("Point", "point.h")
-    Point("int", "IPoint")          
-    d_inst = Point("double", "DPoint")       
-    rename(d_inst.x, "X")           // only DPoint is affect by this renames,
-    rename(d_inst.y, "Y")           // IPoint stays intact
-
- - - - -
- What if my template accepts more than one type? -

-When you want to instantiate a template with more than one type, you can pass -either a string with the types separated by whitespace, or a list of strings -("int double" or ["int", "double"] would both work). -
- - - - - - -
-
-
- - diff --git a/pyste/doc/the_interface_files.html b/pyste/doc/the_interface_files.html deleted file mode 100644 index 9c020043..00000000 --- a/pyste/doc/the_interface_files.html +++ /dev/null @@ -1,102 +0,0 @@ - - - -The Interface Files - - - - - - - - - - -
- - The Interface Files -
-
- - - - - - -
-

-The interface files are the heart of Pyste. The user creates one or more -interface files declaring the classes and functions he wants to export, and then -invokes Pyste passing the interface files to it. Pyste then generates a single -cpp file with -Boost.Python code, with all the classes and functions exported.

-

-Besides declaring the classes and functions, the user has a number of other -options, like renaming e excluding classes and member functionis. Those are -explained later on.

-

Basics

-Suppose we have a class and some functions that we want to expose to Python -declared in the header hello.h:

-
-    struct World
-    {
-        World(std::string msg): msg(msg) {} 
-        void set(std::string msg) { this->msg = msg; }
-        std::string greet() { return msg; }
-        std::string msg;
-    };
-
-    enum choice { red, blue };
-    
-    namespace test {
-    
-    void show(choice c) { std::cout << "value: " << (int)c << std::endl; }
-    
-    }
-
-

-We create a file named hello.pyste and create instances of the classes -Function, Class and Enum:

-
-    Function("test::show", "hello.h")
-    Class("World", "hello.h")
-    Enum("choice", "hello.h")
-
-

-That will expose the class, the free function and the enum found in hello.h.

-

Inheritance

-Pyste automatically generates the correct code (specifying bases<> in the -class_ declaration) if the Class() function that exports the base classes -and their children are in the same Pyste file. If that's not the case, you have -to indicate that there's a relationship between the Pyste files using the -Import function specifying the other Pyste file.

-

-Suppose we have two classes, A and B, and A is a base class for B. We -create two Pyste files:

-

-A.pyste:

-
-    Class("A", "A.h")
-
-

-B.pyste:

-
-    Import("A.pyste")
-    Class("B", "B.h")
-
-

-Note that we specify that B needs to know about A to be properly exported.

- - - - - - -
-
-
- - diff --git a/pyste/doc/theme/alert.gif b/pyste/doc/theme/alert.gif deleted file mode 100644 index 270764cc..00000000 Binary files a/pyste/doc/theme/alert.gif and /dev/null differ diff --git a/pyste/doc/theme/arrow.gif b/pyste/doc/theme/arrow.gif deleted file mode 100644 index e33db0fb..00000000 Binary files a/pyste/doc/theme/arrow.gif and /dev/null differ diff --git a/pyste/doc/theme/bkd.gif b/pyste/doc/theme/bkd.gif deleted file mode 100644 index dcabcb80..00000000 Binary files a/pyste/doc/theme/bkd.gif and /dev/null differ diff --git a/pyste/doc/theme/bkd2.gif b/pyste/doc/theme/bkd2.gif deleted file mode 100644 index b03d9ba9..00000000 Binary files a/pyste/doc/theme/bkd2.gif and /dev/null differ diff --git a/pyste/doc/theme/bulb.gif b/pyste/doc/theme/bulb.gif deleted file mode 100644 index 74f3baac..00000000 Binary files a/pyste/doc/theme/bulb.gif and /dev/null differ diff --git a/pyste/doc/theme/bullet.gif b/pyste/doc/theme/bullet.gif deleted file mode 100644 index da787e2e..00000000 Binary files a/pyste/doc/theme/bullet.gif and /dev/null differ diff --git a/pyste/doc/theme/l_arr.gif b/pyste/doc/theme/l_arr.gif deleted file mode 100644 index 5b3cb1cb..00000000 Binary files a/pyste/doc/theme/l_arr.gif and /dev/null differ diff --git a/pyste/doc/theme/l_arr_disabled.gif b/pyste/doc/theme/l_arr_disabled.gif deleted file mode 100644 index ed58a605..00000000 Binary files a/pyste/doc/theme/l_arr_disabled.gif and /dev/null differ diff --git a/pyste/doc/theme/note.gif b/pyste/doc/theme/note.gif deleted file mode 100644 index bd92f075..00000000 Binary files a/pyste/doc/theme/note.gif and /dev/null differ diff --git a/pyste/doc/theme/r_arr.gif b/pyste/doc/theme/r_arr.gif deleted file mode 100644 index 2dcdad11..00000000 Binary files a/pyste/doc/theme/r_arr.gif and /dev/null differ diff --git a/pyste/doc/theme/r_arr_disabled.gif b/pyste/doc/theme/r_arr_disabled.gif deleted file mode 100644 index 2100f78b..00000000 Binary files a/pyste/doc/theme/r_arr_disabled.gif and /dev/null differ diff --git a/pyste/doc/theme/smiley.gif b/pyste/doc/theme/smiley.gif deleted file mode 100644 index 4c848f8f..00000000 Binary files a/pyste/doc/theme/smiley.gif and /dev/null differ diff --git a/pyste/doc/theme/style.css b/pyste/doc/theme/style.css deleted file mode 100644 index 643df02a..00000000 --- a/pyste/doc/theme/style.css +++ /dev/null @@ -1,178 +0,0 @@ -/*============================================================================= - Copyright (c) 2003 Bruno da Silva de Oliveira - - Use, modification and distribution is subject to 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) -=============================================================================*/ - -body -{ - background-image: url(bkd.gif); - background-color: #FFFFFF; - margin: 1em 2em 1em 2em; -} - -h1 { font-family: Verdana, Arial, Helvetica, sans-serif; font-weight: bold; text-align: left; } -h2 { font: 140% sans-serif; font-weight: bold; text-align: left; } -h3 { font: 120% sans-serif; font-weight: bold; text-align: left; } -h4 { font: bold 100% sans-serif; font-weight: bold; text-align: left; } -h5 { font: italic 100% sans-serif; font-weight: bold; text-align: left; } -h6 { font: small-caps 100% sans-serif; font-weight: bold; text-align: left; } - -pre -{ - border-top: gray 1pt solid; - border-right: gray 1pt solid; - border-left: gray 1pt solid; - border-bottom: gray 1pt solid; - - padding-top: 2pt; - padding-right: 2pt; - padding-left: 2pt; - padding-bottom: 2pt; - - display: block; - font-family: "courier new", courier, mono; - background-color: #eeeeee; font-size: small -} - -code -{ - font-family: "Courier New", Courier, mono; - font-size: small -} - -tt -{ - display: inline; - font-family: "Courier New", Courier, mono; - color: #000099; - font-size: small -} - -p -{ - text-align: justify; - font-family: Georgia, "Times New Roman", Times, serif -} - -ul -{ - list-style-image: url(bullet.gif); - font-family: Georgia, "Times New Roman", Times, serif -} - -ol -{ - font-family: Georgia, "Times New Roman", Times, serif -} - -a -{ - font-weight: bold; - color: #003366; - text-decoration: none; -} - -a:hover { color: #8080FF; } - -.literal { color: #666666; font-style: italic} -.keyword { color: #000099} -.identifier {} -.comment { font-style: italic; color: #990000} -.special { color: #800040} -.preprocessor { color: #FF0000} -.string { font-style: italic; color: #666666} -.copyright { color: #666666; font-size: small} -.white_bkd { background-color: #FFFFFF} -.dk_grey_bkd { background-color: #999999} -.quotes { color: #666666; font-style: italic; font-weight: bold} - -.note_box -{ - display: block; - - border-top: gray 1pt solid; - border-right: gray 1pt solid; - border-left: gray 1pt solid; - border-bottom: gray 1pt solid; - - padding-right: 12pt; - padding-left: 12pt; - padding-bottom: 12pt; - padding-top: 12pt; - - font-family: Arial, Helvetica, sans-serif; - background-color: #E2E9EF; - font-size: small; text-align: justify -} - -.table_title -{ - background-color: #648CCA; - - font-family: Verdana, Arial, Helvetica, sans-serif; color: #FFFFFF; - font-weight: bold -; padding-top: 4px; padding-right: 4px; padding-bottom: 4px; padding-left: 4px -} - -.table_cells -{ - background-color: #E2E9EF; - - font-family: Geneva, Arial, Helvetica, san-serif; - font-size: small -; padding-top: 4px; padding-right: 4px; padding-bottom: 4px; padding-left: 4px -} - -.toc -{ - DISPLAY: block; - background-color: #E2E9EF - font-family: Arial, Helvetica, sans-serif; - - border-top: gray 1pt solid; - border-left: gray 1pt solid; - border-bottom: gray 1pt solid; - border-right: gray 1pt solid; - - padding-top: 24pt; - padding-right: 24pt; - padding-left: 24pt; - padding-bottom: 24pt; -} - -.toc_title -{ - background-color: #648CCA; - padding-top: 4px; - padding-right: 4px; - padding-bottom: 4px; - padding-left: 4px; - font-family: Geneva, Arial, Helvetica, san-serif; - color: #FFFFFF; - font-weight: bold -} - -.toc_cells -{ - background-color: #E2E9EF; - padding-top: 4px; - padding-right: 4px; - padding-bottom: 4px; - padding-left: 4px; - font-family: Geneva, Arial, Helvetica, san-serif; - font-size: small -} - -div.logo -{ - float: right; -} - -.toc_cells_L0 { background-color: #E2E9EF; padding-top: 4px; padding-right: 4px; padding-bottom: 4px; padding-left: 4px; font-family: Geneva, Arial, Helvetica, san-serif; font-size: small } -.toc_cells_L1 { background-color: #E2E9EF; padding-top: 4px; padding-right: 4px; padding-bottom: 4px; padding-left: 44px; font-family: Geneva, Arial, Helvetica, san-serif; font-size: small } -.toc_cells_L2 { background-color: #E2E9EF; padding-top: 4px; padding-right: 4px; padding-bottom: 4px; padding-left: 88px; font-family: Geneva, Arial, Helvetica, san-serif; font-size: small } -.toc_cells_L3 { background-color: #E2E9EF; padding-top: 4px; padding-right: 4px; padding-bottom: 4px; padding-left: 122px; font-family: Geneva, Arial, Helvetica, san-serif; font-size: small } -.toc_cells_L4 { background-color: #E2E9EF; padding-top: 4px; padding-right: 4px; padding-bottom: 4px; padding-left: 166px; font-family: Geneva, Arial, Helvetica, san-serif; font-size: small } diff --git a/pyste/doc/theme/u_arr.gif b/pyste/doc/theme/u_arr.gif deleted file mode 100644 index ada3d6e0..00000000 Binary files a/pyste/doc/theme/u_arr.gif and /dev/null differ diff --git a/pyste/doc/wrappers.html b/pyste/doc/wrappers.html deleted file mode 100644 index 534ae552..00000000 --- a/pyste/doc/wrappers.html +++ /dev/null @@ -1,124 +0,0 @@ - - - -Wrappers - - - - - - - - - - -
- - Wrappers -
-
- - - - - - -
-

-Suppose you have this function:

-
-    std::vector<std::string> names();
-
-

-But you don't want to -to export std::vector<std::string>, -you want this function to return a python list of strings. -Boost.Python has -excellent support for things like that:

-
-    list names_wrapper()
-    {
-        list result;
-        // call original function
-        vector<string> v = names();
-        // put all the strings inside the python list
-        vector<string>::iterator it;
-        for (it = v.begin(); it != v.end(); ++it){
-            result.append(*it);    
-        }
-        return result;
-    }
-    
-    BOOST_PYTHON_MODULE(test)
-    {
-        def("names", &names_wrapper);
-    }
-
-

-Nice heh? Pyste supports this mechanism too. You declare the names_wrapper -function in a header named "test_wrappers.h" and in the interface file:

-
-    Include("test_wrappers.h")
-    names = Function("names", "test.h")
-    set_wrapper(names, "names_wrapper")
-
-

-You can optionally declare the function in the interface file itself:

-
-    names_wrapper = Wrapper("names_wrapper",
-    """
-    list names_wrapper()
-    {
-        // code to call name() and convert the vector to a list...
-    }
-    """)
-    names = Function("names", "test.h")
-    set_wrapper(names, names_wrapper)
-
-

-The same mechanism can be used with member functions too. Just remember that -the first parameter of wrappers for member functions is a pointer to the -class, as in:

-
-    struct C
-    {
-        std::vector<std::string> names();
-    }
-
-    list names_wrapper(C* c)
-    {
-        // same as before, calling c->names() and converting result to a list 
-    }
-
-

-And then in the interface file:

-
-    C = Class("C", "test.h")
-    set_wrapper(C.names, "names_wrapper")
-
- - - - -
- -Even though -Boost.Python accepts either a pointer or a -reference to the class in wrappers for member functions as the first parameter, -Pyste expects them to be a pointer. Doing otherwise will prevent your -code to compile when you set a wrapper for a virtual member function. -
- - - - - - -
-
-
- - diff --git a/pyste/index.html b/pyste/index.html deleted file mode 100644 index 953b37c1..00000000 --- a/pyste/index.html +++ /dev/null @@ -1,90 +0,0 @@ - - - -Pyste Documentation - - - - - - - - - -
- - Pyste Documentation -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Table of contents
- Introduction -
- Running Pyste -
- The Interface Files -
- Renaming and Excluding -
- Policies -
- Templates -
- Wrappers -
- Exporting An Entire Header -
- Smart Pointers -
- Global Variables -
- Adding New Methods -
- Inserting Code -
-
-
- - diff --git a/pyste/install/pyste.py b/pyste/install/pyste.py deleted file mode 100644 index da926235..00000000 --- a/pyste/install/pyste.py +++ /dev/null @@ -1,8 +0,0 @@ -#!/usr/bin/env python - -# Copyright Bruno da Silva de Oliveira 2006. 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) - -from Pyste import pyste -pyste.main() diff --git a/pyste/install/setup.py b/pyste/install/setup.py deleted file mode 100644 index c1703981..00000000 --- a/pyste/install/setup.py +++ /dev/null @@ -1,20 +0,0 @@ -# Copyright Prabhu Ramachandran 2006. 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) - -from distutils.core import setup -import sys - -setup (name = "Pyste", - version = "0.9.10", - description = "Pyste - Python Semi-Automatic Exporter", - maintainer = "Bruno da Silva de Oliveira", - maintainer_email = "nicodemus@globalite.com.br", - licence = "Boost License", - long_description = "Pyste is a Boost.Python code generator", - url = "http://www.boost.org/libs/python/pyste/index.html", - platforms = ['Any'], - packages = ['Pyste'], - scripts = ['pyste.py'], - package_dir = {'Pyste': '../src/Pyste'}, - ) diff --git a/pyste/src/Pyste/ClassExporter.py b/pyste/src/Pyste/ClassExporter.py deleted file mode 100644 index decaf628..00000000 --- a/pyste/src/Pyste/ClassExporter.py +++ /dev/null @@ -1,918 +0,0 @@ -# Copyright Bruno da Silva de Oliveira 2003. Use, modification and -# distribution is subject to 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) - -import exporters -from Exporter import Exporter -from declarations import * -from settings import * -from policies import * -from SingleCodeUnit import SingleCodeUnit -from EnumExporter import EnumExporter -from utils import makeid, enumerate -import copy -import exporterutils -import re - -#============================================================================== -# ClassExporter -#============================================================================== -class ClassExporter(Exporter): - 'Generates boost.python code to export a class declaration' - - def __init__(self, info, parser_tail=None): - Exporter.__init__(self, info, parser_tail) - # sections of code - self.sections = {} - # template: each item in the list is an item into the class_<...> - # section. - self.sections['template'] = [] - # constructor: each item in the list is a parameter to the class_ - # constructor, like class_(...) - self.sections['constructor'] = [] - # inside: everything within the class_<> statement - self.sections['inside'] = [] - # scope: items outside the class statement but within its scope. - # scope* s = new scope(class<>()); - # ... - # delete s; - self.sections['scope'] = [] - # declarations: outside the BOOST_PYTHON_MODULE macro - self.sections['declaration'] = [] - self.sections['declaration-outside'] = [] - self.sections['include'] = [] - # a list of Constructor instances - self.constructors = [] - # a list of code units, generated by nested declarations - self.nested_codeunits = [] - - - def ScopeName(self): - return makeid(self.class_.FullName()) + '_scope' - - - def Name(self): - return self.info.name - - - def SetDeclarations(self, declarations): - Exporter.SetDeclarations(self, declarations) - if self.declarations: - decl = self.GetDeclaration(self.info.name) - if isinstance(decl, Typedef): - self.class_ = self.GetDeclaration(decl.type.name) - if not self.info.rename: - self.info.rename = decl.name - else: - self.class_ = decl - self.class_ = copy.deepcopy(self.class_) - else: - self.class_ = None - - - def ClassBases(self): - all_bases = [] - for level in self.class_.hierarchy: - for base in level: - all_bases.append(base) - return [self.GetDeclaration(x.name) for x in all_bases] - - - def Order(self): - '''Return the TOTAL number of bases that this class has, including the - bases' bases. Do this because base classes must be instantialized - before the derived classes in the module definition. - ''' - num_bases = len(self.ClassBases()) - return num_bases, self.class_.FullName() - - - def Export(self, codeunit, exported_names): - self.InheritMethods(exported_names) - self.MakeNonVirtual() - if not self.info.exclude: - self.ExportBasics() - self.ExportBases(exported_names) - self.ExportConstructors() - self.ExportVariables() - self.ExportVirtualMethods(codeunit) - self.ExportMethods() - self.ExportOperators() - self.ExportNestedClasses(exported_names) - self.ExportNestedEnums(exported_names) - self.ExportSmartPointer() - self.ExportOpaquePointerPolicies() - self.ExportAddedCode() - self.Write(codeunit) - exported_names[self.Name()] = 1 - - - def InheritMethods(self, exported_names): - '''Go up in the class hierarchy looking for classes that were not - exported yet, and then add their public members to this classes - members, as if they were members of this class. This allows the user to - just export one type and automatically get all the members from the - base classes. - ''' - valid_members = (Method, ClassVariable, NestedClass, ClassEnumeration) - fullnames = [x.FullName() for x in self.class_] - pointers = [x.PointerDeclaration(True) for x in self.class_ if isinstance(x, Method)] - fullnames = dict([(x, None) for x in fullnames]) - pointers = dict([(x, None) for x in pointers]) - for level in self.class_.hierarchy: - level_exported = False - for base in level: - base = self.GetDeclaration(base.name) - if base.FullName() not in exported_names: - for member in base: - if type(member) in valid_members: - member_copy = copy.deepcopy(member) - member_copy.class_ = self.class_.FullName() - if isinstance(member_copy, Method): - pointer = member_copy.PointerDeclaration(True) - if pointer not in pointers: - self.class_.AddMember(member) - pointers[pointer] = None - elif member_copy.FullName() not in fullnames: - self.class_.AddMember(member) - else: - level_exported = True - if level_exported: - break - def IsValid(member): - return isinstance(member, valid_members) and member.visibility == Scope.public - self.public_members = [x for x in self.class_ if IsValid(x)] - - - def Write(self, codeunit): - indent = self.INDENT - boost_ns = namespaces.python - pyste_ns = namespaces.pyste - code = '' - # begin a scope for this class if needed - nested_codeunits = self.nested_codeunits - needs_scope = self.sections['scope'] or nested_codeunits - if needs_scope: - scope_name = self.ScopeName() - code += indent + boost_ns + 'scope* %s = new %sscope(\n' %\ - (scope_name, boost_ns) - # export the template section - template_params = ', '.join(self.sections['template']) - code += indent + boost_ns + 'class_< %s >' % template_params - # export the constructor section - constructor_params = ', '.join(self.sections['constructor']) - code += '(%s)\n' % constructor_params - # export the inside section - in_indent = indent*2 - for line in self.sections['inside']: - code += in_indent + line + '\n' - # write the scope section and end it - if not needs_scope: - code += indent + ';\n' - else: - code += indent + ');\n' - for line in self.sections['scope']: - code += indent + line + '\n' - # write the contents of the nested classes - for nested_unit in nested_codeunits: - code += '\n' + nested_unit.Section('module') - # close the scope - code += indent + 'delete %s;\n' % scope_name - - # write the code to the module section in the codeunit - codeunit.Write('module', code + '\n') - - # write the declarations to the codeunit - declarations = '\n'.join(self.sections['declaration']) - for nested_unit in nested_codeunits: - declarations += nested_unit.Section('declaration') - if declarations: - codeunit.Write('declaration', declarations + '\n') - declarations_outside = '\n'.join(self.sections['declaration-outside']) - if declarations_outside: - codeunit.Write('declaration-outside', declarations_outside + '\n') - - # write the includes to the codeunit - includes = '\n'.join(self.sections['include']) - for nested_unit in nested_codeunits: - includes += nested_unit.Section('include') - if includes: - codeunit.Write('include', includes) - - - def Add(self, section, item): - 'Add the item into the corresponding section' - self.sections[section].append(item) - - - def ExportBasics(self): - '''Export the name of the class and its class_ statement.''' - class_name = self.class_.FullName() - self.Add('template', class_name) - name = self.info.rename or self.class_.name - self.Add('constructor', '"%s"' % name) - - - def ExportBases(self, exported_names): - 'Expose the bases of the class into the template section' - hierarchy = self.class_.hierarchy - exported = [] - for level in hierarchy: - for base in level: - if base.visibility == Scope.public and base.name in exported_names: - exported.append(base.name) - if exported: - break - if exported: - code = namespaces.python + 'bases< %s > ' % (', '.join(exported)) - self.Add('template', code) - - - def ExportConstructors(self): - '''Exports all the public contructors of the class, plus indicates if the - class is noncopyable. - ''' - py_ns = namespaces.python - indent = self.INDENT - - def init_code(cons): - 'return the init<>() code for the given contructor' - param_list = [p.FullName() for p in cons.parameters] - min_params_list = param_list[:cons.minArgs] - max_params_list = param_list[cons.minArgs:] - min_params = ', '.join(min_params_list) - max_params = ', '.join(max_params_list) - init = py_ns + 'init< ' - init += min_params - if max_params: - if min_params: - init += ', ' - init += py_ns + ('optional< %s >' % max_params) - init += ' >()' - return init - - constructors = [x for x in self.public_members if isinstance(x, Constructor)] - # don't export copy constructors if the class is abstract - # we could remove all constructors, but this will have the effect of - # inserting no_init in the declaration, which would not allow - # even subclasses to be instantiated. - self.constructors = constructors[:] - if self.class_.abstract: - for cons in constructors: - if cons.IsCopy(): - constructors.remove(cons) - break - - if not constructors: - # declare no_init - self.Add('constructor', py_ns + 'no_init') - else: - # write the constructor with less parameters to the constructor section - smaller = None - for cons in constructors: - if smaller is None or len(cons.parameters) < len(smaller.parameters): - smaller = cons - assert smaller is not None - self.Add('constructor', init_code(smaller)) - constructors.remove(smaller) - # write the rest to the inside section, using def() - for cons in constructors: - code = '.def(%s)' % init_code(cons) - self.Add('inside', code) - - # check if the class is copyable - if not self.class_.HasCopyConstructor() or self.class_.abstract: - self.Add('template', namespaces.boost + 'noncopyable') - - - def ExportVariables(self): - 'Export the variables of the class, both static and simple variables' - vars = [x for x in self.public_members if isinstance(x, Variable)] - for var in vars: - if self.info[var.name].exclude: - continue - name = self.info[var.name].rename or var.name - fullname = var.FullName() - if var.type.const: - def_ = '.def_readonly' - else: - def_ = '.def_readwrite' - code = '%s("%s", &%s)' % (def_, name, fullname) - self.Add('inside', code) - - - def OverloadName(self, method): - 'Returns the name of the overloads struct for the given method' - name = makeid(method.FullName()) - overloads = '_overloads_%i_%i' % (method.minArgs, method.maxArgs) - return name + overloads - - - def GetAddedMethods(self): - added_methods = self.info.__added__ - result = [] - if added_methods: - for name, rename in added_methods: - decl = self.GetDeclaration(name) - self.info[name].rename = rename - result.append(decl) - return result - - - def ExportMethods(self): - '''Export all the non-virtual methods of this class, plus any function - that is to be exported as a method''' - - declared = {} - def DeclareOverloads(m): - 'Declares the macro for the generation of the overloads' - if (isinstance(m, Method) and m.static) or type(m) == Function: - func = m.FullName() - macro = 'BOOST_PYTHON_FUNCTION_OVERLOADS' - else: - func = m.name - macro = 'BOOST_PYTHON_MEMBER_FUNCTION_OVERLOADS' - code = '%s(%s, %s, %i, %i)\n' % (macro, self.OverloadName(m), func, m.minArgs, m.maxArgs) - if code not in declared: - declared[code] = True - self.Add('declaration', code) - - - def Pointer(m): - 'returns the correct pointer declaration for the method m' - # check if this method has a wrapper set for him - wrapper = self.info[m.name].wrapper - if wrapper: - return '&' + wrapper.FullName() - else: - return m.PointerDeclaration() - - def IsExportable(m): - 'Returns true if the given method is exportable by this routine' - ignore = (Constructor, ClassOperator, Destructor) - return isinstance(m, Function) and not isinstance(m, ignore) and not m.virtual - - methods = [x for x in self.public_members if IsExportable(x)] - methods.extend(self.GetAddedMethods()) - - staticmethods = {} - - for method in methods: - method_info = self.info[method.name] - - # skip this method if it was excluded by the user - if method_info.exclude: - continue - - # rename the method if the user requested - name = method_info.rename or method.name - - # warn the user if this method needs a policy and doesn't have one - method_info.policy = exporterutils.HandlePolicy(method, method_info.policy) - - # check for policies - policy = method_info.policy or '' - if policy: - policy = ', %s%s()' % (namespaces.python, policy.Code()) - # check for overloads - overload = '' - if method.minArgs != method.maxArgs and not method_info.wrapper: - # add the overloads for this method - DeclareOverloads(method) - overload_name = self.OverloadName(method) - overload = ', %s%s()' % (namespaces.pyste, overload_name) - - # build the .def string to export the method - pointer = Pointer(method) - code = '.def("%s", %s' % (name, pointer) - code += policy - code += overload - code += ')' - self.Add('inside', code) - # static method - if isinstance(method, Method) and method.static: - staticmethods[name] = 1 - # add wrapper code if this method has one - wrapper = method_info.wrapper - if wrapper and wrapper.code: - self.Add('declaration', wrapper.code) - - # export staticmethod statements - for name in staticmethods: - code = '.staticmethod("%s")' % name - self.Add('inside', code) - - - - def MakeNonVirtual(self): - '''Make all methods that the user indicated to no_override no more virtual, delegating their - export to the ExportMethods routine''' - for member in self.class_: - if type(member) == Method and member.virtual: - member.virtual = not self.info[member.name].no_override - - - def ExportVirtualMethods(self, codeunit): - # check if this class has any virtual methods - has_virtual_methods = False - for member in self.class_: - if type(member) == Method and member.virtual: - has_virtual_methods = True - break - - holder = self.info.holder - if has_virtual_methods: - generator = _VirtualWrapperGenerator(self.class_, self.ClassBases(), self.info, codeunit) - if holder: - self.Add('template', holder(generator.FullName())) - else: - self.Add('template', generator.FullName()) - for definition in generator.GenerateDefinitions(): - self.Add('inside', definition) - self.Add('declaration', generator.GenerateVirtualWrapper(self.INDENT)) - else: - if holder: - self.Add('template', holder(self.class_.FullName())) - - # operators natively supported by boost - BOOST_SUPPORTED_OPERATORS = '+ - * / % ^ & ! ~ | < > == != <= >= << >> && || += -= '\ - '*= /= %= ^= &= |= <<= >>='.split() - # create a map for faster lookup - BOOST_SUPPORTED_OPERATORS = dict(zip(BOOST_SUPPORTED_OPERATORS, range(len(BOOST_SUPPORTED_OPERATORS)))) - - # a dict of operators that are not directly supported by boost, but can be exposed - # simply as a function with a special name - BOOST_RENAME_OPERATORS = { - '()' : '__call__', - } - - # converters which have a special name in python - # it's a map of a regular expression of the converter's result to the - # appropriate python name - SPECIAL_CONVERTERS = { - re.compile(r'(const)?\s*double$') : '__float__', - re.compile(r'(const)?\s*float$') : '__float__', - re.compile(r'(const)?\s*int$') : '__int__', - re.compile(r'(const)?\s*long$') : '__long__', - re.compile(r'(const)?\s*char\s*\*?$') : '__str__', - re.compile(r'(const)?.*::basic_string<.*>\s*(\*|\&)?$') : '__str__', - } - - - def ExportOperators(self): - 'Export all member operators and free operators related to this class' - - def GetFreeOperators(): - 'Get all the free (global) operators related to this class' - operators = [] - for decl in self.declarations: - if isinstance(decl, Operator): - # check if one of the params is this class - for param in decl.parameters: - if param.name == self.class_.FullName(): - operators.append(decl) - break - return operators - - def GetOperand(param): - 'Returns the operand of this parameter (either "self", or "other")' - if param.name == self.class_.FullName(): - return namespaces.python + 'self' - else: - return namespaces.python + ('other< %s >()' % param.name) - - - def HandleSpecialOperator(operator): - # gatter information about the operator and its parameters - result_name = operator.result.name - param1_name = '' - if operator.parameters: - param1_name = operator.parameters[0].name - - # check for str - ostream = 'basic_ostream' - is_str = result_name.find(ostream) != -1 and param1_name.find(ostream) != -1 - if is_str: - namespace = namespaces.python + 'self_ns::' - self_ = namespaces.python + 'self' - return '.def(%sstr(%s))' % (namespace, self_) - - # is not a special operator - return None - - - - frees = GetFreeOperators() - members = [x for x in self.public_members if type(x) == ClassOperator] - all_operators = frees + members - operators = [x for x in all_operators if not self.info['operator'][x.name].exclude] - - for operator in operators: - # gatter information about the operator, for use later - wrapper = self.info['operator'][operator.name].wrapper - if wrapper: - pointer = '&' + wrapper.FullName() - if wrapper.code: - self.Add('declaration-outside', wrapper.code) - else: - pointer = operator.PointerDeclaration() - rename = self.info['operator'][operator.name].rename - - # check if this operator will be exported as a method - export_as_method = wrapper or rename or operator.name in self.BOOST_RENAME_OPERATORS - - # check if this operator has a special representation in boost - special_code = HandleSpecialOperator(operator) - has_special_representation = special_code is not None - - if export_as_method: - # export this operator as a normal method, renaming or using the given wrapper - if not rename: - if wrapper: - rename = wrapper.name - else: - rename = self.BOOST_RENAME_OPERATORS[operator.name] - policy = '' - policy_obj = self.info['operator'][operator.name].policy - if policy_obj: - policy = ', %s()' % policy_obj.Code() - self.Add('inside', '.def("%s", %s%s)' % (rename, pointer, policy)) - - elif has_special_representation: - self.Add('inside', special_code) - - elif operator.name in self.BOOST_SUPPORTED_OPERATORS: - # export this operator using boost's facilities - op = operator - is_unary = isinstance(op, Operator) and len(op.parameters) == 1 or\ - isinstance(op, ClassOperator) and len(op.parameters) == 0 - if is_unary: - self.Add('inside', '.def( %s%sself )' % \ - (operator.name, namespaces.python)) - else: - # binary operator - if len(operator.parameters) == 2: - left_operand = GetOperand(operator.parameters[0]) - right_operand = GetOperand(operator.parameters[1]) - else: - left_operand = namespaces.python + 'self' - right_operand = GetOperand(operator.parameters[0]) - self.Add('inside', '.def( %s %s %s )' % \ - (left_operand, operator.name, right_operand)) - - # export the converters. - # export them as simple functions with a pre-determined name - - converters = [x for x in self.public_members if type(x) == ConverterOperator] - - def ConverterMethodName(converter): - result_fullname = converter.result.FullName() - result_name = converter.result.name - for regex, method_name in self.SPECIAL_CONVERTERS.items(): - if regex.match(result_fullname): - return method_name - else: - # extract the last name from the full name - result_name = makeid(result_name) - return 'to_' + result_name - - for converter in converters: - info = self.info['operator'][converter.result.FullName()] - # check if this operator should be excluded - if info.exclude: - continue - - special_code = HandleSpecialOperator(converter) - if info.rename or not special_code: - # export as method - name = info.rename or ConverterMethodName(converter) - pointer = converter.PointerDeclaration() - policy_code = '' - if info.policy: - policy_code = ', %s()' % info.policy.Code() - self.Add('inside', '.def("%s", %s%s)' % (name, pointer, policy_code)) - - elif special_code: - self.Add('inside', special_code) - - - - def ExportNestedClasses(self, exported_names): - nested_classes = [x for x in self.public_members if isinstance(x, NestedClass)] - for nested_class in nested_classes: - nested_info = self.info[nested_class.name] - nested_info.include = self.info.include - nested_info.name = nested_class.FullName() - exporter = self.__class__(nested_info) - exporter.SetDeclarations(self.declarations) - codeunit = SingleCodeUnit(None, None) - exporter.Export(codeunit, exported_names) - self.nested_codeunits.append(codeunit) - - - def ExportNestedEnums(self, exported_names): - nested_enums = [x for x in self.public_members if isinstance(x, ClassEnumeration)] - for enum in nested_enums: - enum_info = self.info[enum.name] - enum_info.include = self.info.include - enum_info.name = enum.FullName() - exporter = EnumExporter(enum_info) - exporter.SetDeclarations(self.declarations) - codeunit = SingleCodeUnit(None, None) - exporter.Export(codeunit, exported_names) - self.nested_codeunits.append(codeunit) - - - def ExportSmartPointer(self): - smart_ptr = self.info.smart_ptr - if smart_ptr: - class_name = self.class_.FullName() - smart_ptr = smart_ptr % class_name - self.Add('scope', '%sregister_ptr_to_python< %s >();' % (namespaces.python, smart_ptr)) - - - def ExportOpaquePointerPolicies(self): - # check all methods for 'return_opaque_pointer' policies - methods = [x for x in self.public_members if isinstance(x, Method)] - for method in methods: - return_opaque_policy = return_value_policy(return_opaque_pointer) - if self.info[method.name].policy == return_opaque_policy: - macro = exporterutils.EspecializeTypeID(method.result.name) - if macro: - self.Add('declaration-outside', macro) - - def ExportAddedCode(self): - if self.info.__code__: - for code in self.info.__code__: - self.Add('inside', code) - - -#============================================================================== -# Virtual Wrapper utils -#============================================================================== - -def _ParamsInfo(m, count=None): - if count is None: - count = len(m.parameters) - param_names = ['p%i' % i for i in range(count)] - param_types = [x.FullName() for x in m.parameters[:count]] - params = ['%s %s' % (t, n) for t, n in zip(param_types, param_names)] - #for i, p in enumerate(m.parameters[:count]): - # if p.default is not None: - # #params[i] += '=%s' % p.default - # params[i] += '=%s' % (p.name + '()') - params = ', '.join(params) - return params, param_names, param_types - - -class _VirtualWrapperGenerator(object): - 'Generates code to export the virtual methods of the given class' - - def __init__(self, class_, bases, info, codeunit): - self.class_ = copy.deepcopy(class_) - self.bases = bases[:] - self.info = info - self.wrapper_name = makeid(class_.FullName()) + '_Wrapper' - self.virtual_methods = None - self._method_count = {} - self.codeunit = codeunit - self.GenerateVirtualMethods() - - - SELF = 'py_self' - - - def DefaultImplementationNames(self, method): - '''Returns a list of default implementations for this method, one for each - number of default arguments. Always returns at least one name, and return from - the one with most arguments to the one with the least. - ''' - base_name = 'default_' + method.name - minArgs = method.minArgs - maxArgs = method.maxArgs - if minArgs == maxArgs: - return [base_name] - else: - return [base_name + ('_%i' % i) for i in range(minArgs, maxArgs+1)] - - - def Declaration(self, method, indent): - '''Returns a string with the declarations of the virtual wrapper and - its default implementations. This string must be put inside the Wrapper - body. - ''' - pyste = namespaces.pyste - python = namespaces.python - rename = self.info[method.name].rename or method.name - result = method.result.FullName() - return_str = 'return ' - if result == 'void': - return_str = '' - params, param_names, param_types = _ParamsInfo(method) - constantness = '' - if method.const: - constantness = ' const' - - # call_method callback - decl = indent + '%s %s(%s)%s%s {\n' % (result, method.name, params, constantness, method.Exceptions()) - param_names_str = ', '.join(param_names) - if param_names_str: - param_names_str = ', ' + param_names_str - - self_str = self.SELF - - decl += indent*2 + '%(return_str)s%(python)scall_method< %(result)s >' \ - '(%(self_str)s, "%(rename)s"%(param_names_str)s);\n' % locals() - decl += indent + '}\n' - - # default implementations (with overloading) - def DefaultImpl(method, param_names): - 'Return the body of a default implementation wrapper' - indent2 = indent * 2 - wrapper = self.info[method.name].wrapper - if not wrapper: - # return the default implementation of the class - return indent2 + '%s%s(%s);\n' % \ - (return_str, method.FullName(), ', '.join(param_names)) - else: - if wrapper.code: - self.codeunit.Write('declaration-outside', wrapper.code) - # return a call for the wrapper - params = ', '.join(['this'] + param_names) - return indent2 + '%s%s(%s);\n' % (return_str, wrapper.FullName(), params) - - if not method.abstract and method.visibility != Scope.private: - minArgs = method.minArgs - maxArgs = method.maxArgs - impl_names = self.DefaultImplementationNames(method) - for impl_name, argNum in zip(impl_names, range(minArgs, maxArgs+1)): - params, param_names, param_types = _ParamsInfo(method, argNum) - decl += '\n' - decl += indent + '%s %s(%s)%s {\n' % (result, impl_name, params, constantness) - decl += DefaultImpl(method, param_names) - decl += indent + '}\n' - return decl - - - def MethodDefinition(self, method): - '''Returns a list of lines, which should be put inside the class_ - statement to export this method.''' - # dont define abstract methods - pyste = namespaces.pyste - rename = self.info[method.name].rename or method.name - default_names = self.DefaultImplementationNames(method) - class_name = self.class_.FullName() - wrapper_name = pyste + self.wrapper_name - result = method.result.FullName() - is_method_unique = method.is_unique - constantness = '' - if method.const: - constantness = ' const' - - # create a list of default-impl pointers - minArgs = method.minArgs - maxArgs = method.maxArgs - if method.abstract: - default_pointers = [] - elif is_method_unique: - default_pointers = ['&%s::%s' % (wrapper_name, x) for x in default_names] - else: - default_pointers = [] - for impl_name, argNum in zip(default_names, range(minArgs, maxArgs+1)): - param_list = [x.FullName() for x in method.parameters[:argNum]] - params = ', '.join(param_list) - signature = '%s (%s::*)(%s)%s' % (result, wrapper_name, params, constantness) - default_pointer = '(%s)&%s::%s' % (signature, wrapper_name, impl_name) - default_pointers.append(default_pointer) - - # get the pointer of the method - pointer = method.PointerDeclaration() - if method.abstract: - pointer = namespaces.python + ('pure_virtual(%s)' % pointer) - - # warn the user if this method needs a policy and doesn't have one - method_info = self.info[method.name] - method_info.policy = exporterutils.HandlePolicy(method, method_info.policy) - - # Add policy to overloaded methods also - policy = method_info.policy or '' - if policy: - policy = ', %s%s()' % (namespaces.python, policy.Code()) - - # generate the defs - definitions = [] - # basic def - if default_pointers: - definitions.append('.def("%s", %s, %s%s)' % (rename, pointer, default_pointers[-1], policy)) - for default_pointer in default_pointers[:-1]: - definitions.append('.def("%s", %s%s)' % (rename, default_pointer, policy)) - else: - definitions.append('.def("%s", %s%s)' % (rename, pointer, policy)) - return definitions - - - def FullName(self): - return namespaces.pyste + self.wrapper_name - - - def GenerateVirtualMethods(self): - '''To correctly export all virtual methods, we must also make wrappers - for the virtual methods of the bases of this class, as if the methods - were from this class itself. - This method creates the instance variable self.virtual_methods. - ''' - def IsVirtual(m): - if type(m) is Method: - pure_virtual = m.abstract and m.virtual - virtual = m.virtual and m.visibility != Scope.private - return virtual or pure_virtual - else: - return False - - # extract the virtual methods, avoiding duplications. The duplication - # must take in account the full signature without the class name, so - # that inherited members are correctly excluded if the subclass overrides - # them. - def MethodSig(method): - if method.const: - const = ' const' - else: - const = '' - if method.result: - result = method.result.FullName() - else: - result = '' - params = ', '.join([x.FullName() for x in method.parameters]) - return '%s %s(%s)%s%s' % ( - result, method.name, params, const, method.Exceptions()) - - already_added = {} - self.virtual_methods = [] - for member in self.class_: - if IsVirtual(member): - already_added[MethodSig(member)] = None - self.virtual_methods.append(member) - - for base in self.bases: - base_methods = [copy.deepcopy(x) for x in base if IsVirtual(x)] - for base_method in base_methods: - self.class_.AddMember(base_method) - - all_methods = [x for x in self.class_ if IsVirtual(x)] - - for member in all_methods: - sig = MethodSig(member) - if IsVirtual(member) and not sig in already_added: - self.virtual_methods.append(member) - already_added[sig] = 0 - - - def Constructors(self): - return self.class_.Constructors(publics_only=True) - - - def GenerateDefinitions(self): - defs = [] - for method in self.virtual_methods: - exclude = self.info[method.name].exclude - # generate definitions only for public methods and non-abstract methods - if method.visibility == Scope.public and not exclude: - defs.extend(self.MethodDefinition(method)) - return defs - - - def GenerateVirtualWrapper(self, indent): - 'Return the wrapper for this class' - - # generate the class code - class_name = self.class_.FullName() - code = 'struct %s: %s\n' % (self.wrapper_name, class_name) - code += '{\n' - # generate constructors (with the overloads for each one) - for cons in self.Constructors(): # only public constructors - minArgs = cons.minArgs - maxArgs = cons.maxArgs - # from the min number of arguments to the max number, generate - # all version of the given constructor - cons_code = '' - for argNum in range(minArgs, maxArgs+1): - params, param_names, param_types = _ParamsInfo(cons, argNum) - if params: - params = ', ' + params - cons_code += indent + '%s(PyObject* %s_%s):\n' % \ - (self.wrapper_name, self.SELF, params) - cons_code += indent*2 + '%s(%s), %s(%s_) {}\n\n' % \ - (class_name, ', '.join(param_names), self.SELF, self.SELF) - code += cons_code - # generate the body - body = [] - for method in self.virtual_methods: - if not self.info[method.name].exclude: - body.append(self.Declaration(method, indent)) - body = '\n'.join(body) - code += body + '\n' - # add the self member - code += indent + 'PyObject* %s;\n' % self.SELF - code += '};\n' - return code diff --git a/pyste/src/Pyste/CodeExporter.py b/pyste/src/Pyste/CodeExporter.py deleted file mode 100644 index 382fffbd..00000000 --- a/pyste/src/Pyste/CodeExporter.py +++ /dev/null @@ -1,26 +0,0 @@ -# Copyright Bruno da Silva de Oliveira 2003. Use, modification and -# distribution is subject to 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) - -from Exporter import Exporter - -#============================================================================== -# CodeExporter -#============================================================================== -class CodeExporter(Exporter): - - def __init__(self, info): - Exporter.__init__(self, info) - - - def Name(self): - return self.info.code - - - def Export(self, codeunit, exported_names): - codeunit.Write(self.info.section, self.info.code) - - - def WriteInclude(self, codeunit): - pass diff --git a/pyste/src/Pyste/CppParser.py b/pyste/src/Pyste/CppParser.py deleted file mode 100644 index be68a448..00000000 --- a/pyste/src/Pyste/CppParser.py +++ /dev/null @@ -1,247 +0,0 @@ -# Copyright Bruno da Silva de Oliveira 2003. Use, modification and -# distribution is subject to 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) - -from GCCXMLParser import ParseDeclarations -import tempfile -import shutil -import os -import sys -import os.path -import settings -import shutil -import shelve -from cPickle import dump, load - -#============================================================================== -# exceptions -#============================================================================== -class CppParserError(Exception): pass - -#============================================================================== -# CppParser -#============================================================================== -class CppParser: - 'Parses a header file and returns a list of declarations' - - def __init__(self, includes=None, defines=None, cache_dir=None, version=None, gccxml_path = 'gccxml'): - 'includes and defines ar the directives given to gcc' - if includes is None: - includes = [] - if defines is None: - defines = [] - self.includes = includes - self.gccxml_path = gccxml_path - self.defines = defines - self.version = version - #if cache_dir is None: - # cache_dir = tempfile.mktemp() - # self.delete_cache = True - #else: - # self.delete_cache = False - self.delete_cache = False - self.cache_dir = cache_dir - self.cache_files = [] - self.mem_cache = {} - # create the cache dir - if cache_dir: - try: - os.makedirs(cache_dir) - except OSError: pass - - - def __del__(self): - self.Close() - - - def _IncludeParams(self, filename): - includes = self.includes[:] - filedir = os.path.dirname(filename) - if not filedir: - filedir = '.' - includes.insert(0, filedir) - includes = ['-I "%s"' % self.Unixfy(x) for x in includes] - return ' '.join(includes) - - - def _DefineParams(self): - defines = ['-D "%s"' % x for x in self.defines] - return ' '.join(defines) - - - def FindHeader(self, header): - if os.path.isfile(header): - return header - for path in self.includes: - filename = os.path.join(path, header) - if os.path.isfile(filename): - return filename - else: - name = os.path.basename(header) - raise RuntimeError, 'Header file "%s" not found!' % name - - - def AppendTail(self, filename, tail): - '''Creates a temporary file, appends the text tail to it, and returns - the filename of the file. - ''' - if hasattr(tempfile, 'mkstemp'): - f_no, temp = tempfile.mkstemp('.h') - f = file(temp, 'a') - os.close(f_no) - else: - temp = tempfile.mktemp('.h') - f = file(temp, 'a') - f.write('#include "%s"\n\n' % os.path.abspath(filename)) - f.write(tail) - f.write('\n') - f.close() - return temp - - - def Unixfy(self, path): - return path.replace('\\', '/') - - - def ParseWithGCCXML(self, header, tail): - '''Parses the given header using gccxml and GCCXMLParser. - ''' - header = self.FindHeader(header) - if tail: - filename = self.AppendTail(header, tail) - else: - filename = header - xmlfile = tempfile.mktemp('.xml') - try: - # get the params - includes = self._IncludeParams(filename) - defines = self._DefineParams() - # call gccxml - cmd = '%s %s %s "%s" -fxml=%s' - filename = self.Unixfy(filename) - xmlfile = self.Unixfy(xmlfile) - status = os.system(cmd % (self.gccxml_path, includes, defines, filename, xmlfile)) - if status != 0 or not os.path.isfile(xmlfile): - raise CppParserError, 'Error executing gccxml' - # parse the resulting xml - declarations = ParseDeclarations(xmlfile) - # make the declarations' location to point to the original file - if tail: - for decl in declarations: - decl_filename = os.path.normpath(os.path.normcase(decl.location[0])) - filename = os.path.normpath(os.path.normcase(filename)) - if decl_filename == filename: - decl.location = header, decl.location[1] - # return the declarations - return declarations - finally: - if settings.DEBUG and os.path.isfile(xmlfile): - debugname = os.path.basename(header) - debugname = os.path.splitext(debugname)[0] + '.xml' - print 'DEBUG:', debugname - shutil.copy(xmlfile, debugname) - # delete the temporary files - try: - os.remove(xmlfile) - if tail: - os.remove(filename) - except OSError: pass - - - def Parse(self, header, interface, tail=None): - '''Parses the given filename related to the given interface and returns - the (declarations, headerfile). The header returned is normally the - same as the given to this method (except that it is the full path), - except if tail is not None: in this case, the header is copied to a temp - filename and the tail code is appended to it before being passed on to - gccxml. This temp filename is then returned. - ''' - if tail is None: - tail = '' - tail = tail.strip() - declarations = self.GetCache(header, interface, tail) - if declarations is None: - declarations = self.ParseWithGCCXML(header, tail) - self.CreateCache(header, interface, tail, declarations) - header_fullpath = os.path.abspath(self.FindHeader(header)) - return declarations, header_fullpath - - - def CacheFileName(self, interface): - interface_name = os.path.basename(interface) - cache_file = os.path.splitext(interface_name)[0] + '.pystec' - cache_file = os.path.join(self.cache_dir, cache_file) - return cache_file - - - def GetCache(self, header, interface, tail): - key = (header, interface, tail) - # try memory cache first - if key in self.mem_cache: - return self.mem_cache[key] - - # get the cache from the disk - if self.cache_dir is None: - return None - header = self.FindHeader(header) - cache_file = self.CacheFileName(interface) - if os.path.isfile(cache_file): - f = file(cache_file, 'rb') - try: - version = load(f) - if version != self.version: - return None - cache = load(f) - if cache.has_key(key): - self.cache_files.append(cache_file) - return cache[key] - else: - return None - finally: - f.close() - else: - return None - - - def CreateCache(self, header, interface, tail, declarations): - key = (header, interface, tail) - - # our memory cache only holds one item - self.mem_cache.clear() - self.mem_cache[key] = declarations - - # save the cache in the disk - if self.cache_dir is None: - return - header = self.FindHeader(header) - cache_file = self.CacheFileName(interface) - if os.path.isfile(cache_file): - f = file(cache_file, 'rb') - try: - version = load(f) - cache = load(f) - finally: - f.close() - else: - cache = {} - cache[key] = declarations - self.cache_files.append(cache_file) - f = file(cache_file, 'wb') - try: - dump(self.version, f, 1) - dump(cache, f, 1) - finally: - f.close() - return cache_file - - - def Close(self): - if self.delete_cache and self.cache_files: - for filename in self.cache_files: - try: - os.remove(filename) - except OSError: - pass - self.cache_files = [] - shutil.rmtree(self.cache_dir) diff --git a/pyste/src/Pyste/EnumExporter.py b/pyste/src/Pyste/EnumExporter.py deleted file mode 100644 index 0107fbee..00000000 --- a/pyste/src/Pyste/EnumExporter.py +++ /dev/null @@ -1,58 +0,0 @@ -# Copyright Bruno da Silva de Oliveira 2003. Use, modification and -# distribution is subject to 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) - -from Exporter import Exporter -from settings import * -import utils - -#============================================================================== -# EnumExporter -#============================================================================== -class EnumExporter(Exporter): - 'Exports enumerators' - - def __init__(self, info): - Exporter.__init__(self, info) - - - def SetDeclarations(self, declarations): - Exporter.SetDeclarations(self, declarations) - if self.declarations: - self.enum = self.GetDeclaration(self.info.name) - else: - self.enum = None - - def Export(self, codeunit, exported_names): - if self.info.exclude: - return - indent = self.INDENT - in_indent = self.INDENT*2 - rename = self.info.rename or self.enum.name - full_name = self.enum.FullName() - unnamed_enum = False - if rename.startswith('$_') or rename.startswith('._'): - unnamed_enum = True - code = '' - if not unnamed_enum: - code += indent + namespaces.python - code += 'enum_< %s >("%s")\n' % (full_name, rename) - for name in self.enum.values: - rename = self.info[name].rename or name - value_fullname = self.enum.ValueFullName(name) - if not unnamed_enum: - code += in_indent + '.value("%s", %s)\n' % (rename, value_fullname) - else: - code += indent + namespaces.python - code += 'scope().attr("%s") = (int)%s;\n' % (rename, value_fullname ) - if self.info.export_values and not unnamed_enum: - code += in_indent + '.export_values()\n' - if not unnamed_enum: - code += indent + ';\n' - code += '\n' - codeunit.Write('module', code) - exported_names[self.enum.FullName()] = 1 - - def Name(self): - return self.info.name diff --git a/pyste/src/Pyste/Exporter.py b/pyste/src/Pyste/Exporter.py deleted file mode 100644 index d87b37c5..00000000 --- a/pyste/src/Pyste/Exporter.py +++ /dev/null @@ -1,94 +0,0 @@ -# Copyright Bruno da Silva de Oliveira 2003. Use, modification and -# distribution is subject to 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) - -import os.path - -#============================================================================== -# Exporter -#============================================================================== -class Exporter(object): - 'Base class for objects capable to generate boost.python code.' - - INDENT = ' ' * 4 - - def __init__(self, info, parser_tail=None): - self.info = info - self.parser_tail = parser_tail - self.interface_file = None - self.declarations = [] - - - def Name(self): - raise NotImplementedError(self.__class__.__name__) - - - def Tail(self): - return self.parser_tail - - - def Parse(self, parser): - self.parser = parser - header = self.info.include - tail = self.parser_tail - declarations, parser_header = parser.parse(header, tail) - self.parser_header = parser_header - self.SetDeclarations(declarations) - - - def SetParsedHeader(self, parsed_header): - self.parser_header = parsed_header - - - def SetDeclarations(self, declarations): - self.declarations = declarations - - - def GenerateCode(self, codeunit, exported_names): - self.WriteInclude(codeunit) - self.Export(codeunit, exported_names) - - - def WriteInclude(self, codeunit): - codeunit.Write('include', '#include <%s>\n' % self.info.include) - - - def Export(self, codeunit, exported_names): - 'subclasses must override this to do the real work' - pass - - - def GetDeclarations(self, fullname): - decls = [] - for decl in self.declarations: - if decl.FullName() == fullname: - decls.append(decl) - if not decls: - raise RuntimeError, 'no %s declaration found!' % fullname - return decls - - - def GetDeclaration(self, fullname): - decls = self.GetDeclarations(fullname) - #assert len(decls) == 1 - return decls[0] - - - def Order(self): - '''Returns a string that uniquely identifies this instance. All - exporters will be sorted by Order before being exported. - ''' - return 0, self.info.name - - - def Header(self): - return self.info.include - - - def __eq__(self, other): - return type(self) is type(other) and self.Name() == other.Name() \ - and self.interface_file == other.interface_file - - def __ne__(self, other): - return not self == other diff --git a/pyste/src/Pyste/FunctionExporter.py b/pyste/src/Pyste/FunctionExporter.py deleted file mode 100644 index 5765f65e..00000000 --- a/pyste/src/Pyste/FunctionExporter.py +++ /dev/null @@ -1,92 +0,0 @@ -# Copyright Bruno da Silva de Oliveira 2003. Use, modification and -# distribution is subject to 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) - -from Exporter import Exporter -from policies import * -from declarations import * -from settings import * -import utils -import exporterutils - - -#============================================================================== -# FunctionExporter -#============================================================================== -class FunctionExporter(Exporter): - 'Generates boost.python code to export the given function.' - - def __init__(self, info, tail=None): - Exporter.__init__(self, info, tail) - - - def Export(self, codeunit, exported_names): - if not self.info.exclude: - decls = self.GetDeclarations(self.info.name) - for decl in decls: - self.info.policy = exporterutils.HandlePolicy(decl, self.info.policy) - self.ExportDeclaration(decl, len(decls) == 1, codeunit) - self.ExportOpaquePointer(decl, codeunit) - self.GenerateOverloads(decls, codeunit) - exported_names[self.Name()] = 1 - - - def ExportDeclaration(self, decl, unique, codeunit): - name = self.info.rename or decl.name - defs = namespaces.python + 'def("%s", ' % name - wrapper = self.info.wrapper - if wrapper: - pointer = '&' + wrapper.FullName() - else: - pointer = decl.PointerDeclaration() - defs += pointer - defs += self.PolicyCode() - overload = self.OverloadName(decl) - if overload: - defs += ', %s()' % (namespaces.pyste + overload) - defs += ');' - codeunit.Write('module', self.INDENT + defs + '\n') - # add the code of the wrapper - if wrapper and wrapper.code: - codeunit.Write('declaration', wrapper.code + '\n') - - - def OverloadName(self, decl): - if decl.minArgs != decl.maxArgs: - return '%s_overloads_%i_%i' % \ - (decl.name, decl.minArgs, decl.maxArgs) - else: - return '' - - - def GenerateOverloads(self, declarations, codeunit): - codes = {} - for decl in declarations: - overload = self.OverloadName(decl) - if overload and overload not in codes: - code = 'BOOST_PYTHON_FUNCTION_OVERLOADS(%s, %s, %i, %i)' %\ - (overload, decl.FullName(), decl.minArgs, decl.maxArgs) - codeunit.Write('declaration', code + '\n') - codes[overload] = None - - - def PolicyCode(self): - policy = self.info.policy - if policy is not None: - assert isinstance(policy, Policy) - return ', %s()' % policy.Code() - else: - return '' - - - def ExportOpaquePointer(self, function, codeunit): - if self.info.policy == return_value_policy(return_opaque_pointer): - typename = function.result.name - macro = exporterutils.EspecializeTypeID(typename) - if macro: - codeunit.Write('declaration-outside', macro) - - - def Name(self): - return self.info.name diff --git a/pyste/src/Pyste/GCCXMLParser.py b/pyste/src/Pyste/GCCXMLParser.py deleted file mode 100644 index 4a101720..00000000 --- a/pyste/src/Pyste/GCCXMLParser.py +++ /dev/null @@ -1,478 +0,0 @@ -# Copyright Bruno da Silva de Oliveira 2003. Use, modification and -# distribution is subject to 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) - -from declarations import * -try: - # try to use internal elementtree - from xml.etree.cElementTree import ElementTree -except ImportError: - # try to use cElementTree if avaiable - try: - from cElementTree import ElementTree - except ImportError: - # fall back to the normal elementtree - from elementtree.ElementTree import ElementTree -from xml.parsers.expat import ExpatError -from copy import deepcopy -from utils import enumerate - - -#============================================================================== -# Exceptions -#============================================================================== -class InvalidXMLError(Exception): pass - -class ParserError(Exception): pass - -class InvalidContextError(ParserError): pass - - -#============================================================================== -# GCCXMLParser -#============================================================================== -class GCCXMLParser(object): - 'Parse a GCC_XML file and extract the top-level declarations.' - - interested_tags = {'Class':0, 'Function':0, 'Variable':0, 'Enumeration':0} - - def Parse(self, filename): - self.elements = self.GetElementsFromXML(filename) - # high level declarations - self.declarations = [] - self._names = {} - # parse the elements - for id in self.elements: - element, decl = self.elements[id] - if decl is None: - try: - self.ParseElement(id, element) - except InvalidContextError: - pass # ignore those nodes with invalid context - # (workaround gccxml bug) - - - def Declarations(self): - return self.declarations - - - def AddDecl(self, decl): - if decl.FullName() in self._names: - decl.is_unique= False - for d in self.declarations: - if d.FullName() == decl.FullName(): - d.is_unique = False - self._names[decl.FullName()] = 0 - self.declarations.append(decl) - - - def ParseElement(self, id, element): - method = 'Parse' + element.tag - if hasattr(self, method): - func = getattr(self, method) - func(id, element) - else: - self.ParseUnknown(id, element) - - - def GetElementsFromXML(self,filename): - 'Extracts a dictionary of elements from the gcc_xml file.' - - tree = ElementTree() - try: - tree.parse(filename) - except ExpatError: - raise InvalidXMLError, 'Not a XML file: %s' % filename - - root = tree.getroot() - if root.tag != 'GCC_XML': - raise InvalidXMLError, 'Not a valid GCC_XML file' - - # build a dictionary of id -> element, None - elementlist = root.getchildren() - elements = {} - for element in elementlist: - id = element.get('id') - if id: - elements[id] = element, None - return elements - - - def GetDecl(self, id): - if id not in self.elements: - if id == '_0': - raise InvalidContextError, 'Invalid context found in the xml file.' - else: - msg = 'ID not found in elements: %s' % id - raise ParserError, msg - - elem, decl = self.elements[id] - if decl is None: - self.ParseElement(id, elem) - elem, decl = self.elements[id] - if decl is None: - raise ParserError, 'Could not parse element: %s' % elem.tag - return decl - - - def GetType(self, id): - def Check(id, feature): - pos = id.find(feature) - if pos != -1: - id = id[:pos] + id[pos+1:] - return True, id - else: - return False, id - const, id = Check(id, 'c') - volatile, id = Check(id, 'v') - restricted, id = Check(id, 'r') - decl = self.GetDecl(id) - if isinstance(decl, Type): - res = deepcopy(decl) - if const: - res.const = const - if volatile: - res.volatile = volatile - if restricted: - res.restricted = restricted - else: - res = Type(decl.FullName(), const) - res.volatile = volatile - res.restricted = restricted - return res - - - def GetLocation(self, location): - file, line = location.split(':') - file = self.GetDecl(file) - return file, int(line) - - - def Update(self, id, decl): - element, _ = self.elements[id] - self.elements[id] = element, decl - - - def ParseUnknown(self, id, element): - name = '__Unknown_Element_%s' % id - decl = Unknown(name) - self.Update(id, decl) - - - def ParseNamespace(self, id, element): - namespace = element.get('name') - context = element.get('context') - if context: - outer = self.GetDecl(context) - if not outer.endswith('::'): - outer += '::' - namespace = outer + namespace - if namespace.startswith('::'): - namespace = namespace[2:] - self.Update(id, namespace) - - - def ParseFile(self, id, element): - filename = element.get('name') - self.Update(id, filename) - - - def ParseVariable(self, id, element): - # in gcc_xml, a static Field is declared as a Variable, so we check - # this and call the Field parser. - context = self.GetDecl(element.get('context')) - if isinstance(context, Class): - self.ParseField(id, element) - elem, decl = self.elements[id] - decl.static = True - else: - namespace = context - name = element.get('name') - type_ = self.GetType(element.get('type')) - location = self.GetLocation(element.get('location')) - variable = Variable(type_, name, namespace) - variable.location = location - self.AddDecl(variable) - self.Update(id, variable) - - - def GetArguments(self, element): - args = [] - for child in element: - if child.tag == 'Argument': - type = self.GetType(child.get('type')) - type.default = child.get('default') - args.append(type) - return args - - - def GetExceptions(self, exception_list): - if exception_list is None: - return None - - exceptions = [] - for t in exception_list.split(): - exceptions.append(self.GetType(t)) - - return exceptions - - - def ParseFunction(self, id, element, functionType=Function): - '''functionType is used because a Operator is identical to a normal - function, only the type of the function changes.''' - name = element.get('name') - returns = self.GetType(element.get('returns')) - namespace = self.GetDecl(element.get('context')) - location = self.GetLocation(element.get('location')) - params = self.GetArguments(element) - incomplete = bool(int(element.get('incomplete', 0))) - throws = self.GetExceptions(element.get('throw', None)) - function = functionType(name, namespace, returns, params, throws) - function.location = location - self.AddDecl(function) - self.Update(id, function) - - - def ParseOperatorFunction(self, id, element): - self.ParseFunction(id, element, Operator) - - - def GetHierarchy(self, bases): - '''Parses the string "bases" from the xml into a list of tuples of Base - instances. The first tuple is the most direct inheritance, and then it - goes up in the hierarchy. - ''' - - if bases is None: - return [] - base_names = bases.split() - this_level = [] - next_levels = [] - for base in base_names: - # get the visibility - split = base.split(':') - if len(split) == 2: - visib = split[0] - base = split[1] - else: - visib = Scope.public - decl = self.GetDecl(base) - if not isinstance(decl, Class): - # on windows, there are some classes which "bases" points to an - # "Unimplemented" tag, but we are not interested in this classes - # anyway - continue - base = Base(decl.FullName(), visib) - this_level.append(base) - # normalize with the other levels - for index, level in enumerate(decl.hierarchy): - if index < len(next_levels): - next_levels[index] = next_levels[index] + level - else: - next_levels.append(level) - hierarchy = [] - if this_level: - hierarchy.append(tuple(this_level)) - if next_levels: - hierarchy.extend(next_levels) - return hierarchy - - - def GetMembers(self, member_list): - # members must be a string with the ids of the members - if member_list is None: - return [] - members = [] - for member in member_list.split(): - decl = self.GetDecl(member) - if type(decl) in Class.ValidMemberTypes(): - members.append(decl) - return members - - - def ParseClass(self, id, element): - name = element.get('name') - abstract = bool(int(element.get('abstract', '0'))) - location = self.GetLocation(element.get('location')) - context = self.GetDecl(element.get('context')) - incomplete = bool(int(element.get('incomplete', 0))) - if isinstance(context, str): - class_ = Class(name, context, [], abstract) - else: - # a nested class - visib = element.get('access', Scope.public) - class_ = NestedClass( - name, context.FullName(), visib, [], abstract) - class_.incomplete = incomplete - # we have to add the declaration of the class before trying - # to parse its members and bases, to avoid recursion. - self.AddDecl(class_) - class_.location = location - self.Update(id, class_) - # now we can get the members and the bases - class_.hierarchy = self.GetHierarchy(element.get('bases')) - if class_.hierarchy: - class_.bases = class_.hierarchy[0] - members = self.GetMembers(element.get('members')) - for member in members: - class_.AddMember(member) - - - def ParseStruct(self, id, element): - self.ParseClass(id, element) - - - FUNDAMENTAL_RENAME = { - 'long long int' : 'boost::int64_t', - 'long long unsigned int' : 'boost::uint64_t', - } - - def ParseFundamentalType(self, id, element): - name = element.get('name') - name = self.FUNDAMENTAL_RENAME.get(name, name) - type_ = FundamentalType(name) - self.Update(id, type_) - - - def ParseArrayType(self, id, element): - type = self.GetType(element.get('type')) - min = element.get('min') - max = element.get('max') - array = ArrayType(type.name, type.const, min, max) - self.Update(id, array) - - - def ParseReferenceType(self, id, element): - type = self.GetType(element.get('type')) - expand = not isinstance(type, FunctionType) - ref = ReferenceType(type.name, type.const, None, expand, type.suffix) - self.Update(id, ref) - - - def ParsePointerType(self, id, element): - type = self.GetType(element.get('type')) - expand = not isinstance(type, FunctionType) - ref = PointerType(type.name, type.const, None, expand, type.suffix) - self.Update(id, ref) - - - def ParseFunctionType(self, id, element): - result = self.GetType(element.get('returns')) - args = self.GetArguments(element) - func = FunctionType(result, args) - self.Update(id, func) - - - def ParseMethodType(self, id, element): - class_ = self.GetDecl(element.get('basetype')).FullName() - result = self.GetType(element.get('returns')) - args = self.GetArguments(element) - method = MethodType(result, args, class_) - self.Update(id, method) - - - def ParseField(self, id, element): - name = element.get('name') - visib = element.get('access', Scope.public) - classname = self.GetDecl(element.get('context')).FullName() - type_ = self.GetType(element.get('type')) - static = bool(int(element.get('extern', '0'))) - location = self.GetLocation(element.get('location')) - var = ClassVariable(type_, name, classname, visib, static) - var.location = location - self.Update(id, var) - - - def ParseMethod(self, id, element, methodType=Method): - name = element.get('name') - result = self.GetType(element.get('returns')) - classname = self.GetDecl(element.get('context')).FullName() - visib = element.get('access', Scope.public) - static = bool(int(element.get('static', '0'))) - virtual = bool(int(element.get('virtual', '0'))) - abstract = bool(int(element.get('pure_virtual', '0'))) - const = bool(int(element.get('const', '0'))) - location = self.GetLocation(element.get('location')) - throws = self.GetExceptions(element.get('throw', None)) - params = self.GetArguments(element) - method = methodType( - name, classname, result, params, visib, virtual, abstract, static, const, throws) - method.location = location - self.Update(id, method) - - - def ParseOperatorMethod(self, id, element): - self.ParseMethod(id, element, ClassOperator) - - - def ParseConstructor(self, id, element): - name = element.get('name') - visib = element.get('access', Scope.public) - classname = self.GetDecl(element.get('context')).FullName() - location = self.GetLocation(element.get('location')) - params = self.GetArguments(element) - artificial = element.get('artificial', False) - ctor = Constructor(name, classname, params, visib) - ctor.location = location - self.Update(id, ctor) - - - def ParseDestructor(self, id, element): - name = element.get('name') - visib = element.get('access', Scope.public) - classname = self.GetDecl(element.get('context')).FullName() - virtual = bool(int(element.get('virtual', '0'))) - location = self.GetLocation(element.get('location')) - des = Destructor(name, classname, visib, virtual) - des.location = location - self.Update(id, des) - - - def ParseConverter(self, id, element): - self.ParseMethod(id, element, ConverterOperator) - - - def ParseTypedef(self, id, element): - name = element.get('name') - type = self.GetType(element.get('type')) - context = self.GetDecl(element.get('context')) - if isinstance(context, Class): - context = context.FullName() - typedef = Typedef(type, name, context) - self.Update(id, typedef) - self.AddDecl(typedef) - - - def ParseEnumeration(self, id, element): - name = element.get('name') - location = self.GetLocation(element.get('location')) - context = self.GetDecl(element.get('context')) - incomplete = bool(int(element.get('incomplete', 0))) - if isinstance(context, str): - enum = Enumeration(name, context) - else: - visib = element.get('access', Scope.public) - enum = ClassEnumeration(name, context.FullName(), visib) - self.AddDecl(enum) - enum.location = location - for child in element: - if child.tag == 'EnumValue': - name = child.get('name') - value = int(child.get('init')) - enum.values[name] = value - enum.incomplete = incomplete - self.Update(id, enum) - - - -def ParseDeclarations(filename): - 'Returns a list of the top declarations found in the gcc_xml file.' - - parser = GCCXMLParser() - parser.Parse(filename) - return parser.Declarations() - - -if __name__ == '__main__': - ParseDeclarations(r'D:\Programming\Libraries\boost-cvs\boost\libs\python\pyste\example\test.xml') diff --git a/pyste/src/Pyste/HeaderExporter.py b/pyste/src/Pyste/HeaderExporter.py deleted file mode 100644 index 47651ba7..00000000 --- a/pyste/src/Pyste/HeaderExporter.py +++ /dev/null @@ -1,81 +0,0 @@ -# Copyright Bruno da Silva de Oliveira 2003. Use, modification and -# distribution is subject to 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) - -from Exporter import Exporter -from ClassExporter import ClassExporter -from FunctionExporter import FunctionExporter -from EnumExporter import EnumExporter -from VarExporter import VarExporter -from infos import * -from declarations import * -import os.path -import exporters -import MultipleCodeUnit - -#============================================================================== -# HeaderExporter -#============================================================================== -class HeaderExporter(Exporter): - 'Exports all declarations found in the given header' - - def __init__(self, info, parser_tail=None): - Exporter.__init__(self, info, parser_tail) - - - def WriteInclude(self, codeunit): - pass - - - def IsInternalName(self, name): - '''Returns true if the given name looks like a internal compiler - structure''' - return name.startswith('_') - - - def Export(self, codeunit, exported_names): - header = os.path.normpath(self.parser_header) - for decl in self.declarations: - # check if this declaration is in the header - location = os.path.abspath(decl.location[0]) - if location == header and not self.IsInternalName(decl.name): - # ok, check the type of the declaration and export it accordingly - self.HandleDeclaration(decl, codeunit, exported_names) - - - def HandleDeclaration(self, decl, codeunit, exported_names): - '''Dispatch the declaration to the appropriate method, that must create - a suitable info object for a Exporter, create a Exporter, set its - declarations and append it to the list of exporters. - ''' - dispatch_table = { - Class : ClassExporter, - Enumeration : EnumExporter, - Function : FunctionExporter, - Variable : VarExporter, - } - - exporter_class = dispatch_table.get(type(decl)) - if exporter_class is not None: - self.HandleExporter(decl, exporter_class, codeunit, exported_names) - - - def HandleExporter(self, decl, exporter_type, codeunit, exported_names): - # only export complete declarations - if not decl.incomplete: - info = self.info[decl.name] - info.name = decl.FullName() - info.include = self.info.include - exporter = exporter_type(info) - exporter.SetDeclarations(self.declarations) - exporter.SetParsedHeader(self.parser_header) - if isinstance(codeunit, MultipleCodeUnit.MultipleCodeUnit): - codeunit.SetCurrent(self.interface_file, exporter.Name()) - else: - codeunit.SetCurrent(exporter.Name()) - exporter.GenerateCode(codeunit, exported_names) - - - def Name(self): - return self.info.include diff --git a/pyste/src/Pyste/MultipleCodeUnit.py b/pyste/src/Pyste/MultipleCodeUnit.py deleted file mode 100644 index 65faad45..00000000 --- a/pyste/src/Pyste/MultipleCodeUnit.py +++ /dev/null @@ -1,135 +0,0 @@ -# Copyright Bruno da Silva de Oliveira 2003. Use, modification and -# distribution is subject to 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) - -from SingleCodeUnit import SingleCodeUnit -import os -import utils -from SmartFile import SmartFile - - -#============================================================================== -# MultipleCodeUnit -#============================================================================== -class MultipleCodeUnit(object): - ''' - Represents a bunch of cpp files, where each cpp file represents a header - to be exported by pyste. Another cpp, named .cpp is created too. - ''' - - def __init__(self, modulename, outdir): - self.modulename = modulename - self.outdir = outdir - self.codeunits = {} # maps from a (filename, function) to a SingleCodeUnit - self.functions = [] - self._current = None - self.all = SingleCodeUnit(None, None) - - - def _FunctionName(self, interface_file): - name = os.path.splitext(interface_file)[0] - return 'Export_%s' % utils.makeid(name) - - - def _FileName(self, interface_file): - filename = os.path.basename(interface_file) - filename = '_%s.cpp' % os.path.splitext(filename)[0] - return os.path.join(self.outdir, filename) - - - def SetCurrent(self, interface_file, export_name): - 'Changes the current code unit' - if export_name is None: - self._current = None - elif export_name is '__all__': - self._current = self.all - else: - filename = self._FileName(interface_file) - function = self._FunctionName(interface_file) - try: - codeunit = self.codeunits[filename] - except KeyError: - codeunit = SingleCodeUnit(None, filename) - codeunit.module_definition = 'void %s()' % function - self.codeunits[filename] = codeunit - if function not in self.functions: - self.functions.append(function) - self._current = codeunit - - - def Current(self): - return self._current - - current = property(Current, SetCurrent) - - - def Write(self, section, code): - if self._current is not None: - self.current.Write(section, code) - - - def Section(self, section): - if self._current is not None: - return self.current.Section(section) - - - def _CreateOutputDir(self): - try: - os.mkdir(self.outdir) - except OSError: pass # already created - - - def Save(self): - # create the directory where all the files will go - self._CreateOutputDir(); - # order all code units by filename, and merge them all - codeunits = {} # filename => list of codeunits - - # While ordering all code units by file name, the first code - # unit in the list of code units is used as the main unit - # which dumps all the include, declaration and - # declaration-outside sections at the top of the file. - for filename, codeunit in self.codeunits.items(): - if filename not in codeunits: - # this codeunit is the main codeunit. - codeunits[filename] = [codeunit] - codeunit.Merge(self.all) - else: - main_unit = codeunits[filename][0] - for section in ('include', 'declaration', 'declaration-outside'): - main_unit.code[section] = main_unit.code[section] + codeunit.code[section] - codeunit.code[section] = '' - codeunits[filename].append(codeunit) - - # Now write all the codeunits appending them correctly. - for file_units in codeunits.values(): - append = False - for codeunit in file_units: - codeunit.Save(append) - if not append: - append = True - - - def GenerateMain(self, interfaces): - # generate the main cpp - filename = os.path.join(self.outdir, '_main.cpp') - fout = SmartFile(filename, 'w') - fout.write(utils.left_equals('Include')) - fout.write('#include \n\n') - fout.write(utils.left_equals('Exports')) - functions = [self._FunctionName(x) for x in interfaces] - for function in functions: - fout.write('void %s();\n' % function) - fout.write('\n') - fout.write(utils.left_equals('Module')) - fout.write('BOOST_PYTHON_MODULE(%s)\n' % self.modulename) - fout.write('{\n') - indent = ' ' * 4 - for function in functions: - fout.write(indent) - fout.write('%s();\n' % function) - fout.write('}\n') - - - diff --git a/pyste/src/Pyste/SingleCodeUnit.py b/pyste/src/Pyste/SingleCodeUnit.py deleted file mode 100644 index 2e59dbb8..00000000 --- a/pyste/src/Pyste/SingleCodeUnit.py +++ /dev/null @@ -1,121 +0,0 @@ -# Copyright Bruno da Silva de Oliveira 2003. Use, modification and -# distribution is subject to 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) - -from settings import namespaces -import settings -from utils import remove_duplicated_lines, left_equals -from SmartFile import SmartFile - - -#============================================================================== -# SingleCodeUnit -#============================================================================== -class SingleCodeUnit: - ''' - Represents a cpp file, where other objects can write in one of the - predefined sections. - The avaiable sections are: - pchinclude - The pre-compiled header area - include - The include area of the cpp file - declaration - The part before the module definition - module - Inside the BOOST_PYTHON_MODULE macro - ''' - - def __init__(self, modulename, filename): - self.modulename = modulename - self.filename = filename - # define the avaiable sections - self.code = {} - # include section - self.code['pchinclude'] = '' - # include section - self.code['include'] = '' - # declaration section (inside namespace) - self.code['declaration'] = '' - # declaration (outside namespace) - self.code['declaration-outside'] = '' - # inside BOOST_PYTHON_MACRO - self.code['module'] = '' - # create the default module definition - self.module_definition = 'BOOST_PYTHON_MODULE(%s)' % modulename - - - def Write(self, section, code): - 'write the given code in the section of the code unit' - if section not in self.code: - raise RuntimeError, 'Invalid CodeUnit section: %s' % section - self.code[section] += code - - - def Merge(self, other): - for section in ('include', 'declaration', 'declaration-outside', 'module'): - self.code[section] = self.code[section] + other.code[section] - - - def Section(self, section): - return self.code[section] - - - def SetCurrent(self, *args): - pass - - - def Current(self): - pass - - - def Save(self, append=False): - 'Writes this code unit to the filename' - space = '\n\n' - if not append: - flag = 'w' - else: - flag = 'a' - fout = SmartFile(self.filename, flag) - fout.write('\n') - # includes - # boost.python header - if self.code['pchinclude']: - fout.write(left_equals('PCH')) - fout.write(self.code['pchinclude']+'\n') - fout.write('#ifdef _MSC_VER\n') - fout.write('#pragma hdrstop\n') - fout.write('#endif\n') - else: - fout.write(left_equals('Boost Includes')) - fout.write('#include \n') - # include numerical boost for int64 definitions - fout.write('#include \n') - fout.write('\n') - # other includes - if self.code['include']: - fout.write(left_equals('Includes')) - includes = remove_duplicated_lines(self.code['include']) - fout.write(includes) - fout.write(space) - # using - if settings.USING_BOOST_NS and not append: - fout.write(left_equals('Using')) - fout.write('using namespace boost::python;\n\n') - # declarations - declaration = self.code['declaration'] - declaration_outside = self.code['declaration-outside'] - if declaration_outside or declaration: - fout.write(left_equals('Declarations')) - if declaration_outside: - fout.write(declaration_outside + '\n\n') - if declaration: - pyste_namespace = namespaces.pyste[:-2] - fout.write('namespace %s {\n\n' % pyste_namespace) - fout.write(declaration) - fout.write('\n}// namespace %s\n' % pyste_namespace) - fout.write(space) - # module - fout.write(left_equals('Module')) - fout.write(self.module_definition + '\n') - fout.write('{\n') - fout.write(self.code['module']) - fout.write('}\n\n') - fout.close() diff --git a/pyste/src/Pyste/SmartFile.py b/pyste/src/Pyste/SmartFile.py deleted file mode 100644 index 039579e3..00000000 --- a/pyste/src/Pyste/SmartFile.py +++ /dev/null @@ -1,60 +0,0 @@ -# Copyright Bruno da Silva de Oliveira 2003. Use, modification and -# distribution is subject to 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) - -import os -import md5 - -#============================================================================== -# SmartFile -#============================================================================== -class SmartFile(object): - ''' - A file-like object used for writing files. The given file will only be - actually written to disk if there's not a file with the same name, or if - the existing file is *different* from the file to be written. - ''' - - def __init__(self, filename, mode='w'): - self.filename = filename - self.mode = mode - self._contents = [] - self._closed = False - - - def __del__(self): - if not self._closed: - self.close() - - - def write(self, string): - self._contents.append(string) - - - def _dowrite(self, contents): - f = file(self.filename, self.mode) - f.write(contents) - f.close() - - - def _GetMD5(self, string): - return md5.new(string).digest() - - - def close(self): - # if the filename doesn't exist, write the file right away - this_contents = ''.join(self._contents) - if not os.path.isfile(self.filename): - self._dowrite(this_contents) - else: - # read the contents of the file already in disk - f = file(self.filename) - other_contents = f.read() - f.close() - # test the md5 for both files - this_md5 = self._GetMD5(this_contents) - other_md5 = self._GetMD5(other_contents) - if this_md5 != other_md5: - self._dowrite(this_contents) - self._closed = True diff --git a/pyste/src/Pyste/VarExporter.py b/pyste/src/Pyste/VarExporter.py deleted file mode 100644 index d3571e75..00000000 --- a/pyste/src/Pyste/VarExporter.py +++ /dev/null @@ -1,40 +0,0 @@ -# Copyright Bruno da Silva de Oliveira 2003. Use, modification and -# distribution is subject to 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) - -from Exporter import Exporter -from settings import * -import utils - -#============================================================================== -# VarExporter -#============================================================================== -class VarExporter(Exporter): - '''Exports a global variable. - ''' - - def __init__(self, info): - Exporter.__init__(self, info) - - - def Export(self, codeunit, exported_names): - if self.info.exclude: return - decl = self.GetDeclaration(self.info.name) - if not decl.type.const: - msg = '---> Warning: The global variable "%s" is non-const:\n' \ - ' changes in Python will not reflect in C++.' - print msg % self.info.name - print - rename = self.info.rename or self.info.name - code = self.INDENT + namespaces.python - code += 'scope().attr("%s") = %s;\n' % (rename, self.info.name) - codeunit.Write('module', code) - - - def Order(self): - return 0, self.info.name - - - def Name(self): - return self.info.name diff --git a/pyste/src/Pyste/__init__.py b/pyste/src/Pyste/__init__.py deleted file mode 100644 index 02eec64b..00000000 --- a/pyste/src/Pyste/__init__.py +++ /dev/null @@ -1,6 +0,0 @@ -# Copyright Bruno da Silva de Oliveira 2003. Use, modification and -# distribution is subject to 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) - - diff --git a/pyste/src/Pyste/declarations.py b/pyste/src/Pyste/declarations.py deleted file mode 100644 index 6eff97dc..00000000 --- a/pyste/src/Pyste/declarations.py +++ /dev/null @@ -1,653 +0,0 @@ -# Copyright Bruno da Silva de Oliveira 2003. Use, modification and -# distribution is subject to 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) - -''' -Defines classes that represent declarations found in C++ header files. - -''' - -# version indicates the version of the declarations. Whenever a declaration -# changes, this variable should be updated, so that the caches can be rebuilt -# automatically -version = '1.0' - -#============================================================================== -# Declaration -#============================================================================== -class Declaration(object): - '''Base class for all declarations. - @ivar name: The name of the declaration. - @ivar namespace: The namespace of the declaration. - ''' - - def __init__(self, name, namespace): - ''' - @type name: string - @param name: The name of this declaration - @type namespace: string - @param namespace: the full namespace where this declaration resides. - ''' - self.name = name - self.namespace = namespace - self.location = '', -1 # (filename, line) - self.incomplete = False - self.is_unique = True - - - def FullName(self): - ''' - Returns the full qualified name: "boost::inner::Test" - @rtype: string - @return: The full name of the declaration. - ''' - namespace = self.namespace or '' - if namespace and not namespace.endswith('::'): - namespace += '::' - return namespace + self.name - - - def __repr__(self): - return '' % (self.FullName(), id(self)) - - - def __str__(self): - return 'Declaration of %s' % self.FullName() - - -#============================================================================== -# Class -#============================================================================== -class Class(Declaration): - ''' - Represents a C++ class or struct. Iteration through it yields its members. - - @type abstract: bool - @ivar abstract: if the class has any abstract methods. - - @type bases: tuple - @ivar bases: tuple with L{Base} instances, representing the most direct - inheritance. - - @type hierarchy: list - @ivar hierarchy: a list of tuples of L{Base} instances, representing - the entire hierarchy tree of this object. The first tuple is the parent - classes, and the other ones go up in the hierarchy. - ''' - - def __init__(self, name, namespace, members, abstract): - Declaration.__init__(self, name, namespace) - self.__members = members - self.__member_names = {} - self.abstract = abstract - self.bases = () - self.hierarchy = () - self.operator = {} - - - def __iter__(self): - '''iterates through the class' members. - ''' - return iter(self.__members) - - - def Constructors(self, publics_only=True): - '''Returns a list of the constructors for this class. - @rtype: list - ''' - constructors = [] - for member in self: - if isinstance(member, Constructor): - if publics_only and member.visibility != Scope.public: - continue - constructors.append(member) - return constructors - - - def HasCopyConstructor(self): - '''Returns true if this class has a public copy constructor. - @rtype: bool - ''' - for cons in self.Constructors(): - if cons.IsCopy(): - return True - return False - - - def HasDefaultConstructor(self): - '''Returns true if this class has a public default constructor. - @rtype: bool - ''' - for cons in self.Constructors(): - if cons.IsDefault(): - return True - return False - - - def AddMember(self, member): - if member.name in self.__member_names: - member.is_unique = False - for m in self: - if m.name == member.name: - m.is_unique = False - else: - member.is_unique = True - self.__member_names[member.name] = 1 - self.__members.append(member) - if isinstance(member, ClassOperator): - self.operator[member.name] = member - - - def ValidMemberTypes(): - return (NestedClass, Method, Constructor, Destructor, ClassVariable, - ClassOperator, ConverterOperator, ClassEnumeration) - ValidMemberTypes = staticmethod(ValidMemberTypes) - - -#============================================================================== -# NestedClass -#============================================================================== -class NestedClass(Class): - '''The declaration of a class/struct inside another class/struct. - - @type class: string - @ivar class: fullname of the class where this class is contained. - - @type visibility: L{Scope} - @ivar visibility: the visibility of this class. - ''' - - def __init__(self, name, class_, visib, members, abstract): - Class.__init__(self, name, None, members, abstract) - self.class_ = class_ - self.visibility = visib - - - def FullName(self): - '''The full name of this class, like ns::outer::inner. - @rtype: string - ''' - return '%s::%s' % (self.class_, self.name) - - -#============================================================================== -# Scope -#============================================================================== -class Scope: - '''Used to represent the visibility of various members inside a class. - @cvar public: public visibility - @cvar private: private visibility - @cvar protected: protected visibility - ''' - public = 'public' - private = 'private' - protected = 'protected' - - -#============================================================================== -# Base -#============================================================================== -class Base: - '''Represents a base class of another class. - @ivar _name: the full name of the base class. - @ivar _visibility: the visibility of the derivation. - ''' - - def __init__(self, name, visibility=Scope.public): - self.name = name - self.visibility = visibility - - -#============================================================================== -# Function -#============================================================================== -class Function(Declaration): - '''The declaration of a function. - @ivar _result: instance of L{Type} or None. - @ivar _parameters: list of L{Type} instances. - @ivar _throws: exception specifiers or None - ''' - - def __init__(self, name, namespace, result, params, throws=None): - Declaration.__init__(self, name, namespace) - # the result type: instance of Type, or None (constructors) - self.result = result - # the parameters: instances of Type - self.parameters = params - # the exception specification - self.throws = throws - - - def Exceptions(self): - if self.throws is None: - return "" - else: - return " throw(%s)" % ', '.join ([x.FullName() for x in self.throws]) - - - def PointerDeclaration(self, force=False): - '''Returns a declaration of a pointer to this function. - @param force: If True, returns a complete pointer declaration regardless - if this function is unique or not. - ''' - if self.is_unique and not force: - return '&%s' % self.FullName() - else: - result = self.result.FullName() - params = ', '.join([x.FullName() for x in self.parameters]) - return '(%s (*)(%s)%s)&%s' % (result, params, self.Exceptions(), self.FullName()) - - - def MinArgs(self): - min = 0 - for arg in self.parameters: - if arg.default is None: - min += 1 - return min - - minArgs = property(MinArgs) - - - def MaxArgs(self): - return len(self.parameters) - - maxArgs = property(MaxArgs) - - - -#============================================================================== -# Operator -#============================================================================== -class Operator(Function): - '''The declaration of a custom operator. Its name is the same as the - operator name in C++, ie, the name of the declaration "operator+(..)" is - "+". - ''' - - def FullName(self): - namespace = self.namespace or '' - if not namespace.endswith('::'): - namespace += '::' - return namespace + 'operator' + self.name - - -#============================================================================== -# Method -#============================================================================== -class Method(Function): - '''The declaration of a method. - - @ivar _visibility: the visibility of this method. - @ivar _virtual: if this method is declared as virtual. - @ivar _abstract: if this method is virtual but has no default implementation. - @ivar _static: if this method is static. - @ivar _class: the full name of the class where this method was declared. - @ivar _const: if this method is declared as const. - @ivar _throws: list of exception specificiers or None - ''' - - def __init__(self, name, class_, result, params, visib, virtual, abstract, static, const, throws=None): - Function.__init__(self, name, None, result, params, throws) - self.visibility = visib - self.virtual = virtual - self.abstract = abstract - self.static = static - self.class_ = class_ - self.const = const - - - def FullName(self): - return self.class_ + '::' + self.name - - - def PointerDeclaration(self, force=False): - '''Returns a declaration of a pointer to this member function. - @param force: If True, returns a complete pointer declaration regardless - if this function is unique or not. - ''' - if self.static: - # static methods are like normal functions - return Function.PointerDeclaration(self, force) - if self.is_unique and not force: - return '&%s' % self.FullName() - else: - result = self.result.FullName() - params = ', '.join([x.FullName() for x in self.parameters]) - const = '' - if self.const: - const = 'const' - return '(%s (%s::*)(%s) %s%s)&%s' %\ - (result, self.class_, params, const, self.Exceptions(), self.FullName()) - - -#============================================================================== -# Constructor -#============================================================================== -class Constructor(Method): - '''A class' constructor. - ''' - - def __init__(self, name, class_, params, visib): - Method.__init__(self, name, class_, None, params, visib, False, False, False, False) - - - def IsDefault(self): - '''Returns True if this constructor is a default constructor. - ''' - return len(self.parameters) == 0 and self.visibility == Scope.public - - - def IsCopy(self): - '''Returns True if this constructor is a copy constructor. - ''' - if len(self.parameters) != 1: - return False - param = self.parameters[0] - class_as_param = self.parameters[0].name == self.class_ - param_reference = isinstance(param, ReferenceType) - is_public = self.visibility == Scope.public - return param_reference and class_as_param and param.const and is_public - - - def PointerDeclaration(self, force=False): - return '' - - -#============================================================================== -# Destructor -#============================================================================== -class Destructor(Method): - 'The destructor of a class.' - - def __init__(self, name, class_, visib, virtual): - Method.__init__(self, name, class_, None, [], visib, virtual, False, False, False) - - def FullName(self): - return self.class_ + '::~' + self.name - - - def PointerDeclaration(self, force=False): - return '' - - - -#============================================================================== -# ClassOperator -#============================================================================== -class ClassOperator(Method): - 'A custom operator in a class.' - - def FullName(self): - return self.class_ + '::operator ' + self.name - - - -#============================================================================== -# ConverterOperator -#============================================================================== -class ConverterOperator(ClassOperator): - 'An operator in the form "operator OtherClass()".' - - def FullName(self): - return self.class_ + '::operator ' + self.result.FullName() - - - -#============================================================================== -# Type -#============================================================================== -class Type(Declaration): - '''Represents the type of a variable or parameter. - @ivar _const: if the type is constant. - @ivar _default: if this type has a default value associated with it. - @ivar _volatile: if this type was declared with the keyword volatile. - @ivar _restricted: if this type was declared with the keyword restricted. - @ivar _suffix: Suffix to get the full type name. '*' for pointers, for - example. - ''' - - def __init__(self, name, const=False, default=None, suffix=''): - Declaration.__init__(self, name, None) - # whatever the type is constant or not - self.const = const - # used when the Type is a function argument - self.default = default - self.volatile = False - self.restricted = False - self.suffix = suffix - - def __repr__(self): - if self.const: - const = 'const ' - else: - const = '' - return '' - - - def FullName(self): - if self.const: - const = 'const ' - else: - const = '' - return const + self.name + self.suffix - - -#============================================================================== -# ArrayType -#============================================================================== -class ArrayType(Type): - '''Represents an array. - @ivar min: the lower bound of the array, usually 0. Can be None. - @ivar max: the upper bound of the array. Can be None. - ''' - - def __init__(self, name, const, min, max): - 'min and max can be None.' - Type.__init__(self, name, const) - self.min = min - self.max = max - - - -#============================================================================== -# ReferenceType -#============================================================================== -class ReferenceType(Type): - '''A reference type.''' - - def __init__(self, name, const=False, default=None, expandRef=True, suffix=''): - Type.__init__(self, name, const, default) - if expandRef: - self.suffix = suffix + '&' - - -#============================================================================== -# PointerType -#============================================================================== -class PointerType(Type): - 'A pointer type.' - - def __init__(self, name, const=False, default=None, expandPointer=False, suffix=''): - Type.__init__(self, name, const, default) - if expandPointer: - self.suffix = suffix + '*' - - -#============================================================================== -# FundamentalType -#============================================================================== -class FundamentalType(Type): - 'One of the fundamental types, like int, void, etc.' - - def __init__(self, name, const=False, default=None): - Type.__init__(self, name, const, default) - - - -#============================================================================== -# FunctionType -#============================================================================== -class FunctionType(Type): - '''A pointer to a function. - @ivar _result: the return value - @ivar _parameters: a list of Types, indicating the parameters of the function. - @ivar _name: the name of the function. - ''' - - def __init__(self, result, parameters): - Type.__init__(self, '', False) - self.result = result - self.parameters = parameters - self.name = self.FullName() - - - def FullName(self): - full = '%s (*)' % self.result.FullName() - params = [x.FullName() for x in self.parameters] - full += '(%s)' % ', '.join(params) - return full - - -#============================================================================== -# MethodType -#============================================================================== -class MethodType(FunctionType): - '''A pointer to a member function of a class. - @ivar _class: The fullname of the class that the method belongs to. - ''' - - def __init__(self, result, parameters, class_): - self.class_ = class_ - FunctionType.__init__(self, result, parameters) - - - def FullName(self): - full = '%s (%s::*)' % (self.result.FullName(), self.class_) - params = [x.FullName() for x in self.parameters] - full += '(%s)' % ', '.join(params) - return full - - -#============================================================================== -# Variable -#============================================================================== -class Variable(Declaration): - '''Represents a global variable. - - @type _type: L{Type} - @ivar _type: The type of the variable. - ''' - - def __init__(self, type, name, namespace): - Declaration.__init__(self, name, namespace) - self.type = type - - -#============================================================================== -# ClassVariable -#============================================================================== -class ClassVariable(Variable): - '''Represents a class variable. - - @type _visibility: L{Scope} - @ivar _visibility: The visibility of this variable within the class. - - @type _static: bool - @ivar _static: Indicates if the variable is static. - - @ivar _class: Full name of the class that this variable belongs to. - ''' - - def __init__(self, type, name, class_, visib, static): - Variable.__init__(self, type, name, None) - self.visibility = visib - self.static = static - self.class_ = class_ - - - def FullName(self): - return self.class_ + '::' + self.name - - -#============================================================================== -# Enumeration -#============================================================================== -class Enumeration(Declaration): - '''Represents an enum. - - @type _values: dict of str => int - @ivar _values: holds the values for this enum. - ''' - - def __init__(self, name, namespace): - Declaration.__init__(self, name, namespace) - self.values = {} # dict of str => int - - - def ValueFullName(self, name): - '''Returns the full name for a value in the enum. - ''' - assert name in self.values - namespace = self.namespace - if namespace: - namespace += '::' - return namespace + name - - -#============================================================================== -# ClassEnumeration -#============================================================================== -class ClassEnumeration(Enumeration): - '''Represents an enum inside a class. - - @ivar _class: The full name of the class where this enum belongs. - @ivar _visibility: The visibility of this enum inside his class. - ''' - - def __init__(self, name, class_, visib): - Enumeration.__init__(self, name, None) - self.class_ = class_ - self.visibility = visib - - - def FullName(self): - return '%s::%s' % (self.class_, self.name) - - - def ValueFullName(self, name): - assert name in self.values - return '%s::%s' % (self.class_, name) - - -#============================================================================== -# Typedef -#============================================================================== -class Typedef(Declaration): - '''A Typedef declaration. - - @type _type: L{Type} - @ivar _type: The type of the typedef. - - @type _visibility: L{Scope} - @ivar _visibility: The visibility of this typedef. - ''' - - def __init__(self, type, name, namespace): - Declaration.__init__(self, name, namespace) - self.type = type - self.visibility = Scope.public - - - - - -#============================================================================== -# Unknown -#============================================================================== -class Unknown(Declaration): - '''A declaration that Pyste does not know how to handle. - ''' - - def __init__(self, name): - Declaration.__init__(self, name, None) diff --git a/pyste/src/Pyste/exporters.py b/pyste/src/Pyste/exporters.py deleted file mode 100644 index f573d01b..00000000 --- a/pyste/src/Pyste/exporters.py +++ /dev/null @@ -1,12 +0,0 @@ -# Copyright Bruno da Silva de Oliveira 2003. Use, modification and -# distribution is subject to 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) - - -# a list of Exporter instances -exporters = [] - -current_interface = None # the current interface file being processed -importing = False # whetever we are now importing a pyste file. - # exporters created here shouldn't export themselves diff --git a/pyste/src/Pyste/exporterutils.py b/pyste/src/Pyste/exporterutils.py deleted file mode 100644 index 363700d2..00000000 --- a/pyste/src/Pyste/exporterutils.py +++ /dev/null @@ -1,87 +0,0 @@ -# Copyright Bruno da Silva de Oliveira 2003. Use, modification and -# distribution is subject to 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) - -''' -Various helpers for interface files. -''' - -from settings import * -from policies import * -from declarations import * - -#============================================================================== -# FunctionWrapper -#============================================================================== -class FunctionWrapper(object): - '''Holds information about a wrapper for a function or a method. It is - divided in 2 parts: the name of the Wrapper, and its code. The code is - placed in the declaration section of the module, while the name is used to - def' the function or method (with the pyste namespace prepend to it). If - code is None, the name is left unchanged. - ''' - - def __init__(self, name, code=None): - self.name = name - self.code = code - - def FullName(self): - if self.code: - return namespaces.pyste + self.name - else: - return self.name - - -_printed_warnings = {} # used to avoid double-prints of warnings - -#============================================================================== -# HandlePolicy -#============================================================================== -def HandlePolicy(function, policy): - '''Show a warning to the user if the function needs a policy and doesn't - have one. Return a policy to the function, which is the given policy itself - if it is not None, or a default policy for this method. - ''' - - def IsString(type): - 'Return True if the Type instance can be considered a string' - return type.FullName() == 'const char*' - - def IsPyObject(type): - return type.FullName() == '_object *' # internal name of PyObject - - result = function.result - # if the function returns const char*, a policy is not needed - if IsString(result) or IsPyObject(result): - return policy - # if returns a const T&, set the default policy - if policy is None and result.const and isinstance(result, ReferenceType): - policy = return_value_policy(copy_const_reference) - # basic test if the result type demands a policy - needs_policy = isinstance(result, (ReferenceType, PointerType)) - # show a warning to the user, if needed - if needs_policy and policy is None: - global _printed_warnings - warning = '---> Error: %s returns a pointer or a reference, ' \ - 'but no policy was specified.' % function.FullName() - if warning not in _printed_warnings: - print warning - print - # avoid double prints of the same warning - _printed_warnings[warning] = 1 - return policy - - -#============================================================================== -# EspecializeTypeID -#============================================================================== -_exported_type_ids = {} -def EspecializeTypeID(typename): - global _exported_type_ids - macro = 'BOOST_PYTHON_OPAQUE_SPECIALIZED_TYPE_ID(%s)\n' % typename - if macro not in _exported_type_ids: - _exported_type_ids[macro] = 1 - return macro - else: - return None diff --git a/pyste/src/Pyste/infos.py b/pyste/src/Pyste/infos.py deleted file mode 100644 index 2a4f01ea..00000000 --- a/pyste/src/Pyste/infos.py +++ /dev/null @@ -1,259 +0,0 @@ -# Copyright Bruno da Silva de Oliveira 2003. Use, modification and -# distribution is subject to 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) - -import os.path -import copy -import exporters -from ClassExporter import ClassExporter -from FunctionExporter import FunctionExporter -from EnumExporter import EnumExporter -from HeaderExporter import HeaderExporter -from VarExporter import VarExporter -from CodeExporter import CodeExporter -from exporterutils import FunctionWrapper -from utils import makeid -import warnings - -#============================================================================== -# DeclarationInfo -#============================================================================== -class DeclarationInfo: - - def __init__(self, otherInfo=None): - self.__infos = {} - self.__attributes = {} - if otherInfo is not None: - self.__infos = copy.deepcopy(otherInfo.__infos) - self.__attributes = copy.deepcopy(otherInfo.__attributes) - - - def __getitem__(self, name): - 'Used to access sub-infos' - if name.startswith('__'): - raise AttributeError - default = DeclarationInfo() - default._Attribute('name', name) - return self.__infos.setdefault(name, default) - - - def __getattr__(self, name): - return self[name] - - - def _Attribute(self, name, value=None): - if value is None: - # get value - return self.__attributes.get(name) - else: - # set value - self.__attributes[name] = value - - - def AddExporter(self, exporter): - # this was causing a much serious bug, as reported by Niall Douglas: - # another solution must be found! - #if not exporters.importing: - if exporter not in exporters.exporters: - exporters.exporters.append(exporter) - exporter.interface_file = exporters.current_interface - - -#============================================================================== -# FunctionInfo -#============================================================================== -class FunctionInfo(DeclarationInfo): - - def __init__(self, name, include, tail=None, otherOption=None, - exporter_class = FunctionExporter): - DeclarationInfo.__init__(self, otherOption) - self._Attribute('name', name) - self._Attribute('include', include) - self._Attribute('exclude', False) - # create a FunctionExporter - exporter = exporter_class(InfoWrapper(self), tail) - self.AddExporter(exporter) - - -#============================================================================== -# ClassInfo -#============================================================================== -class ClassInfo(DeclarationInfo): - - def __init__(self, name, include, tail=None, otherInfo=None, - exporter_class = ClassExporter): - DeclarationInfo.__init__(self, otherInfo) - self._Attribute('name', name) - self._Attribute('include', include) - self._Attribute('exclude', False) - # create a ClassExporter - exporter = exporter_class(InfoWrapper(self), tail) - self.AddExporter(exporter) - - -#============================================================================== -# templates -#============================================================================== -def GenerateName(name, type_list): - name = name.replace('::', '_') - names = [name] + type_list - return makeid('_'.join(names)) - - -class ClassTemplateInfo(DeclarationInfo): - - def __init__(self, name, include, - exporter_class = ClassExporter): - DeclarationInfo.__init__(self) - self._Attribute('name', name) - self._Attribute('include', include) - self._exporter_class = exporter_class - - - def Instantiate(self, type_list, rename=None): - if not rename: - rename = GenerateName(self._Attribute('name'), type_list) - # generate code to instantiate the template - types = ', '.join(type_list) - tail = 'typedef %s< %s > %s;\n' % (self._Attribute('name'), types, rename) - tail += 'void __instantiate_%s()\n' % rename - tail += '{ sizeof(%s); }\n\n' % rename - # create a ClassInfo - class_ = ClassInfo(rename, self._Attribute('include'), tail, self, - exporter_class = self._exporter_class) - return class_ - - - def __call__(self, types, rename=None): - if isinstance(types, str): - types = types.split() - return self.Instantiate(types, rename) - -#============================================================================== -# EnumInfo -#============================================================================== -class EnumInfo(DeclarationInfo): - - def __init__(self, name, include, exporter_class = EnumExporter): - DeclarationInfo.__init__(self) - self._Attribute('name', name) - self._Attribute('include', include) - self._Attribute('exclude', False) - self._Attribute('export_values', False) - exporter = exporter_class(InfoWrapper(self)) - self.AddExporter(exporter) - - -#============================================================================== -# HeaderInfo -#============================================================================== -class HeaderInfo(DeclarationInfo): - - def __init__(self, include, exporter_class = HeaderExporter): - warnings.warn('AllFromHeader is not working in all cases in the current version.') - DeclarationInfo.__init__(self) - self._Attribute('include', include) - exporter = exporter_class(InfoWrapper(self)) - self.AddExporter(exporter) - - -#============================================================================== -# VarInfo -#============================================================================== -class VarInfo(DeclarationInfo): - - def __init__(self, name, include, exporter_class = VarExporter): - DeclarationInfo.__init__(self) - self._Attribute('name', name) - self._Attribute('include', include) - exporter = exporter_class(InfoWrapper(self)) - self.AddExporter(exporter) - - -#============================================================================== -# CodeInfo -#============================================================================== -class CodeInfo(DeclarationInfo): - - def __init__(self, code, section, exporter_class = CodeExporter): - DeclarationInfo.__init__(self) - self._Attribute('code', code) - self._Attribute('section', section) - exporter = exporter_class(InfoWrapper(self)) - self.AddExporter(exporter) - - -#============================================================================== -# InfoWrapper -#============================================================================== -class InfoWrapper: - 'Provides a nicer interface for a info' - - def __init__(self, info): - self.__dict__['_info'] = info # so __setattr__ is not called - - def __getitem__(self, name): - return InfoWrapper(self._info[name]) - - def __getattr__(self, name): - return self._info._Attribute(name) - - def __setattr__(self, name, value): - self._info._Attribute(name, value) - - -#============================================================================== -# Functions -#============================================================================== -def exclude(info): - info._Attribute('exclude', True) - -def set_policy(info, policy): - info._Attribute('policy', policy) - -def rename(info, name): - info._Attribute('rename', name) - -def set_wrapper(info, wrapper): - if isinstance(wrapper, str): - wrapper = FunctionWrapper(wrapper) - info._Attribute('wrapper', wrapper) - -def instantiate(template, types, rename=None): - if isinstance(types, str): - types = types.split() - return template.Instantiate(types, rename) - -def use_shared_ptr(info): - info._Attribute('smart_ptr', 'boost::shared_ptr< %s >') - -def use_auto_ptr(info): - info._Attribute('smart_ptr', 'std::auto_ptr< %s >') - -def holder(info, function): - msg = "Expected a callable that accepts one string argument." - assert callable(function), msg - info._Attribute('holder', function) - -def add_method(info, name, rename=None): - added = info._Attribute('__added__') - if added is None: - info._Attribute('__added__', [(name, rename)]) - else: - added.append((name, rename)) - - -def class_code(info, code): - added = info._Attribute('__code__') - if added is None: - info._Attribute('__code__', [code]) - else: - added.append(code) - -def final(info): - info._Attribute('no_override', True) - - -def export_values(info): - info._Attribute('export_values', True) diff --git a/pyste/src/Pyste/policies.py b/pyste/src/Pyste/policies.py deleted file mode 100644 index 57ebd0de..00000000 --- a/pyste/src/Pyste/policies.py +++ /dev/null @@ -1,95 +0,0 @@ -# Copyright Bruno da Silva de Oliveira 2003. Use, modification and -# distribution is subject to 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) - - - -class Policy(object): - 'Represents one of the call policies of boost.python.' - - def __init__(self): - if type(self) is Policy: - raise RuntimeError, "Can't create an instance of the class Policy" - - - def Code(self): - 'Returns the string corresponding to a instancialization of the policy.' - pass - - - def _next(self): - if self.next is not None: - return ', %s >' % self.next.Code() - else: - return ' >' - - - def __eq__(self, other): - try: - return self.Code() == other.Code() - except AttributeError: - return False - - - -class return_internal_reference(Policy): - 'Ties the return value to one of the parameters.' - - def __init__(self, param=1, next=None): - ''' - param is the position of the parameter, or None for "self". - next indicates the next policy, or None. - ''' - self.param = param - self.next=next - - - def Code(self): - c = 'return_internal_reference< %i' % self.param - c += self._next() - return c - - - -class with_custodian_and_ward(Policy): - 'Ties lifetime of two arguments of a function.' - - def __init__(self, custodian, ward, next=None): - self.custodian = custodian - self.ward = ward - self.next = next - - def Code(self): - c = 'with_custodian_and_ward< %i, %i' % (self.custodian, self.ward) - c += self._next() - return c - - - -class return_value_policy(Policy): - 'Policy to convert return values.' - - def __init__(self, which, next=None): - self.which = which - self.next = next - - - def Code(self): - c = 'return_value_policy< %s' % self.which - c += self._next() - return c - -class return_self(Policy): - - def Code(self): - return 'return_self<>' - - -# values for return_value_policy -reference_existing_object = 'reference_existing_object' -copy_const_reference = 'copy_const_reference' -copy_non_const_reference = 'copy_non_const_reference' -manage_new_object = 'manage_new_object' -return_opaque_pointer = 'return_opaque_pointer' -return_by_value = 'return_by_value' diff --git a/pyste/src/Pyste/pyste.py b/pyste/src/Pyste/pyste.py deleted file mode 100644 index cedffff5..00000000 --- a/pyste/src/Pyste/pyste.py +++ /dev/null @@ -1,424 +0,0 @@ -# Copyright Bruno da Silva de Oliveira 2003. Use, modification and -# distribution is subject to 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) - -""" -Pyste version %s - -Usage: - pyste [options] interface-files - -where options are: - --module= The name of the module that will be generated; - defaults to the first interface filename, without - the extension. - -I Add an include path - -D Define symbol - --multiple Create various cpps, instead of only one - (useful during development) - --out= Specify output filename (default: .cpp) - in --multiple mode, this will be a directory - --no-using Do not declare "using namespace boost"; - use explicit declarations instead - --pyste-ns= Set the namespace where new types will be declared; - default is the empty namespace - --debug Writes the xml for each file parsed in the current - directory - --cache-dir= Directory for cache files (speeds up future runs) - --only-create-cache Recreates all caches (doesn't generate code). - --generate-main Generates the _main.cpp file (in multiple mode) - --file-list A file with one pyste file per line. Use as a - substitute for passing the files in the command - line. - --gccxml-path= Path to gccxml executable (default: gccxml) - --no-default-include Do not use INCLUDE environment variable for include - files to pass along gccxml. - -h, --help Print this help and exit - -v, --version Print version information -""" - -import sys -import os -import getopt -import exporters -import SingleCodeUnit -import MultipleCodeUnit -import infos -import exporterutils -import settings -import gc -import sys -from policies import * -from CppParser import CppParser, CppParserError -import time -import declarations - -__version__ = '0.9.30' - -def RecursiveIncludes(include): - 'Return a list containg the include dir and all its subdirectories' - dirs = [include] - def visit(arg, dir, names): - # ignore CVS dirs - if os.path.split(dir)[1] != 'CVS': - dirs.append(dir) - os.path.walk(include, visit, None) - return dirs - - -def GetDefaultIncludes(): - if 'INCLUDE' in os.environ: - include = os.environ['INCLUDE'] - return include.split(os.pathsep) - else: - return [] - - -def ProcessIncludes(includes): - if sys.platform == 'win32': - index = 0 - for include in includes: - includes[index] = include.replace('\\', '/') - index += 1 - - -def ReadFileList(filename): - f = file(filename) - files = [] - try: - for line in f: - line = line.strip() - if line: - files.append(line) - finally: - f.close() - return files - - -def ParseArguments(): - - def Usage(): - print __doc__ % __version__ - sys.exit(1) - - try: - options, files = getopt.getopt( - sys.argv[1:], - 'R:I:D:vh', - ['module=', 'multiple', 'out=', 'no-using', 'pyste-ns=', 'debug', 'cache-dir=', - 'only-create-cache', 'version', 'generate-main', 'file-list=', 'help', - 'gccxml-path=', 'no-default-include']) - except getopt.GetoptError, e: - print - print 'ERROR:', e - Usage() - - default_includes = GetDefaultIncludes() - includes = [] - defines = [] - module = None - out = None - multiple = False - cache_dir = None - create_cache = False - generate_main = False - gccxml_path = 'gccxml' - - for opt, value in options: - if opt == '-I': - includes.append(value) - elif opt == '-D': - defines.append(value) - elif opt == '-R': - includes.extend(RecursiveIncludes(value)) - elif opt == '--module': - module = value - elif opt == '--out': - out = value - elif opt == '--no-using': - settings.namespaces.python = 'boost::python::' - settings.USING_BOOST_NS = False - elif opt == '--pyste-ns': - settings.namespaces.pyste = value + '::' - elif opt == '--debug': - settings.DEBUG = True - elif opt == '--multiple': - multiple = True - elif opt == '--cache-dir': - cache_dir = value - elif opt == '--only-create-cache': - create_cache = True - elif opt == '--file-list': - files += ReadFileList(value) - elif opt in ['-h', '--help']: - Usage() - elif opt in ['-v', '--version']: - print 'Pyste version %s' % __version__ - sys.exit(2) - elif opt == '--generate-main': - generate_main = True - elif opt == '--gccxml-path': - gccxml_path = value - elif opt == '--no-default-include': - default_includes = [] - else: - print 'Unknown option:', opt - Usage() - - includes[0:0] = default_includes - if not files: - Usage() - if not module: - module = os.path.splitext(os.path.basename(files[0]))[0] - if not out: - out = module - if not multiple: - out += '.cpp' - for file in files: - d = os.path.dirname(os.path.abspath(file)) - if d not in sys.path: - sys.path.append(d) - - if create_cache and not cache_dir: - print 'Error: Use --cache-dir to indicate where to create the cache files!' - Usage() - sys.exit(3) - - if generate_main and not multiple: - print 'Error: --generate-main only valid in multiple mode.' - Usage() - sys.exit(3) - - ProcessIncludes(includes) - return includes, defines, module, out, files, multiple, cache_dir, create_cache, \ - generate_main, gccxml_path - - -def PCHInclude(*headers): - code = '\n'.join(['#include <%s>' % x for x in headers]) - infos.CodeInfo(code, 'pchinclude') - - -def CreateContext(): - 'create the context where a interface file will be executed' - context = {} - context['Import'] = Import - # infos - context['Function'] = infos.FunctionInfo - context['Class'] = infos.ClassInfo - context['Include'] = lambda header: infos.CodeInfo('#include <%s>\n' % header, 'include') - context['PCHInclude'] = PCHInclude - context['Template'] = infos.ClassTemplateInfo - context['Enum'] = infos.EnumInfo - context['AllFromHeader'] = infos.HeaderInfo - context['Var'] = infos.VarInfo - # functions - context['rename'] = infos.rename - context['set_policy'] = infos.set_policy - context['exclude'] = infos.exclude - context['set_wrapper'] = infos.set_wrapper - context['use_shared_ptr'] = infos.use_shared_ptr - context['use_auto_ptr'] = infos.use_auto_ptr - context['holder'] = infos.holder - context['add_method'] = infos.add_method - context['final'] = infos.final - context['export_values'] = infos.export_values - # policies - context['return_internal_reference'] = return_internal_reference - context['with_custodian_and_ward'] = with_custodian_and_ward - context['return_value_policy'] = return_value_policy - context['reference_existing_object'] = reference_existing_object - context['copy_const_reference'] = copy_const_reference - context['copy_non_const_reference'] = copy_non_const_reference - context['return_opaque_pointer'] = return_opaque_pointer - context['manage_new_object'] = manage_new_object - context['return_by_value'] = return_by_value - context['return_self'] = return_self - # utils - context['Wrapper'] = exporterutils.FunctionWrapper - context['declaration_code'] = lambda code: infos.CodeInfo(code, 'declaration-outside') - context['module_code'] = lambda code: infos.CodeInfo(code, 'module') - context['class_code'] = infos.class_code - return context - - -def Begin(): - # parse arguments - includes, defines, module, out, interfaces, multiple, cache_dir, create_cache, generate_main, gccxml_path = ParseArguments() - # run pyste scripts - for interface in interfaces: - ExecuteInterface(interface) - # create the parser - parser = CppParser(includes, defines, cache_dir, declarations.version, gccxml_path) - try: - if not create_cache: - if not generate_main: - return GenerateCode(parser, module, out, interfaces, multiple) - else: - return GenerateMain(module, out, OrderInterfaces(interfaces)) - else: - return CreateCaches(parser) - finally: - parser.Close() - - -def CreateCaches(parser): - # There is one cache file per interface so we organize the headers - # by interfaces. For each interface collect the tails from the - # exporters sharing the same header. - tails = JoinTails(exporters.exporters) - - # now for each interface file take each header, and using the tail - # get the declarations and cache them. - for interface, header in tails: - tail = tails[(interface, header)] - declarations = parser.ParseWithGCCXML(header, tail) - cachefile = parser.CreateCache(header, interface, tail, declarations) - print 'Cached', cachefile - - return 0 - - -_imported_count = {} # interface => count - -def ExecuteInterface(interface): - old_interface = exporters.current_interface - if not os.path.exists(interface): - if old_interface and os.path.exists(old_interface): - d = os.path.dirname(old_interface) - interface = os.path.join(d, interface) - if not os.path.exists(interface): - raise IOError, "Cannot find interface file %s."%interface - - _imported_count[interface] = _imported_count.get(interface, 0) + 1 - exporters.current_interface = interface - context = CreateContext() - context['INTERFACE_FILE'] = os.path.abspath(interface) - execfile(interface, context) - exporters.current_interface = old_interface - - -def Import(interface): - exporters.importing = True - ExecuteInterface(interface) - exporters.importing = False - - -def JoinTails(exports): - '''Returns a dict of {(interface, header): tail}, where tail is the - joining of all tails of all exports for the header. - ''' - tails = {} - for export in exports: - interface = export.interface_file - header = export.Header() - tail = export.Tail() or '' - if (interface, header) in tails: - all_tails = tails[(interface,header)] - all_tails += '\n' + tail - tails[(interface, header)] = all_tails - else: - tails[(interface, header)] = tail - - return tails - - - -def OrderInterfaces(interfaces): - interfaces_order = [(_imported_count[x], x) for x in interfaces] - interfaces_order.sort() - interfaces_order.reverse() - return [x for _, x in interfaces_order] - - - -def GenerateMain(module, out, interfaces): - codeunit = MultipleCodeUnit.MultipleCodeUnit(module, out) - codeunit.GenerateMain(interfaces) - return 0 - - -def GenerateCode(parser, module, out, interfaces, multiple): - # prepare to generate the wrapper code - if multiple: - codeunit = MultipleCodeUnit.MultipleCodeUnit(module, out) - else: - codeunit = SingleCodeUnit.SingleCodeUnit(module, out) - # stop referencing the exporters here - exports = exporters.exporters - exporters.exporters = None - exported_names = dict([(x.Name(), None) for x in exports]) - - # order the exports - order = {} - for export in exports: - if export.interface_file in order: - order[export.interface_file].append(export) - else: - order[export.interface_file] = [export] - exports = [] - interfaces_order = OrderInterfaces(interfaces) - for interface in interfaces_order: - exports.extend(order[interface]) - del order - del interfaces_order - - # now generate the code in the correct order - #print exported_names - tails = JoinTails(exports) - for i in xrange(len(exports)): - export = exports[i] - interface = export.interface_file - header = export.Header() - if header: - tail = tails[(interface, header)] - declarations, parsed_header = parser.Parse(header, interface, tail) - else: - declarations = [] - parsed_header = None - ExpandTypedefs(declarations, exported_names) - export.SetDeclarations(declarations) - export.SetParsedHeader(parsed_header) - if multiple: - codeunit.SetCurrent(export.interface_file, export.Name()) - export.GenerateCode(codeunit, exported_names) - # force collect of cyclic references - exports[i] = None - del declarations - del export - gc.collect() - # finally save the code unit - codeunit.Save() - if not multiple: - print 'Module %s generated' % module - return 0 - - -def ExpandTypedefs(decls, exported_names): - '''Check if the names in exported_names are a typedef, and add the real class - name in the dict. - ''' - for name in exported_names.keys(): - for decl in decls: - if isinstance(decl, declarations.Typedef): - exported_names[decl.type.FullName()] = None - -def UsePsyco(): - 'Tries to use psyco if possible' - try: - import psyco - psyco.profile() - except: pass - - -def main(): - start = time.clock() - UsePsyco() - status = Begin() - print '%0.2f seconds' % (time.clock()-start) - sys.exit(status) - - -if __name__ == '__main__': - main() diff --git a/pyste/src/Pyste/settings.py b/pyste/src/Pyste/settings.py deleted file mode 100644 index ba613b23..00000000 --- a/pyste/src/Pyste/settings.py +++ /dev/null @@ -1,21 +0,0 @@ -# Copyright Bruno da Silva de Oliveira 2003. Use, modification and -# distribution is subject to 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) - - -#============================================================================== -# Global information -#============================================================================== - -DEBUG = False -USING_BOOST_NS = True - -class namespaces: - boost = 'boost::' - pyste = '' - python = '' # default is to not use boost::python namespace explicitly, so - # use the "using namespace" statement instead - -import sys -msvc = sys.platform == 'win32' diff --git a/pyste/src/Pyste/utils.py b/pyste/src/Pyste/utils.py deleted file mode 100644 index a8843e3f..00000000 --- a/pyste/src/Pyste/utils.py +++ /dev/null @@ -1,78 +0,0 @@ -# Copyright Bruno da Silva de Oliveira 2003. Use, modification and -# distribution is subject to 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) - -from __future__ import generators -import string -import sys - -#============================================================================== -# enumerate -#============================================================================== -def enumerate(seq): - i = 0 - for x in seq: - yield i, x - i += 1 - - -#============================================================================== -# makeid -#============================================================================== -_valid_chars = string.ascii_letters + string.digits + '_' -_valid_chars = dict(zip(_valid_chars, _valid_chars)) - -def makeid(name): - 'Returns the name as a valid identifier' - if type(name) != str: - print type(name), name - newname = [] - for char in name: - if char not in _valid_chars: - char = '_' - newname.append(char) - newname = ''.join(newname) - # avoid duplications of '_' chars - names = [x for x in newname.split('_') if x] - return '_'.join(names) - - -#============================================================================== -# remove_duplicated_lines -#============================================================================== -def remove_duplicated_lines(text): - includes = text.splitlines() - d = dict([(include, 0) for include in includes]) - includes = d.keys() - includes.sort() - return '\n'.join(includes) - - -#============================================================================== -# left_equals -#============================================================================== -def left_equals(s): - s = '// %s ' % s - return s + ('='*(80-len(s))) + '\n' - - -#============================================================================== -# post_mortem -#============================================================================== -def post_mortem(): - - def info(type, value, tb): - if hasattr(sys, 'ps1') or not sys.stderr.isatty(): - # we are in interactive mode or we don't have a tty-like - # device, so we call the default hook - sys.__excepthook__(type, value, tb) - else: - import traceback, pdb - # we are NOT in interactive mode, print the exception... - traceback.print_exception(type, value, tb) - print - # ...then start the debugger in post-mortem mode. - pdb.pm() - - sys.excepthook = info diff --git a/pyste/tests/GCCXMLParserUT.py b/pyste/tests/GCCXMLParserUT.py deleted file mode 100644 index 7175c9c6..00000000 --- a/pyste/tests/GCCXMLParserUT.py +++ /dev/null @@ -1,341 +0,0 @@ -# Copyright Bruno da Silva de Oliveira 2003. Use, modification and -# distribution is subject to 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) - -import sys -sys.path.append('../src') -import unittest -import tempfile -import os.path -from Pyste import GCCXMLParser -from Pyste.declarations import * - - -class Tester(unittest.TestCase): - - def TestConstructor(self, class_, method, visib): - self.assert_(isinstance(method, Constructor)) - self.assertEqual(method.FullName(), class_.FullName() + '::' + method.name) - self.assertEqual(method.result, None) - self.assertEqual(method.visibility, visib) - self.assert_(not method.virtual) - self.assert_(not method.abstract) - self.assert_(not method.static) - - def TestDefaultConstructor(self, class_, method, visib): - self.TestConstructor(class_, method, visib) - self.assert_(method.IsDefault()) - - def TestCopyConstructor(self, class_, method, visib): - self.TestConstructor(class_, method, visib) - self.assertEqual(len(method.parameters), 1) - param = method.parameters[0] - self.TestType( - param, - ReferenceType, - class_.FullName(), - 'const %s&' % class_.FullName(), - True) - self.assert_(method.IsCopy()) - - - def TestType(self, type_, classtype_, name, fullname, const): - self.assert_(isinstance(type_, classtype_)) - self.assertEqual(type_.name, name) - self.assertEqual(type_.namespace, None) - self.assertEqual(type_.FullName(), fullname) - self.assertEqual(type_.const, const) - - -class ClassBaseTest(Tester): - - def setUp(self): - self.base = GetDecl('Base') - - def testClass(self): - 'test the properties of the class Base' - self.assert_(isinstance(self.base, Class)) - self.assert_(self.base.abstract) - - - def testFoo(self): - 'test function foo in class Base' - foo = GetMember(self.base, 'foo') - self.assert_(isinstance(foo, Method)) - self.assertEqual(foo.visibility, Scope.public) - self.assert_(foo.virtual) - self.assert_(foo.abstract) - self.failIf(foo.static) - self.assertEqual(foo.class_, 'test::Base') - self.failIf(foo.const) - self.assertEqual(foo.FullName(), 'test::Base::foo') - self.assertEqual(foo.result.name, 'void') - self.assertEqual(len(foo.parameters), 1) - param = foo.parameters[0] - self.TestType(param, FundamentalType, 'int', 'int', False) - self.assertEqual(foo.namespace, None) - self.assertEqual( - foo.PointerDeclaration(1), '(void (test::Base::*)(int) )&test::Base::foo') - - def testX(self): - 'test the member x in class Base' - x = GetMember(self.base, 'x') - self.assertEqual(x.class_, 'test::Base') - self.assertEqual(x.FullName(), 'test::Base::x') - self.assertEqual(x.namespace, None) - self.assertEqual(x.visibility, Scope.private) - self.TestType(x.type, FundamentalType, 'int', 'int', False) - self.assertEqual(x.static, False) - - def testConstructors(self): - 'test constructors in class Base' - constructors = GetMembers(self.base, 'Base') - for cons in constructors: - if len(cons.parameters) == 0: - self.TestDefaultConstructor(self.base, cons, Scope.public) - elif len(cons.parameters) == 1: # copy constructor - self.TestCopyConstructor(self.base, cons, Scope.public) - elif len(cons.parameters) == 2: # other constructor - intp, floatp = cons.parameters - self.TestType(intp, FundamentalType, 'int', 'int', False) - self.TestType(floatp, FundamentalType, 'float', 'float', False) - - def testSimple(self): - 'test function simple in class Base' - simple = GetMember(self.base, 'simple') - self.assert_(isinstance(simple, Method)) - self.assertEqual(simple.visibility, Scope.protected) - self.assertEqual(simple.FullName(), 'test::Base::simple') - self.assertEqual(len(simple.parameters), 1) - param = simple.parameters[0] - self.TestType(param, ReferenceType, 'std::string', 'const std::string&', True) - self.TestType(simple.result, FundamentalType, 'bool', 'bool', False) - self.assertEqual( - simple.PointerDeclaration(1), - '(bool (test::Base::*)(const std::string&) )&test::Base::simple') - - - def testZ(self): - z = GetMember(self.base, 'z') - self.assert_(isinstance(z, Variable)) - self.assertEqual(z.visibility, Scope.public) - self.assertEqual(z.FullName(), 'test::Base::z') - self.assertEqual(z.type.name, 'int') - self.assertEqual(z.type.const, False) - self.assert_(z.static) - - -class ClassTemplateTest(Tester): - - def setUp(self): - self.template = GetDecl('Template') - - def testClass(self): - 'test the properties of the Template class' - self.assert_(isinstance(self.template, Class)) - self.assert_(not self.template.abstract) - self.assertEqual(self.template.FullName(), 'Template') - self.assertEqual(self.template.namespace, '') - self.assertEqual(self.template.name, 'Template') - - def testConstructors(self): - 'test the automatic constructors of the class Template' - constructors = GetMembers(self.template, 'Template') - for cons in constructors: - if len(cons.parameters) == 0: - self.TestDefaultConstructor(self.template, cons, Scope.public) - elif len(cons.parameters) == 1: - self.TestCopyConstructor(self.template, cons, Scope.public) - - - def testValue(self): - 'test the class variable value' - value = GetMember(self.template, 'value') - self.assert_(isinstance(value, ClassVariable)) - self.assert_(value.name, 'value') - self.TestType(value.type, FundamentalType, 'int', 'int', False) - self.assert_(not value.static) - self.assertEqual(value.visibility, Scope.public) - self.assertEqual(value.class_, 'Template') - self.assertEqual(value.FullName(), 'Template::value') - - def testBase(self): - 'test the superclasses of Template' - bases = self.template.bases - self.assertEqual(len(bases), 1) - base = bases[0] - self.assert_(isinstance(base, Base)) - self.assertEqual(base.name, 'test::Base') - self.assertEqual(base.visibility, Scope.protected) - - - -class FreeFuncTest(Tester): - - def setUp(self): - self.func = GetDecl('FreeFunc') - - def testFunc(self): - 'test attributes of FreeFunc' - self.assert_(isinstance(self.func, Function)) - self.assertEqual(self.func.name, 'FreeFunc') - self.assertEqual(self.func.FullName(), 'test::FreeFunc') - self.assertEqual(self.func.namespace, 'test') - self.assertEqual( - self.func.PointerDeclaration(1), - '(const test::Base& (*)(const std::string&, int))&test::FreeFunc') - - - def testResult(self): - 'test the return value of FreeFunc' - res = self.func.result - self.TestType(res, ReferenceType, 'test::Base', 'const test::Base&', True) - - def testParameters(self): - 'test the parameters of FreeFunc' - self.assertEqual(len(self.func.parameters), 2) - strp, intp = self.func.parameters - self.TestType(strp, ReferenceType, 'std::string', 'const std::string&', True) - self.assertEqual(strp.default, None) - self.TestType(intp, FundamentalType, 'int', 'int', False) - self.assertEqual(intp.default, '10') - - - -class testFunctionPointers(Tester): - - def testMethodPointer(self): - 'test declaration of a pointer-to-method' - meth = GetDecl('MethodTester') - param = meth.parameters[0] - fullname = 'void (test::Base::*)(int)' - self.TestType(param, PointerType, fullname, fullname, False) - - def testFunctionPointer(self): - 'test declaration of a pointer-to-function' - func = GetDecl('FunctionTester') - param = func.parameters[0] - fullname = 'void (*)(int)' - self.TestType(param, PointerType, fullname, fullname, False) - - - -# ============================================================================= -# Support routines -# ============================================================================= - -cppcode = ''' -namespace std { - class string; -} -namespace test { -class Base -{ -public: - Base(); - Base(const Base&); - Base(int, float); - - virtual void foo(int = 0.0) = 0; - static int z; -protected: - bool simple(const std::string&); -private: - int x; -}; - -void MethodTester( void (Base::*)(int) ); -void FunctionTester( void (*)(int) ); - - -const Base & FreeFunc(const std::string&, int=10); - -} - -template -struct Template: protected test::Base -{ - T value; - virtual void foo(int); -}; - -Template __aTemplateInt; -''' - -def GetXMLFile(): - '''Generates an gccxml file using the code from the global cppcode. - Returns the xml's filename.''' - # write the code to a header file - tmpfile = tempfile.mktemp() + '.h' - f = file(tmpfile, 'w') - f.write(cppcode) - f.close() - # run gccxml - outfile = tmpfile + '.xml' - if os.system('gccxml "%s" "-fxml=%s"' % (tmpfile, outfile)) != 0: - raise RuntimeError, 'Error executing GCCXML.' - # read the output file into the xmlcode - f = file(outfile) - xmlcode = f.read() - #print xmlcode - f.close() - # remove the header - os.remove(tmpfile) - return outfile - - - -def GetDeclarations(): - 'Uses the GCCXMLParser module to get the declarations.' - xmlfile = GetXMLFile() - declarations = GCCXMLParser.ParseDeclarations(xmlfile) - os.remove(xmlfile) - return declarations - -# the declarations to be analysed -declarations = GetDeclarations() - - -def GetDecl(name): - 'returns one of the top declarations given its name' - for decl in declarations: - if decl.name == name: - return decl - else: - raise RuntimeError, 'Declaration not found: %s' % name - - -def GetMember(class_, name): - 'gets the member of the given class by its name' - - res = None - multipleFound = False - for member in class_: - if member.name == name: - if res is not None: - multipleFound = True - break - res = member - if res is None or multipleFound: - raise RuntimeError, \ - 'No member or more than one member found in class %s: %s' \ - % (class_.name, name) - return res - - -def GetMembers(class_, name): - 'gets the members of the given class by its name' - res = [] - for member in class_: - if member.name == name: - res.append(member) - if len(res) in (0, 1): - raise RuntimeError, \ - 'GetMembers: 0 or 1 members found in class %s: %s' \ - % (class_.name, name) - return res - - -if __name__ == '__main__': - unittest.main() diff --git a/pyste/tests/SmartFileUT.py b/pyste/tests/SmartFileUT.py deleted file mode 100644 index 9e4e9988..00000000 --- a/pyste/tests/SmartFileUT.py +++ /dev/null @@ -1,84 +0,0 @@ -# Copyright Bruno da Silva de Oliveira 2003. Use, modification and -# distribution is subject to 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) -import sys -sys.path.append('../src') -from SmartFile import * -import unittest -import tempfile -import os -import time - - -class SmartFileTest(unittest.TestCase): - - FILENAME = tempfile.mktemp() - - def setUp(self): - self._Clean() - - def tearDown(self): - self._Clean() - - def _Clean(self): - try: - os.remove(self.FILENAME) - except OSError: pass - - - def testNonExistant(self): - "Must override the file, as there's no file in the disk yet" - self.assert_(not os.path.isfile(self.FILENAME)) - f = SmartFile(self.FILENAME, 'w') - f.write('Testing 123\nTesting again.') - f.close() - self.assert_(os.path.isfile(self.FILENAME)) - - - def testOverride(self): - "Must override the file, because the contents are different" - contents = 'Contents!\nContents!' - # create the file normally first - f = file(self.FILENAME, 'w') - f.write(contents) - f.close() - file_time = os.path.getmtime(self.FILENAME) - self.assert_(os.path.isfile(self.FILENAME)) - time.sleep(2) - f = SmartFile(self.FILENAME, 'w') - f.write(contents + '_') - f.close() - new_file_time = os.path.getmtime(self.FILENAME) - self.assert_(new_file_time != file_time) - - - def testNoOverride(self): - "Must not override the file, because the contents are the same" - contents = 'Contents!\nContents!' - # create the file normally first - f = file(self.FILENAME, 'w') - f.write(contents) - f.close() - file_time = os.path.getmtime(self.FILENAME) - self.assert_(os.path.isfile(self.FILENAME)) - time.sleep(2) - f = SmartFile(self.FILENAME, 'w') - f.write(contents) - f.close() - new_file_time = os.path.getmtime(self.FILENAME) - self.assert_(new_file_time == file_time) - - - def testAutoClose(self): - "Must be closed when garbage-collected" - def foo(): - f = SmartFile(self.FILENAME) - f.write('testing') - self.assert_(not os.path.isfile(self.FILENAME)) - foo() - self.assert_(os.path.isfile(self.FILENAME)) - - -if __name__ == '__main__': - unittest.main() diff --git a/pyste/tests/abstract_test.h b/pyste/tests/abstract_test.h deleted file mode 100644 index e0fba2b2..00000000 --- a/pyste/tests/abstract_test.h +++ /dev/null @@ -1,22 +0,0 @@ -/* Copyright Bruno da Silva de Oliveira 2003. Use, modification and - distribution is subject to 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 -#include - -namespace abstract { - -struct A { - virtual ~A() {} - virtual std::string f()=0; -}; - -struct B: A { - std::string f() { return "B::f"; } -}; - -std::string call(A* a) { return a->f(); } - -} diff --git a/pyste/tests/abstract_test.pyste b/pyste/tests/abstract_test.pyste deleted file mode 100644 index c65bb3ad..00000000 --- a/pyste/tests/abstract_test.pyste +++ /dev/null @@ -1,3 +0,0 @@ -Class('abstract::A', 'abstract_test.h') -Class('abstract::B', 'abstract_test.h') -Function('abstract::call', 'abstract_test.h') diff --git a/pyste/tests/abstract_testUT.py b/pyste/tests/abstract_testUT.py deleted file mode 100644 index 4dc61a26..00000000 --- a/pyste/tests/abstract_testUT.py +++ /dev/null @@ -1,26 +0,0 @@ -# Copyright Bruno da Silva de Oliveira 2003. Use, modification and -# distribution is subject to 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) -import unittest -from _abstract_test import * - -class AbstractTest(unittest.TestCase): - - def testIt(self): - class C(A): - def f(self): - return 'C::f' - - a = A() - b = B() - c = C() - self.assertRaises(RuntimeError, a.f) - self.assertEqual(b.f(), 'B::f') - self.assertEqual(call(b), 'B::f') - self.assertEqual(c.f(), 'C::f') - self.assertEqual(call(c), 'C::f') - - -if __name__ == '__main__': - unittest.main() diff --git a/pyste/tests/add_test.h b/pyste/tests/add_test.h deleted file mode 100644 index 447e8814..00000000 --- a/pyste/tests/add_test.h +++ /dev/null @@ -1,18 +0,0 @@ -/* Copyright Bruno da Silva de Oliveira 2003. Use, modification and - distribution is subject to 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) - */ -namespace add_test { - -struct C -{ - int x; -}; - -const int get_x(C& c) -{ - return c.x; -} - -} diff --git a/pyste/tests/add_test.pyste b/pyste/tests/add_test.pyste deleted file mode 100644 index cc7faa9e..00000000 --- a/pyste/tests/add_test.pyste +++ /dev/null @@ -1,2 +0,0 @@ -C = Class('add_test::C', 'add_test.h') -add_method(C, 'add_test::get_x') diff --git a/pyste/tests/add_testUT.py b/pyste/tests/add_testUT.py deleted file mode 100644 index 16f57a32..00000000 --- a/pyste/tests/add_testUT.py +++ /dev/null @@ -1,16 +0,0 @@ -# Copyright Bruno da Silva de Oliveira 2003. Use, modification and -# distribution is subject to 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) -import unittest -from _add_test import * - -class AddMethodTest(unittest.TestCase): - - def testIt(self): - c = C() - c.x = 10 - self.assertEqual(c.get_x(), 10) - -if __name__ == '__main__': - unittest.main() diff --git a/pyste/tests/basic.cpp b/pyste/tests/basic.cpp deleted file mode 100644 index d07b6da6..00000000 --- a/pyste/tests/basic.cpp +++ /dev/null @@ -1,13 +0,0 @@ -/* Copyright Bruno da Silva de Oliveira 2003. Use, modification and - distribution is subject to 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 "basic.h" - -namespace basic { - - int C::static_value = 3; - const int C::const_static_value = 100; - -} diff --git a/pyste/tests/basic.h b/pyste/tests/basic.h deleted file mode 100644 index 690fed2d..00000000 --- a/pyste/tests/basic.h +++ /dev/null @@ -1,69 +0,0 @@ -/* Copyright Bruno da Silva de Oliveira 2003. Use, modification and - distribution is subject to 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 BASIC_H -#define BASIC_H - - -#include - -namespace basic { - -struct C -{ - // test virtuallity - C(): value(1), const_value(0) {} - virtual int f(int x = 10) - { - return x*2; - } - - int foo(int x=1){ - return x+1; - } - - const std::string& get_name() { return name; } - void set_name(const std::string& name) { this->name = name; } -private: - std::string name; - -public: - // test data members - static int static_value; - static const int const_static_value; - - int value; - const int const_value; - - // test static functions - static int mul(int x, int y) { return x*y; } - static double mul(double x, double y) { return x*y; } - - static int square(int x=2) { return x*x; } -}; - -inline int call_f(C& c) -{ - return c.f(); -} - -inline int call_f(C& c, int x) -{ - return c.f(x); -} - -inline int get_static() -{ - return C::static_value; -} - -inline int get_value(C& c) -{ - return c.value; -} - -} - -#endif diff --git a/pyste/tests/basic.pyste b/pyste/tests/basic.pyste deleted file mode 100644 index 4fe0b5b3..00000000 --- a/pyste/tests/basic.pyste +++ /dev/null @@ -1,5 +0,0 @@ -Class('basic::C', 'basic.h') -Function('basic::call_f', 'basic.h') -Function('basic::get_static', 'basic.h') -Function('basic::get_value', 'basic.h') - diff --git a/pyste/tests/basicUT.py b/pyste/tests/basicUT.py deleted file mode 100644 index 9a18bcbf..00000000 --- a/pyste/tests/basicUT.py +++ /dev/null @@ -1,73 +0,0 @@ -# Copyright Bruno da Silva de Oliveira 2003. Use, modification and -# distribution is subject to 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) -import unittest -from _basic import * - -class BasicExampleTest(unittest.TestCase): - - def testIt(self): - - # test virtual functions - class D(C): - def f(self, x=10): - return x+1 - - d = D() - c = C() - - self.assertEqual(c.f(), 20) - self.assertEqual(c.f(3), 6) - self.assertEqual(d.f(), 11) - self.assertEqual(d.f(3), 4) - self.assertEqual(call_f(c), 20) - self.assertEqual(call_f(c, 4), 8) - self.assertEqual(call_f(d), 11) - self.assertEqual(call_f(d, 3), 4) - - # test data members - def testValue(value): - self.assertEqual(c.value, value) - self.assertEqual(d.value, value) - self.assertEqual(get_value(c), value) - self.assertEqual(get_value(d), value) - testValue(1) - c.value = 30 - d.value = 30 - testValue(30) - self.assertEqual(c.const_value, 0) - self.assertEqual(d.const_value, 0) - def set_const_value(): - c.const_value = 12 - self.assertRaises(AttributeError, set_const_value) - - # test static data-members - def testStatic(value): - self.assertEqual(C.static_value, value) - self.assertEqual(c.static_value, value) - self.assertEqual(D.static_value, value) - self.assertEqual(d.static_value, value) - self.assertEqual(get_static(), value) - testStatic(3) - C.static_value = 10 - testStatic(10) - self.assertEqual(C.const_static_value, 100) - def set_const_static(): - C.const_static_value = 1 - self.assertRaises(AttributeError, set_const_static) - - # test static function - def test_mul(result, *args): - self.assertEqual(C.mul(*args), result) - self.assertEqual(c.mul(*args), result) - test_mul(16, 8, 2) - test_mul(6.0, 2.0, 3.0) - self.assertEqual(C.square(), 4) - self.assertEqual(c.square(), 4) - self.assertEqual(C.square(3), 9) - self.assertEqual(c.square(3), 9) - - -if __name__ == '__main__': - unittest.main() diff --git a/pyste/tests/code_test.h b/pyste/tests/code_test.h deleted file mode 100644 index 0a31205a..00000000 --- a/pyste/tests/code_test.h +++ /dev/null @@ -1,8 +0,0 @@ -/* Copyright Bruno da Silva de Oliveira 2003. Use, modification and - distribution is subject to 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) - */ -struct A { - int x; -}; diff --git a/pyste/tests/code_test.pyste b/pyste/tests/code_test.pyste deleted file mode 100644 index 467996fd..00000000 --- a/pyste/tests/code_test.pyste +++ /dev/null @@ -1,9 +0,0 @@ -Class('A', 'code_test.h') -Include('string') -declaration_code(''' -int get(A& a) { return a.x; } - -std::string foo() { return "Hello!"; } -''') -module_code(' def("get", &get);\n') -module_code(' def("foo", &foo);\n') diff --git a/pyste/tests/code_testUT.py b/pyste/tests/code_testUT.py deleted file mode 100644 index 1059570a..00000000 --- a/pyste/tests/code_testUT.py +++ /dev/null @@ -1,18 +0,0 @@ -# Copyright Bruno da Silva de Oliveira 2003. Use, modification and -# distribution is subject to 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) -import unittest -from _code_test import * - -class CodeTest(unittest.TestCase): - - def testIt(self): - a = A() - a.x = 12 - self.assertEqual(get(a), 12) - self.assertEqual(foo(), "Hello!") - - -if __name__ == '__main__': - unittest.main() diff --git a/pyste/tests/enums.h b/pyste/tests/enums.h deleted file mode 100644 index afe33ca4..00000000 --- a/pyste/tests/enums.h +++ /dev/null @@ -1,34 +0,0 @@ -/* Copyright Bruno da Silva de Oliveira 2003. Use, modification and - distribution is subject to 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 ENUMS_H -#define ENUMS_H - -namespace enums { - -enum color { red, blue }; - -struct X -{ - enum choices - { - good = 1, - bad = 2 - }; - - int set(choices c) - { - return (int)c; - } -}; - -enum { - x = 0, - y = 1 -}; - -} - -#endif diff --git a/pyste/tests/enums.pyste b/pyste/tests/enums.pyste deleted file mode 100644 index c18a1244..00000000 --- a/pyste/tests/enums.pyste +++ /dev/null @@ -1,8 +0,0 @@ -h = AllFromHeader('enums.h') -rename(h.color.red, 'Red') -rename(h.color.blue, 'Blue') -export_values(h.color) -rename(h.X.choices.bad, 'Bad') -rename(h.X.choices.good, 'Good') -rename(h.X.choices, 'Choices') - diff --git a/pyste/tests/enumsUT.py b/pyste/tests/enumsUT.py deleted file mode 100644 index 7c7720dc..00000000 --- a/pyste/tests/enumsUT.py +++ /dev/null @@ -1,24 +0,0 @@ -# Copyright Bruno da Silva de Oliveira 2003. Use, modification and -# distribution is subject to 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) -import unittest -from _enums import * - -class EnumsTest(unittest.TestCase): - - def testIt(self): - self.assertEqual(int(Red), 0) - self.assertEqual(int(Blue), 1) - - self.assertEqual(int(X.Choices.Good), 1) - self.assertEqual(int(X.Choices.Bad), 2) - a = X() - self.assertEqual(a.set(a.Choices.Good), 1) - self.assertEqual(a.set(a.Choices.Bad), 2) - self.assertEqual(x, 0) - self.assertEqual(y, 1) - - -if __name__ == '__main__': - unittest.main() diff --git a/pyste/tests/header_test.h b/pyste/tests/header_test.h deleted file mode 100644 index 030d0d26..00000000 --- a/pyste/tests/header_test.h +++ /dev/null @@ -1,43 +0,0 @@ -/* Copyright Bruno da Silva de Oliveira 2003. Use, modification and - distribution is subject to 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 HEADER_TEST_H -#define HEADER_TEST_H - -#include -#include - -namespace header_test { - -enum choice { red, blue }; - -inline std::string choice_str(choice c) -{ - std::map choice_map; - choice_map[red] = "red"; - choice_map[blue] = "blue"; - return choice_map[c]; -} - -struct C -{ - choice c; - - std::string get() - { - return choice_str(c); - } -}; - -// test the exclusion of the following - -struct ForwardDeclared; // should be excluded automatically -struct A {}; -void foo(); -enum bar { value }; - -} - -#endif diff --git a/pyste/tests/header_test.pyste b/pyste/tests/header_test.pyste deleted file mode 100644 index 3bd55501..00000000 --- a/pyste/tests/header_test.pyste +++ /dev/null @@ -1,4 +0,0 @@ -h = AllFromHeader('header_test.h') -exclude(h.A) -exclude(h.foo) -exclude(h.bar) diff --git a/pyste/tests/header_testUT.py b/pyste/tests/header_testUT.py deleted file mode 100644 index aa0d4a16..00000000 --- a/pyste/tests/header_testUT.py +++ /dev/null @@ -1,27 +0,0 @@ -# Copyright Bruno da Silva de Oliveira 2003. Use, modification and -# distribution is subject to 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) -import unittest -from _header_test import * - -class HeaderTest(unittest.TestCase): - - def testIt(self): - self.assertEqual(choice.red, 0) - self.assertEqual(choice.blue, 1) - self.assertEqual(choice_str(choice.blue), 'blue') - self.assertEqual(choice_str(choice.red), 'red') - c = C() - c.c = choice.blue - self.assertEqual(c.get(), 'blue') - c.c = choice.red - self.assertEqual(c.get(), 'red') - # the following classes/functions should not have being exported - self.assertRaises(NameError, lambda: A()) - self.assertRaises(NameError, lambda: foo()) - self.assertRaises(NameError, lambda: bar.value) - self.assertRaises(NameError, lambda: ForwardDeclared()) - -if __name__ == '__main__': - unittest.main() diff --git a/pyste/tests/infosUT.py b/pyste/tests/infosUT.py deleted file mode 100644 index 93769f34..00000000 --- a/pyste/tests/infosUT.py +++ /dev/null @@ -1,55 +0,0 @@ -# Copyright Bruno da Silva de Oliveira 2003. Use, modification and -# distribution is subject to 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) -import sys -from Pyste.infos import * -from Pyste.policies import * -from Pyste.exporterutils import * -import unittest - -#================================================================================ -# InfosTest -#================================================================================ -class InfosTest(unittest.TestCase): - - def testFunctionInfo(self): - info = FunctionInfo('test::foo', 'foo.h') - rename(info, 'hello') - set_policy(info, return_internal_reference()) - set_wrapper(info, FunctionWrapper('foo_wrapper')) - - info = InfoWrapper(info) - - self.assertEqual(info.rename, 'hello') - self.assertEqual(info.policy.Code(), 'return_internal_reference< 1 >') - self.assertEqual(info.wrapper.name, 'foo_wrapper') - - - def testClassInfo(self): - info = ClassInfo('test::IFoo', 'foo.h') - rename(info.name, 'Name') - rename(info.exclude, 'Exclude') - rename(info, 'Foo') - rename(info.Bar, 'bar') - set_policy(info.Baz, return_internal_reference()) - rename(info.operator['>>'], 'from_string') - exclude(info.Bar) - set_wrapper(info.Baz, FunctionWrapper('baz_wrapper')) - - info = InfoWrapper(info) - - self.assertEqual(info.rename, 'Foo') - self.assertEqual(info['Bar'].rename, 'bar') - self.assertEqual(info['name'].rename, 'Name') - self.assertEqual(info['exclude'].rename, 'Exclude') - self.assertEqual(info['Bar'].exclude, True) - self.assertEqual(info['Baz'].policy.Code(), 'return_internal_reference< 1 >') - self.assertEqual(info['Baz'].wrapper.name, 'baz_wrapper') - self.assertEqual(info['operator']['>>'].rename, 'from_string') - - - - -if __name__ == '__main__': - unittest.main() diff --git a/pyste/tests/inherit.cpp b/pyste/tests/inherit.cpp deleted file mode 100644 index a75e8389..00000000 --- a/pyste/tests/inherit.cpp +++ /dev/null @@ -1,8 +0,0 @@ -/* Copyright Bruno da Silva de Oliveira 2003. Use, modification and - distribution is subject to 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 "inherit.h" - -int inherit::C::s = 1; diff --git a/pyste/tests/inherit.h b/pyste/tests/inherit.h deleted file mode 100644 index 8f903f4f..00000000 --- a/pyste/tests/inherit.h +++ /dev/null @@ -1,43 +0,0 @@ -/* Copyright Bruno da Silva de Oliveira 2003. Use, modification and - distribution is subject to 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) - */ -namespace inherit { - -template -class A -{ -public: - void set(T v) { mData = v; } - - T get() const { return mData; } - -private: - T mData; -}; - - -class B : public A -{ -public: - int go() { return get(); } -}; - -struct C : B -{ - enum ab { a = 1, b = 2 }; - int f1() { return 1; } - int x; - static int s; -}; - -struct D : C -{ - int f2() { return 2; } - int y; -}; - -struct X {}; -struct E: X, D {}; -} diff --git a/pyste/tests/inherit.pyste b/pyste/tests/inherit.pyste deleted file mode 100644 index 0dc02998..00000000 --- a/pyste/tests/inherit.pyste +++ /dev/null @@ -1,8 +0,0 @@ -A = Template('inherit::A', 'inherit.h') -A_int = A('int', 'A_int') - -Class('inherit::B', 'inherit.h') -Class('inherit::D', 'inherit.h') -E = Class('inherit::E', 'inherit.h') -exclude(E.s) -exclude(E.ab) diff --git a/pyste/tests/inherit2.h b/pyste/tests/inherit2.h deleted file mode 100644 index af9387bd..00000000 --- a/pyste/tests/inherit2.h +++ /dev/null @@ -1,35 +0,0 @@ -/* Copyright Bruno da Silva de Oliveira 2003. Use, modification and - distribution is subject to 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) - */ -namespace inherit2 { - -struct A -{ - int x; - int getx() { return x; } - int foo() { return 0; } - int foo(int x) { return x; } -}; - -struct B : A -{ - int y; - int gety() { return y; } - int foo() { return 1; } -}; - -struct C : B -{ - int z; - int getz() { return z; } -}; - -struct D : C -{ - int w; - int getw() { return w; } -}; - -} diff --git a/pyste/tests/inherit2.pyste b/pyste/tests/inherit2.pyste deleted file mode 100644 index 38082139..00000000 --- a/pyste/tests/inherit2.pyste +++ /dev/null @@ -1,2 +0,0 @@ -Class('inherit2::B', 'inherit2.h') -Class('inherit2::D', 'inherit2.h') diff --git a/pyste/tests/inherit2UT.py b/pyste/tests/inherit2UT.py deleted file mode 100644 index 85afce61..00000000 --- a/pyste/tests/inherit2UT.py +++ /dev/null @@ -1,31 +0,0 @@ -# Copyright Bruno da Silva de Oliveira 2003. Use, modification and -# distribution is subject to 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) -import unittest -from _inherit2 import * - -class InheritExampleTest(unittest.TestCase): - - def testIt(self): - b = B() - d = D() - - self.assert_(issubclass(D, B)) - b.x, b.y = 10, 5 - self.assertEqual(b.getx(), 10) - self.assertEqual(b.gety(), 5) - d.x, d.y, d.z, d.w = 20, 15, 10, 5 - self.assertEqual(d.getx(), 20) - self.assertEqual(d.gety(), 15) - self.assertEqual(d.getz(), 10) - self.assertEqual(d.getw(), 5) - self.assertEqual(b.foo(), 1) - self.assertEqual(b.foo(3), 3) - - def wrong(): - return b.getw() - self.assertRaises(AttributeError, wrong) - -if __name__ == '__main__': - unittest.main() diff --git a/pyste/tests/inherit3.h b/pyste/tests/inherit3.h deleted file mode 100644 index 1945fb51..00000000 --- a/pyste/tests/inherit3.h +++ /dev/null @@ -1,46 +0,0 @@ -/* Copyright Bruno da Silva de Oliveira 2003. Use, modification and - distribution is subject to 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) - */ - -namespace inherit3 { - -struct A -{ - A() { x = 0; } - struct X { int y; }; - int x; - virtual int foo() { return 0; } - virtual int foo(int x) { return x; } - A operator+(A o) const - { - A r; - r.x = o.x + x; - return r; - } - enum E { i, j }; - -}; - -struct B: A -{ - B() { x = 0; } - struct X { int y; }; - int x; - int foo() { return 1; } - A operator+(A o) const - { - A r; - r.x = o.x + x; - return r; - } - enum E { i, j }; - -}; - -struct C: A -{ -}; - -} diff --git a/pyste/tests/inherit3.pyste b/pyste/tests/inherit3.pyste deleted file mode 100644 index f95c0605..00000000 --- a/pyste/tests/inherit3.pyste +++ /dev/null @@ -1,2 +0,0 @@ -Class('inherit3::B', 'inherit3.h') -Class('inherit3::C', 'inherit3.h') diff --git a/pyste/tests/inherit3UT.py b/pyste/tests/inherit3UT.py deleted file mode 100644 index b7dba1e9..00000000 --- a/pyste/tests/inherit3UT.py +++ /dev/null @@ -1,27 +0,0 @@ -# Copyright Bruno da Silva de Oliveira 2003. Use, modification and -# distribution is subject to 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) -import unittest -from _inherit3 import * - -class testInherit3(unittest.TestCase): - - def testIt(self): - def testInst(c): - self.assertEqual(c.x, 0) - self.assertEqual(c.foo(3), 3) - x = c.X() - self.assertEqual(x.y, 0) - self.assertEqual(c.E.i, 0) - self.assertEqual(c.E.j, 1) - b = B() - c = C() - testInst(b) - testInst(c) - self.assertEqual(b.foo(), 1) - self.assertEqual(c.foo(), 0) - - -if __name__ == '__main__': - unittest.main() diff --git a/pyste/tests/inherit4.h b/pyste/tests/inherit4.h deleted file mode 100644 index a1cecfbc..00000000 --- a/pyste/tests/inherit4.h +++ /dev/null @@ -1,23 +0,0 @@ -/* Copyright Bruno da Silva de Oliveira 2003. Use, modification and - distribution is subject to 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) - */ -namespace inherit4 { - -struct A -{ - int x; -}; - -struct B: A -{ - int y; -}; - -struct C: B -{ - int z; -}; - -} diff --git a/pyste/tests/inherit4.pyste b/pyste/tests/inherit4.pyste deleted file mode 100644 index 4809e022..00000000 --- a/pyste/tests/inherit4.pyste +++ /dev/null @@ -1,3 +0,0 @@ -Class('inherit4::A', 'inherit4.h') -Class('inherit4::B', 'inherit4.h') -Class('inherit4::C', 'inherit4.h') diff --git a/pyste/tests/inherit4UT.py b/pyste/tests/inherit4UT.py deleted file mode 100644 index f2c75c55..00000000 --- a/pyste/tests/inherit4UT.py +++ /dev/null @@ -1,31 +0,0 @@ -# Copyright Bruno da Silva de Oliveira 2003. Use, modification and -# distribution is subject to 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) -import unittest -from _inherit4 import * - -class TestInherit4(unittest.TestCase): - - def testIt(self): - self.assert_(issubclass(B, A)) - self.assert_(issubclass(C, A)) - self.assert_(issubclass(C, B)) - a = A() - a.x = 1 - b = B() - b.x = 10 - b.y = 20 - c = C() - c.x = 100 - c.y = 200 - c.z = 300 - self.assertEqual(a.x, 1) - self.assertEqual(b.x, 10) - self.assertEqual(b.y, 20) - self.assertEqual(c.x, 100) - self.assertEqual(c.y, 200) - self.assertEqual(c.z, 300) - -if __name__ == '__main__': - unittest.main() diff --git a/pyste/tests/inheritUT.py b/pyste/tests/inheritUT.py deleted file mode 100644 index f3e7b406..00000000 --- a/pyste/tests/inheritUT.py +++ /dev/null @@ -1,33 +0,0 @@ -# Copyright Bruno da Silva de Oliveira 2003. Use, modification and -# distribution is subject to 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) -import unittest -from _inherit import * - -class InheritExampleTest(unittest.TestCase): - - def testIt(self): - a = A_int() - b = B() - self.assert_(isinstance(b, A_int)) - self.assert_(issubclass(B, A_int)) - a.set(10) - self.assertEqual(a.get(), 10) - b.set(1) - self.assertEqual(b.go(), 1) - self.assertEqual(b.get(), 1) - - d = D() - self.assert_(issubclass(D, B)) - self.assertEqual(d.x, 0) - self.assertEqual(d.y, 0) - self.assertEqual(d.s, 1) - self.assertEqual(D.s, 1) - self.assertEqual(d.f1(), 1) - self.assertEqual(d.f2(), 2) - - - -if __name__ == '__main__': - unittest.main() diff --git a/pyste/tests/nested.cpp b/pyste/tests/nested.cpp deleted file mode 100644 index 6e167ab0..00000000 --- a/pyste/tests/nested.cpp +++ /dev/null @@ -1,9 +0,0 @@ -/* Copyright Bruno da Silva de Oliveira 2003. Use, modification and - distribution is subject to 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 "nested.h" - -int nested::X::staticXValue = 10; -int nested::X::Y::staticYValue = 20; diff --git a/pyste/tests/nested.h b/pyste/tests/nested.h deleted file mode 100644 index 13ed6085..00000000 --- a/pyste/tests/nested.h +++ /dev/null @@ -1,32 +0,0 @@ -/* Copyright Bruno da Silva de Oliveira 2003. Use, modification and - distribution is subject to 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 NESTED_H -#define NESTED_H - -namespace nested { - -struct X -{ - struct Y - { - int valueY; - static int staticYValue; - struct Z - { - int valueZ; - }; - }; - - static int staticXValue; - int valueX; -}; - -typedef X Root; - -} - -#endif diff --git a/pyste/tests/nested.pyste b/pyste/tests/nested.pyste deleted file mode 100644 index 48bb26b5..00000000 --- a/pyste/tests/nested.pyste +++ /dev/null @@ -1 +0,0 @@ -Class('nested::Root', 'nested.h') diff --git a/pyste/tests/nestedUT.py b/pyste/tests/nestedUT.py deleted file mode 100644 index 06c1c7be..00000000 --- a/pyste/tests/nestedUT.py +++ /dev/null @@ -1,19 +0,0 @@ -# Copyright Bruno da Silva de Oliveira 2003. Use, modification and -# distribution is subject to 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) -import unittest -from _nested import * - -class NestedTest(unittest.TestCase): - - def testIt(self): - self.assertEqual(Root.staticXValue, 10) - self.assertEqual(Root.Y.staticYValue, 20) - z = Root.Y.Z() - z.valueZ = 3 - self.assertEqual(z.valueZ, 3) - - -if __name__ == '__main__': - unittest.main() diff --git a/pyste/tests/opaque.h b/pyste/tests/opaque.h deleted file mode 100644 index 1947830e..00000000 --- a/pyste/tests/opaque.h +++ /dev/null @@ -1,57 +0,0 @@ -/* Copyright Bruno da Silva de Oliveira 2003. Use, modification and - distribution is subject to 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 OPAQUE_H -#define OPAQUE_H - -#include - -namespace opaque { - - -struct C { - C(int v): value(v) {} - int value; -}; - - -inline C* new_C() -{ - return new C(10); -} - -inline C* new_C_zero() -{ - return new C(0); -} - -inline int get(C* c) -{ - return c->value; -} - -struct D { - D(double v): value(v) {} - double value; -}; - -struct A -{ - D* new_handle() - { - return new D(3.0); - } - - double get(D* d) - { - return d->value; - } - - int f(int x=0) { return x; } -}; - -} - -#endif diff --git a/pyste/tests/opaque.pyste b/pyste/tests/opaque.pyste deleted file mode 100644 index 8180d251..00000000 --- a/pyste/tests/opaque.pyste +++ /dev/null @@ -1,7 +0,0 @@ -foo = Function('opaque::new_C', 'opaque.h') -set_policy(foo, return_value_policy(return_opaque_pointer)) -foo = Function('opaque::new_C_zero', 'opaque.h') -set_policy(foo, return_value_policy(return_opaque_pointer)) -Function('opaque::get', 'opaque.h' ) -A = Class('opaque::A', 'opaque.h') -set_policy(A.new_handle, return_value_policy(return_opaque_pointer)) diff --git a/pyste/tests/opaqueUT.py b/pyste/tests/opaqueUT.py deleted file mode 100644 index 0f3e1e07..00000000 --- a/pyste/tests/opaqueUT.py +++ /dev/null @@ -1,24 +0,0 @@ -# Copyright Bruno da Silva de Oliveira 2003. Use, modification and -# distribution is subject to 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) -import unittest -from _opaque import * - -class OpaqueTest(unittest.TestCase): - - def testIt(self): - - c = new_C() - self.assertEqual(get(c), 10) - c = new_C_zero() - self.assertEqual(get(c), 0) - a = A() - d = a.new_handle() - self.assertEqual(a.get(d), 3.0) - self.assertEqual(a.f(), 0) - self.assertEqual(a.f(3), 3) - - -if __name__ == '__main__': - unittest.main() diff --git a/pyste/tests/operators.cpp b/pyste/tests/operators.cpp deleted file mode 100644 index cecdaca0..00000000 --- a/pyste/tests/operators.cpp +++ /dev/null @@ -1,8 +0,0 @@ -/* Copyright Bruno da Silva de Oliveira 2003. Use, modification and - distribution is subject to 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 "operators.h" - -double operators::C::x = 10; diff --git a/pyste/tests/operators.h b/pyste/tests/operators.h deleted file mode 100644 index 5d394421..00000000 --- a/pyste/tests/operators.h +++ /dev/null @@ -1,52 +0,0 @@ -/* Copyright Bruno da Silva de Oliveira 2003. Use, modification and - distribution is subject to 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 OPERATORS_H -#define OPERATORS_H - - -namespace operators { - -struct C -{ - static double x; - double value; - - const C operator+(const C other) const - { - C c; - c.value = value + other.value; - return c; - } - operator int() const - { - return (int)value; - } - - double operator()() - { - return C::x; - } - - double operator()(double other) - { - return C::x + other; - } - - operator const char*() { return "C"; } -}; - -inline const C operator*(const C& lhs, const C& rhs) -{ - C c; - c.value = lhs.value * rhs.value; - return c; -} - - -} - - -#endif diff --git a/pyste/tests/operators.pyste b/pyste/tests/operators.pyste deleted file mode 100644 index 4ab7a370..00000000 --- a/pyste/tests/operators.pyste +++ /dev/null @@ -1,2 +0,0 @@ -C = Class('operators::C', 'operators.h') -#exclude(C.operator['+']) diff --git a/pyste/tests/operatorsUT.py b/pyste/tests/operatorsUT.py deleted file mode 100644 index beb19317..00000000 --- a/pyste/tests/operatorsUT.py +++ /dev/null @@ -1,30 +0,0 @@ -# Copyright Bruno da Silva de Oliveira 2003. Use, modification and -# distribution is subject to 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) -import unittest -from _operators import * - -class OperatorTest(unittest.TestCase): - - def testIt(self): - c = C() - c.value = 3.0 - d = C() - d.value = 2.0 - self.assertEqual(c.x, 10) - self.assertEqual(C.x, 10) - self.assertEqual(C.x, 10) - self.assertEqual((c * d).value, 6.0) - self.assertEqual((c + d).value, 5.0) - self.assertEqual(int(c), 3) - self.assertEqual(int(d), 2) - self.assertEqual(c(), 10) - self.assertEqual(d(), 10) - self.assertEqual(c(3.0), 13.0) - self.assertEqual(d(6.0), 16.0) - self.assertEqual(str(c), "C") - - -if __name__ == '__main__': - unittest.main() diff --git a/pyste/tests/policiesUT.py b/pyste/tests/policiesUT.py deleted file mode 100644 index 7255baeb..00000000 --- a/pyste/tests/policiesUT.py +++ /dev/null @@ -1,67 +0,0 @@ -# Copyright Bruno da Silva de Oliveira 2003. Use, modification and -# distribution is subject to 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) -import sys -import unittest -from Pyste.policies import * - - -#================================================================================ -# PolicicesTest -#================================================================================ -class PoliciesTest(unittest.TestCase): - - def testReturnInternal(self): - 'tests the code from a simple internal_reference' - - x = return_internal_reference(1) - self.assertEqual(x.Code(), 'return_internal_reference< 1 >') - x = return_internal_reference(3) - self.assertEqual(x.Code(), 'return_internal_reference< 3 >') - - - def testCustodian(self): - 'tests the code from a simple custodian_and_ward' - - x = with_custodian_and_ward(1,2) - self.assertEqual(x.Code(), 'with_custodian_and_ward< 1, 2 >') - x = with_custodian_and_ward(3,4) - self.assertEqual(x.Code(), 'with_custodian_and_ward< 3, 4 >') - - - def testReturnPolicies(self): - 'tests all the return_value_policies' - - ret = 'return_value_policy< %s >' - x = return_value_policy(reference_existing_object) - self.assertEqual(x.Code(), ret % 'reference_existing_object') - x = return_value_policy(copy_const_reference) - self.assertEqual(x.Code(), ret % 'copy_const_reference') - x = return_value_policy(copy_non_const_reference) - self.assertEqual(x.Code(), ret % 'copy_non_const_reference') - x = return_value_policy(manage_new_object) - self.assertEqual(x.Code(), ret % 'manage_new_object') - x = return_value_policy(return_opaque_pointer) - self.assertEqual(x.Code(), ret % 'return_opaque_pointer') - - def testReturnWithCustodiam(self): - 'test the mix of return_internal with custodian' - - x = return_internal_reference(1, with_custodian_and_ward(3,2)) - self.assertEqual( - x.Code(), - 'return_internal_reference< 1, with_custodian_and_ward< 3, 2 > >') - - - def testReturnPoliciesWithInternal(self): - 'test the mix of return_internal with return_policy' - - x = return_internal_reference(1, return_value_policy(manage_new_object)) - self.assertEqual( - x.Code(), - 'return_internal_reference< 1, return_value_policy< manage_new_object > >') - - -if __name__ == '__main__': - unittest.main() diff --git a/pyste/tests/runtests.py b/pyste/tests/runtests.py deleted file mode 100644 index 4bf83b34..00000000 --- a/pyste/tests/runtests.py +++ /dev/null @@ -1,21 +0,0 @@ -# Copyright Bruno da Silva de Oliveira 2003. Use, modification and -# distribution is subject to 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) -#!/usr/bin/python - -import sys -sys.path.append('../src/Pyste') -import unittest -import os.path -from glob import glob - -if __name__ == '__main__': - loader = unittest.defaultTestLoader - tests = [] - for name in glob('*UT.py'): - module = __import__(os.path.splitext(name)[0]) - tests.append(loader.loadTestsFromModule(module)) - runner = unittest.TextTestRunner() - result = runner.run(unittest.TestSuite(tests)) - sys.exit(not result.wasSuccessful()) diff --git a/pyste/tests/smart_ptr.h b/pyste/tests/smart_ptr.h deleted file mode 100644 index b230b917..00000000 --- a/pyste/tests/smart_ptr.h +++ /dev/null @@ -1,50 +0,0 @@ -/* Copyright Bruno da Silva de Oliveira 2003. Use, modification and - distribution is subject to 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 SMART_PTR_H -#define SMART_PTR_H - - -#include -#include - -namespace smart_ptr { - -struct C -{ - int value; -}; - -inline boost::shared_ptr NewC() { return boost::shared_ptr( new C() ); } - -struct D -{ - boost::shared_ptr Get() { return ptr; } - void Set( boost::shared_ptr c ) { ptr = c; } -private: - boost::shared_ptr ptr; -}; - -inline std::auto_ptr NewD() { return std::auto_ptr( new D() ); } - - -// test an abstract class -struct A -{ - virtual int f() = 0; -}; - -struct B: A -{ - virtual int f(){ return 1; } -}; - -inline boost::shared_ptr NewA() { return boost::shared_ptr(new B()); } -inline int GetA(boost::shared_ptr a) { return a->f(); } - -} - -#endif diff --git a/pyste/tests/smart_ptr.pyste b/pyste/tests/smart_ptr.pyste deleted file mode 100644 index cfbdd81a..00000000 --- a/pyste/tests/smart_ptr.pyste +++ /dev/null @@ -1,13 +0,0 @@ -C = Class('smart_ptr::C', 'smart_ptr.h') -use_shared_ptr(C) - -D = Class('smart_ptr::D', 'smart_ptr.h') -use_auto_ptr(D) - -A = Class('smart_ptr::A', 'smart_ptr.h') -use_shared_ptr(A) - -Function('smart_ptr::NewC', 'smart_ptr.h') -Function('smart_ptr::NewD', 'smart_ptr.h') -Function('smart_ptr::NewA', 'smart_ptr.h') -Function('smart_ptr::GetA', 'smart_ptr.h') diff --git a/pyste/tests/smart_ptrUT.py b/pyste/tests/smart_ptrUT.py deleted file mode 100644 index 9d81f08d..00000000 --- a/pyste/tests/smart_ptrUT.py +++ /dev/null @@ -1,22 +0,0 @@ -# Copyright Bruno da Silva de Oliveira 2003. Use, modification and -# distribution is subject to 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) -import unittest -from _smart_ptr import * - -class BasicExampleTest(unittest.TestCase): - - def testIt(self): - c = NewC() - d = NewD() - c.value = 3 - d.Set(c) - c1 = d.Get() - c1.value = 6 - self.assertEqual(c.value, 6) - a = NewA() - self.assertEqual(GetA(a), 1) - -if __name__ == '__main__': - unittest.main() diff --git a/pyste/tests/templates.h b/pyste/tests/templates.h deleted file mode 100644 index 7258e91c..00000000 --- a/pyste/tests/templates.h +++ /dev/null @@ -1,15 +0,0 @@ -/* Copyright Bruno da Silva de Oliveira 2003. Use, modification and - distribution is subject to 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) - */ -namespace templates { - -template -struct Point -{ - T x; - T y; -}; - -} diff --git a/pyste/tests/templates.pyste b/pyste/tests/templates.pyste deleted file mode 100644 index 77eaceaa..00000000 --- a/pyste/tests/templates.pyste +++ /dev/null @@ -1,8 +0,0 @@ -Point = Template('templates::Point', 'templates.h') -rename(Point.x, 'i') -rename(Point.y, 'j') -IPoint = Point('int') -FPoint = Point('double', 'FPoint') -rename(IPoint, 'IPoint') -rename(IPoint.x, 'x') -rename(IPoint.y, 'y') diff --git a/pyste/tests/templatesUT.py b/pyste/tests/templatesUT.py deleted file mode 100644 index 0c4b08b5..00000000 --- a/pyste/tests/templatesUT.py +++ /dev/null @@ -1,30 +0,0 @@ -# Copyright Bruno da Silva de Oliveira 2003. Use, modification and -# distribution is subject to 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) -import unittest -from _templates import * - -class TemplatesTest(unittest.TestCase): - - def testIt(self): - fp = FPoint() - fp.i = 3.0 - fp.j = 4.0 - ip = IPoint() - ip.x = 10 - ip.y = 3 - - self.assertEqual(fp.i, 3.0) - self.assertEqual(fp.j, 4.0) - self.assertEqual(ip.x, 10) - self.assertEqual(ip.y, 3) - self.assertEqual(type(fp.i), float) - self.assertEqual(type(fp.j), float) - self.assertEqual(type(ip.x), int) - self.assertEqual(type(ip.y), int) - - - -if __name__ == '__main__': - unittest.main() diff --git a/pyste/tests/test_all.py b/pyste/tests/test_all.py deleted file mode 100644 index ba3c54de..00000000 --- a/pyste/tests/test_all.py +++ /dev/null @@ -1,140 +0,0 @@ -#!/usr/bin/python -# Copyright Bruno da Silva de Oliveira 2003. Use, modification and -# distribution is subject to 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) - -import os -import glob -import shutil -import sys -import time - -#============================================================================= -# win32 configuration -#============================================================================= -if sys.platform == 'win32': - - includes = '-ID:/programming/libraries/boost-cvs/boost -ID:/Bin/Python/include' - build_pyste_cmd = 'python ../src/Pyste/pyste.py --pyste-ns=pyste --cache-dir=cache %s ' % includes - compile_single_cmd = 'cl /nologo /GR /GX -c %s -I. ' % includes - link_single_cmd = 'link /nologo /DLL '\ - '/libpath:D:/programming/libraries/boost-cvs/lib /libpath:D:/Bin/Python/libs '\ - 'boost_python.lib python24.lib /out:_%s.dll ' - obj_ext = 'obj' - -#============================================================================= -# linux configuration -#============================================================================= -elif sys.platform == 'linux2': - - build_pyste_cmd = 'python ../src/Pyste/pyste.py -I. ' - compile_single_cmd = 'g++ -shared -c -I. -I/usr/include/python2.4 ' - link_single_cmd = 'g++ -shared -o _%s.so -lboost_python ' - obj_ext = 'o' - - - -def build_pyste(multiple, module): - rest = '%s --module=_%s %s.pyste' % (multiple, module, module) - execute(build_pyste_cmd + rest) - - -def compile_single(module): - module_obj = '' - if os.path.isfile(module+'.cpp'): - execute(compile_single_cmd + module+'.cpp') - module_obj = module + '.' + obj_ext - execute(compile_single_cmd + ('_%s.cpp' % module)) - link = link_single_cmd % module - execute(link + ('_%s.%s ' % (module, obj_ext)) + module_obj) - - -def compile_multiple(module): - module_obj = '' - if os.path.isfile(module+'.cpp'): - execute(compile_single_cmd + module+'.cpp') - module_obj = module + '.' + obj_ext - files = glob.glob('_%s/*.cpp' % module) - for f in files: - execute(compile_single_cmd + f) - def basename(name): - return os.path.basename(os.path.splitext(name)[0]) - objs = [basename(x) + '.' + obj_ext for x in files] - objs.append(module_obj) - execute((link_single_cmd % module) + ' '.join(objs)) - - -def execute(cmd): - os.system(cmd) - - -def run_tests(): - if os.system('python runtests.py') != 0: - raise RuntimeError, 'tests failed' - - -def cleanup(): - modules = get_modules() - extensions = '*.dll *.pyc *.obj *.exp *.lib *.o *.so' - files = [] - for module in modules: - files.append('_' + module + '.cpp') - for ext in extensions.split(): - files += glob.glob(ext) - files.append('build.log') - for file in files: - try: - os.remove(file) - except OSError: pass - - for module in modules: - try: - shutil.rmtree('_' + module) - except OSError: pass - - -def main(multiple, module=None): - if module is None: - modules = get_modules() - else: - modules = [module] - - start = time.clock() - for module in modules: - build_pyste(multiple, module) - print '-'*50 - print 'Building pyste files: %0.2f seconds' % (time.clock()-start) - print - - start = time.clock() - for module in modules: - if multiple: - compile_multiple(module) - else: - compile_single(module) - print '-'*50 - print 'Compiling files: %0.2f seconds' % (time.clock()-start) - print - if len(modules) == 1: - os.system('python %sUT.py' % modules[0]) - else: - run_tests() - #cleanup() - - -def get_modules(): - def getname(file): - return os.path.splitext(os.path.basename(file))[0] - return [getname(x) for x in glob.glob('*.pyste')] - -if __name__ == '__main__': - if len(sys.argv) > 1: - module = sys.argv[1] - else: - module = None - try: -# main('--multiple', module) - main('', module) - except RuntimeError, e: - print e diff --git a/pyste/tests/vars.cpp b/pyste/tests/vars.cpp deleted file mode 100644 index e2abcd33..00000000 --- a/pyste/tests/vars.cpp +++ /dev/null @@ -1,12 +0,0 @@ -/* Copyright Bruno da Silva de Oliveira 2003. Use, modification and - distribution is subject to 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 "vars.h" - -const Color black = Color(0, 0, 0); -const Color red = Color(255, 0, 0); -const Color green = Color(0, 255, 0); -const Color blue = Color(0, 0, 255); -Color in_use = black; diff --git a/pyste/tests/vars.h b/pyste/tests/vars.h deleted file mode 100644 index 24e87d80..00000000 --- a/pyste/tests/vars.h +++ /dev/null @@ -1,24 +0,0 @@ -/* Copyright Bruno da Silva de Oliveira 2003. Use, modification and - distribution is subject to 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) - */ - -struct Color -{ - Color(int r_ = 0, int g_ = 0, int b_ = 0): - r(r_), g(g_), b(b_) - {} - Color( const Color &c): - r(c.r), g(c.g), b(c.b) - {} - int r; - int g; - int b; -}; - -extern const Color black; -extern const Color red; -extern const Color green; -extern const Color blue; -extern Color in_use; diff --git a/pyste/tests/vars.pyste b/pyste/tests/vars.pyste deleted file mode 100644 index 3fd9d689..00000000 --- a/pyste/tests/vars.pyste +++ /dev/null @@ -1 +0,0 @@ -AllFromHeader('vars.h') diff --git a/pyste/tests/varsUT.py b/pyste/tests/varsUT.py deleted file mode 100644 index 4c32cbb2..00000000 --- a/pyste/tests/varsUT.py +++ /dev/null @@ -1,22 +0,0 @@ -# Copyright Bruno da Silva de Oliveira 2003. Use, modification and -# distribution is subject to 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) -import unittest -import _vars - - -class VarsTest(unittest.TestCase): - - def testIt(self): - def testColor(c, r, g, b): - self.assertEqual(c.r, r) - self.assertEqual(c.g, g) - self.assertEqual(c.b, b) - testColor(_vars.black, 0, 0, 0) - testColor(_vars.red, 255, 0, 0) - testColor(_vars.green, 0, 255, 0) - testColor(_vars.blue, 0, 0, 255) - -if __name__ == '__main__': - unittest.main() diff --git a/pyste/tests/virtual.cpp b/pyste/tests/virtual.cpp deleted file mode 100644 index 070d9d34..00000000 --- a/pyste/tests/virtual.cpp +++ /dev/null @@ -1,75 +0,0 @@ -/* Copyright Bruno da Silva de Oliveira 2003. Use, modification and - distribution is subject to 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) - */ - -// Includes ==================================================================== -#include -#include - -// Using ======================================================================= -using namespace boost::python; - -// Declarations ================================================================ - - -namespace { - - -struct virtual_C_Wrapper: virtual_::C -{ - virtual_C_Wrapper(PyObject* self_, const virtual_::C & p0): - virtual_::C(p0), self(self_) {} - - virtual_C_Wrapper(PyObject* self_): - virtual_::C(), self(self_) {} - - int f() { - return call_method< int >(self, "f"); - } - - int default_f() { - return virtual_::C::f(); - } - - void bar(int p0) { - call_method< void >(self, "bar", p0); - } - - void default_bar(int p0) { - virtual_::C::bar(p0); - } - - void bar(char * p0) { - call_method< void >(self, "bar", p0); - } - - void default_bar(char * p0) { - virtual_::C::bar(p0); - } - - int f_abs() { - return call_method< int >(self, "f_abs"); - } - - PyObject* self; -}; - - - -}// namespace - - -// Module ====================================================================== -BOOST_PYTHON_MODULE(virtual) -{ - class_< virtual_::C, boost::noncopyable, virtual_C_Wrapper >("C", init< >()) - .def("get_name", &virtual_::C::get_name) - .def("f", &virtual_::C::f, &virtual_C_Wrapper::default_f) - .def("bar", (void (virtual_::C::*)(int) )&virtual_::C::bar, (void (virtual_C_Wrapper::*)(int))&virtual_C_Wrapper::default_bar) - .def("bar", (void (virtual_::C::*)(char *) )&virtual_::C::bar, (void (virtual_C_Wrapper::*)(char *))&virtual_C_Wrapper::default_bar) - ; - - def("call_f", &virtual_::call_f); -} diff --git a/pyste/tests/virtual.h b/pyste/tests/virtual.h deleted file mode 100644 index d0bb194a..00000000 --- a/pyste/tests/virtual.h +++ /dev/null @@ -1,41 +0,0 @@ -/* Copyright Bruno da Silva de Oliveira 2003. Use, modification and - distribution is subject to 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) - */ -namespace virtual_ { - -struct C -{ -public: - virtual int f() - { - return f_abs(); - } - - virtual void bar(int) {} - virtual void bar(char*) {} - - const char* get_name() - { - return name(); - } - virtual int dummy() { return 0; } - -protected: - virtual int f_abs() = 0; - -private: - virtual const char* name() { return "C"; } -}; - -struct D -{ - virtual int dummy() { return 0; } -}; - -inline int call_f(C& c) { return c.f(); } -inline int call_dummy(C* c) { return c->dummy(); } -inline int call_dummy(D* d) { return d->dummy(); } - -} diff --git a/pyste/tests/virtual.pyste b/pyste/tests/virtual.pyste deleted file mode 100644 index ef966412..00000000 --- a/pyste/tests/virtual.pyste +++ /dev/null @@ -1,6 +0,0 @@ -C = Class('virtual_::C', 'virtual.h') -final(C.dummy) -D = Class('virtual_::D', 'virtual.h') -final(D.dummy) -Function('virtual_::call_f', 'virtual.h') -Function('virtual_::call_dummy', 'virtual.h') diff --git a/pyste/tests/virtual2.h b/pyste/tests/virtual2.h deleted file mode 100644 index a6677ad1..00000000 --- a/pyste/tests/virtual2.h +++ /dev/null @@ -1,34 +0,0 @@ -/* Copyright Bruno da Silva de Oliveira 2003. Use, modification and - distribution is subject to 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) - */ - -namespace virtual2 { - -struct A -{ - virtual int f() { return 0; } - virtual int f1() { return 10; } - virtual A* make_new() { return new A; } -}; - -struct B: A -{ - virtual int f() { return 1; } - virtual int f2() { return 20; } - virtual A* make_new() { return new B; } -}; - -inline int call_fs(A*a) -{ - int r = a->f1(); - B* b = dynamic_cast(a); - return r + b->f2(); -} - -inline int call_f(A* a) -{ - return a->f(); -} -} diff --git a/pyste/tests/virtual2.pyste b/pyste/tests/virtual2.pyste deleted file mode 100644 index 785b819c..00000000 --- a/pyste/tests/virtual2.pyste +++ /dev/null @@ -1,6 +0,0 @@ -A = Class('virtual2::A', 'virtual2.h') -set_policy(A.make_new, return_value_policy(manage_new_object)) -B = Class('virtual2::B', 'virtual2.h') -set_policy(B.make_new, return_value_policy(manage_new_object)) -Function('virtual2::call_fs', 'virtual2.h') -Function('virtual2::call_f', 'virtual2.h') diff --git a/pyste/tests/virtual2UT.py b/pyste/tests/virtual2UT.py deleted file mode 100644 index 312277d2..00000000 --- a/pyste/tests/virtual2UT.py +++ /dev/null @@ -1,40 +0,0 @@ -# Copyright Bruno da Silva de Oliveira 2003. Use, modification and -# distribution is subject to 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) - -import unittest -from _virtual2 import * - -class Virtual2Test(unittest.TestCase): - - def testIt(self): - a = A() - self.assertEqual(a.f1(), 10) - b = B() - self.assertEqual(b.f1(), 10) - self.assertEqual(b.f2(), 20) - self.assertEqual(call_fs(b), 30) - self.assertEqual(call_f(a), 0) - self.assertEqual(call_f(b), 1) - nb = b.make_new() - na = a.make_new() - self.assertEqual(na.f1(), 10) - self.assertEqual(nb.f1(), 10) - self.assertEqual(nb.f2(), 20) - self.assertEqual(call_fs(nb), 30) - self.assertEqual(call_f(na), 0) - self.assertEqual(call_f(nb), 1) - class C(B): - def f1(self): return 1 - def f2(self): return 2 - def f(self): return 100 - - c = C() - self.assertEqual(call_fs(c), 3) - self.assertEqual(call_fs(c), 3) - self.assertEqual(call_f(c), 100) - - -if __name__ == '__main__': - unittest.main() diff --git a/pyste/tests/virtualUT.py b/pyste/tests/virtualUT.py deleted file mode 100644 index deff6818..00000000 --- a/pyste/tests/virtualUT.py +++ /dev/null @@ -1,55 +0,0 @@ -# Copyright Bruno da Silva de Oliveira 2003. Use, modification and -# distribution is subject to 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) -import unittest -from _virtual import * - -class VirtualTest(unittest.TestCase): - - def testIt(self): - - class E(C): - def f_abs(self): - return 3 - def dummy(self): - # override should not work - return 100 - - class F(C): - def f(self): - return 10 - def name(self): - return 'F' - - class G(D): - def dummy(self): - # override should not work - return 100 - - e = E() - f = F() - - self.assertEqual(e.f(), 3) - self.assertEqual(call_f(e), 3) - self.assertEqual(f.f(), 10) - self.assertEqual(call_f(f), 10) - self.assertEqual(e.get_name(), 'C') - #self.assertEqual(e.get_name(), 'E') check this later - - c = C() - c.bar(1) # ok - c.bar('a') # ok - self.assertRaises(TypeError, c.bar, 1.0) - - # test no_overrides - d = G() - self.assertEqual(e.dummy(), 100) - self.assertEqual(call_dummy(e), 0) - self.assertEqual(d.dummy(), 100) - self.assertEqual(call_dummy(d), 0) - - - -if __name__ == '__main__': - unittest.main() diff --git a/pyste/tests/wrappertest.h b/pyste/tests/wrappertest.h deleted file mode 100644 index 2304fd84..00000000 --- a/pyste/tests/wrappertest.h +++ /dev/null @@ -1,51 +0,0 @@ -/* Copyright Bruno da Silva de Oliveira 2003. Use, modification and - distribution is subject to 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 WRAPPER_TEST -#define WRAPPER_TEST - - -#include - -namespace wrappertest { - -inline std::vector Range(int count) -{ - std::vector v; - v.reserve(count); - for (int i = 0; i < count; ++i){ - v.push_back(i); - } - return v; -} - - -struct C -{ - C() {} - - std::vector Mul(int value) - { - std::vector res; - res.reserve(value); - std::vector::const_iterator it; - std::vector v(Range(value)); - for (it = v.begin(); it != v.end(); ++it){ - res.push_back(*it * value); - } - return res; - } -}; - - -struct A -{ - virtual int f() { return 1; }; -}; - -inline int call_foo(A* a){ return a->f(); } -} -#endif - diff --git a/pyste/tests/wrappertest.pyste b/pyste/tests/wrappertest.pyste deleted file mode 100644 index 12ba47b6..00000000 --- a/pyste/tests/wrappertest.pyste +++ /dev/null @@ -1,21 +0,0 @@ -Include('wrappertest_wrappers.h') - -f = Function('wrappertest::Range', 'wrappertest.h') -set_wrapper(f, 'RangeWrapper') - -mul = Wrapper('MulWrapper', -''' -list MulWrapper(wrappertest::C& c, int value){ - return VectorToList(c.Mul(value)); -} -''' -) - -C = Class('wrappertest::C', 'wrappertest.h') -set_wrapper(C.Mul, mul) - - -A = Class('wrappertest::A', 'wrappertest.h') -set_wrapper(A.f, 'f_wrapper') - -Function('wrappertest::call_foo', 'wrappertest.h') diff --git a/pyste/tests/wrappertestUT.py b/pyste/tests/wrappertestUT.py deleted file mode 100644 index d770408b..00000000 --- a/pyste/tests/wrappertestUT.py +++ /dev/null @@ -1,24 +0,0 @@ -# Copyright Bruno da Silva de Oliveira 2003. Use, modification and -# distribution is subject to 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) -import unittest -from _wrappertest import * - -class WrapperTest(unittest.TestCase): - - def testIt(self): - self.assertEqual(Range(10), range(10)) - self.assertEqual(C().Mul(10), [x*10 for x in range(10)]) - - a = A() - self.assertEqual(a.f(), 10) - self.assertEqual(call_foo(a), 10) - class D(A): - def f(self): return 2 - d = D() - self.assertEqual(d.f(), 2) - self.assertEqual(call_foo(d), 2) - -if __name__ == '__main__': - unittest.main() diff --git a/pyste/tests/wrappertest_wrappers.h b/pyste/tests/wrappertest_wrappers.h deleted file mode 100644 index 31570a05..00000000 --- a/pyste/tests/wrappertest_wrappers.h +++ /dev/null @@ -1,33 +0,0 @@ -/* Copyright Bruno da Silva de Oliveira 2003. Use, modification and - distribution is subject to 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 WRAPPER_TEST_WRAPPERS -#define WRAPPER_TEST_WRAPPERS - -#include -#include -#include "wrappertest.h" - -using namespace boost::python; - -template -list VectorToList(const std::vector & v) -{ - list res; - typename std::vector::const_iterator it; - for(it = v.begin(); it != v.end(); ++it){ - res.append(*it); - } - Py_XINCREF(res.ptr()); - return res; -} - -inline list RangeWrapper(int count){ - return VectorToList(wrappertest::Range(count)); -} - -inline int f_wrapper(wrappertest::A*) { return 10; } - -#endif diff --git a/src/converter/arg_to_python_base.cpp b/src/converter/arg_to_python_base.cpp deleted file mode 100644 index d872314a..00000000 --- a/src/converter/arg_to_python_base.cpp +++ /dev/null @@ -1,28 +0,0 @@ -// 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 -#include -#include -#include -#include - -namespace boost { namespace python { namespace converter { - -namespace detail -{ - arg_to_python_base::arg_to_python_base( - void const volatile* source, registration const& converters) -# if !defined(BOOST_MSVC) || BOOST_MSVC <= 1300 || _MSC_FULL_VER > 13102179 - : handle<> -# else - : m_ptr -# endif - (converters.to_python(source)) - { - } -} - -}}} // namespace boost::python::converter diff --git a/src/converter/builtin_converters.cpp b/src/converter/builtin_converters.cpp deleted file mode 100644 index 9900602b..00000000 --- a/src/converter/builtin_converters.cpp +++ /dev/null @@ -1,570 +0,0 @@ -// 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 -#include -#include -#include - -#include -#include - -#include -#include -#include -#include -#include -#include - -#include -#include -#include - -namespace boost { namespace python { namespace converter { - -shared_ptr_deleter::shared_ptr_deleter(handle<> owner) - : owner(owner) -{} - -shared_ptr_deleter::~shared_ptr_deleter() {} - -void shared_ptr_deleter::operator()(void const*) -{ - owner.reset(); -} - -namespace -{ - - // An lvalue conversion function which extracts a char const* from a - // Python String. -#if PY_VERSION_HEX < 0x03000000 - void* convert_to_cstring(PyObject* obj) - { - return PyString_Check(obj) ? PyString_AsString(obj) : 0; - } -#else - void* convert_to_cstring(PyObject* obj) - { - return PyUnicode_Check(obj) ? _PyUnicode_AsString(obj) : 0; - } -#endif - - // Given a target type and a SlotPolicy describing how to perform a - // given conversion, registers from_python converters which use the - // SlotPolicy to extract the type. - template - struct slot_rvalue_from_python - { - public: - slot_rvalue_from_python() - { - registry::insert( - &slot_rvalue_from_python::convertible - , &slot_rvalue_from_python::construct - , type_id() - , &SlotPolicy::get_pytype - ); - } - - private: - static void* convertible(PyObject* obj) - { - unaryfunc* slot = SlotPolicy::get_slot(obj); - return slot && *slot ? slot : 0; - } - - static void construct(PyObject* obj, rvalue_from_python_stage1_data* data) - { - // Get the (intermediate) source object - unaryfunc creator = *static_cast(data->convertible); - handle<> intermediate(creator(obj)); - - // Get the location in which to construct - void* storage = ((rvalue_from_python_storage*)data)->storage.bytes; -# ifdef _MSC_VER -# pragma warning(push) -# pragma warning(disable:4244) -# endif - new (storage) T( SlotPolicy::extract(intermediate.get()) ); - -# ifdef _MSC_VER -# pragma warning(pop) -# endif - // record successful construction - data->convertible = storage; - } - }; - - // identity_unaryfunc/py_object_identity -- manufacture a unaryfunc - // "slot" which just returns its argument. - extern "C" PyObject* identity_unaryfunc(PyObject* x) - { - Py_INCREF(x); - return x; - } - unaryfunc py_object_identity = identity_unaryfunc; - -#if PY_VERSION_HEX >= 0x03000000 - // As in Python 3 there is only one integer type, we can have much - // simplified logic. - // XXX(bhy) maybe the code will work with 2.6 or even 2.5? - struct int_rvalue_from_python_base - { - static unaryfunc* get_slot(PyObject* obj) - { - return PyLong_Check(obj) ? &py_object_identity : 0; - } - static PyTypeObject const* get_pytype() {return &PyLong_Type;} - }; - - template - struct signed_int_rvalue_from_python : int_rvalue_from_python_base - { - static T extract(PyObject* intermediate) - { - long x = PyLong_AsLong(intermediate); - if (PyErr_Occurred()) - throw_error_already_set(); - return numeric_cast(x); - } - }; - - template - struct unsigned_int_rvalue_from_python : int_rvalue_from_python_base - { - static T extract(PyObject* intermediate) - { - unsigned long x = PyLong_AsUnsignedLong(intermediate); - if (PyErr_Occurred()) - throw_error_already_set(); - return numeric_cast(x); - } - }; -#else // PY_VERSION_HEX >= 0x03000000 - // A SlotPolicy for extracting signed integer types from Python objects - struct signed_int_rvalue_from_python_base - { - static unaryfunc* get_slot(PyObject* obj) - { - PyNumberMethods* number_methods = obj->ob_type->tp_as_number; - if (number_methods == 0) - return 0; - - return ( -#if PY_VERSION_HEX >= 0x02040000 && defined(BOOST_PYTHON_BOOL_INT_STRICT) - !PyBool_Check(obj) && -#endif - (PyInt_Check(obj) || PyLong_Check(obj))) - - ? &number_methods->nb_int : 0; - } - static PyTypeObject const* get_pytype() { return &PyInt_Type;} - }; - - template - struct signed_int_rvalue_from_python : signed_int_rvalue_from_python_base - { - static T extract(PyObject* intermediate) - { - long x = PyInt_AsLong(intermediate); - if (PyErr_Occurred()) - throw_error_already_set(); - return numeric_cast(x); - } - }; - - // A SlotPolicy for extracting unsigned integer types from Python objects - struct unsigned_int_rvalue_from_python_base - { - static unaryfunc* get_slot(PyObject* obj) - { - PyNumberMethods* number_methods = obj->ob_type->tp_as_number; - if (number_methods == 0) - return 0; - - return ( -#if PY_VERSION_HEX >= 0x02040000 && defined(BOOST_PYTHON_BOOL_INT_STRICT) - !PyBool_Check(obj) && -#endif - (PyInt_Check(obj) || PyLong_Check(obj))) - ? &py_object_identity : 0; - } - static PyTypeObject const* get_pytype() { return &PyInt_Type;} - }; - - template - struct unsigned_int_rvalue_from_python : unsigned_int_rvalue_from_python_base - { - static T extract(PyObject* intermediate) - { - if (PyLong_Check(intermediate)) { - // PyLong_AsUnsignedLong() checks for negative overflow, so no - // need to check it here. - unsigned long result = PyLong_AsUnsignedLong(intermediate); - if (PyErr_Occurred()) - throw_error_already_set(); - return numeric_cast(result); - } else { - // None of PyInt_AsUnsigned*() functions check for negative - // overflow, so use PyInt_AS_LONG instead and check if number is - // negative, issuing the exception appropriately. - long result = PyInt_AS_LONG(intermediate); - if (PyErr_Occurred()) - throw_error_already_set(); - if (result < 0) { - PyErr_SetString(PyExc_OverflowError, "can't convert negative" - " value to unsigned"); - throw_error_already_set(); - } - return numeric_cast(result); - } - } - }; -#endif // PY_VERSION_HEX >= 0x03000000 - -// Checking Python's macro instead of Boost's - we don't seem to get -// the config right all the time. Furthermore, Python's is defined -// when long long is absent but __int64 is present. - -#ifdef HAVE_LONG_LONG - // A SlotPolicy for extracting long long types from Python objects - - struct long_long_rvalue_from_python_base - { - static unaryfunc* get_slot(PyObject* obj) - { -#if PY_VERSION_HEX >= 0x03000000 - return PyLong_Check(obj) ? &py_object_identity : 0; -#else - PyNumberMethods* number_methods = obj->ob_type->tp_as_number; - if (number_methods == 0) - return 0; - - // Return the identity conversion slot to avoid creating a - // new object. We'll handle that in the extract function - if (PyInt_Check(obj)) - return &number_methods->nb_int; - else if (PyLong_Check(obj)) - return &number_methods->nb_long; - else - return 0; -#endif - } - static PyTypeObject const* get_pytype() { return &PyLong_Type;} - }; - - struct long_long_rvalue_from_python : long_long_rvalue_from_python_base - { - static BOOST_PYTHON_LONG_LONG extract(PyObject* intermediate) - { -#if PY_VERSION_HEX < 0x03000000 - if (PyInt_Check(intermediate)) - { - return PyInt_AS_LONG(intermediate); - } - else -#endif - { - BOOST_PYTHON_LONG_LONG result = PyLong_AsLongLong(intermediate); - - if (PyErr_Occurred()) - throw_error_already_set(); - - return result; - } - } - }; - - struct unsigned_long_long_rvalue_from_python : long_long_rvalue_from_python_base - { - static unsigned BOOST_PYTHON_LONG_LONG extract(PyObject* intermediate) - { -#if PY_VERSION_HEX < 0x03000000 - if (PyInt_Check(intermediate)) - { - return numeric_cast(PyInt_AS_LONG(intermediate)); - } - else -#endif - { - unsigned BOOST_PYTHON_LONG_LONG result = PyLong_AsUnsignedLongLong(intermediate); - - if (PyErr_Occurred()) - throw_error_already_set(); - - return result; - } - } - }; -#endif - - // A SlotPolicy for extracting bool from a Python object - struct bool_rvalue_from_python - { - static unaryfunc* get_slot(PyObject* obj) - { -#if PY_VERSION_HEX >= 0x03000000 - return obj == Py_None || PyLong_Check(obj) ? &py_object_identity : 0; -#elif PY_VERSION_HEX >= 0x02040000 && defined(BOOST_PYTHON_BOOL_INT_STRICT) - return obj == Py_None || PyBool_Check(obj) ? &py_object_identity : 0; -#else - return obj == Py_None || PyInt_Check(obj) ? &py_object_identity : 0; -#endif - } - - static bool extract(PyObject* intermediate) - { - return PyObject_IsTrue(intermediate); - } - - static PyTypeObject const* get_pytype() - { -#if PY_VERSION_HEX >= 0x02030000 - return &PyBool_Type; -#else - return &PyInt_Type; -#endif - } - }; - - // A SlotPolicy for extracting floating types from Python objects. - struct float_rvalue_from_python - { - static unaryfunc* get_slot(PyObject* obj) - { - PyNumberMethods* number_methods = obj->ob_type->tp_as_number; - if (number_methods == 0) - return 0; - - // For integer types, return the tp_int conversion slot to avoid - // creating a new object. We'll handle that below -#if PY_VERSION_HEX < 0x03000000 - if (PyInt_Check(obj)) - return &number_methods->nb_int; -#endif - - return (PyLong_Check(obj) || PyFloat_Check(obj)) - ? &number_methods->nb_float : 0; - } - - static double extract(PyObject* intermediate) - { -#if PY_VERSION_HEX < 0x03000000 - if (PyInt_Check(intermediate)) - { - return PyInt_AS_LONG(intermediate); - } - else -#endif - { - return PyFloat_AS_DOUBLE(intermediate); - } - } - static PyTypeObject const* get_pytype() { return &PyFloat_Type;} - }; - -#if PY_VERSION_HEX >= 0x03000000 - unaryfunc py_unicode_as_string_unaryfunc = PyUnicode_AsUTF8String; -#endif - - // A SlotPolicy for extracting C++ strings from Python objects. - struct string_rvalue_from_python - { - // If the underlying object is "string-able" this will succeed - static unaryfunc* get_slot(PyObject* obj) - { -#if PY_VERSION_HEX >= 0x03000000 - return (PyUnicode_Check(obj)) ? &py_unicode_as_string_unaryfunc : - PyBytes_Check(obj) ? &py_object_identity : 0; -#else - return (PyString_Check(obj)) ? &obj->ob_type->tp_str : 0; - -#endif - }; - - // Remember that this will be used to construct the result object -#if PY_VERSION_HEX >= 0x03000000 - static std::string extract(PyObject* intermediate) - { - return std::string(PyBytes_AsString(intermediate),PyBytes_Size(intermediate)); - } - static PyTypeObject const* get_pytype() { return &PyUnicode_Type;} -#else - static std::string extract(PyObject* intermediate) - { - return std::string(PyString_AsString(intermediate),PyString_Size(intermediate)); - } - static PyTypeObject const* get_pytype() { return &PyString_Type;} -#endif - }; - -#if defined(Py_USING_UNICODE) && !defined(BOOST_NO_STD_WSTRING) - // encode_string_unaryfunc/py_encode_string -- manufacture a unaryfunc - // "slot" which encodes a Python string using the default encoding - extern "C" PyObject* encode_string_unaryfunc(PyObject* x) - { - return PyUnicode_FromEncodedObject( x, 0, 0 ); - } - unaryfunc py_encode_string = encode_string_unaryfunc; - - // A SlotPolicy for extracting C++ strings from Python objects. - struct wstring_rvalue_from_python - { - // If the underlying object is "string-able" this will succeed - static unaryfunc* get_slot(PyObject* obj) - { - return PyUnicode_Check(obj) - ? &py_object_identity -#if PY_VERSION_HEX >= 0x03000000 - : PyBytes_Check(obj) -#else - : PyString_Check(obj) -#endif - ? &py_encode_string - : 0; - }; - - // Remember that this will be used to construct the result object - static std::wstring extract(PyObject* intermediate) - { - std::wstring result(::PyObject_Length(intermediate), L' '); - if (!result.empty()) - { - int err = PyUnicode_AsWideChar( -#if PY_VERSION_HEX < 0x03020000 - (PyUnicodeObject *) -#endif - intermediate - , &result[0] - , result.size()); - - if (err == -1) - throw_error_already_set(); - } - return result; - } - static PyTypeObject const* get_pytype() { return &PyUnicode_Type;} - }; -#endif - - struct complex_rvalue_from_python - { - static unaryfunc* get_slot(PyObject* obj) - { - if (PyComplex_Check(obj)) - return &py_object_identity; - else - return float_rvalue_from_python::get_slot(obj); - } - - static std::complex extract(PyObject* intermediate) - { - if (PyComplex_Check(intermediate)) - { - return std::complex( - PyComplex_RealAsDouble(intermediate) - , PyComplex_ImagAsDouble(intermediate)); - } -#if PY_VERSION_HEX < 0x03000000 - else if (PyInt_Check(intermediate)) - { - return PyInt_AS_LONG(intermediate); - } -#endif - else - { - return PyFloat_AS_DOUBLE(intermediate); - } - } - static PyTypeObject const* get_pytype() { return &PyComplex_Type;} - }; -} - -BOOST_PYTHON_DECL PyObject* do_return_to_python(char x) -{ -#if PY_VERSION_HEX >= 0x03000000 - return PyUnicode_FromStringAndSize(&x, 1); -#else - return PyString_FromStringAndSize(&x, 1); -#endif -} - -BOOST_PYTHON_DECL PyObject* do_return_to_python(char const* x) -{ -#if PY_VERSION_HEX >= 0x03000000 - return x ? PyUnicode_FromString(x) : boost::python::detail::none(); -#else - return x ? PyString_FromString(x) : boost::python::detail::none(); -#endif -} - -BOOST_PYTHON_DECL PyObject* do_return_to_python(PyObject* x) -{ - return x ? x : boost::python::detail::none(); -} - -BOOST_PYTHON_DECL PyObject* do_arg_to_python(PyObject* x) -{ - if (x == 0) - return boost::python::detail::none(); - - Py_INCREF(x); - return x; -} - -#define REGISTER_INT_CONVERTERS(signedness, U) \ - slot_rvalue_from_python< \ - signedness U \ - ,signedness##_int_rvalue_from_python \ - >() - -#define REGISTER_INT_CONVERTERS2(U) \ - REGISTER_INT_CONVERTERS(signed, U); \ - REGISTER_INT_CONVERTERS(unsigned, U) - -void initialize_builtin_converters() -{ - // booleans - slot_rvalue_from_python(); - - // integer types - REGISTER_INT_CONVERTERS2(char); - REGISTER_INT_CONVERTERS2(short); - REGISTER_INT_CONVERTERS2(int); - REGISTER_INT_CONVERTERS2(long); - -// using Python's macro instead of Boost's - we don't seem to get the -// config right all the time. -# ifdef HAVE_LONG_LONG - slot_rvalue_from_python(); - slot_rvalue_from_python(); -# endif - - // floating types - slot_rvalue_from_python(); - slot_rvalue_from_python(); - slot_rvalue_from_python(); - - slot_rvalue_from_python,complex_rvalue_from_python>(); - slot_rvalue_from_python,complex_rvalue_from_python>(); - slot_rvalue_from_python,complex_rvalue_from_python>(); - - // Add an lvalue converter for char which gets us char const* -#if PY_VERSION_HEX < 0x03000000 - registry::insert(convert_to_cstring,type_id(),&converter::wrap_pytype<&PyString_Type>::get_pytype); -#else - registry::insert(convert_to_cstring,type_id(),&converter::wrap_pytype<&PyUnicode_Type>::get_pytype); -#endif - - // Register by-value converters to std::string, std::wstring -#if defined(Py_USING_UNICODE) && !defined(BOOST_NO_STD_WSTRING) - slot_rvalue_from_python(); -# endif - slot_rvalue_from_python(); - -} - -}}} // namespace boost::python::converter diff --git a/src/converter/from_python.cpp b/src/converter/from_python.cpp deleted file mode 100644 index 9678be1c..00000000 --- a/src/converter/from_python.cpp +++ /dev/null @@ -1,303 +0,0 @@ -// 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 -#include -#include - -#include - -#include -#include -#include - -#include -#include - -namespace boost { namespace python { namespace converter { - -// rvalue_from_python_stage1 -- do the first stage of a conversion -// from a Python object to a C++ rvalue. -// -// source - the Python object to be converted -// converters - the registry entry for the target type T -// -// Postcondition: where x is the result, one of: -// -// 1. x.convertible == 0, indicating failure -// -// 2. x.construct == 0, x.convertible is the address of an object of -// type T. Indicates a successful lvalue conversion -// -// 3. where y is of type rvalue_from_python_data, -// x.construct(source, y) constructs an object of type T -// in y.storage.bytes and then sets y.convertible == y.storage.bytes, -// or else throws an exception and has no effect. -BOOST_PYTHON_DECL rvalue_from_python_stage1_data rvalue_from_python_stage1( - PyObject* source - , registration const& converters) -{ - rvalue_from_python_stage1_data data; - - // First check to see if it's embedded in an extension class - // instance, as a special case. - data.convertible = objects::find_instance_impl(source, converters.target_type, converters.is_shared_ptr); - data.construct = 0; - if (!data.convertible) - { - for (rvalue_from_python_chain const* chain = converters.rvalue_chain; - chain != 0; - chain = chain->next) - { - void* r = chain->convertible(source); - if (r != 0) - { - data.convertible = r; - data.construct = chain->construct; - break; - } - } - } - return data; -} - -// rvalue_result_from_python -- return the address of a C++ object which -// can be used as the result of calling a Python function. -// -// src - the Python object to be converted -// -// data - a reference to the base part of a -// rvalue_from_python_data object, where T is the -// target type of the conversion. -// -// Requires: data.convertible == ®istered::converters -// -BOOST_PYTHON_DECL void* rvalue_result_from_python( - PyObject* src, rvalue_from_python_stage1_data& data) -{ - // Retrieve the registration - // Cast in two steps for less-capable compilers - void const* converters_ = data.convertible; - registration const& converters = *static_cast(converters_); - - // Look for an eligible converter - data = rvalue_from_python_stage1(src, converters); - return rvalue_from_python_stage2(src, data, converters); -} - -BOOST_PYTHON_DECL void* rvalue_from_python_stage2( - PyObject* source, rvalue_from_python_stage1_data& data, registration const& converters) -{ - if (!data.convertible) - { - handle<> msg( -#if PY_VERSION_HEX >= 0x03000000 - ::PyUnicode_FromFormat -#else - ::PyString_FromFormat -#endif - ( - "No registered converter was able to produce a C++ rvalue of type %s from this Python object of type %s" - , converters.target_type.name() - , source->ob_type->tp_name - )); - - PyErr_SetObject(PyExc_TypeError, msg.get()); - throw_error_already_set(); - } - - // If a construct function was registered (i.e. we found an - // rvalue conversion), call it now. - if (data.construct != 0) - data.construct(source, &data); - - // Return the address of the resulting C++ object - return data.convertible; -} - -BOOST_PYTHON_DECL void* get_lvalue_from_python( - PyObject* source - , registration const& converters) -{ - // Check to see if it's embedded in a class instance - void* x = objects::find_instance_impl(source, converters.target_type); - if (x) - return x; - - lvalue_from_python_chain const* chain = converters.lvalue_chain; - for (;chain != 0; chain = chain->next) - { - void* r = chain->convert(source); - if (r != 0) - return r; - } - return 0; -} - -namespace -{ - // Prevent looping in implicit conversions. This could/should be - // much more efficient, but will work for now. - typedef std::vector visited_t; - static visited_t visited; - - inline bool visit(rvalue_from_python_chain const* chain) - { - visited_t::iterator const p = std::lower_bound(visited.begin(), visited.end(), chain); - if (p != visited.end() && *p == chain) - return false; - visited.insert(p, chain); - return true; - } - - // RAII class for managing global visited marks. - struct unvisit - { - unvisit(rvalue_from_python_chain const* chain) - : chain(chain) {} - - ~unvisit() - { - visited_t::iterator const p = std::lower_bound(visited.begin(), visited.end(), chain); - assert(p != visited.end()); - visited.erase(p); - } - private: - rvalue_from_python_chain const* chain; - }; -} - - -BOOST_PYTHON_DECL bool implicit_rvalue_convertible_from_python( - PyObject* source - , registration const& converters) -{ - if (objects::find_instance_impl(source, converters.target_type)) - return true; - - rvalue_from_python_chain const* chain = converters.rvalue_chain; - - if (!visit(chain)) - return false; - - unvisit protect(chain); - - for (;chain != 0; chain = chain->next) - { - if (chain->convertible(source)) - return true; - } - - return false; -} - -namespace -{ - void throw_no_lvalue_from_python(PyObject* source, registration const& converters, char const* ref_type) - { - handle<> msg( -#if PY_VERSION_HEX >= 0x03000000 - ::PyUnicode_FromFormat -#else - ::PyString_FromFormat -#endif - ( - "No registered converter was able to extract a C++ %s to type %s" - " from this Python object of type %s" - , ref_type - , converters.target_type.name() - , source->ob_type->tp_name - )); - - PyErr_SetObject(PyExc_TypeError, msg.get()); - - throw_error_already_set(); - } - - void* lvalue_result_from_python( - PyObject* source - , registration const& converters - , char const* ref_type) - { - handle<> holder(source); - if (source->ob_refcnt <= 1) - { - handle<> msg( -#if PY_VERSION_HEX >= 0x3000000 - ::PyUnicode_FromFormat -#else - ::PyString_FromFormat -#endif - ( - "Attempt to return dangling %s to object of type: %s" - , ref_type - , converters.target_type.name())); - - PyErr_SetObject(PyExc_ReferenceError, msg.get()); - - throw_error_already_set(); - } - - void* result = get_lvalue_from_python(source, converters); - if (!result) - (throw_no_lvalue_from_python)(source, converters, ref_type); - return result; - } - -} - -BOOST_PYTHON_DECL void throw_no_pointer_from_python(PyObject* source, registration const& converters) -{ - (throw_no_lvalue_from_python)(source, converters, "pointer"); -} - -BOOST_PYTHON_DECL void throw_no_reference_from_python(PyObject* source, registration const& converters) -{ - (throw_no_lvalue_from_python)(source, converters, "reference"); -} - -BOOST_PYTHON_DECL void* reference_result_from_python( - PyObject* source - , registration const& converters) -{ - return (lvalue_result_from_python)(source, converters, "reference"); -} - -BOOST_PYTHON_DECL void* pointer_result_from_python( - PyObject* source - , registration const& converters) -{ - if (source == Py_None) - { - Py_DECREF(source); - return 0; - } - return (lvalue_result_from_python)(source, converters, "pointer"); -} - -BOOST_PYTHON_DECL void void_result_from_python(PyObject* o) -{ - Py_DECREF(expect_non_null(o)); -} - -} // namespace boost::python::converter - -BOOST_PYTHON_DECL PyObject* -pytype_check(PyTypeObject* type_, PyObject* source) -{ - if (!PyObject_IsInstance(source, python::upcast(type_))) - { - ::PyErr_Format( - PyExc_TypeError - , "Expecting an object of type %s; got an object of type %s instead" - , type_->tp_name - , source->ob_type->tp_name - ); - throw_error_already_set(); - } - return source; -} - -}} // namespace boost::python diff --git a/src/converter/registry.cpp b/src/converter/registry.cpp deleted file mode 100644 index aa20c3f6..00000000 --- a/src/converter/registry.cpp +++ /dev/null @@ -1,306 +0,0 @@ -// Copyright David Abrahams 2001. -// 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 -#include -#include - -#include -#include - -#if defined(__APPLE__) && defined(__MACH__) && defined(__GNUC__) \ - && __GNUC__ == 3 && __GNUC_MINOR__ <= 4 && !defined(__APPLE_CC__) -# define BOOST_PYTHON_CONVERTER_REGISTRY_APPLE_MACH_WORKAROUND -#endif - -#if defined(BOOST_PYTHON_TRACE_REGISTRY) \ - || defined(BOOST_PYTHON_CONVERTER_REGISTRY_APPLE_MACH_WORKAROUND) -# include -#endif - -namespace boost { namespace python { namespace converter { -BOOST_PYTHON_DECL PyTypeObject const* registration::expected_from_python_type() const -{ - if (this->m_class_object != 0) - return this->m_class_object; - - std::set pool; - - for(rvalue_from_python_chain* r = rvalue_chain; r ; r=r->next) - if(r->expected_pytype) - pool.insert(r->expected_pytype()); - - //for now I skip the search for common base - if (pool.size()==1) - return *pool.begin(); - - return 0; - -} - -BOOST_PYTHON_DECL PyTypeObject const* registration::to_python_target_type() const -{ - if (this->m_class_object != 0) - return this->m_class_object; - - if (this->m_to_python_target_type != 0) - return this->m_to_python_target_type(); - - return 0; -} - -BOOST_PYTHON_DECL PyTypeObject* registration::get_class_object() const -{ - if (this->m_class_object == 0) - { - ::PyErr_Format( - PyExc_TypeError - , const_cast("No Python class registered for C++ class %s") - , this->target_type.name()); - - throw_error_already_set(); - } - - return this->m_class_object; -} - -BOOST_PYTHON_DECL PyObject* registration::to_python(void const volatile* source) const -{ - if (this->m_to_python == 0) - { - handle<> msg( -#if PY_VERSION_HEX >= 0x3000000 - ::PyUnicode_FromFormat -#else - ::PyString_FromFormat -#endif - ( - "No to_python (by-value) converter found for C++ type: %s" - , this->target_type.name() - ) - ); - - PyErr_SetObject(PyExc_TypeError, msg.get()); - - throw_error_already_set(); - } - - return source == 0 - ? incref(Py_None) - : this->m_to_python(const_cast(source)); -} - -namespace -{ - template< typename T > - void delete_node( T* node ) - { - if( !!node && !!node->next ) - delete_node( node->next ); - delete node; - } -} - -registration::~registration() -{ - delete_node(lvalue_chain); - delete_node(rvalue_chain); -} - - -namespace // -{ - typedef registration entry; - - typedef std::set registry_t; - -#ifndef BOOST_PYTHON_CONVERTER_REGISTRY_APPLE_MACH_WORKAROUND - registry_t& entries() - { - static registry_t registry; - -# ifndef BOOST_PYTHON_SUPPRESS_REGISTRY_INITIALIZATION - static bool builtin_converters_initialized = false; - if (!builtin_converters_initialized) - { - // Make this true early because registering the builtin - // converters will cause recursion. - builtin_converters_initialized = true; - - initialize_builtin_converters(); - } -# ifdef BOOST_PYTHON_TRACE_REGISTRY - std::cout << "registry: "; - for (registry_t::iterator p = registry.begin(); p != registry.end(); ++p) - { - std::cout << p->target_type << "; "; - } - std::cout << '\n'; -# endif -# endif - return registry; - } -#else - registry_t& static_registry() - { - static registry_t result; - return result; - } - - bool static_builtin_converters_initialized() - { - static bool result = false; - if (result == false) { - result = true; - std::cout << std::flush; - return false; - } - return true; - } - - registry_t& entries() - { -# ifndef BOOST_PYTHON_SUPPRESS_REGISTRY_INITIALIZATION - if (!static_builtin_converters_initialized()) - { - initialize_builtin_converters(); - } -# ifdef BOOST_PYTHON_TRACE_REGISTRY - std::cout << "registry: "; - for (registry_t::iterator p = static_registry().begin(); p != static_registry().end(); ++p) - { - std::cout << p->target_type << "; "; - } - std::cout << '\n'; -# endif -# endif - return static_registry(); - } -#endif // BOOST_PYTHON_CONVERTER_REGISTRY_APPLE_MACH_WORKAROUND - - entry* get(type_info type, bool is_shared_ptr = false) - { -# ifdef BOOST_PYTHON_TRACE_REGISTRY - registry_t::iterator p = entries().find(entry(type)); - - std::cout << "looking up " << type << ": " - << (p == entries().end() || p->target_type != type - ? "...NOT found\n" : "...found\n"); -# endif - std::pair pos_ins - = entries().insert(entry(type,is_shared_ptr)); - -# if __MWERKS__ >= 0x3000 - // do a little invariant checking if a change was made - if ( pos_ins.second ) - assert(entries().invariants()); -# endif - return const_cast(&*pos_ins.first); - } -} // namespace - -namespace registry -{ - void insert(to_python_function_t f, type_info source_t, PyTypeObject const* (*to_python_target_type)()) - { -# ifdef BOOST_PYTHON_TRACE_REGISTRY - std::cout << "inserting to_python " << source_t << "\n"; -# endif - entry* slot = get(source_t); - - assert(slot->m_to_python == 0); // we have a problem otherwise - if (slot->m_to_python != 0) - { - std::string msg = ( - std::string("to-Python converter for ") - + source_t.name() - + " already registered; second conversion method ignored." - ); - - if ( ::PyErr_Warn( NULL, const_cast(msg.c_str()) ) ) - { - throw_error_already_set(); - } - } - slot->m_to_python = f; - slot->m_to_python_target_type = to_python_target_type; - } - - // Insert an lvalue from_python converter - void insert(convertible_function convert, type_info key, PyTypeObject const* (*exp_pytype)()) - { -# ifdef BOOST_PYTHON_TRACE_REGISTRY - std::cout << "inserting lvalue from_python " << key << "\n"; -# endif - entry* found = get(key); - lvalue_from_python_chain *registration = new lvalue_from_python_chain; - registration->convert = convert; - registration->next = found->lvalue_chain; - found->lvalue_chain = registration; - - insert(convert, 0, key,exp_pytype); - } - - // Insert an rvalue from_python converter - void insert(convertible_function convertible - , constructor_function construct - , type_info key - , PyTypeObject const* (*exp_pytype)()) - { -# ifdef BOOST_PYTHON_TRACE_REGISTRY - std::cout << "inserting rvalue from_python " << key << "\n"; -# endif - entry* found = get(key); - rvalue_from_python_chain *registration = new rvalue_from_python_chain; - registration->convertible = convertible; - registration->construct = construct; - registration->expected_pytype = exp_pytype; - registration->next = found->rvalue_chain; - found->rvalue_chain = registration; - } - - // Insert an rvalue from_python converter - void push_back(convertible_function convertible - , constructor_function construct - , type_info key - , PyTypeObject const* (*exp_pytype)()) - { -# ifdef BOOST_PYTHON_TRACE_REGISTRY - std::cout << "push_back rvalue from_python " << key << "\n"; -# endif - rvalue_from_python_chain** found = &get(key)->rvalue_chain; - while (*found != 0) - found = &(*found)->next; - - rvalue_from_python_chain *registration = new rvalue_from_python_chain; - registration->convertible = convertible; - registration->construct = construct; - registration->expected_pytype = exp_pytype; - registration->next = 0; - *found = registration; - } - - registration const& lookup(type_info key) - { - return *get(key); - } - - registration const& lookup_shared_ptr(type_info key) - { - return *get(key, true); - } - - registration const* query(type_info type) - { - registry_t::iterator p = entries().find(entry(type)); -# ifdef BOOST_PYTHON_TRACE_REGISTRY - std::cout << "querying " << type - << (p == entries().end() || p->target_type != type - ? "...NOT found\n" : "...found\n"); -# endif - return (p == entries().end() || p->target_type != type) ? 0 : &*p; - } -} // namespace registry - -}}} // namespace boost::python::converter diff --git a/src/converter/type_id.cpp b/src/converter/type_id.cpp deleted file mode 100644 index c6a8bf7a..00000000 --- a/src/converter/type_id.cpp +++ /dev/null @@ -1,212 +0,0 @@ -// Copyright David Abrahams 2001. -// 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 -#include -#include -#include -#include -#include -#include -#include - -#if defined(__QNXNTO__) -# include -#else /* defined(__QNXNTO__) */ - -#if !defined(__GNUC__) || __GNUC__ >= 3 || __SGI_STL_PORT || __EDG_VERSION__ -# include -#else -# include -#endif - -# 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 -#endif /* defined(__QNXNTO__) */ - -namespace boost { namespace python { - -# ifdef BOOST_PYTHON_HAVE_GCC_CP_DEMANGLE - -# if defined(__QNXNTO__) -namespace cxxabi { -extern "C" char* __cxa_demangle(char const*, char*, std::size_t*, int*); -} -# else /* defined(__QNXNTO__) */ - -# ifdef __GNUC__ -# if __GNUC__ < 3 - -namespace cxxabi = :: ; -extern "C" char* __cxa_demangle(char const*, char*, std::size_t*, int*); -# else - -namespace cxxabi = ::abi; // GCC 3.1 and later - -# if __GNUC__ == 3 && __GNUC_MINOR__ == 0 -namespace abi -{ - extern "C" char* __cxa_demangle(char const*, char*, std::size_t*, int*); -} -# endif /* __GNUC__ == 3 && __GNUC_MINOR__ == 0 */ -# endif /* __GNUC__ < 3 */ -# endif /* __GNUC__ */ -# endif /* defined(__QNXNTO__) */ - -namespace -{ - struct compare_first_cstring - { - template - bool operator()(T const& x, T const& y) - { - return std::strcmp(x.first,y.first) < 0; - } - }; - - struct free_mem - { - free_mem(char*p) - : p(p) {} - - ~free_mem() - { - std::free(p); - } - char* p; - }; -} - -bool cxxabi_cxa_demangle_is_broken() -{ - static bool was_tested = false; - static bool is_broken = false; - if (!was_tested) { - int status; - free_mem keeper(cxxabi::__cxa_demangle("b", 0, 0, &status)); - was_tested = true; - if (status == -2 || strcmp(keeper.p, "bool") != 0) { - is_broken = true; - } - } - return is_broken; -} - -namespace detail -{ - BOOST_PYTHON_DECL char const* gcc_demangle(char const* mangled) - { - typedef std::vector< - std::pair - > mangling_map; - - static mangling_map demangler; - mangling_map::iterator p - = std::lower_bound( - demangler.begin(), demangler.end() - , std::make_pair(mangled, (char const*)0) - , compare_first_cstring()); - - if (p == demangler.end() || strcmp(p->first, mangled)) - { - int status; - free_mem keeper( - cxxabi::__cxa_demangle(mangled, 0, 0, &status) - ); - - assert(status != -3); // invalid argument error - - if (status == -1) - { - throw std::bad_alloc(); - } - else - { - char const* demangled - = status == -2 - // Invalid mangled name. Best we can do is to - // return it intact. - ? mangled - : keeper.p; - - // Ult Mundane, 2005 Aug 17 - // Contributed 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) - // The __cxa_demangle function is supposed to translate - // builtin types from their one-character mangled names, - // but it doesn't in gcc 3.3.5 and gcc 3.4.x. - if (cxxabi_cxa_demangle_is_broken() - && status == -2 && strlen(mangled) == 1) - { - // list from - // http://www.codesourcery.com/cxx-abi/abi.html - switch (mangled[0]) - { - case 'v': demangled = "void"; break; - case 'w': demangled = "wchar_t"; break; - case 'b': demangled = "bool"; break; - case 'c': demangled = "char"; break; - case 'a': demangled = "signed char"; break; - case 'h': demangled = "unsigned char"; break; - case 's': demangled = "short"; break; - case 't': demangled = "unsigned short"; break; - case 'i': demangled = "int"; break; - case 'j': demangled = "unsigned int"; break; - case 'l': demangled = "long"; break; - case 'm': demangled = "unsigned long"; break; - case 'x': demangled = "long long"; break; - case 'y': demangled = "unsigned long long"; break; - case 'n': demangled = "__int128"; break; - case 'o': demangled = "unsigned __int128"; break; - case 'f': demangled = "float"; break; - case 'd': demangled = "double"; break; - case 'e': demangled = "long double"; break; - case 'g': demangled = "__float128"; break; - case 'z': demangled = "..."; break; - } - } - - p = demangler.insert(p, std::make_pair(mangled, demangled)); - keeper.p = 0; - } - } - - return p->second; - } -} -# endif - -BOOST_PYTHON_DECL std::ostream& operator<<(std::ostream& os, type_info const& x) -{ - return os << x.name(); -} - -namespace detail -{ - BOOST_PYTHON_DECL std::ostream& operator<<(std::ostream& os, detail::decorated_type_info const& x) - { - os << x.m_base_type; - if (x.m_decoration & decorated_type_info::const_) - os << " const"; - if (x.m_decoration & decorated_type_info::volatile_) - os << " volatile"; - if (x.m_decoration & decorated_type_info::reference) - os << "&"; - return os; - } -} -}} // namespace boost::python::converter diff --git a/src/dict.cpp b/src/dict.cpp deleted file mode 100644 index 77d840d4..00000000 --- a/src/dict.cpp +++ /dev/null @@ -1,184 +0,0 @@ -// Copyright David Abrahams 2004. 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 -#include - -namespace boost { namespace python { namespace detail { -namespace -{ - // When returning list objects from methods, it may turn out that the - // derived class is returning something else, perhaps something not - // even derived from list. Since it is generally harmless for a - // Boost.Python wrapper object to hold an object of a different - // type, and because calling list() with an object may in fact - // perform a conversion, the least-bad alternative is to assume that - // we have a Python list object and stuff it into the list result. - list assume_list(object const& o) - { - return list(detail::borrowed_reference(o.ptr())); - } - - // No PyDict_CheckExact; roll our own. - inline bool check_exact(dict_base const* p) - { - return p->ptr()->ob_type == &PyDict_Type; - } -} - -detail::new_reference dict_base::call(object const& arg_) -{ - return (detail::new_reference)PyObject_CallFunction( - (PyObject*)&PyDict_Type, const_cast("(O)"), - arg_.ptr()); -} - -dict_base::dict_base() - : object(detail::new_reference(PyDict_New())) -{} - -dict_base::dict_base(object_cref data) - : object(call(data)) -{} - -void dict_base::clear() -{ - if (check_exact(this)) - PyDict_Clear(this->ptr()); - else - this->attr("clear")(); -} - -dict dict_base::copy() -{ - if (check_exact(this)) - { - return dict(detail::new_reference( - PyDict_Copy(this->ptr()))); - } - else - { - return dict(detail::borrowed_reference( - this->attr("copy")().ptr() - )); - } -} - -object dict_base::get(object_cref k) const -{ - if (check_exact(this)) - { - PyObject* result = PyDict_GetItem(this->ptr(),k.ptr()); - return object(detail::borrowed_reference(result ? result : Py_None)); - } - else - { - return this->attr("get")(k); - } -} - -object dict_base::get(object_cref k, object_cref d) const -{ - return this->attr("get")(k,d); -} - -bool dict_base::has_key(object_cref k) const -{ - return extract(this->contains(k)); -} - -list dict_base::items() const -{ - if (check_exact(this)) - { - return list(detail::new_reference( - PyDict_Items(this->ptr()))); - } - else - { - return assume_list(this->attr("items")()); - } -} - -object dict_base::iteritems() const -{ - return this->attr("iteritems")(); -} - -object dict_base::iterkeys() const -{ - return this->attr("iterkeys")(); -} - -object dict_base::itervalues() const -{ - return this->attr("itervalues")(); -} - -list dict_base::keys() const -{ - if (check_exact(this)) - { - return list(detail::new_reference( - PyDict_Keys(this->ptr()))); - } - else - { - return assume_list(this->attr("keys")()); - } -} - -tuple dict_base::popitem() -{ - return tuple(detail::borrowed_reference( - this->attr("popitem")().ptr() - )); -} - -object dict_base::setdefault(object_cref k) -{ - return this->attr("setdefault")(k); -} - -object dict_base::setdefault(object_cref k, object_cref d) -{ - return this->attr("setdefault")(k,d); -} - -void dict_base::update(object_cref other) -{ - if (check_exact(this)) - { - if (PyDict_Update(this->ptr(),other.ptr()) == -1) - throw_error_already_set(); - } - else - { - this->attr("update")(other); - } -} - -list dict_base::values() const -{ - if (check_exact(this)) - { - return list(detail::new_reference( - PyDict_Values(this->ptr()))); - } - else - { - return assume_list(this->attr("values")()); - } -} - -static struct register_dict_pytype_ptr -{ - register_dict_pytype_ptr() - { - const_cast( - converter::registry::lookup(boost::python::type_id()) - ).m_class_object = &PyDict_Type; - } -}register_dict_pytype_ptr_; - -}}} // namespace boost::python diff --git a/src/errors.cpp b/src/errors.cpp deleted file mode 100644 index 34ea22f4..00000000 --- a/src/errors.cpp +++ /dev/null @@ -1,105 +0,0 @@ -// Copyright David Abrahams 2001. -// 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 BOOST_PYTHON_SOURCE -# define BOOST_PYTHON_SOURCE -#endif - -#include -#include -#include - -namespace boost { namespace python { - -error_already_set::~error_already_set() {} - -// IMPORTANT: this function may only be called from within a catch block! -BOOST_PYTHON_DECL bool handle_exception_impl(function0 f) -{ - try - { - if (detail::exception_handler::chain) - return detail::exception_handler::chain->handle(f); - f(); - return false; - } - catch(const boost::python::error_already_set&) - { - // The python error reporting has already been handled. - } - catch(const std::bad_alloc&) - { - PyErr_NoMemory(); - } - catch(const bad_numeric_cast& x) - { - PyErr_SetString(PyExc_OverflowError, x.what()); - } - catch(const std::out_of_range& x) - { - PyErr_SetString(PyExc_IndexError, x.what()); - } - catch(const std::invalid_argument& x) - { - PyErr_SetString(PyExc_ValueError, x.what()); - } - catch(const std::exception& x) - { - PyErr_SetString(PyExc_RuntimeError, x.what()); - } - catch(...) - { - PyErr_SetString(PyExc_RuntimeError, "unidentifiable C++ exception"); - } - return true; -} - -void BOOST_PYTHON_DECL throw_error_already_set() -{ - throw error_already_set(); -} - -namespace detail { - -bool exception_handler::operator()(function0 const& f) const -{ - if (m_next) - { - return m_next->handle(f); - } - else - { - f(); - return false; - } -} - -exception_handler::exception_handler(handler_function const& impl) - : m_impl(impl) - , m_next(0) -{ - if (chain != 0) - tail->m_next = this; - else - chain = this; - tail = this; -} - -exception_handler* exception_handler::chain; -exception_handler* exception_handler::tail; - -BOOST_PYTHON_DECL void register_exception_handler(handler_function const& f) -{ - // the constructor links the new object into a handler chain, so - // this object isn't actaully leaked (until, of course, the - // interpreter exits). - new exception_handler(f); -} - -} // namespace boost::python::detail - -}} // namespace boost::python - - diff --git a/src/exec.cpp b/src/exec.cpp deleted file mode 100644 index fa2860e4..00000000 --- a/src/exec.cpp +++ /dev/null @@ -1,109 +0,0 @@ -// Copyright Stefan Seefeld 2005. -// 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 -#include -#include -#include -#include - -namespace boost -{ -namespace python -{ - -object BOOST_PYTHON_DECL eval(str string, object global, object local) -{ - // Set suitable default values for global and local dicts. - if (global.is_none()) - { - if (PyObject *g = PyEval_GetGlobals()) - global = object(detail::borrowed_reference(g)); - else - global = dict(); - } - if (local.is_none()) local = global; - // should be 'char const *' but older python versions don't use 'const' yet. - char *s = python::extract(string); - PyObject* result = PyRun_String(s, Py_eval_input, global.ptr(), local.ptr()); - if (!result) throw_error_already_set(); - return object(detail::new_reference(result)); -} - -object BOOST_PYTHON_DECL exec(str string, object global, object local) -{ - // Set suitable default values for global and local dicts. - if (global.is_none()) - { - if (PyObject *g = PyEval_GetGlobals()) - global = object(detail::borrowed_reference(g)); - else - global = dict(); - } - if (local.is_none()) local = global; - // should be 'char const *' but older python versions don't use 'const' yet. - char *s = python::extract(string); - PyObject* result = PyRun_String(s, Py_file_input, global.ptr(), local.ptr()); - if (!result) throw_error_already_set(); - return object(detail::new_reference(result)); -} - -object BOOST_PYTHON_DECL exec_statement(str string, object global, object local) -{ - // Set suitable default values for global and local dicts. - if (global.is_none()) - { - if (PyObject *g = PyEval_GetGlobals()) - global = object(detail::borrowed_reference(g)); - else - global = dict(); - } - if (local.is_none()) local = global; - // should be 'char const *' but older python versions don't use 'const' yet. - char *s = python::extract(string); - PyObject* result = PyRun_String(s, Py_single_input, global.ptr(), local.ptr()); - if (!result) throw_error_already_set(); - return object(detail::new_reference(result)); -} - -// Execute python source code from file filename. -// global and local are the global and local scopes respectively, -// used during execution. -object BOOST_PYTHON_DECL exec_file(str filename, object global, object local) -{ - // Set suitable default values for global and local dicts. - if (global.is_none()) - { - if (PyObject *g = PyEval_GetGlobals()) - global = object(detail::borrowed_reference(g)); - else - global = dict(); - } - if (local.is_none()) local = global; - // should be 'char const *' but older python versions don't use 'const' yet. - char *f = python::extract(filename); - // Let python open the file to avoid potential binary incompatibilities. -#if PY_VERSION_HEX >= 0x03040000 - FILE *fs = _Py_fopen(f, "r"); -#elif PY_VERSION_HEX >= 0x03000000 - PyObject *fo = Py_BuildValue("s", f); - FILE *fs = _Py_fopen(fo, "r"); - Py_DECREF(fo); -#else - PyObject *pyfile = PyFile_FromString(f, const_cast("r")); - if (!pyfile) throw std::invalid_argument(std::string(f) + " : no such file"); - python::handle<> file(pyfile); - FILE *fs = PyFile_AsFile(file.get()); -#endif - PyObject* result = PyRun_File(fs, - f, - Py_file_input, - global.ptr(), local.ptr()); - if (!result) throw_error_already_set(); - return object(detail::new_reference(result)); -} - -} // namespace boost::python -} // namespace boost diff --git a/src/import.cpp b/src/import.cpp deleted file mode 100644 index 0add79ee..00000000 --- a/src/import.cpp +++ /dev/null @@ -1,25 +0,0 @@ -// Copyright Stefan Seefeld 2005. -// 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 -#include -#include -#include - -namespace boost -{ -namespace python -{ - -object BOOST_PYTHON_DECL import(str name) -{ - // should be 'char const *' but older python versions don't use 'const' yet. - char *n = python::extract(name); - python::handle<> module(PyImport_ImportModule(n)); - return python::object(module); -} - -} // namespace boost::python -} // namespace boost diff --git a/src/list.cpp b/src/list.cpp deleted file mode 100644 index 77e61688..00000000 --- a/src/list.cpp +++ /dev/null @@ -1,170 +0,0 @@ -// 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 -#include - -namespace boost { namespace python { namespace detail { - - -detail::new_non_null_reference list_base::call(object const& arg_) -{ - return (detail::new_non_null_reference) - (expect_non_null)( - PyObject_CallFunction( - (PyObject*)&PyList_Type, const_cast("(O)"), - arg_.ptr())); -} - -list_base::list_base() - : object(detail::new_reference(PyList_New(0))) -{} - -list_base::list_base(object_cref sequence) - : object(list_base::call(sequence)) -{} - -void list_base::append(object_cref x) -{ - if (PyList_CheckExact(this->ptr())) - { - if (PyList_Append(this->ptr(), x.ptr()) == -1) - throw_error_already_set(); - } - else - { - this->attr("append")(x); - } -} - -//long list_base::count(object_cref value) const; - -void list_base::extend(object_cref sequence) -{ - this->attr("extend")(sequence); -} - -long list_base::index(object_cref value) const -{ - object result_obj(this->attr("index")(value)); -#if PY_VERSION_HEX >= 0x03000000 - ssize_t result = PyLong_AsSsize_t(result_obj.ptr()); -#else - long result = PyInt_AsLong(result_obj.ptr()); -#endif - if (result == -1) - throw_error_already_set(); - return result; -} - -void list_base::insert(ssize_t index, object_cref item) -{ - if (PyList_CheckExact(this->ptr())) - { - if (PyList_Insert(this->ptr(), index, item.ptr()) == -1) - throw_error_already_set(); - } - else - { - this->attr("insert")(index, item); - } -} - -void list_base::insert(object const& index, object_cref x) -{ -#if PY_VERSION_HEX >= 0x03000000 - ssize_t index_ = PyLong_AsSsize_t(index.ptr()); -#else - long index_ = PyInt_AsLong(index.ptr()); -#endif - if (index_ == -1 && PyErr_Occurred()) - throw_error_already_set(); - this->insert(index_, x); -} - -object list_base::pop() -{ - return this->attr("pop")(); -} - -object list_base::pop(ssize_t index) -{ - return this->pop(object(index)); -} - -object list_base::pop(object const& index) -{ - return this->attr("pop")(index); -} - -void list_base::remove(object_cref value) -{ - this->attr("remove")(value); -} - -void list_base::reverse() -{ - if (PyList_CheckExact(this->ptr())) - { - if (PyList_Reverse(this->ptr()) == -1) - throw_error_already_set(); - } - else - { - this->attr("reverse")(); - } -} - -void list_base::sort() -{ - if (PyList_CheckExact(this->ptr())) - { - if (PyList_Sort(this->ptr()) == -1) - throw_error_already_set(); - } - else - { - this->attr("sort")(); - } -} - -#if PY_VERSION_HEX >= 0x03000000 -void list_base::sort(args_proxy const &args, - kwds_proxy const &kwds) -{ - this->attr("sort")(args, kwds); -} -#else -void list_base::sort(object_cref cmpfunc) -{ - this->attr("sort")(cmpfunc); -} -#endif - -// For some reason, moving this to the end of the TU suppresses an ICE -// with vc6. -ssize_t list_base::count(object_cref value) const -{ - object result_obj(this->attr("count")(value)); -#if PY_VERSION_HEX >= 0x03000000 - ssize_t result = PyLong_AsSsize_t(result_obj.ptr()); -#else - long result = PyInt_AsLong(result_obj.ptr()); -#endif - if (result == -1) - throw_error_already_set(); - return result; -} - -static struct register_list_pytype_ptr -{ - register_list_pytype_ptr() - { - const_cast( - converter::registry::lookup(boost::python::type_id()) - ).m_class_object = &PyList_Type; - } -}register_list_pytype_ptr_; - -}}} // namespace boost::python diff --git a/src/long.cpp b/src/long.cpp deleted file mode 100644 index 1ec8ebc0..00000000 --- a/src/long.cpp +++ /dev/null @@ -1,39 +0,0 @@ -// 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 - -namespace boost { namespace python { namespace detail { - -new_non_null_reference long_base::call(object const& arg_) -{ - return (detail::new_non_null_reference)PyObject_CallFunction( - (PyObject*)&PyLong_Type, const_cast("(O)"), - arg_.ptr()); -} - -new_non_null_reference long_base::call(object const& arg_, object const& base) -{ - return (detail::new_non_null_reference)PyObject_CallFunction( - (PyObject*)&PyLong_Type, const_cast("(OO)"), - arg_.ptr(), base.ptr()); -} - -long_base::long_base() - : object( - detail::new_reference( - PyObject_CallFunction((PyObject*)&PyLong_Type, const_cast("()"))) - ) -{} - -long_base::long_base(object_cref arg) - : object(long_base::call(arg)) -{} - -long_base::long_base(object_cref arg, object_cref base) - : object(long_base::call(arg, base)) -{} - - -}}} // namespace boost::python diff --git a/src/module.cpp b/src/module.cpp deleted file mode 100644 index 96284819..00000000 --- a/src/module.cpp +++ /dev/null @@ -1,73 +0,0 @@ -// (C) Copyright David Abrahams 2000. -// 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) -// -// The author gratefully acknowleges the support of Dragon Systems, Inc., in -// producing this work. - -#include -#include - -namespace boost { namespace python { namespace detail { - -namespace -{ - PyObject* init_module_in_scope(PyObject* m, void(*init_function)()) - { - if (m != 0) - { - // Create the current module scope - object m_obj(((borrowed_reference_t*)m)); - scope current_module(m_obj); - - handle_exception(init_function); - } - - return m; - } -} - -BOOST_PYTHON_DECL void scope_setattr_doc(char const* name, object const& x, char const* doc) -{ - // Use function::add_to_namespace to achieve overloading if - // appropriate. - scope current; - objects::add_to_namespace(current, name, x, doc); -} - -#if PY_VERSION_HEX >= 0x03000000 - -BOOST_PYTHON_DECL PyObject* init_module(PyModuleDef& moduledef, void(*init_function)()) -{ - return init_module_in_scope( - PyModule_Create(&moduledef), - init_function); -} - -#else - -namespace -{ - PyMethodDef initial_methods[] = { { 0, 0, 0, 0 } }; -} - -BOOST_PYTHON_DECL PyObject* init_module(char const* name, void(*init_function)()) -{ - return init_module_in_scope( - Py_InitModule(const_cast(name), initial_methods), - init_function); -} - -#endif - -}}} // namespace boost::python::detail - -namespace boost { namespace python { - -namespace detail -{ - BOOST_PYTHON_DECL PyObject* current_scope = 0; -} - -}} diff --git a/src/numeric.cpp b/src/numeric.cpp deleted file mode 100644 index c8a5f071..00000000 --- a/src/numeric.cpp +++ /dev/null @@ -1,325 +0,0 @@ -// 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 -#include -#include -#include -#include -#include - -namespace boost { namespace python { namespace numeric { - -namespace -{ - enum state_t { failed = -1, unknown, succeeded }; - state_t state = unknown; - std::string module_name; - std::string type_name; - - handle<> array_module; - handle<> array_type; - handle<> array_function; - - void throw_load_failure() - { - PyErr_Format( - PyExc_ImportError - , "No module named '%s' or its type '%s' did not follow the NumPy protocol" - , module_name.c_str(), type_name.c_str()); - throw_error_already_set(); - - } - - bool load(bool throw_on_error) - { - if (!state) - { - if (module_name.size() == 0) - { - module_name = "numarray"; - type_name = "NDArray"; - if (load(false)) - return true; - module_name = "Numeric"; - type_name = "ArrayType"; - } - - state = failed; - PyObject* module = ::PyImport_Import(object(module_name).ptr()); - if (module) - { - PyObject* type = ::PyObject_GetAttrString(module, const_cast(type_name.c_str())); - - if (type && PyType_Check(type)) - { - array_type = handle<>(type); - PyObject* function = ::PyObject_GetAttrString(module, const_cast("array")); - - if (function && PyCallable_Check(function)) - { - array_function = handle<>(function); - state = succeeded; - } - } - } - } - - if (state == succeeded) - return true; - - if (throw_on_error) - throw_load_failure(); - - PyErr_Clear(); - return false; - } - - object demand_array_function() - { - load(true); - return object(array_function); - } -} - -void array::set_module_and_type(char const* package_name, char const* type_attribute_name) -{ - state = unknown; - module_name = package_name ? package_name : "" ; - type_name = type_attribute_name ? type_attribute_name : "" ; -} - -std::string array::get_module_name() -{ - load(false); - return module_name; -} - -namespace aux -{ - bool array_object_manager_traits::check(PyObject* obj) - { - if (!load(false)) - return false; - return ::PyObject_IsInstance(obj, array_type.get()); - } - - python::detail::new_non_null_reference - array_object_manager_traits::adopt(PyObject* obj) - { - load(true); - return detail::new_non_null_reference( - pytype_check(downcast(array_type.get()), obj)); - } - - PyTypeObject const* array_object_manager_traits::get_pytype() - { - load(false); - if(!array_type) return 0; - return downcast(array_type.get()); - } - -# define BOOST_PYTHON_AS_OBJECT(z, n, _) object(x##n) -# define BOOST_PP_LOCAL_MACRO(n) \ - array_base::array_base(BOOST_PP_ENUM_PARAMS(n, object const& x)) \ - : object(demand_array_function()(BOOST_PP_ENUM_PARAMS(n, x))) \ - {} -# define BOOST_PP_LOCAL_LIMITS (1, 6) -# include BOOST_PP_LOCAL_ITERATE() -# undef BOOST_PYTHON_AS_OBJECT - - array_base::array_base(BOOST_PP_ENUM_PARAMS(7, object const& x)) - : object(demand_array_function()(BOOST_PP_ENUM_PARAMS(7, x))) - {} - - object array_base::argmax(long axis) - { - return attr("argmax")(axis); - } - - object array_base::argmin(long axis) - { - return attr("argmin")(axis); - } - - object array_base::argsort(long axis) - { - return attr("argsort")(axis); - } - - object array_base::astype(object const& type) - { - return attr("astype")(type); - } - - void array_base::byteswap() - { - attr("byteswap")(); - } - - object array_base::copy() const - { - return attr("copy")(); - } - - object array_base::diagonal(long offset, long axis1, long axis2) const - { - return attr("diagonal")(offset, axis1, axis2); - } - - void array_base::info() const - { - attr("info")(); - } - - bool array_base::is_c_array() const - { - return extract(attr("is_c_array")()); - } - - bool array_base::isbyteswapped() const - { - return extract(attr("isbyteswapped")()); - } - - array array_base::new_(object type) const - { - return extract(attr("new")(type))(); - } - - void array_base::sort() - { - attr("sort")(); - } - - object array_base::trace(long offset, long axis1, long axis2) const - { - return attr("trace")(offset, axis1, axis2); - } - - object array_base::type() const - { - return attr("type")(); - } - - char array_base::typecode() const - { - return extract(attr("typecode")()); - } - - object array_base::factory( - object const& sequence - , object const& typecode - , bool copy - , bool savespace - , object type - , object shape - ) - { - return attr("factory")(sequence, typecode, copy, savespace, type, shape); - } - - object array_base::getflat() const - { - return attr("getflat")(); - } - - long array_base::getrank() const - { - return extract(attr("getrank")()); - } - - object array_base::getshape() const - { - return attr("getshape")(); - } - - bool array_base::isaligned() const - { - return extract(attr("isaligned")()); - } - - bool array_base::iscontiguous() const - { - return extract(attr("iscontiguous")()); - } - - long array_base::itemsize() const - { - return extract(attr("itemsize")()); - } - - long array_base::nelements() const - { - return extract(attr("nelements")()); - } - - object array_base::nonzero() const - { - return attr("nonzero")(); - } - - void array_base::put(object const& indices, object const& values) - { - attr("put")(indices, values); - } - - void array_base::ravel() - { - attr("ravel")(); - } - - object array_base::repeat(object const& repeats, long axis) - { - return attr("repeat")(repeats, axis); - } - - void array_base::resize(object const& shape) - { - attr("resize")(shape); - } - - void array_base::setflat(object const& flat) - { - attr("setflat")(flat); - } - - void array_base::setshape(object const& shape) - { - attr("setshape")(shape); - } - - void array_base::swapaxes(long axis1, long axis2) - { - attr("swapaxes")(axis1, axis2); - } - - object array_base::take(object const& sequence, long axis) const - { - return attr("take")(sequence, axis); - } - - void array_base::tofile(object const& file) const - { - attr("tofile")(file); - } - - str array_base::tostring() const - { - return str(attr("tostring")()); - } - - void array_base::transpose(object const& axes) - { - attr("transpose")(axes); - } - - object array_base::view() const - { - return attr("view")(); - } -} - -}}} // namespace boost::python::numeric diff --git a/src/object/class.cpp b/src/object/class.cpp deleted file mode 100644 index aeef688e..00000000 --- a/src/object/class.cpp +++ /dev/null @@ -1,764 +0,0 @@ -// Copyright David Abrahams 2001. -// 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 -#include // #including this first is an intel6 workaround - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -namespace boost { namespace python { - -# ifdef BOOST_PYTHON_SELF_IS_CLASS -namespace self_ns -{ - self_t self; -} -# endif - -instance_holder::instance_holder() - : m_next(0) -{ -} - -instance_holder::~instance_holder() -{ -} - -extern "C" -{ - // This is copied from typeobject.c in the Python sources. Even though - // class_metatype_object doesn't set Py_TPFLAGS_HAVE_GC, that bit gets - // filled in by the base class initialization process in - // PyType_Ready(). However, tp_is_gc is *not* copied from the base - // type, making it assume that classes are GC-able even if (like - // class_type_object) they're statically allocated. - static int - type_is_gc(PyTypeObject *python_type) - { - return python_type->tp_flags & Py_TPFLAGS_HEAPTYPE; - } - - // This is also copied from the Python sources. We can't implement - // static_data as a subclass property effectively without it. - typedef struct { - PyObject_HEAD - PyObject *prop_get; - PyObject *prop_set; - PyObject *prop_del; - PyObject *prop_doc; - int getter_doc; - } propertyobject; - - // Copied from Python source and removed the part for setting docstring, - // since we don't have a setter for __doc__ and trying to set it will - // cause the init fail. - static int property_init(PyObject *self, PyObject *args, PyObject *kwds) - { - PyObject *get = NULL, *set = NULL, *del = NULL, *doc = NULL; - static const char *kwlist[] = {"fget", "fset", "fdel", "doc", 0}; - propertyobject *prop = (propertyobject *)self; - - if (!PyArg_ParseTupleAndKeywords(args, kwds, "|OOOO:property", - const_cast(kwlist), &get, &set, &del, &doc)) - return -1; - - if (get == Py_None) - get = NULL; - if (set == Py_None) - set = NULL; - if (del == Py_None) - del = NULL; - - Py_XINCREF(get); - Py_XINCREF(set); - Py_XINCREF(del); - Py_XINCREF(doc); - - prop->prop_get = get; - prop->prop_set = set; - prop->prop_del = del; - prop->prop_doc = doc; - prop->getter_doc = 0; - - return 0; - } - - - static PyObject * - static_data_descr_get(PyObject *self, PyObject * /*obj*/, PyObject * /*type*/) - { - propertyobject *gs = (propertyobject *)self; - - return PyObject_CallFunction(gs->prop_get, const_cast("()")); - } - - static int - static_data_descr_set(PyObject *self, PyObject * /*obj*/, PyObject *value) - { - propertyobject *gs = (propertyobject *)self; - PyObject *func, *res; - - if (value == NULL) - func = gs->prop_del; - else - func = gs->prop_set; - if (func == NULL) { - PyErr_SetString(PyExc_AttributeError, - value == NULL ? - "can't delete attribute" : - "can't set attribute"); - return -1; - } - if (value == NULL) - res = PyObject_CallFunction(func, const_cast("()")); - else - res = PyObject_CallFunction(func, const_cast("(O)"), value); - if (res == NULL) - return -1; - Py_DECREF(res); - return 0; - } -} - -static PyTypeObject static_data_object = { - PyVarObject_HEAD_INIT(NULL, 0) - const_cast("Boost.Python.StaticProperty"), - sizeof(propertyobject), - 0, - 0, /* tp_dealloc */ - 0, /* tp_print */ - 0, /* tp_getattr */ - 0, /* tp_setattr */ - 0, /* tp_compare */ - 0, /* tp_repr */ - 0, /* tp_as_number */ - 0, /* tp_as_sequence */ - 0, /* tp_as_mapping */ - 0, /* tp_hash */ - 0, /* tp_call */ - 0, /* tp_str */ - 0, /* tp_getattro */ - 0, /* tp_setattro */ - 0, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT // | Py_TPFLAGS_HAVE_GC - | Py_TPFLAGS_BASETYPE, /* tp_flags */ - 0, /* tp_doc */ - 0, /* tp_traverse */ - 0, /* tp_clear */ - 0, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - 0, /* tp_iter */ - 0, /* tp_iternext */ - 0, /* tp_methods */ - 0, /* tp_members */ - 0, /* tp_getset */ - 0, //&PyProperty_Type, /* tp_base */ - 0, /* tp_dict */ - static_data_descr_get, /* tp_descr_get */ - static_data_descr_set, /* tp_descr_set */ - 0, /* tp_dictoffset */ - property_init, /* tp_init */ - 0, /* tp_alloc */ - 0, // filled in with type_new /* tp_new */ - 0, // filled in with __PyObject_GC_Del /* tp_free */ - 0, /* tp_is_gc */ - 0, /* tp_bases */ - 0, /* tp_mro */ - 0, /* tp_cache */ - 0, /* tp_subclasses */ - 0, /* tp_weaklist */ -#if PYTHON_API_VERSION >= 1012 - 0 /* tp_del */ -#endif -}; - -namespace objects -{ -#if PY_VERSION_HEX < 0x03000000 - // XXX Not sure why this run into compiling error in Python 3 - extern "C" - { - // This declaration needed due to broken Python 2.2 headers - extern DL_IMPORT(PyTypeObject) PyProperty_Type; - } -#endif - - BOOST_PYTHON_DECL PyObject* static_data() - { - if (static_data_object.tp_dict == 0) - { - Py_TYPE(&static_data_object) = &PyType_Type; - static_data_object.tp_base = &PyProperty_Type; - if (PyType_Ready(&static_data_object)) - return 0; - } - return upcast(&static_data_object); - } -} - -extern "C" -{ - // Ordinarily, descriptors have a certain assymetry: you can use - // them to read attributes off the class object they adorn, but - // writing the same attribute on the class object always replaces - // the descriptor in the class __dict__. In order to properly - // represent C++ static data members, we need to allow them to be - // written through the class instance. This function of the - // metaclass makes it possible. - static int - class_setattro(PyObject *obj, PyObject *name, PyObject* value) - { - // Must use "private" Python implementation detail - // _PyType_Lookup instead of PyObject_GetAttr because the - // latter will always end up calling the descr_get function on - // any descriptor it finds; we need the unadulterated - // descriptor here. - PyObject* a = _PyType_Lookup(downcast(obj), name); - - // a is a borrowed reference or 0 - - // If we found a static data descriptor, call it directly to - // force it to set the static data member - if (a != 0 && PyObject_IsInstance(a, objects::static_data())) - return Py_TYPE(a)->tp_descr_set(a, obj, value); - else - return PyType_Type.tp_setattro(obj, name, value); - } -} - -static PyTypeObject class_metatype_object = { - PyVarObject_HEAD_INIT(NULL, 0) - const_cast("Boost.Python.class"), - PyType_Type.tp_basicsize, - 0, - 0, /* tp_dealloc */ - 0, /* tp_print */ - 0, /* tp_getattr */ - 0, /* tp_setattr */ - 0, /* tp_compare */ - 0, /* tp_repr */ - 0, /* tp_as_number */ - 0, /* tp_as_sequence */ - 0, /* tp_as_mapping */ - 0, /* tp_hash */ - 0, /* tp_call */ - 0, /* tp_str */ - 0, /* tp_getattro */ - class_setattro, /* tp_setattro */ - 0, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT // | Py_TPFLAGS_HAVE_GC - | Py_TPFLAGS_BASETYPE, /* tp_flags */ - 0, /* tp_doc */ - 0, /* tp_traverse */ - 0, /* tp_clear */ - 0, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - 0, /* tp_iter */ - 0, /* tp_iternext */ - 0, /* tp_methods */ - 0, /* tp_members */ - 0, /* tp_getset */ - 0, //&PyType_Type, /* tp_base */ - 0, /* tp_dict */ - 0, /* tp_descr_get */ - 0, /* tp_descr_set */ - 0, /* tp_dictoffset */ - 0, /* tp_init */ - 0, /* tp_alloc */ - 0, // filled in with type_new /* tp_new */ - 0, // filled in with __PyObject_GC_Del /* tp_free */ - (inquiry)type_is_gc, /* tp_is_gc */ - 0, /* tp_bases */ - 0, /* tp_mro */ - 0, /* tp_cache */ - 0, /* tp_subclasses */ - 0, /* tp_weaklist */ -#if PYTHON_API_VERSION >= 1012 - 0 /* tp_del */ -#endif -}; - -// Install the instance data for a C++ object into a Python instance -// object. -void instance_holder::install(PyObject* self) throw() -{ - assert(PyType_IsSubtype(Py_TYPE(Py_TYPE(self)), &class_metatype_object)); - m_next = ((objects::instance<>*)self)->objects; - ((objects::instance<>*)self)->objects = this; -} - - -namespace objects -{ -// Get the metatype object for all extension classes. - BOOST_PYTHON_DECL type_handle class_metatype() - { - if (class_metatype_object.tp_dict == 0) - { - Py_TYPE(&class_metatype_object) = &PyType_Type; - class_metatype_object.tp_base = &PyType_Type; - if (PyType_Ready(&class_metatype_object)) - return type_handle(); - } - return type_handle(borrowed(&class_metatype_object)); - } - extern "C" - { - static void instance_dealloc(PyObject* inst) - { - instance<>* kill_me = (instance<>*)inst; - - for (instance_holder* p = kill_me->objects, *next; p != 0; p = next) - { - next = p->next(); - p->~instance_holder(); - instance_holder::deallocate(inst, dynamic_cast(p)); - } - - // Python 2.2.1 won't add weak references automatically when - // tp_itemsize > 0, so we need to manage that - // ourselves. Accordingly, we also have to clean up the - // weakrefs ourselves. - if (kill_me->weakrefs != NULL) - PyObject_ClearWeakRefs(inst); - - Py_XDECREF(kill_me->dict); - - Py_TYPE(inst)->tp_free(inst); - } - - static PyObject * - instance_new(PyTypeObject* type_, PyObject* /*args*/, PyObject* /*kw*/) - { - // Attempt to find the __instance_size__ attribute. If not present, no problem. - PyObject* d = type_->tp_dict; - PyObject* instance_size_obj = PyObject_GetAttrString(d, const_cast("__instance_size__")); - - ssize_t instance_size = instance_size_obj ? -#if PY_VERSION_HEX >= 0x03000000 - PyLong_AsSsize_t(instance_size_obj) : 0; -#else - PyInt_AsLong(instance_size_obj) : 0; -#endif - - if (instance_size < 0) - instance_size = 0; - - PyErr_Clear(); // Clear any errors that may have occurred. - - instance<>* result = (instance<>*)type_->tp_alloc(type_, instance_size); - if (result) - { - // Guido says we can use ob_size for any purpose we - // like, so we'll store the total size of the object - // there. A negative number indicates that the extra - // instance memory is not yet allocated to any holders. -#if PY_VERSION_HEX >= 0x02060000 - Py_SIZE(result) = -#else - result->ob_size = -#endif - -(static_cast(offsetof(instance<>,storage) + instance_size)); - } - return (PyObject*)result; - } - - static PyObject* instance_get_dict(PyObject* op, void*) - { - instance<>* inst = downcast >(op); - if (inst->dict == 0) - inst->dict = PyDict_New(); - return python::xincref(inst->dict); - } - - static int instance_set_dict(PyObject* op, PyObject* dict, void*) - { - instance<>* inst = downcast >(op); - python::xdecref(inst->dict); - inst->dict = python::incref(dict); - return 0; - } - - } - - - static PyGetSetDef instance_getsets[] = { - {const_cast("__dict__"), instance_get_dict, instance_set_dict, NULL, 0}, - {0, 0, 0, 0, 0} - }; - - - static PyMemberDef instance_members[] = { - {const_cast("__weakref__"), T_OBJECT, offsetof(instance<>, weakrefs), 0, 0}, - {0, 0, 0, 0, 0} - }; - - static PyTypeObject class_type_object = { - PyVarObject_HEAD_INIT(NULL, 0) - const_cast("Boost.Python.instance"), - offsetof(instance<>,storage), /* tp_basicsize */ - 1, /* tp_itemsize */ - instance_dealloc, /* tp_dealloc */ - 0, /* tp_print */ - 0, /* tp_getattr */ - 0, /* tp_setattr */ - 0, /* tp_compare */ - 0, /* tp_repr */ - 0, /* tp_as_number */ - 0, /* tp_as_sequence */ - 0, /* tp_as_mapping */ - 0, /* tp_hash */ - 0, /* tp_call */ - 0, /* tp_str */ - 0, /* tp_getattro */ - 0, /* tp_setattro */ - 0, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT // | Py_TPFLAGS_HAVE_GC - | Py_TPFLAGS_BASETYPE, /* tp_flags */ - 0, /* tp_doc */ - 0, /* tp_traverse */ - 0, /* tp_clear */ - 0, /* tp_richcompare */ - offsetof(instance<>,weakrefs), /* tp_weaklistoffset */ - 0, /* tp_iter */ - 0, /* tp_iternext */ - 0, /* tp_methods */ - instance_members, /* tp_members */ - instance_getsets, /* tp_getset */ - 0, //&PyBaseObject_Type, /* tp_base */ - 0, /* tp_dict */ - 0, /* tp_descr_get */ - 0, /* tp_descr_set */ - offsetof(instance<>,dict), /* tp_dictoffset */ - 0, /* tp_init */ - PyType_GenericAlloc, /* tp_alloc */ - instance_new, /* tp_new */ - 0, /* tp_free */ - 0, /* tp_is_gc */ - 0, /* tp_bases */ - 0, /* tp_mro */ - 0, /* tp_cache */ - 0, /* tp_subclasses */ - 0, /* tp_weaklist */ -#if PYTHON_API_VERSION >= 1012 - 0 /* tp_del */ -#endif - }; - - BOOST_PYTHON_DECL type_handle class_type() - { - if (class_type_object.tp_dict == 0) - { - Py_TYPE(&class_type_object) = incref(class_metatype().get()); - class_type_object.tp_base = &PyBaseObject_Type; - if (PyType_Ready(&class_type_object)) - return type_handle(); -// class_type_object.tp_setattro = class_setattro; - } - return type_handle(borrowed(&class_type_object)); - } - - BOOST_PYTHON_DECL void* - find_instance_impl(PyObject* inst, type_info type, bool null_shared_ptr_only) - { - if (!Py_TYPE(Py_TYPE(inst)) || - !PyType_IsSubtype(Py_TYPE(Py_TYPE(inst)), &class_metatype_object)) - return 0; - - instance<>* self = reinterpret_cast*>(inst); - - for (instance_holder* match = self->objects; match != 0; match = match->next()) - { - void* const found = match->holds(type, null_shared_ptr_only); - if (found) - return found; - } - return 0; - } - - object module_prefix() - { - return object( - PyObject_IsInstance(scope().ptr(), upcast(&PyModule_Type)) - ? object(scope().attr("__name__")) - : api::getattr(scope(), "__module__", str()) - ); - } - - namespace - { - // Find a registered class object corresponding to id. Return a - // null handle if no such class is registered. - inline type_handle query_class(type_info id) - { - converter::registration const* p = converter::registry::query(id); - return type_handle( - python::borrowed( - python::allow_null(p ? p->m_class_object : 0)) - ); - } - - // Find a registered class corresponding to id. If not found, - // throw an appropriate exception. - type_handle get_class(type_info id) - { - type_handle result(query_class(id)); - - if (result.get() == 0) - { - object report("extension class wrapper for base class "); - report = report + id.name() + " has not been created yet"; - PyErr_SetObject(PyExc_RuntimeError, report.ptr()); - throw_error_already_set(); - } - return result; - } - - // class_base constructor - // - // name - the name of the new Python class - // - // num_types - one more than the number of declared bases - // - // types - array of python::type_info, the first item - // corresponding to the class being created, and the - // rest corresponding to its declared bases. - // - inline object - new_class(char const* name, std::size_t num_types, type_info const* const types, char const* doc) - { - assert(num_types >= 1); - - // Build a tuple of the base Python type objects. If no bases - // were declared, we'll use our class_type() as the single base - // class. - ssize_t const num_bases = (std::max)(num_types - 1, static_cast(1)); - handle<> bases(PyTuple_New(num_bases)); - - for (ssize_t i = 1; i <= num_bases; ++i) - { - type_handle c = (i >= static_cast(num_types)) ? class_type() : get_class(types[i]); - // PyTuple_SET_ITEM steals this reference - PyTuple_SET_ITEM(bases.get(), static_cast(i - 1), upcast(c.release())); - } - - // Call the class metatype to create a new class - dict d; - - object m = module_prefix(); - if (m) d["__module__"] = m; - - if (doc != 0) - d["__doc__"] = doc; - - object result = object(class_metatype())(name, bases, d); - assert(PyType_IsSubtype(Py_TYPE(result.ptr()), &PyType_Type)); - - if (scope().ptr() != Py_None) - scope().attr(name) = result; - - // For pickle. Will lead to informative error messages if pickling - // is not enabled. - result.attr("__reduce__") = object(make_instance_reduce_function()); - - return result; - } - } - - class_base::class_base( - char const* name, std::size_t num_types, type_info const* const types, char const* doc) - : object(new_class(name, num_types, types, doc)) - { - // Insert the new class object in the registry - converter::registration& converters = const_cast( - converter::registry::lookup(types[0])); - - // Class object is leaked, for now - converters.m_class_object = (PyTypeObject*)incref(this->ptr()); - } - - BOOST_PYTHON_DECL void copy_class_object(type_info const& src, type_info const& dst) - { - converter::registration& dst_converters - = const_cast(converter::registry::lookup(dst)); - - converter::registration const& src_converters = converter::registry::lookup(src); - - dst_converters.m_class_object = src_converters.m_class_object; - } - - void class_base::set_instance_size(std::size_t instance_size) - { - this->attr("__instance_size__") = instance_size; - } - - void class_base::add_property( - char const* name, object const& fget, char const* docstr) - { - object property( - (python::detail::new_reference) - PyObject_CallFunction((PyObject*)&PyProperty_Type, const_cast("Osss"), fget.ptr(), 0, 0, docstr)); - - this->setattr(name, property); - } - - void class_base::add_property( - char const* name, object const& fget, object const& fset, char const* docstr) - { - object property( - (python::detail::new_reference) - PyObject_CallFunction((PyObject*)&PyProperty_Type, const_cast("OOss"), fget.ptr(), fset.ptr(), 0, docstr)); - - this->setattr(name, property); - } - - void class_base::add_static_property(char const* name, object const& fget) - { - object property( - (python::detail::new_reference) - PyObject_CallFunction(static_data(), const_cast("O"), fget.ptr()) - ); - - this->setattr(name, property); - } - - void class_base::add_static_property(char const* name, object const& fget, object const& fset) - { - object property( - (python::detail::new_reference) - PyObject_CallFunction(static_data(), const_cast("OO"), fget.ptr(), fset.ptr())); - - this->setattr(name, property); - } - - void class_base::setattr(char const* name, object const& x) - { - if (PyObject_SetAttrString(this->ptr(), const_cast(name), x.ptr()) < 0) - throw_error_already_set(); - } - - namespace - { - extern "C" PyObject* no_init(PyObject*, PyObject*) - { - ::PyErr_SetString(::PyExc_RuntimeError, const_cast("This class cannot be instantiated from Python")); - return NULL; - } - static ::PyMethodDef no_init_def = { - const_cast("__init__"), no_init, METH_VARARGS, - const_cast("Raises an exception\n" - "This class cannot be instantiated from Python\n") - }; - } - - void class_base::def_no_init() - { - handle<> f(::PyCFunction_New(&no_init_def, 0)); - this->setattr("__init__", object(f)); - } - - void class_base::enable_pickling_(bool getstate_manages_dict) - { - setattr("__safe_for_unpickling__", object(true)); - - if (getstate_manages_dict) - { - setattr("__getstate_manages_dict__", object(true)); - } - } - - namespace - { - PyObject* callable_check(PyObject* callable) - { - if (PyCallable_Check(expect_non_null(callable))) - return callable; - - ::PyErr_Format( - PyExc_TypeError - , const_cast("staticmethod expects callable object; got an object of type %s, which is not callable") - , Py_TYPE(callable)->tp_name - ); - - throw_error_already_set(); - return 0; - } - } - - void class_base::make_method_static(const char * method_name) - { - PyTypeObject* self = downcast(this->ptr()); - dict d((handle<>(borrowed(self->tp_dict)))); - - object method(d[method_name]); - - this->attr(method_name) = object( - handle<>( - PyStaticMethod_New((callable_check)(method.ptr()) ) - )); - } - - BOOST_PYTHON_DECL type_handle registered_class_object(type_info id) - { - return query_class(id); - } -} // namespace objects - - -void* instance_holder::allocate(PyObject* self_, std::size_t holder_offset, std::size_t holder_size) -{ - assert(PyType_IsSubtype(Py_TYPE(Py_TYPE(self_)), &class_metatype_object)); - objects::instance<>* self = (objects::instance<>*)self_; - - int total_size_needed = holder_offset + holder_size; - - if (-Py_SIZE(self) >= total_size_needed) - { - // holder_offset should at least point into the variable-sized part - assert(holder_offset >= offsetof(objects::instance<>,storage)); - - // Record the fact that the storage is occupied, noting where it starts - Py_SIZE(self) = holder_offset; - return (char*)self + holder_offset; - } - else - { - void* const result = PyMem_Malloc(holder_size); - if (result == 0) - throw std::bad_alloc(); - return result; - } -} - -void instance_holder::deallocate(PyObject* self_, void* storage) throw() -{ - assert(PyType_IsSubtype(Py_TYPE(Py_TYPE(self_)), &class_metatype_object)); - objects::instance<>* self = (objects::instance<>*)self_; - if (storage != (char*)self + Py_SIZE(self)) - { - PyMem_Free(storage); - } -} - -}} // namespace boost::python diff --git a/src/object/enum.cpp b/src/object/enum.cpp deleted file mode 100644 index 3063320c..00000000 --- a/src/object/enum.cpp +++ /dev/null @@ -1,246 +0,0 @@ -// 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 -#include -#include -#include -#include -#include -#include -#include -#include -#include - -namespace boost { namespace python { namespace objects { - -struct enum_object -{ -#if PY_VERSION_HEX >= 0x03000000 - PyLongObject base_object; -#else - PyIntObject base_object; -#endif - PyObject* name; -}; - -static PyMemberDef enum_members[] = { - {const_cast("name"), T_OBJECT_EX, offsetof(enum_object,name),READONLY, 0}, - {0, 0, 0, 0, 0} -}; - - -extern "C" -{ - static PyObject* enum_repr(PyObject* self_) - { - // XXX(bhy) Potentional memory leak here since PyObject_GetAttrString returns a new reference - // const char *mod = PyString_AsString(PyObject_GetAttrString( self_, const_cast("__module__"))); - PyObject *mod = PyObject_GetAttrString( self_, "__module__"); - enum_object* self = downcast(self_); - if (!self->name) - { - return -#if PY_VERSION_HEX >= 0x03000000 - PyUnicode_FromFormat("%S.%s(%ld)", mod, self_->ob_type->tp_name, PyLong_AsLong(self_)); -#else - PyString_FromFormat("%s.%s(%ld)", PyString_AsString(mod), self_->ob_type->tp_name, PyInt_AS_LONG(self_)); -#endif - } - else - { - PyObject* name = self->name; - if (name == 0) - return 0; - - return -#if PY_VERSION_HEX >= 0x03000000 - PyUnicode_FromFormat("%S.%s.%S", mod, self_->ob_type->tp_name, name); -#else - PyString_FromFormat("%s.%s.%s", - PyString_AsString(mod), self_->ob_type->tp_name, PyString_AsString(name)); -#endif - } - } - - static PyObject* enum_str(PyObject* self_) - { - enum_object* self = downcast(self_); - if (!self->name) - { -#if PY_VERSION_HEX >= 0x03000000 - return PyLong_Type.tp_str(self_); -#else - return PyInt_Type.tp_str(self_); -#endif - } - else - { - return incref(self->name); - } - } -} - -static PyTypeObject enum_type_object = { - PyVarObject_HEAD_INIT(NULL, 0) // &PyType_Type - const_cast("Boost.Python.enum"), - sizeof(enum_object), /* tp_basicsize */ - 0, /* tp_itemsize */ - 0, /* tp_dealloc */ - 0, /* tp_print */ - 0, /* tp_getattr */ - 0, /* tp_setattr */ - 0, /* tp_compare */ - enum_repr, /* tp_repr */ - 0, /* tp_as_number */ - 0, /* tp_as_sequence */ - 0, /* tp_as_mapping */ - 0, /* tp_hash */ - 0, /* tp_call */ - enum_str, /* tp_str */ - 0, /* tp_getattro */ - 0, /* tp_setattro */ - 0, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT -#if PY_VERSION_HEX < 0x03000000 - | Py_TPFLAGS_CHECKTYPES -#endif - | Py_TPFLAGS_HAVE_GC - | Py_TPFLAGS_BASETYPE, /* tp_flags */ - 0, /* tp_doc */ - 0, /* tp_traverse */ - 0, /* tp_clear */ - 0, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - 0, /* tp_iter */ - 0, /* tp_iternext */ - 0, /* tp_methods */ - enum_members, /* tp_members */ - 0, /* tp_getset */ - 0, //&PyInt_Type, /* tp_base */ - 0, /* tp_dict */ - 0, /* tp_descr_get */ - 0, /* tp_descr_set */ - 0, /* tp_dictoffset */ - 0, /* tp_init */ - 0, /* tp_alloc */ - 0, /* tp_new */ - 0, /* tp_free */ - 0, /* tp_is_gc */ - 0, /* tp_bases */ - 0, /* tp_mro */ - 0, /* tp_cache */ - 0, /* tp_subclasses */ - 0, /* tp_weaklist */ -#if PYTHON_API_VERSION >= 1012 - 0 /* tp_del */ -#endif -}; - -object module_prefix(); - -namespace -{ - object new_enum_type(char const* name, char const *doc) - { - if (enum_type_object.tp_dict == 0) - { - Py_TYPE(&enum_type_object) = incref(&PyType_Type); -#if PY_VERSION_HEX >= 0x03000000 - enum_type_object.tp_base = &PyLong_Type; -#else - enum_type_object.tp_base = &PyInt_Type; -#endif - if (PyType_Ready(&enum_type_object)) - throw_error_already_set(); - } - - type_handle metatype(borrowed(&PyType_Type)); - type_handle base(borrowed(&enum_type_object)); - - // suppress the instance __dict__ in these enum objects. There - // may be a slicker way, but this'll do for now. - dict d; - d["__slots__"] = tuple(); - d["values"] = dict(); - d["names"] = dict(); - - object module_name = module_prefix(); - if (module_name) - d["__module__"] = module_name; - if (doc) - d["__doc__"] = doc; - - object result = (object(metatype))(name, make_tuple(base), d); - - scope().attr(name) = result; - - return result; - } -} - -enum_base::enum_base( - char const* name - , converter::to_python_function_t to_python - , converter::convertible_function convertible - , converter::constructor_function construct - , type_info id - , char const *doc - ) - : object(new_enum_type(name, doc)) -{ - converter::registration& converters - = const_cast( - converter::registry::lookup(id)); - - converters.m_class_object = downcast(this->ptr()); - converter::registry::insert(to_python, id); - converter::registry::insert(convertible, construct, id); -} - -void enum_base::add_value(char const* name_, long value) -{ - // Convert name to Python string - object name(name_); - - // Create a new enum instance by calling the class with a value - object x = (*this)(value); - - // Store the object in the enum class - (*this).attr(name_) = x; - - dict d = extract(this->attr("values"))(); - d[value] = x; - - // Set the name field in the new enum instanec - enum_object* p = downcast(x.ptr()); - Py_XDECREF(p->name); - p->name = incref(name.ptr()); - - dict names_dict = extract(this->attr("names"))(); - names_dict[x.attr("name")] = x; -} - -void enum_base::export_values() -{ - dict d = extract(this->attr("names"))(); - list items = d.items(); - scope current; - - for (unsigned i = 0, max = len(items); i < max; ++i) - api::setattr(current, items[i][0], items[i][1]); - } - -PyObject* enum_base::to_python(PyTypeObject* type_, long x) -{ - object type((type_handle(borrowed(type_)))); - - dict d = extract(type.attr("values"))(); - object v = d.get(x, object()); - return incref( - (v == object() ? type(x) : v).ptr()); -} - -}}} // namespace boost::python::object diff --git a/src/object/function.cpp b/src/object/function.cpp deleted file mode 100644 index 5c59cc77..00000000 --- a/src/object/function.cpp +++ /dev/null @@ -1,793 +0,0 @@ -// Copyright David Abrahams 2001. -// 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 -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include - -#include - -#include -#include - -#if BOOST_PYTHON_DEBUG_ERROR_MESSAGES -# include -#endif - -namespace boost { namespace python { - volatile bool docstring_options::show_user_defined_ = true; - volatile bool docstring_options::show_cpp_signatures_ = true; -#ifndef BOOST_PYTHON_NO_PY_SIGNATURES - volatile bool docstring_options::show_py_signatures_ = true; -#else - volatile bool docstring_options::show_py_signatures_ = false; -#endif -}} - -namespace boost { namespace python { namespace objects { - -py_function_impl_base::~py_function_impl_base() -{ -} - -unsigned py_function_impl_base::max_arity() const -{ - return this->min_arity(); -} - -extern PyTypeObject function_type; - -function::function( - py_function const& implementation -#if BOOST_WORKAROUND(__EDG_VERSION__, == 245) - , python::detail::keyword const* names_and_defaults -#else - , python::detail::keyword const* const names_and_defaults -#endif - , unsigned num_keywords - ) - : m_fn(implementation) - , m_nkeyword_values(0) -{ - if (names_and_defaults != 0) - { - unsigned int max_arity = m_fn.max_arity(); - unsigned int keyword_offset - = max_arity > num_keywords ? max_arity - num_keywords : 0; - - - ssize_t tuple_size = num_keywords ? max_arity : 0; - m_arg_names = object(handle<>(PyTuple_New(tuple_size))); - - if (num_keywords != 0) - { - for (unsigned j = 0; j < keyword_offset; ++j) - PyTuple_SET_ITEM(m_arg_names.ptr(), j, incref(Py_None)); - } - - for (unsigned i = 0; i < num_keywords; ++i) - { - tuple kv; - - python::detail::keyword const* const p = names_and_defaults + i; - if (p->default_value) - { - kv = make_tuple(p->name, p->default_value); - ++m_nkeyword_values; - } - else - { - kv = make_tuple(p->name); - } - - PyTuple_SET_ITEM( - m_arg_names.ptr() - , i + keyword_offset - , incref(kv.ptr()) - ); - } - } - - PyObject* p = this; - if (Py_TYPE(&function_type) == 0) - { - Py_TYPE(&function_type) = &PyType_Type; - ::PyType_Ready(&function_type); - } - - (void)( // warning suppression for GCC - PyObject_INIT(p, &function_type) - ); -} - -function::~function() -{ -} - -PyObject* function::call(PyObject* args, PyObject* keywords) const -{ - std::size_t n_unnamed_actual = PyTuple_GET_SIZE(args); - std::size_t n_keyword_actual = keywords ? PyDict_Size(keywords) : 0; - std::size_t n_actual = n_unnamed_actual + n_keyword_actual; - - function const* f = this; - - // Try overloads looking for a match - do - { - // Check for a plausible number of arguments - unsigned min_arity = f->m_fn.min_arity(); - unsigned max_arity = f->m_fn.max_arity(); - - if (n_actual + f->m_nkeyword_values >= min_arity - && n_actual <= max_arity) - { - // This will be the args that actually get passed - handle<>inner_args(allow_null(borrowed(args))); - - if (n_keyword_actual > 0 // Keyword arguments were supplied - || n_actual < min_arity) // or default keyword values are needed - { - if (f->m_arg_names.is_none()) - { - // this overload doesn't accept keywords - inner_args = handle<>(); - } - else - { - // "all keywords are none" is a special case - // indicating we will accept any number of keyword - // arguments - if (PyTuple_Size(f->m_arg_names.ptr()) == 0) - { - // no argument preprocessing - } - else if (n_actual > max_arity) - { - // too many arguments - inner_args = handle<>(); - } - else - { - // build a new arg tuple, will adjust its size later - assert(max_arity <= static_cast(ssize_t_max)); - inner_args = handle<>( - PyTuple_New(static_cast(max_arity))); - - // Fill in the positional arguments - for (std::size_t i = 0; i < n_unnamed_actual; ++i) - PyTuple_SET_ITEM(inner_args.get(), i, incref(PyTuple_GET_ITEM(args, i))); - - // Grab remaining arguments by name from the keyword dictionary - std::size_t n_actual_processed = n_unnamed_actual; - - for (std::size_t arg_pos = n_unnamed_actual; arg_pos < max_arity ; ++arg_pos) - { - // Get the keyword[, value pair] corresponding - PyObject* kv = PyTuple_GET_ITEM(f->m_arg_names.ptr(), arg_pos); - - // If there were any keyword arguments, - // look up the one we need for this - // argument position - PyObject* value = n_keyword_actual - ? PyDict_GetItem(keywords, PyTuple_GET_ITEM(kv, 0)) - : 0; - - if (!value) - { - // Not found; check if there's a default value - if (PyTuple_GET_SIZE(kv) > 1) - value = PyTuple_GET_ITEM(kv, 1); - - if (!value) - { - // still not found; matching fails - PyErr_Clear(); - inner_args = handle<>(); - break; - } - } - else - { - ++n_actual_processed; - } - - PyTuple_SET_ITEM(inner_args.get(), arg_pos, incref(value)); - } - - if (inner_args.get()) - { - //check if we proccessed all the arguments - if(n_actual_processed < n_actual) - inner_args = handle<>(); - } - } - } - } - - // Call the function. Pass keywords in case it's a - // function accepting any number of keywords - PyObject* result = inner_args ? f->m_fn(inner_args.get(), keywords) : 0; - - // If the result is NULL but no error was set, m_fn failed - // the argument-matching test. - - // This assumes that all other error-reporters are - // well-behaved and never return NULL to python without - // setting an error. - if (result != 0 || PyErr_Occurred()) - return result; - } - f = f->m_overloads.get(); - } - while (f); - // None of the overloads matched; time to generate the error message - argument_error(args, keywords); - return 0; -} - -object function::signature(bool show_return_type) const -{ - py_function const& impl = m_fn; - - python::detail::signature_element const* return_type = impl.signature(); - python::detail::signature_element const* s = return_type + 1; - - list formal_params; - if (impl.max_arity() == 0) - formal_params.append("void"); - - for (unsigned n = 0; n < impl.max_arity(); ++n) - { - if (s[n].basename == 0) - { - formal_params.append("..."); - break; - } - - str param(s[n].basename); - if (s[n].lvalue) - param += " {lvalue}"; - - if (m_arg_names) // None or empty tuple will test false - { - object kv(m_arg_names[n]); - if (kv) - { - char const* const fmt = len(kv) > 1 ? " %s=%r" : " %s"; - param += fmt % kv; - } - } - - formal_params.append(param); - } - - if (show_return_type) - return "%s(%s) -> %s" % make_tuple( - m_name, str(", ").join(formal_params), return_type->basename); - return "%s(%s)" % make_tuple( - m_name, str(", ").join(formal_params)); -} - -object function::signatures(bool show_return_type) const -{ - list result; - for (function const* f = this; f; f = f->m_overloads.get()) { - result.append(f->signature(show_return_type)); - } - return result; -} - -void function::argument_error(PyObject* args, PyObject* /*keywords*/) const -{ - static handle<> exception( - PyErr_NewException(const_cast("Boost.Python.ArgumentError"), PyExc_TypeError, 0)); - - object message = "Python argument types in\n %s.%s(" - % make_tuple(this->m_namespace, this->m_name); - - list actual_args; - for (ssize_t i = 0; i < PyTuple_Size(args); ++i) - { - char const* name = PyTuple_GetItem(args, i)->ob_type->tp_name; - actual_args.append(str(name)); - } - message += str(", ").join(actual_args); - message += ")\ndid not match C++ signature:\n "; - message += str("\n ").join(signatures()); - -#if BOOST_PYTHON_DEBUG_ERROR_MESSAGES - std::printf("\n--------\n%s\n--------\n", extract(message)()); -#endif - PyErr_SetObject(exception.get(), message.ptr()); - throw_error_already_set(); -} - -void function::add_overload(handle const& overload_) -{ - function* parent = this; - - while (parent->m_overloads) - parent = parent->m_overloads.get(); - - parent->m_overloads = overload_; - - // If we have no documentation, get the docs from the overload - if (!m_doc) - m_doc = overload_->m_doc; -} - -namespace -{ - char const* const binary_operator_names[] = - { - "add__", - "and__", - "div__", - "divmod__", - "eq__", - "floordiv__", - "ge__", - "gt__", - "le__", - "lshift__", - "lt__", - "mod__", - "mul__", - "ne__", - "or__", - "pow__", - "radd__", - "rand__", - "rdiv__", - "rdivmod__", - "rfloordiv__", - "rlshift__", - "rmod__", - "rmul__", - "ror__", - "rpow__", - "rrshift__", - "rshift__", - "rsub__", - "rtruediv__", - "rxor__", - "sub__", - "truediv__", - "xor__" - }; - - struct less_cstring - { - bool operator()(char const* x, char const* y) const - { - return BOOST_CSTD_::strcmp(x,y) < 0; - } - }; - - inline bool is_binary_operator(char const* name) - { - return name[0] == '_' - && name[1] == '_' - && std::binary_search( - &binary_operator_names[0] - , binary_operator_names + sizeof(binary_operator_names)/sizeof(*binary_operator_names) - , name + 2 - , less_cstring() - ); - } - - // Something for the end of the chain of binary operators - PyObject* not_implemented(PyObject*, PyObject*) - { - Py_INCREF(Py_NotImplemented); - return Py_NotImplemented; - } - - handle not_implemented_function() - { - - static object keeper( - function_object( - py_function(¬_implemented, mpl::vector1(), 2) - , python::detail::keyword_range()) - ); - return handle(borrowed(downcast(keeper.ptr()))); - } -} - -void function::add_to_namespace( - object const& name_space, char const* name_, object const& attribute) -{ - add_to_namespace(name_space, name_, attribute, 0); -} - -namespace detail -{ - extern char py_signature_tag[]; - extern char cpp_signature_tag[]; -} - -void function::add_to_namespace( - object const& name_space, char const* name_, object const& attribute, char const* doc) -{ - str const name(name_); - PyObject* const ns = name_space.ptr(); - - if (attribute.ptr()->ob_type == &function_type) - { - function* new_func = downcast(attribute.ptr()); - handle<> dict; - -#if PY_VERSION_HEX < 0x03000000 - // Old-style class gone in Python 3 - if (PyClass_Check(ns)) - dict = handle<>(borrowed(((PyClassObject*)ns)->cl_dict)); - else -#endif - if (PyType_Check(ns)) - dict = handle<>(borrowed(((PyTypeObject*)ns)->tp_dict)); - else - dict = handle<>(PyObject_GetAttrString(ns, const_cast("__dict__"))); - - if (dict == 0) - throw_error_already_set(); - - handle<> existing(allow_null(::PyObject_GetItem(dict.get(), name.ptr()))); - - if (existing) - { - if (existing->ob_type == &function_type) - { - new_func->add_overload( - handle( - borrowed( - downcast(existing.get()) - ) - ) - ); - } - else if (existing->ob_type == &PyStaticMethod_Type) - { - char const* name_space_name = extract(name_space.attr("__name__")); - - ::PyErr_Format( - PyExc_RuntimeError - , "Boost.Python - All overloads must be exported " - "before calling \'class_<...>(\"%s\").staticmethod(\"%s\")\'" - , name_space_name - , name_ - ); - throw_error_already_set(); - } - } - else if (is_binary_operator(name_)) - { - // Binary operators need an additional overload which - // returns NotImplemented, so that Python will try the - // __rxxx__ functions on the other operand. We add this - // when no overloads for the operator already exist. - new_func->add_overload(not_implemented_function()); - } - - // A function is named the first time it is added to a namespace. - if (new_func->name().is_none()) - new_func->m_name = name; - - handle<> name_space_name( - allow_null(::PyObject_GetAttrString(name_space.ptr(), const_cast("__name__")))); - - if (name_space_name) - new_func->m_namespace = object(name_space_name); - } - - // The PyObject_GetAttrString() or PyObject_GetItem calls above may - // have left an active error - PyErr_Clear(); - if (PyObject_SetAttr(ns, name.ptr(), attribute.ptr()) < 0) - throw_error_already_set(); - - object mutable_attribute(attribute); -/* - if (doc != 0 && docstring_options::show_user_defined_) - { - // Accumulate documentation - - if ( - PyObject_HasAttrString(mutable_attribute.ptr(), "__doc__") - && mutable_attribute.attr("__doc__")) - { - mutable_attribute.attr("__doc__") += "\n\n"; - mutable_attribute.attr("__doc__") += doc; - } - else { - mutable_attribute.attr("__doc__") = doc; - } - } - - if (docstring_options::show_signatures_) - { - if ( PyObject_HasAttrString(mutable_attribute.ptr(), "__doc__") - && mutable_attribute.attr("__doc__")) { - mutable_attribute.attr("__doc__") += ( - mutable_attribute.attr("__doc__")[-1] != "\n" ? "\n\n" : "\n"); - } - else { - mutable_attribute.attr("__doc__") = ""; - } - function* f = downcast(attribute.ptr()); - mutable_attribute.attr("__doc__") += str("\n ").join(make_tuple( - "C++ signature:", f->signature(true))); - } - */ - str _doc; - - if (docstring_options::show_py_signatures_) - { - _doc += str(const_cast(detail::py_signature_tag)); - } - if (doc != 0 && docstring_options::show_user_defined_) - _doc += doc; - - if (docstring_options::show_cpp_signatures_) - { - _doc += str(const_cast(detail::cpp_signature_tag)); - } - if(_doc) - { - object mutable_attribute(attribute); - mutable_attribute.attr("__doc__")= _doc; - } -} - -BOOST_PYTHON_DECL void add_to_namespace( - object const& name_space, char const* name, object const& attribute) -{ - function::add_to_namespace(name_space, name, attribute, 0); -} - -BOOST_PYTHON_DECL void add_to_namespace( - object const& name_space, char const* name, object const& attribute, char const* doc) -{ - function::add_to_namespace(name_space, name, attribute, doc); -} - - -namespace -{ - struct bind_return - { - bind_return(PyObject*& result, function const* f, PyObject* args, PyObject* keywords) - : m_result(result) - , m_f(f) - , m_args(args) - , m_keywords(keywords) - {} - - void operator()() const - { - m_result = m_f->call(m_args, m_keywords); - } - - private: - PyObject*& m_result; - function const* m_f; - PyObject* m_args; - PyObject* m_keywords; - }; -} - -extern "C" -{ - // Stolen from Python's funcobject.c - static PyObject * - function_descr_get(PyObject *func, PyObject *obj, PyObject *type_) - { -#if PY_VERSION_HEX >= 0x03000000 - // The implement is different in Python 3 because of the removal of unbound method - if (obj == Py_None || obj == NULL) { - Py_INCREF(func); - return func; - } - return PyMethod_New(func, obj); -#else - if (obj == Py_None) - obj = NULL; - return PyMethod_New(func, obj, type_); -#endif - } - - static void - function_dealloc(PyObject* p) - { - delete static_cast(p); - } - - static PyObject * - function_call(PyObject *func, PyObject *args, PyObject *kw) - { - PyObject* result = 0; - handle_exception(bind_return(result, static_cast(func), args, kw)); - return result; - } - - // - // Here we're using the function's tp_getset rather than its - // tp_members to set up __doc__ and __name__, because tp_members - // really depends on having a POD object type (it relies on - // offsets). It might make sense to reformulate function as a POD - // at some point, but this is much more expedient. - // - static PyObject* function_get_doc(PyObject* op, void*) - { - function* f = downcast(op); - list signatures = function_doc_signature_generator::function_doc_signatures(f); - if(!signatures) return python::detail::none(); - signatures.reverse(); - return python::incref( str("\n").join(signatures).ptr()); - } - - static int function_set_doc(PyObject* op, PyObject* doc, void*) - { - function* f = downcast(op); - f->doc(doc ? object(python::detail::borrowed_reference(doc)) : object()); - return 0; - } - - static PyObject* function_get_name(PyObject* op, void*) - { - function* f = downcast(op); - if (f->name().is_none()) -#if PY_VERSION_HEX >= 0x03000000 - return PyUnicode_InternFromString(""); -#else - return PyString_InternFromString(""); -#endif - else - return python::incref(f->name().ptr()); - } - - // We add a dummy __class__ attribute in order to fool PyDoc into - // treating these as built-in functions and scanning their - // documentation - static PyObject* function_get_class(PyObject* /*op*/, void*) - { - return python::incref(upcast(&PyCFunction_Type)); - } - - static PyObject* function_get_module(PyObject* op, void*) - { - function* f = downcast(op); - object const& ns = f->get_namespace(); - if (!ns.is_none()) { - return python::incref(ns.ptr()); - } - PyErr_SetString( - PyExc_AttributeError, const_cast( - "Boost.Python function __module__ unknown.")); - return 0; - } -} - -static PyGetSetDef function_getsetlist[] = { - {const_cast("__name__"), (getter)function_get_name, 0, 0, 0 }, - {const_cast("func_name"), (getter)function_get_name, 0, 0, 0 }, - {const_cast("__module__"), (getter)function_get_module, 0, 0, 0 }, - {const_cast("func_module"), (getter)function_get_module, 0, 0, 0 }, - {const_cast("__class__"), (getter)function_get_class, 0, 0, 0 }, // see note above - {const_cast("__doc__"), (getter)function_get_doc, (setter)function_set_doc, 0, 0}, - {const_cast("func_doc"), (getter)function_get_doc, (setter)function_set_doc, 0, 0}, - {NULL, 0, 0, 0, 0} /* Sentinel */ -}; - -PyTypeObject function_type = { - PyVarObject_HEAD_INIT(NULL, 0) - const_cast("Boost.Python.function"), - sizeof(function), - 0, - (destructor)function_dealloc, /* tp_dealloc */ - 0, /* tp_print */ - 0, /* tp_getattr */ - 0, /* tp_setattr */ - 0, /* tp_compare */ - 0, //(reprfunc)func_repr, /* tp_repr */ - 0, /* tp_as_number */ - 0, /* tp_as_sequence */ - 0, /* tp_as_mapping */ - 0, /* tp_hash */ - function_call, /* tp_call */ - 0, /* tp_str */ - 0, // PyObject_GenericGetAttr, /* tp_getattro */ - 0, // PyObject_GenericSetAttr, /* tp_setattro */ - 0, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT /* | Py_TPFLAGS_HAVE_GC */,/* tp_flags */ - 0, /* tp_doc */ - 0, // (traverseproc)func_traverse, /* tp_traverse */ - 0, /* tp_clear */ - 0, /* tp_richcompare */ - 0, //offsetof(PyFunctionObject, func_weakreflist), /* tp_weaklistoffset */ - 0, /* tp_iter */ - 0, /* tp_iternext */ - 0, /* tp_methods */ - 0, // func_memberlist, /* tp_members */ - function_getsetlist, /* tp_getset */ - 0, /* tp_base */ - 0, /* tp_dict */ - function_descr_get, /* tp_descr_get */ - 0, /* tp_descr_set */ - 0, //offsetof(PyFunctionObject, func_dict), /* tp_dictoffset */ - 0, /* tp_init */ - 0, /* tp_alloc */ - 0, /* tp_new */ - 0, /* tp_free */ - 0, /* tp_is_gc */ - 0, /* tp_bases */ - 0, /* tp_mro */ - 0, /* tp_cache */ - 0, /* tp_subclasses */ - 0, /* tp_weaklist */ -#if PYTHON_API_VERSION >= 1012 - 0 /* tp_del */ -#endif -}; - -object function_object( - py_function const& f - , python::detail::keyword_range const& keywords) -{ - return python::object( - python::detail::new_non_null_reference( - new function( - f, keywords.first, keywords.second - keywords.first))); -} - -object function_object(py_function const& f) -{ - return function_object(f, python::detail::keyword_range()); -} - - -handle<> function_handle_impl(py_function const& f) -{ - return python::handle<>( - allow_null( - new function(f, 0, 0))); -} - -} // namespace objects - -namespace detail -{ - object BOOST_PYTHON_DECL make_raw_function(objects::py_function f) - { - static keyword k; - - return objects::function_object( - f - , keyword_range(&k,&k)); - } - void BOOST_PYTHON_DECL pure_virtual_called() - { - PyErr_SetString( - PyExc_RuntimeError, const_cast("Pure virtual function called")); - throw_error_already_set(); - } -} - -}} // namespace boost::python diff --git a/src/object/function_doc_signature.cpp b/src/object/function_doc_signature.cpp deleted file mode 100644 index 41695285..00000000 --- a/src/object/function_doc_signature.cpp +++ /dev/null @@ -1,344 +0,0 @@ -// Copyright Nikolay Mladenov 2007. -// 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) - -// boost::python::make_tuple below are for gcc 4.4 -std=c++0x compatibility -// (Intel C++ 10 and 11 with -std=c++0x don't need the full qualification). - -#include -#include -#include -#include -#include -#include - -#include - -#include - -namespace boost { namespace python { namespace objects { - - bool function_doc_signature_generator::arity_cmp( function const *f1, function const *f2 ) - { - return f1->m_fn.max_arity() < f2->m_fn.max_arity(); - } - - bool function_doc_signature_generator::are_seq_overloads( function const *f1, function const *f2 , bool check_docs) - { - py_function const & impl1 = f1->m_fn; - py_function const & impl2 = f2->m_fn; - - //the number of parameters differs by 1 - if (impl2.max_arity()-impl1.max_arity() != 1) - return false; - - // if check docs then f1 shold not have docstring or have the same docstring as f2 - if (check_docs && f2->doc() != f1->doc() && f1->doc()) - return false; - - python::detail::signature_element const* s1 = impl1.signature(); - python::detail::signature_element const* s2 = impl2.signature(); - - unsigned size = impl1.max_arity()+1; - - for (unsigned i = 0; i != size; ++i) - { - //check if the argument types are the same - if (s1[i].basename != s2[i].basename) - return false; - - //return type - if (!i) continue; - - //check if the argument default values are the same - bool f1_has_names = bool(f1->m_arg_names); - bool f2_has_names = bool(f2->m_arg_names); - if ( (f1_has_names && f2_has_names && f2->m_arg_names[i-1]!=f1->m_arg_names[i-1]) - || (f1_has_names && !f2_has_names) - || (!f1_has_names && f2_has_names && f2->m_arg_names[i-1]!=python::object()) - ) - return false; - } - return true; - } - - std::vector function_doc_signature_generator::flatten(function const *f) - { - object name = f->name(); - - std::vector res; - - while (f) { - - //this if takes out the not_implemented_function - if (f->name() == name) - res.push_back(f); - - f=f->m_overloads.get(); - } - - //std::sort(res.begin(),res.end(), &arity_cmp); - - return res; - } - std::vector function_doc_signature_generator::split_seq_overloads( const std::vector &funcs, bool split_on_doc_change) - { - std::vector res; - - std::vector::const_iterator fi = funcs.begin(); - - function const * last = *fi; - - while (++fi != funcs.end()){ - - //check if fi starts a new chain of overloads - if (!are_seq_overloads( last, *fi, split_on_doc_change )) - res.push_back(last); - - last = *fi; - } - - if (last) - res.push_back(last); - - return res; - } - - str function_doc_signature_generator::raw_function_pretty_signature(function const *f, size_t n_overloads, bool cpp_types ) - { - str res("object"); - - res = str("%s %s(%s)" % make_tuple( res, f->m_name, str("tuple args, dict kwds")) ); - - return res; - } - - const char * function_doc_signature_generator::py_type_str(const python::detail::signature_element &s) - { - if (s.basename==std::string("void")){ - static const char * none = "None"; - return none; - } - - PyTypeObject const * py_type = s.pytype_f?s.pytype_f():0; - if ( py_type ) - return py_type->tp_name; - else{ - static const char * object = "object"; - return object; - } - } - - str function_doc_signature_generator::parameter_string(py_function const &f, size_t n, object arg_names, bool cpp_types) - { - str param; - - python::detail::signature_element const * s = f.signature(); - if (cpp_types) - { - if(!n) - s = &f.get_return_type(); - if (s[n].basename == 0) - { - return str("..."); - } - - param = str(s[n].basename); - - if (s[n].lvalue) - param += " {lvalue}"; - - } - else - { - if (n) //we are processing an argument and trying to come up with a name for it - { - object kv; - if ( arg_names && (kv = arg_names[n-1]) ) - param = str( " (%s)%s" % make_tuple(py_type_str(s[n]),kv[0]) ); - else - param = str(" (%s)%s%d" % make_tuple(py_type_str(s[n]),"arg", n) ); - } - else //we are processing the return type - param = py_type_str(f.get_return_type()); - } - - //an argument - check for default value and append it - if(n && arg_names) - { - object kv(arg_names[n-1]); - if (kv && len(kv) == 2) - { - param = str("%s=%r" % make_tuple(param, kv[1])); - } - } - return param; - } - - str function_doc_signature_generator::pretty_signature(function const *f, size_t n_overloads, bool cpp_types ) - { - py_function - const& impl = f->m_fn; - ; - - - unsigned arity = impl.max_arity(); - - if(arity == unsigned(-1))// is this the proper raw function test? - { - return raw_function_pretty_signature(f,n_overloads,cpp_types); - } - - list formal_params; - - size_t n_extra_default_args=0; - - for (unsigned n = 0; n <= arity; ++n) - { - str param; - - formal_params.append( - parameter_string(impl, n, f->m_arg_names, cpp_types) - ); - - // find all the arguments with default values preceeding the arity-n_overloads - if (n && f->m_arg_names) - { - object kv(f->m_arg_names[n-1]); - - if (kv && len(kv) == 2) - { - //default argument preceeding the arity-n_overloads - if( n <= arity-n_overloads) - ++n_extra_default_args; - } - else - //argument without default, preceeding the arity-n_overloads - if( n <= arity-n_overloads) - n_extra_default_args = 0; - } - } - - n_overloads+=n_extra_default_args; - - if (!arity && cpp_types) - formal_params.append("void"); - - str ret_type (formal_params.pop(0)); - if (cpp_types ) - { - return str( - "%s %s(%s%s%s%s)" - % boost::python::make_tuple // workaround, see top - ( ret_type - , f->m_name - , str(",").join(formal_params.slice(0,arity-n_overloads)) - , n_overloads ? (n_overloads!=arity?str(" [,"):str("[ ")) : str() - , str(" [,").join(formal_params.slice(arity-n_overloads,arity)) - , std::string(n_overloads,']') - )); - }else{ - return str( - "%s(%s%s%s%s) -> %s" - % boost::python::make_tuple // workaround, see top - ( f->m_name - , str(",").join(formal_params.slice(0,arity-n_overloads)) - , n_overloads ? (n_overloads!=arity?str(" [,"):str("[ ")) : str() - , str(" [,").join(formal_params.slice(arity-n_overloads,arity)) - , std::string(n_overloads,']') - , ret_type - )); - } - - return str( - "%s %s(%s%s%s%s) %s" - % boost::python::make_tuple // workaround, see top - ( cpp_types?ret_type:str("") - , f->m_name - , str(",").join(formal_params.slice(0,arity-n_overloads)) - , n_overloads ? (n_overloads!=arity?str(" [,"):str("[ ")) : str() - , str(" [,").join(formal_params.slice(arity-n_overloads,arity)) - , std::string(n_overloads,']') - , cpp_types?str(""):ret_type - )); - - } - - namespace detail { - char py_signature_tag[] = "PY signature :"; - char cpp_signature_tag[] = "C++ signature :"; - } - - list function_doc_signature_generator::function_doc_signatures( function const * f) - { - list signatures; - std::vector funcs = flatten( f); - std::vector split_funcs = split_seq_overloads( funcs, true); - std::vector::const_iterator sfi=split_funcs.begin(), fi; - size_t n_overloads=0; - for (fi=funcs.begin(); fi!=funcs.end(); ++fi) - { - if(*sfi == *fi){ - if((*fi)->doc()) - { - str func_doc = str((*fi)->doc()); - - int doc_len = len(func_doc); - - bool show_py_signature = doc_len >= int(sizeof(detail::py_signature_tag)/sizeof(char)-1) - && str(detail::py_signature_tag) == func_doc.slice(0, int(sizeof(detail::py_signature_tag)/sizeof(char))-1); - if(show_py_signature) - { - func_doc = str(func_doc.slice(int(sizeof(detail::py_signature_tag)/sizeof(char))-1, _)); - doc_len = len(func_doc); - } - - bool show_cpp_signature = doc_len >= int(sizeof(detail::cpp_signature_tag)/sizeof(char)-1) - && str(detail::cpp_signature_tag) == func_doc.slice( 1-int(sizeof(detail::cpp_signature_tag)/sizeof(char)), _); - - if(show_cpp_signature) - { - func_doc = str(func_doc.slice(_, 1-int(sizeof(detail::cpp_signature_tag)/sizeof(char)))); - doc_len = len(func_doc); - } - - str res="\n"; - str pad = "\n"; - - if(show_py_signature) - { - str sig = pretty_signature(*fi, n_overloads,false); - res+=sig; - if(doc_len || show_cpp_signature )res+=" :"; - pad+= str(" "); - } - - if(doc_len) - { - if(show_py_signature) - res+=pad; - res+= pad.join(func_doc.split("\n")); - } - - if( show_cpp_signature) - { - if(len(res)>1) - res+="\n"+pad; - res+=detail::cpp_signature_tag+pad+" "+pretty_signature(*fi, n_overloads,true); - } - - signatures.append(res); - } - ++sfi; - n_overloads = 0; - }else - ++n_overloads ; - } - - return signatures; - } - - -}}} - diff --git a/src/object/inheritance.cpp b/src/object/inheritance.cpp deleted file mode 100644 index 7dc9db1c..00000000 --- a/src/object/inheritance.cpp +++ /dev/null @@ -1,495 +0,0 @@ -// 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 -#include -#include -#if _MSC_FULL_VER >= 13102171 && _MSC_FULL_VER <= 13102179 -# include -#endif -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -// -// Procedure: -// -// The search is a BFS over the space of (type,address) pairs -// guided by the edges of the casting graph whose nodes -// correspond to classes, and whose edges are traversed by -// applying associated cast functions to an address. We use -// vertex distance to the goal node in the cast_graph to rate the -// paths. The vertex distance to any goal node is calculated on -// demand and outdated by the addition of edges to the graph. - -namespace boost { -namespace -{ - enum edge_cast_t { edge_cast = 8010 }; - template inline void unused_variable(const T&) { } -} - -// Install properties -BOOST_INSTALL_PROPERTY(edge, cast); - -namespace -{ - typedef void*(*cast_function)(void*); - - // - // Here we put together the low-level data structures of the - // casting graph representation. - // - typedef python::type_info class_id; - - // represents a graph of available casts - -#if 0 - struct cast_graph - : -#else - typedef -#endif - adjacency_list > > -#if 0 - {}; -#else - cast_graph; -#endif - - typedef cast_graph::vertex_descriptor vertex_t; - typedef cast_graph::edge_descriptor edge_t; - - struct smart_graph - { - typedef std::vector::const_iterator node_distance_map; - - typedef std::pair out_edges_t; - - // Return a map of the distances from any node to the given - // target node - node_distance_map distances_to(vertex_t target) const - { - std::size_t n = num_vertices(m_topology); - if (m_distances.size() != n * n) - { - m_distances.clear(); - m_distances.resize(n * n, (std::numeric_limits::max)()); - m_known_vertices = n; - } - - std::vector::iterator to_target = m_distances.begin() + n * target; - - // this node hasn't been used as a target yet - if (to_target[target] != 0) - { - typedef reverse_graph reverse_cast_graph; - reverse_cast_graph reverse_topology(m_topology); - - to_target[target] = 0; - - breadth_first_search( - reverse_topology, target - , visitor( - make_bfs_visitor( - record_distances( - make_iterator_property_map( - to_target - , get(vertex_index, reverse_topology) -# ifdef BOOST_NO_STD_ITERATOR_TRAITS - , *to_target -# endif - ) - , on_tree_edge() - )))); - } - - return to_target; - } - - cast_graph& topology() { return m_topology; } - cast_graph const& topology() const { return m_topology; } - - smart_graph() - : m_known_vertices(0) - {} - - private: - cast_graph m_topology; - mutable std::vector m_distances; - mutable std::size_t m_known_vertices; - }; - - smart_graph& full_graph() - { - static smart_graph x; - return x; - } - - smart_graph& up_graph() - { - static smart_graph x; - return x; - } - - // - // Our index of class types - // - using boost::python::objects::dynamic_id_function; - typedef tuples::tuple< - class_id // static type - , vertex_t // corresponding vertex - , dynamic_id_function // dynamic_id if polymorphic, or 0 - > - index_entry_interface; - typedef index_entry_interface::inherited index_entry; - enum { ksrc_static_t, kvertex, kdynamic_id }; - - typedef std::vector type_index_t; - - - type_index_t& type_index() - { - static type_index_t x; - return x; - } - - template - struct select1st - { - typedef typename tuples::element<0, Tuple>::type result_type; - - result_type const& operator()(Tuple const& x) const - { - return tuples::get<0>(x); - } - }; - - // map a type to a position in the index - inline type_index_t::iterator type_position(class_id type) - { - typedef index_entry entry; - - return std::lower_bound( - type_index().begin(), type_index().end() - , boost::make_tuple(type, vertex_t(), dynamic_id_function(0)) - , boost::bind(std::less() - , boost::bind(select1st(), _1) - , boost::bind(select1st(), _2))); - } - - inline index_entry* seek_type(class_id type) - { - type_index_t::iterator p = type_position(type); - if (p == type_index().end() || tuples::get(*p) != type) - return 0; - else - return &*p; - } - - // Get the entry for a type, inserting if necessary - inline type_index_t::iterator demand_type(class_id type) - { - type_index_t::iterator p = type_position(type); - - if (p != type_index().end() && tuples::get(*p) == type) - return p; - - vertex_t v = add_vertex(full_graph().topology()); - vertex_t v2 = add_vertex(up_graph().topology()); - unused_variable(v2); - assert(v == v2); - return type_index().insert(p, boost::make_tuple(type, v, dynamic_id_function(0))); - } - - // Map a two types to a vertex in the graph, inserting if necessary - typedef std::pair - type_index_iterator_pair; - - inline type_index_iterator_pair - demand_types(class_id t1, class_id t2) - { - // be sure there will be no reallocation - type_index().reserve(type_index().size() + 2); - type_index_t::iterator first = demand_type(t1); - type_index_t::iterator second = demand_type(t2); - if (first == second) - ++first; - return std::make_pair(first, second); - } - - struct q_elt - { - q_elt(std::size_t distance - , void* src_address - , vertex_t target - , cast_function cast - ) - : distance(distance) - , src_address(src_address) - , target(target) - , cast(cast) - {} - - std::size_t distance; - void* src_address; - vertex_t target; - cast_function cast; - - bool operator<(q_elt const& rhs) const - { - return distance < rhs.distance; - } - }; - - // Optimization: - // - // Given p, src_t, dst_t - // - // Get a pointer pd to the most-derived object - // if it's polymorphic, dynamic_cast to void* - // otherwise pd = p - // - // Get the most-derived typeid src_td - // - // ptrdiff_t offset = p - pd - // - // Now we can keep a cache, for [src_t, offset, src_td, dst_t] of - // the cast transformation function to use on p and the next src_t - // in the chain. src_td, dst_t don't change throughout this - // process. In order to represent unreachability, when a pair is - // found to be unreachable, we stick a 0-returning "dead-cast" - // function in the cache. - - // This is needed in a few places below - inline void* identity_cast(void* p) - { - return p; - } - - void* search(smart_graph const& g, void* p, vertex_t src, vertex_t dst) - { - // I think this test was thoroughly bogus -- dwa - // If we know there's no path; bail now. - // if (src > g.known_vertices() || dst > g.known_vertices()) - // return 0; - - smart_graph::node_distance_map d(g.distances_to(dst)); - - if (d[src] == (std::numeric_limits::max)()) - return 0; - - typedef property_map::const_type cast_map; - cast_map casts = get(edge_cast, g.topology()); - - typedef std::pair search_state; - typedef std::vector visited_t; - visited_t visited; - std::priority_queue q; - - q.push(q_elt(d[src], p, src, identity_cast)); - while (!q.empty()) - { - q_elt top = q.top(); - q.pop(); - - // Check to see if we have a real state - void* dst_address = top.cast(top.src_address); - if (dst_address == 0) - continue; - - if (top.target == dst) - return dst_address; - - search_state s(top.target,dst_address); - - visited_t::iterator pos = std::lower_bound( - visited.begin(), visited.end(), s); - - // If already visited, continue - if (pos != visited.end() && *pos == s) - continue; - - visited.insert(pos, s); // mark it - - // expand it: - smart_graph::out_edges_t edges = out_edges(s.first, g.topology()); - for (cast_graph::out_edge_iterator p = edges.first - , finish = edges.second - ; p != finish - ; ++p - ) - { - edge_t e = *p; - q.push(q_elt( - d[target(e, g.topology())] - , dst_address - , target(e, g.topology()) - , boost::get(casts, e))); - } - } - return 0; - } - - struct cache_element - { - typedef tuples::tuple< - class_id // source static type - , class_id // target type - , std::ptrdiff_t // offset within source object - , class_id // source dynamic type - >::inherited key_type; - - cache_element(key_type const& k) - : key(k) - , offset(0) - {} - - key_type key; - std::ptrdiff_t offset; - - BOOST_STATIC_CONSTANT( - std::ptrdiff_t, not_found = integer_traits::const_min); - - bool operator<(cache_element const& rhs) const - { - return this->key < rhs.key; - } - - bool unreachable() const - { - return offset == not_found; - } - }; - - enum { kdst_t = ksrc_static_t + 1, koffset, ksrc_dynamic_t }; - typedef std::vector cache_t; - - cache_t& cache() - { - static cache_t x; - return x; - } - - inline void* convert_type(void* const p, class_id src_t, class_id dst_t, bool polymorphic) - { - // Quickly rule out unregistered types - index_entry* src_p = seek_type(src_t); - if (src_p == 0) - return 0; - - index_entry* dst_p = seek_type(dst_t); - if (dst_p == 0) - return 0; - - // Look up the dynamic_id function and call it to get the dynamic - // info - boost::python::objects::dynamic_id_t dynamic_id = polymorphic - ? tuples::get(*src_p)(p) - : std::make_pair(p, src_t); - - // Look in the cache first for a quickie address translation - std::ptrdiff_t offset = (char*)p - (char*)dynamic_id.first; - - cache_element seek(boost::make_tuple(src_t, dst_t, offset, dynamic_id.second)); - cache_t& c = cache(); - cache_t::iterator const cache_pos - = std::lower_bound(c.begin(), c.end(), seek); - - - // if found in the cache, we're done - if (cache_pos != c.end() && cache_pos->key == seek.key) - { - return cache_pos->offset == cache_element::not_found - ? 0 : (char*)p + cache_pos->offset; - } - - // If we are starting at the most-derived type, only look in the up graph - smart_graph const& g = polymorphic && dynamic_id.second != src_t - ? full_graph() : up_graph(); - - void* result = search( - g, p, tuples::get(*src_p) - , tuples::get(*dst_p)); - - // update the cache - c.insert(cache_pos, seek)->offset - = (result == 0) ? cache_element::not_found : (char*)result - (char*)p; - - return result; - } -} - -namespace python { namespace objects { - -BOOST_PYTHON_DECL void* find_dynamic_type(void* p, class_id src_t, class_id dst_t) -{ - return convert_type(p, src_t, dst_t, true); -} - -BOOST_PYTHON_DECL void* find_static_type(void* p, class_id src_t, class_id dst_t) -{ - return convert_type(p, src_t, dst_t, false); -} - -BOOST_PYTHON_DECL void add_cast( - class_id src_t, class_id dst_t, cast_function cast, bool is_downcast) -{ - // adding an edge will invalidate any record of unreachability in - // the cache. - static std::size_t expected_cache_len = 0; - cache_t& c = cache(); - if (c.size() > expected_cache_len) - { - c.erase(std::remove_if( - c.begin(), c.end(), - mem_fn(&cache_element::unreachable)) - , c.end()); - - // If any new cache entries get added, we'll have to do this - // again when the next edge is added - expected_cache_len = c.size(); - } - - type_index_iterator_pair types = demand_types(src_t, dst_t); - vertex_t src = tuples::get(*types.first); - vertex_t dst = tuples::get(*types.second); - - cast_graph* const g[2] = { &up_graph().topology(), &full_graph().topology() }; - - for (cast_graph*const* p = g + (is_downcast ? 1 : 0); p < g + 2; ++p) - { - edge_t e; - bool added; - - tie(e, added) = add_edge(src, dst, **p); - assert(added); - - put(get(edge_cast, **p), e, cast); - put(get(edge_index, **p), e, num_edges(full_graph().topology()) - 1); - } -} - -BOOST_PYTHON_DECL void register_dynamic_id_aux( - class_id static_id, dynamic_id_function get_dynamic_id) -{ - tuples::get(*demand_type(static_id)) = get_dynamic_id; -} - -}}} // namespace boost::python::objects diff --git a/src/object/iterator.cpp b/src/object/iterator.cpp deleted file mode 100644 index 3f6c4ada..00000000 --- a/src/object/iterator.cpp +++ /dev/null @@ -1,39 +0,0 @@ -// 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 -#include -#include -#include - -namespace boost { namespace python { namespace objects { - -namespace -{ - PyObject* identity(PyObject* args_, PyObject*) - { - PyObject* x = PyTuple_GET_ITEM(args_,0); - Py_INCREF(x); - return x; - } -} - -BOOST_PYTHON_DECL object const& identity_function() -{ - static object result( - function_object( - py_function(&identity, mpl::vector2()) - ) - ); - return result; -} - -void stop_iteration_error() -{ - PyErr_SetObject(PyExc_StopIteration, Py_None); - throw_error_already_set(); -} - -}}} // namespace boost::python::objects diff --git a/src/object/life_support.cpp b/src/object/life_support.cpp deleted file mode 100644 index b7e9aa86..00000000 --- a/src/object/life_support.cpp +++ /dev/null @@ -1,121 +0,0 @@ -// 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 -#include -#include - -namespace boost { namespace python { namespace objects { - -struct life_support -{ - PyObject_HEAD - PyObject* patient; -}; - -extern "C" -{ - static void - life_support_dealloc(PyObject* self) - { - Py_XDECREF(((life_support*)self)->patient); - self->ob_type->tp_free(self); - } - - static PyObject * - life_support_call(PyObject *self, PyObject *arg, PyObject * /*kw*/) - { - // Let the patient die now - Py_XDECREF(((life_support*)self)->patient); - ((life_support*)self)->patient = 0; - // Let the weak reference die. This probably kills us. - Py_XDECREF(PyTuple_GET_ITEM(arg, 0)); - return ::boost::python::detail::none(); - } -} - -PyTypeObject life_support_type = { - PyVarObject_HEAD_INIT(NULL, 0)//(&PyType_Type) - const_cast("Boost.Python.life_support"), - sizeof(life_support), - 0, - life_support_dealloc, /* tp_dealloc */ - 0, /* tp_print */ - 0, /* tp_getattr */ - 0, /* tp_setattr */ - 0, /* tp_compare */ - 0, //(reprfunc)func_repr, /* tp_repr */ - 0, /* tp_as_number */ - 0, /* tp_as_sequence */ - 0, /* tp_as_mapping */ - 0, /* tp_hash */ - life_support_call, /* tp_call */ - 0, /* tp_str */ - 0, // PyObject_GenericGetAttr, /* tp_getattro */ - 0, // PyObject_GenericSetAttr, /* tp_setattro */ - 0, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT /* | Py_TPFLAGS_HAVE_GC */,/* tp_flags */ - 0, /* tp_doc */ - 0, // (traverseproc)func_traverse, /* tp_traverse */ - 0, /* tp_clear */ - 0, /* tp_richcompare */ - 0, //offsetof(PyLife_SupportObject, func_weakreflist), /* tp_weaklistoffset */ - 0, /* tp_iter */ - 0, /* tp_iternext */ - 0, /* tp_methods */ - 0, // func_memberlist, /* tp_members */ - 0, //func_getsetlist, /* tp_getset */ - 0, /* tp_base */ - 0, /* tp_dict */ - 0, /* tp_descr_get */ - 0, /* tp_descr_set */ - 0, //offsetof(PyLife_SupportObject, func_dict), /* tp_dictoffset */ - 0, /* tp_init */ - 0, /* tp_alloc */ - 0, /* tp_new */ - 0, /* tp_free */ - 0, /* tp_is_gc */ - 0, /* tp_bases */ - 0, /* tp_mro */ - 0, /* tp_cache */ - 0, /* tp_subclasses */ - 0, /* tp_weaklist */ -#if PYTHON_API_VERSION >= 1012 - 0 /* tp_del */ -#endif -}; - -PyObject* make_nurse_and_patient(PyObject* nurse, PyObject* patient) -{ - if (nurse == Py_None || nurse == patient) - return nurse; - - if (Py_TYPE(&life_support_type) == 0) - { - Py_TYPE(&life_support_type) = &PyType_Type; - PyType_Ready(&life_support_type); - } - - life_support* system = PyObject_New(life_support, &life_support_type); - if (!system) - return 0; - - system->patient = 0; - - // We're going to leak this reference, but don't worry; the - // life_support system decrements it when the nurse dies. - PyObject* weakref = PyWeakref_NewRef(nurse, (PyObject*)system); - - // weakref has either taken ownership, or we have to release it - // anyway - Py_DECREF(system); - if (!weakref) - return 0; - - system->patient = patient; - Py_XINCREF(patient); // hang on to the patient until death - return weakref; -} - -}}} // namespace boost::python::objects diff --git a/src/object/pickle_support.cpp b/src/object/pickle_support.cpp deleted file mode 100644 index 428c07b6..00000000 --- a/src/object/pickle_support.cpp +++ /dev/null @@ -1,78 +0,0 @@ -// (C) Copyright R.W. Grosse-Kunstleve 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 -#include -#include -#include -#include -#include - -namespace boost { namespace python { - -namespace { - - tuple instance_reduce(object instance_obj) - { - list result; - object instance_class(instance_obj.attr("__class__")); - result.append(instance_class); - object none; - if (!getattr(instance_obj, "__safe_for_unpickling__", none)) - { - str type_name(getattr(instance_class, "__name__")); - str module_name(getattr(instance_class, "__module__", object(""))); - if (module_name) - module_name += "."; - - PyErr_SetObject( - PyExc_RuntimeError, - ( "Pickling of \"%s\" instances is not enabled" - " (http://www.boost.org/libs/python/doc/v2/pickle.html)" - % (module_name+type_name)).ptr() - ); - - throw_error_already_set(); - } - object getinitargs = getattr(instance_obj, "__getinitargs__", none); - tuple initargs; - if (!getinitargs.is_none()) { - initargs = tuple(getinitargs()); - } - result.append(initargs); - object getstate = getattr(instance_obj, "__getstate__", none); - object instance_dict = getattr(instance_obj, "__dict__", none); - long len_instance_dict = 0; - if (!instance_dict.is_none()) { - len_instance_dict = len(instance_dict); - } - if (!getstate.is_none()) { - if (len_instance_dict > 0) { - object getstate_manages_dict = getattr( - instance_obj, "__getstate_manages_dict__", none); - if (getstate_manages_dict.is_none()) { - PyErr_SetString(PyExc_RuntimeError, - "Incomplete pickle support" - " (__getstate_manages_dict__ not set)"); - throw_error_already_set(); - } - } - result.append(getstate()); - } - else if (len_instance_dict > 0) { - result.append(instance_dict); - } - return tuple(result); - } - -} // namespace - -object const& make_instance_reduce_function() -{ - static object result(&instance_reduce); - return result; -} - -}} // namespace boost::python diff --git a/src/object/stl_iterator.cpp b/src/object/stl_iterator.cpp deleted file mode 100644 index e32d3214..00000000 --- a/src/object/stl_iterator.cpp +++ /dev/null @@ -1,48 +0,0 @@ -// Copyright Eric Niebler 2005. -// 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) -// -// Credits: -// Andreas Kl\:ockner for fixing increment() to handle -// error conditions. - -#include -#include -#include - -namespace boost { namespace python { namespace objects -{ - -stl_input_iterator_impl::stl_input_iterator_impl() - : it_() - , ob_() -{ -} - -stl_input_iterator_impl::stl_input_iterator_impl(boost::python::object const &ob) - : it_(ob.attr("__iter__")()) - , ob_() -{ - this->increment(); -} - -void stl_input_iterator_impl::increment() -{ - this->ob_ = boost::python::handle<>( - boost::python::allow_null(PyIter_Next(this->it_.ptr()))); - if (PyErr_Occurred()) - throw boost::python::error_already_set(); -} - -bool stl_input_iterator_impl::equal(stl_input_iterator_impl const &that) const -{ - return !this->ob_ == !that.ob_; -} - -boost::python::handle<> const &stl_input_iterator_impl::current() const -{ - return this->ob_; -} - -}}} // namespace boost::python::objects diff --git a/src/object_operators.cpp b/src/object_operators.cpp deleted file mode 100644 index b993245f..00000000 --- a/src/object_operators.cpp +++ /dev/null @@ -1,85 +0,0 @@ -// 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 -#include - -namespace boost { namespace python { namespace api { - -# define BOOST_PYTHON_COMPARE_OP(op, opid) \ -BOOST_PYTHON_DECL object operator op(object const& l, object const& r) \ -{ \ - return object( \ - detail::new_reference( \ - PyObject_RichCompare( \ - l.ptr(), r.ptr(), opid)) \ - ); \ -} -BOOST_PYTHON_COMPARE_OP(>, Py_GT) -BOOST_PYTHON_COMPARE_OP(>=, Py_GE) -BOOST_PYTHON_COMPARE_OP(<, Py_LT) -BOOST_PYTHON_COMPARE_OP(<=, Py_LE) -BOOST_PYTHON_COMPARE_OP(==, Py_EQ) -BOOST_PYTHON_COMPARE_OP(!=, Py_NE) -# undef BOOST_PYTHON_COMPARE_OP - - -#define BOOST_PYTHON_BINARY_OPERATOR(op, name) \ -BOOST_PYTHON_DECL object operator op(object const& l, object const& r) \ -{ \ - return object( \ - detail::new_reference( \ - PyNumber_##name(l.ptr(), r.ptr())) \ - ); \ -} - -BOOST_PYTHON_BINARY_OPERATOR(+, Add) -BOOST_PYTHON_BINARY_OPERATOR(-, Subtract) -BOOST_PYTHON_BINARY_OPERATOR(*, Multiply) -#if PY_VERSION_HEX >= 0x03000000 -// We choose FloorDivide instead of TrueDivide to keep the semantic -// conform with C/C++'s '/' operator -BOOST_PYTHON_BINARY_OPERATOR(/, FloorDivide) -#else -BOOST_PYTHON_BINARY_OPERATOR(/, Divide) -#endif -BOOST_PYTHON_BINARY_OPERATOR(%, Remainder) -BOOST_PYTHON_BINARY_OPERATOR(<<, Lshift) -BOOST_PYTHON_BINARY_OPERATOR(>>, Rshift) -BOOST_PYTHON_BINARY_OPERATOR(&, And) -BOOST_PYTHON_BINARY_OPERATOR(^, Xor) -BOOST_PYTHON_BINARY_OPERATOR(|, Or) -#undef BOOST_PYTHON_BINARY_OPERATOR - -#define BOOST_PYTHON_INPLACE_OPERATOR(op, name) \ -BOOST_PYTHON_DECL object& operator op##=(object& l, object const& r) \ -{ \ - return l = object( \ - (detail::new_reference) \ - PyNumber_InPlace##name(l.ptr(), r.ptr())); \ -} - -BOOST_PYTHON_INPLACE_OPERATOR(+, Add) -BOOST_PYTHON_INPLACE_OPERATOR(-, Subtract) -BOOST_PYTHON_INPLACE_OPERATOR(*, Multiply) -#if PY_VERSION_HEX >= 0x03000000 -// Same reason as above for choosing FloorDivide instead of TrueDivide -BOOST_PYTHON_INPLACE_OPERATOR(/, FloorDivide) -#else -BOOST_PYTHON_INPLACE_OPERATOR(/, Divide) -#endif -BOOST_PYTHON_INPLACE_OPERATOR(%, Remainder) -BOOST_PYTHON_INPLACE_OPERATOR(<<, Lshift) -BOOST_PYTHON_INPLACE_OPERATOR(>>, Rshift) -BOOST_PYTHON_INPLACE_OPERATOR(&, And) -BOOST_PYTHON_INPLACE_OPERATOR(^, Xor) -BOOST_PYTHON_INPLACE_OPERATOR(|, Or) -#undef BOOST_PYTHON_INPLACE_OPERATOR - -object::object(handle<> const& x) - : object_base(python::incref(python::expect_non_null(x.get()))) -{} - -}}} // namespace boost::python diff --git a/src/object_protocol.cpp b/src/object_protocol.cpp deleted file mode 100644 index 95c8c73e..00000000 --- a/src/object_protocol.cpp +++ /dev/null @@ -1,197 +0,0 @@ -// 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 -#include -#include -#include - -namespace boost { namespace python { namespace api { - -BOOST_PYTHON_DECL object getattr(object const& target, object const& key) -{ - return object(detail::new_reference(PyObject_GetAttr(target.ptr(), key.ptr()))); -} - -BOOST_PYTHON_DECL object getattr(object const& target, object const& key, object const& default_) -{ - PyObject* result = PyObject_GetAttr(target.ptr(), key.ptr()); - if (result == NULL && PyErr_ExceptionMatches(PyExc_AttributeError)) - { - PyErr_Clear(); - return default_; - } - return object(detail::new_reference(result)); -} - -BOOST_PYTHON_DECL void setattr(object const& target, object const& key, object const& value) -{ - if (PyObject_SetAttr(target.ptr(), key.ptr(), value.ptr()) == -1) - throw_error_already_set(); -} - -BOOST_PYTHON_DECL void delattr(object const& target, object const& key) -{ - if (PyObject_DelAttr(target.ptr(), key.ptr()) == -1) - throw_error_already_set(); -} - -BOOST_PYTHON_DECL object getattr(object const& target, char const* key) -{ - return object( - detail::new_reference( - PyObject_GetAttrString(target.ptr(), const_cast(key)) - )); -} - -BOOST_PYTHON_DECL object getattr(object const& target, char const* key, object const& default_) -{ - PyObject* result = PyObject_GetAttrString(target.ptr(), const_cast(key)); - if (result == NULL && PyErr_ExceptionMatches(PyExc_AttributeError)) - { - PyErr_Clear(); - return default_; - } - return object(detail::new_reference(result)); - -} -BOOST_PYTHON_DECL void setattr(object const& target, char const* key, object const& value) -{ - if (PyObject_SetAttrString( - target.ptr(), const_cast(key), value.ptr()) == -1 - ) - { - throw_error_already_set(); - } -} - -BOOST_PYTHON_DECL void delattr(object const& target, char const* key) -{ - if (PyObject_DelAttrString( - target.ptr(), const_cast(key)) == -1 - ) - { - throw_error_already_set(); - } -} - -BOOST_PYTHON_DECL object getitem(object const& target, object const& key) -{ - return object(detail::new_reference( - PyObject_GetItem(target.ptr(), key.ptr()))); -} - -BOOST_PYTHON_DECL void setitem(object const& target, object const& key, object const& value) -{ - if (PyObject_SetItem(target.ptr(), key.ptr(), value.ptr()) == -1) - throw_error_already_set(); -} - -BOOST_PYTHON_DECL void delitem(object const& target, object const& key) -{ - if (PyObject_DelItem(target.ptr(), key.ptr()) == -1) - throw_error_already_set(); -} - -namespace // slicing code copied directly out of the Python implementation -{ - #undef ISINT - #define ISINT(x) ((x) == NULL || PyInt_Check(x) || PyLong_Check(x)) - - static PyObject * - apply_slice(PyObject *u, PyObject *v, PyObject *w) /* return u[v:w] */ - { -#if PY_VERSION_HEX < 0x03000000 - PyTypeObject *tp = u->ob_type; - PySequenceMethods *sq = tp->tp_as_sequence; - - if (sq && sq->sq_slice && ISINT(v) && ISINT(w)) { - ssize_t ilow = 0, ihigh = ssize_t_max; - if (!_PyEval_SliceIndex(v, &ilow)) - return NULL; - if (!_PyEval_SliceIndex(w, &ihigh)) - return NULL; - return PySequence_GetSlice(u, ilow, ihigh); - } - else -#endif - { - PyObject *slice = PySlice_New(v, w, NULL); - if (slice != NULL) { - PyObject *res = PyObject_GetItem(u, slice); - Py_DECREF(slice); - return res; - } - else - return NULL; - } - } - - static int - assign_slice(PyObject *u, PyObject *v, PyObject *w, PyObject *x) - /* u[v:w] = x */ - { -#if PY_VERSION_HEX < 0x03000000 - PyTypeObject *tp = u->ob_type; - PySequenceMethods *sq = tp->tp_as_sequence; - - if (sq && sq->sq_slice && ISINT(v) && ISINT(w)) { - ssize_t ilow = 0, ihigh = ssize_t_max; - if (!_PyEval_SliceIndex(v, &ilow)) - return -1; - if (!_PyEval_SliceIndex(w, &ihigh)) - return -1; - if (x == NULL) - return PySequence_DelSlice(u, ilow, ihigh); - else - return PySequence_SetSlice(u, ilow, ihigh, x); - } - else -#endif - { - PyObject *slice = PySlice_New(v, w, NULL); - if (slice != NULL) { - int res; - if (x != NULL) - res = PyObject_SetItem(u, slice, x); - else - res = PyObject_DelItem(u, slice); - Py_DECREF(slice); - return res; - } - else - return -1; - } - } -} - -BOOST_PYTHON_DECL object getslice(object const& target, handle<> const& begin, handle<> const& end) -{ - return object( - detail::new_reference( - apply_slice(target.ptr(), begin.get(), end.get()))); -} - -BOOST_PYTHON_DECL void setslice(object const& target, handle<> const& begin, handle<> const& end, object const& value) -{ - if (assign_slice( - target.ptr(), begin.get(), end.get(), value.ptr()) == -1 - ) - { - throw_error_already_set(); - } -} - -BOOST_PYTHON_DECL void delslice(object const& target, handle<> const& begin, handle<> const& end) -{ - if (assign_slice( - target.ptr(), begin.get(), end.get(), 0) == -1 - ) - { - throw_error_already_set(); - } -} - -}}} // namespace boost::python::api diff --git a/src/slice.cpp b/src/slice.cpp deleted file mode 100644 index ee55f948..00000000 --- a/src/slice.cpp +++ /dev/null @@ -1,37 +0,0 @@ -#include "boost/python/slice.hpp" - -// Copyright (c) 2004 Jonathan Brandmeyer -// Use, modification and distribution are subject to 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) - - -namespace boost { namespace python { namespace detail { - -slice_base::slice_base(PyObject* start, PyObject* stop, PyObject* step) - : object(detail::new_reference( PySlice_New(start, stop, step))) -{ -} - -object -slice_base::start() const -{ - return object( detail::borrowed_reference( - ((PySliceObject*)this->ptr())->start)); -} - -object -slice_base::stop() const -{ - return object( detail::borrowed_reference( - ((PySliceObject*)this->ptr())->stop)); -} - -object -slice_base::step() const -{ - return object( detail::borrowed_reference( - ((PySliceObject*)this->ptr())->step)); -} - -} } } // !namespace boost::python::detail diff --git a/src/str.cpp b/src/str.cpp deleted file mode 100644 index 0bc225aa..00000000 --- a/src/str.cpp +++ /dev/null @@ -1,403 +0,0 @@ -// Copyright David Abrahams 2004. 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 -#include -#include - -namespace boost { namespace python { namespace detail { - -detail::new_reference str_base::call(object const& arg_) -{ - return (detail::new_reference)PyObject_CallFunction( -#if PY_VERSION_HEX >= 0x03000000 - (PyObject*)&PyUnicode_Type, -#else - (PyObject*)&PyString_Type, -#endif - const_cast("(O)"), - arg_.ptr()); -} - -str_base::str_base() - : object(detail::new_reference( -#if PY_VERSION_HEX >= 0x03000000 - ::PyUnicode_FromString("") -#else - ::PyString_FromString("") -#endif - )) -{} - -str_base::str_base(const char* s) - : object(detail::new_reference( -#if PY_VERSION_HEX >= 0x03000000 - ::PyUnicode_FromString(s) -#else - ::PyString_FromString(s) -#endif - )) -{} - -namespace { - - ssize_t str_size_as_py_ssize_t(std::size_t n) - { - if (n > static_cast(ssize_t_max)) - { - throw std::range_error("str size > ssize_t_max"); - } - return static_cast(n); - } - -} // namespace - -str_base::str_base(char const* start, char const* finish) - : object( - detail::new_reference( -#if PY_VERSION_HEX >= 0x03000000 - ::PyUnicode_FromStringAndSize -#else - ::PyString_FromStringAndSize -#endif - (start, str_size_as_py_ssize_t(finish - start)) - ) - ) -{} - -str_base::str_base(char const* start, std::size_t length) // new str - : object( - detail::new_reference( -#if PY_VERSION_HEX >= 0x03000000 - ::PyUnicode_FromStringAndSize -#else - ::PyString_FromStringAndSize -#endif - ( start, str_size_as_py_ssize_t(length) ) - ) - ) -{} - -str_base::str_base(object_cref other) - : object(str_base::call(other)) -{} - -#define BOOST_PYTHON_FORMAT_OBJECT(z, n, data) "O" -#define BOOST_PYTHON_OBJECT_PTR(z, n, data) , x##n .ptr() - -#define BOOST_PYTHON_DEFINE_STR_METHOD(name, arity) \ -str str_base:: name ( BOOST_PP_ENUM_PARAMS(arity, object_cref x) ) const \ -{ \ - return str(new_reference( \ - expect_non_null( \ - PyObject_CallMethod( \ - this->ptr(), const_cast( #name ), \ - const_cast( \ - "(" BOOST_PP_REPEAT(arity, BOOST_PYTHON_FORMAT_OBJECT, _) ")") \ - BOOST_PP_REPEAT_1(arity, BOOST_PYTHON_OBJECT_PTR, _))))); \ -} - -BOOST_PYTHON_DEFINE_STR_METHOD(capitalize, 0) -BOOST_PYTHON_DEFINE_STR_METHOD(center, 1) - -long str_base::count(object_cref sub) const -{ - return extract(this->attr("count")(sub)); -} - -long str_base::count(object_cref sub, object_cref start) const -{ - return extract(this->attr("count")(sub,start)); -} - -long str_base::count(object_cref sub, object_cref start, object_cref end) const -{ - return extract(this->attr("count")(sub,start,end)); -} - -#if PY_VERSION_HEX < 0x03000000 -object str_base::decode() const -{ - return this->attr("decode")(); -} - -object str_base::decode(object_cref encoding) const -{ - return this->attr("decode")(encoding); -} - -object str_base::decode(object_cref encoding, object_cref errors) const -{ - return this->attr("decode")(encoding,errors); -} -#endif - -object str_base::encode() const -{ - return this->attr("encode")(); -} - -object str_base::encode(object_cref encoding) const -{ - return this->attr("encode")(encoding); -} - -object str_base::encode(object_cref encoding, object_cref errors) const -{ - return this->attr("encode")(encoding,errors); -} - - -#if PY_VERSION_HEX >= 0x03000000 - #define _BOOST_PYTHON_ASLONG PyLong_AsLong -#else - #define _BOOST_PYTHON_ASLONG PyInt_AsLong -#endif - -bool str_base::endswith(object_cref suffix) const -{ - bool result = _BOOST_PYTHON_ASLONG(this->attr("endswith")(suffix).ptr()); - if (PyErr_Occurred()) - throw_error_already_set(); - return result; -} - -BOOST_PYTHON_DEFINE_STR_METHOD(expandtabs, 0) -BOOST_PYTHON_DEFINE_STR_METHOD(expandtabs, 1) - -long str_base::find(object_cref sub) const -{ - long result = _BOOST_PYTHON_ASLONG(this->attr("find")(sub).ptr()); - if (PyErr_Occurred()) - throw_error_already_set(); - return result; -} - -long str_base::find(object_cref sub, object_cref start) const -{ - long result = _BOOST_PYTHON_ASLONG(this->attr("find")(sub,start).ptr()); - if (PyErr_Occurred()) - throw_error_already_set(); - return result; -} - -long str_base::find(object_cref sub, object_cref start, object_cref end) const -{ - long result = _BOOST_PYTHON_ASLONG(this->attr("find")(sub,start,end).ptr()); - if (PyErr_Occurred()) - throw_error_already_set(); - return result; -} - -long str_base::index(object_cref sub) const -{ - long result = _BOOST_PYTHON_ASLONG(this->attr("index")(sub).ptr()); - if (PyErr_Occurred()) - throw_error_already_set(); - return result; -} - -long str_base::index(object_cref sub, object_cref start) const -{ - long result = _BOOST_PYTHON_ASLONG(this->attr("index")(sub,start).ptr()); - if (PyErr_Occurred()) - throw_error_already_set(); - return result; -} - -long str_base::index(object_cref sub, object_cref start, object_cref end) const -{ - long result = _BOOST_PYTHON_ASLONG(this->attr("index")(sub,start,end).ptr()); - if (PyErr_Occurred()) - throw_error_already_set(); - return result; -} - -bool str_base::isalnum() const -{ - bool result = _BOOST_PYTHON_ASLONG(this->attr("isalnum")().ptr()); - if (PyErr_Occurred()) - throw_error_already_set(); - return result; -} - -bool str_base::isalpha() const -{ - bool result = _BOOST_PYTHON_ASLONG(this->attr("isalpha")().ptr()); - if (PyErr_Occurred()) - throw_error_already_set(); - return result; -} - -bool str_base::isdigit() const -{ - bool result = _BOOST_PYTHON_ASLONG(this->attr("isdigit")().ptr()); - if (PyErr_Occurred()) - throw_error_already_set(); - return result; -} - -bool str_base::islower() const -{ - bool result = _BOOST_PYTHON_ASLONG(this->attr("islower")().ptr()); - if (PyErr_Occurred()) - throw_error_already_set(); - return result; -} - -bool str_base::isspace() const -{ - bool result = _BOOST_PYTHON_ASLONG(this->attr("isspace")().ptr()); - if (PyErr_Occurred()) - throw_error_already_set(); - return result; -} - -bool str_base::istitle() const -{ - bool result = _BOOST_PYTHON_ASLONG(this->attr("istitle")().ptr()); - if (PyErr_Occurred()) - throw_error_already_set(); - return result; -} - -bool str_base::isupper() const -{ - bool result = _BOOST_PYTHON_ASLONG(this->attr("isupper")().ptr()); - if (PyErr_Occurred()) - throw_error_already_set(); - return result; -} - -BOOST_PYTHON_DEFINE_STR_METHOD(join, 1) -BOOST_PYTHON_DEFINE_STR_METHOD(ljust, 1) -BOOST_PYTHON_DEFINE_STR_METHOD(lower, 0) -BOOST_PYTHON_DEFINE_STR_METHOD(lstrip, 0) -BOOST_PYTHON_DEFINE_STR_METHOD(replace, 2) -BOOST_PYTHON_DEFINE_STR_METHOD(replace, 3) - -long str_base::rfind(object_cref sub) const -{ - long result = _BOOST_PYTHON_ASLONG(this->attr("rfind")(sub).ptr()); - if (PyErr_Occurred()) - throw_error_already_set(); - return result; -} - -long str_base::rfind(object_cref sub, object_cref start) const -{ - long result = _BOOST_PYTHON_ASLONG(this->attr("rfind")(sub,start).ptr()); - if (PyErr_Occurred()) - throw_error_already_set(); - return result; -} - -long str_base::rfind(object_cref sub, object_cref start, object_cref end) const -{ - long result = _BOOST_PYTHON_ASLONG(this->attr("rfind")(sub,start,end).ptr()); - if (PyErr_Occurred()) - throw_error_already_set(); - return result; -} - -long str_base::rindex(object_cref sub) const -{ - long result = _BOOST_PYTHON_ASLONG(this->attr("rindex")(sub).ptr()); - if (PyErr_Occurred()) - throw_error_already_set(); - return result; -} - -long str_base::rindex(object_cref sub, object_cref start) const -{ - long result = _BOOST_PYTHON_ASLONG(this->attr("rindex")(sub,start).ptr()); - if (PyErr_Occurred()) - throw_error_already_set(); - return result; -} - -long str_base::rindex(object_cref sub, object_cref start, object_cref end) const -{ - long result = _BOOST_PYTHON_ASLONG(this->attr("rindex")(sub,start,end).ptr()); - if (PyErr_Occurred()) - throw_error_already_set(); - return result; -} - -BOOST_PYTHON_DEFINE_STR_METHOD(rjust, 1) -BOOST_PYTHON_DEFINE_STR_METHOD(rstrip, 0) - -list str_base::split() const -{ - return list(this->attr("split")()); -} - -list str_base::split(object_cref sep) const -{ - return list(this->attr("split")(sep)); -} - -list str_base::split(object_cref sep, object_cref maxsplit) const -{ - return list(this->attr("split")(sep,maxsplit)); -} - -list str_base::splitlines() const -{ - return list(this->attr("splitlines")()); -} - -list str_base::splitlines(object_cref keepends) const -{ - return list(this->attr("splitlines")(keepends)); -} - -bool str_base::startswith(object_cref prefix) const -{ - bool result = _BOOST_PYTHON_ASLONG(this->attr("startswith")(prefix).ptr()); - if (PyErr_Occurred()) - throw_error_already_set(); - return result; -} - -bool str_base::startswith(object_cref prefix, object_cref start) const -{ - bool result = _BOOST_PYTHON_ASLONG(this->attr("startswith")(prefix,start).ptr()); - if (PyErr_Occurred()) - throw_error_already_set(); - return result; -} - -bool str_base::startswith(object_cref prefix, object_cref start, object_cref end) const -{ - bool result = _BOOST_PYTHON_ASLONG(this->attr("startswith")(prefix,start,end).ptr()); - if (PyErr_Occurred()) - throw_error_already_set(); - return result; -} - -#undef _BOOST_PYTHON_ASLONG - -BOOST_PYTHON_DEFINE_STR_METHOD(strip, 0) -BOOST_PYTHON_DEFINE_STR_METHOD(swapcase, 0) -BOOST_PYTHON_DEFINE_STR_METHOD(title, 0) -BOOST_PYTHON_DEFINE_STR_METHOD(translate, 1) -BOOST_PYTHON_DEFINE_STR_METHOD(translate, 2) -BOOST_PYTHON_DEFINE_STR_METHOD(upper, 0) - -static struct register_str_pytype_ptr -{ - register_str_pytype_ptr() - { - const_cast( - converter::registry::lookup(boost::python::type_id()) - ) -#if PY_VERSION_HEX >= 0x03000000 - .m_class_object = &PyUnicode_Type; -#else - .m_class_object = &PyString_Type; -#endif - } -}register_str_pytype_ptr_; - -}}} // namespace boost::python diff --git a/src/tuple.cpp b/src/tuple.cpp deleted file mode 100644 index 6719713b..00000000 --- a/src/tuple.cpp +++ /dev/null @@ -1,35 +0,0 @@ -// Copyright David Abrahams 2004. -// 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 - -namespace boost { namespace python { namespace detail { - -detail::new_reference tuple_base::call(object const& arg_) -{ - return (detail::new_reference)PyObject_CallFunction( - (PyObject*)&PyTuple_Type, const_cast("(O)"), - arg_.ptr()); -} - -tuple_base::tuple_base() - : object(detail::new_reference(PyTuple_New(0))) -{} - -tuple_base::tuple_base(object_cref sequence) - : object(call(sequence)) -{} - -static struct register_tuple_pytype_ptr -{ - register_tuple_pytype_ptr() - { - const_cast( - converter::registry::lookup(boost::python::type_id()) - ).m_class_object = &PyTuple_Type; - } -}register_tuple_pytype_ptr_; - - -}}} // namespace boost::python diff --git a/src/wrapper.cpp b/src/wrapper.cpp deleted file mode 100755 index f8feaef9..00000000 --- a/src/wrapper.cpp +++ /dev/null @@ -1,66 +0,0 @@ -// Copyright David Abrahams 2004. 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 - -namespace boost { namespace python { - -namespace detail -{ - override wrapper_base::get_override( - char const* name - , PyTypeObject* class_object - ) const - { - if (this->m_self) - { - if (handle<> m = handle<>( - python::allow_null( - ::PyObject_GetAttrString( - this->m_self, const_cast(name)))) - ) - { - PyObject* borrowed_f = 0; - - if ( - PyMethod_Check(m.get()) - && ((PyMethodObject*)m.get())->im_self == this->m_self - && class_object->tp_dict != 0 - ) - { - borrowed_f = ::PyDict_GetItemString( - class_object->tp_dict, const_cast(name)); - - - } - if (borrowed_f != ((PyMethodObject*)m.get())->im_func) - return override(m); - } - } - return override(handle<>(detail::none())); - } -} - -#if 0 -namespace converter -{ - PyObject* BOOST_PYTHON_DECL do_polymorphic_ref_to_python( - python::detail::wrapper_base const volatile* x, type_info src - ) - { - if (x == 0) - { - ::PyErr_Format( - PyExc_TypeError - , "Attempting to returning pointer or reference to instance of %s\n" - "for which no corresponding Python object exists. Wrap this function" - "with a return return value policy" - ) - } - } - -} -#endif - -}} // namespace boost::python::detail diff --git a/test/Jamfile.v2 b/test/Jamfile.v2 deleted file mode 100644 index 55241880..00000000 --- a/test/Jamfile.v2 +++ /dev/null @@ -1,236 +0,0 @@ -# Copyright David Abrahams 2006. 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) - -import python ; -import os ; - -lib socket ; - -use-project /boost/python : ../build ; -project /boost/python/test - : requirements - gcc:-Wextra - qnxnto:socket - ; - -local PY = ; -if [ python.configured ] -{ - PY = /python//python ; -} - -rule py-run ( sources * : input-file ? ) -{ - return [ run $(sources) /boost/python//boost_python $(PY) - : # args - : $(input-file) - : #requirements - BOOST_PYTHON_SUPPRESS_REGISTRY_INITIALIZATION - - ] ; -} - -rule py-compile ( sources * ) -{ - return [ compile $(sources) /boost/python//boost_python ] ; -} - -rule py-compile-fail ( sources * ) -{ - return [ compile-fail $(sources) /boost/python//boost_python ] ; -} - -rule require-windows ( properties * ) -{ - if ! windows in $(properties) - { - return no ; - } -} - -test-suite python - : - - [ - run exec.cpp /boost/python//boost_python/static $(PY) - : # program args - : exec.py # input files - : # requirements - : # target-name - ] - - [ - run exec.cpp ../build//boost_python/shared /python//python - : # program args - : exec.py - : # requirements - : exec-dynamic # target-name - ] - -# [ -# run import_.cpp ../build//boost_python /python//python -# : # program args -# : import_.py # input files -# : # requirements -# : # target-name -# ] - -[ -bpl-test crossmod_exception - : crossmod_exception.py crossmod_exception_a.cpp crossmod_exception_b.cpp -] - -[ bpl-test injected ] -[ bpl-test properties ] -[ bpl-test return_arg ] -[ bpl-test staticmethod ] -[ bpl-test shared_ptr ] -[ bpl-test enable_shared_from_this ] -[ bpl-test andreas_beyer ] -[ bpl-test wrapper_held_type ] - -[ bpl-test polymorphism2_auto_ptr - : polymorphism2_auto_ptr.py polymorphism2.py polymorphism2_auto_ptr.cpp -] - -[ bpl-test polymorphism ] -[ bpl-test polymorphism2 ] - -[ bpl-test auto_ptr ] - -[ bpl-test minimal ] -[ bpl-test args ] -[ bpl-test raw_ctor ] -[ bpl-test numpy : printer.py numeric_tests.py numarray_tests.py numpy.py numpy.cpp ] -[ bpl-test enum ] -[ bpl-test exception_translator ] -[ bpl-test pearu1 : test_cltree.py cltree.cpp ] -[ bpl-test try : newtest.py m1.cpp m2.cpp ] -[ bpl-test const_argument ] -[ bpl-test keywords : keywords.cpp keywords_test.py ] - - -[ python-extension builtin_converters_ext : test_builtin_converters.cpp /boost/python//boost_python ] -[ bpl-test builtin_converters : test_builtin_converters.py builtin_converters_ext ] - - [ bpl-test test_pointer_adoption ] - [ bpl-test operators ] - [ bpl-test operators_wrapper ] - [ bpl-test callbacks ] - [ bpl-test defaults ] - -[ bpl-test object ] -[ bpl-test class ] -[ bpl-test list ] -[ bpl-test long ] -[ bpl-test dict ] -[ bpl-test tuple ] -[ bpl-test str ] -[ bpl-test slice ] - -[ bpl-test virtual_functions ] -[ bpl-test back_reference ] -[ bpl-test implicit ] -[ bpl-test data_members ] - -[ bpl-test ben_scott1 ] - -[ bpl-test bienstman1 ] -[ bpl-test bienstman2 ] -[ bpl-test bienstman3 ] - -[ bpl-test multi_arg_constructor - : # files - : # requirements - # A bug in the Win32 intel compilers causes compilation of one of our - # tests to take forever when debug symbols are enabled. This rule - # turns them off when added to the requirements section - intel-win:off -] - -[ bpl-test iterator : iterator.py iterator.cpp input_iterator.cpp ] - -[ bpl-test stl_iterator : stl_iterator.py stl_iterator.cpp ] - -[ bpl-test extract ] - -[ -bpl-test crossmod_opaque - : crossmod_opaque.py crossmod_opaque_a.cpp crossmod_opaque_b.cpp -] -[ bpl-test opaque ] -[ bpl-test voidptr ] - -[ bpl-test pickle1 ] -[ bpl-test pickle2 ] -[ bpl-test pickle3 ] -[ bpl-test pickle4 ] - -[ bpl-test nested ] - -[ bpl-test docstring ] -[ bpl-test pytype_function ] - -[ bpl-test vector_indexing_suite ] - -[ bpl-test pointer_vector - : # files - : # requirements - # Turn off this test on HP CXX, as the test hangs when executing. - # Whenever the cause for the failure of the polymorphism test is found - # and fixed, this should be retested. - hp_cxx:no ] - -[ python-extension map_indexing_suite_ext - : map_indexing_suite.cpp int_map_indexing_suite.cpp a_map_indexing_suite.cpp - /boost/python//boost_python ] -[ bpl-test - map_indexing_suite : map_indexing_suite.py map_indexing_suite_ext ] - -[ run import_.cpp /boost/python//boost_python $(PY) : : import_.py ] - -# if $(TEST_BIENSTMAN_NON_BUGS) -# { -# bpl-test bienstman4 ; -# bpl-test bienstman5 ; -# } - -[ bpl-test calling_conventions : : @require-windows ] -[ bpl-test calling_conventions_mf : : @require-windows ] - -# --- unit tests of library components --- - -[ compile indirect_traits_test.cpp ] -[ run destroy_test.cpp ] -[ py-run pointer_type_id_test.cpp ] -[ py-run bases.cpp ] -[ run if_else.cpp ] -[ py-run pointee.cpp ] -[ run result.cpp ] - -[ compile string_literal.cpp ] -[ py-compile borrowed.cpp ] -[ py-compile object_manager.cpp ] -[ py-compile copy_ctor_mutates_rhs.cpp ] - -[ py-run upcast.cpp ] - -[ py-compile select_holder.cpp ] - -[ run select_from_python_test.cpp ../src/converter/type_id.cpp - : - : - : BOOST_PYTHON_STATIC_LIB - $(PY) - -] - - [ py-compile select_arg_to_python_test.cpp ] - -[ py-compile-fail ./raw_pyobject_fail1.cpp ] -[ py-compile-fail ./raw_pyobject_fail2.cpp ] -[ py-compile-fail ./as_to_python_function.cpp ] -[ py-compile-fail ./object_fail1.cpp ] - - ; diff --git a/test/a_map_indexing_suite.cpp b/test/a_map_indexing_suite.cpp deleted file mode 100644 index 07a0a6b9..00000000 --- a/test/a_map_indexing_suite.cpp +++ /dev/null @@ -1,92 +0,0 @@ -// Copyright Joel de Guzman 2004. 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 -#include -#include -#include - -using namespace boost::python; - -struct A -{ - int value; - A() : value(0){}; - A(int v) : value(v) {}; -}; - -bool operator==(const A& v1, const A& v2) -{ - return (v1.value == v2.value); -} - -struct B -{ - A a; -}; - -// Converter from A to python int -struct AToPython -{ - static PyObject* convert(const A& s) - { - return boost::python::incref(boost::python::object((int)s.value).ptr()); - } -}; - -// Conversion from python int to A -struct AFromPython -{ - AFromPython() - { - boost::python::converter::registry::push_back( - &convertible, - &construct, - boost::python::type_id< A >()); - } - - static void* convertible(PyObject* obj_ptr) - { -#if PY_VERSION_HEX >= 0x03000000 - if (!PyLong_Check(obj_ptr)) return 0; -#else - if (!PyInt_Check(obj_ptr)) return 0; -#endif - return obj_ptr; - } - - static void construct( - PyObject* obj_ptr, - boost::python::converter::rvalue_from_python_stage1_data* data) - { - void* storage = ( - (boost::python::converter::rvalue_from_python_storage< A >*) - data)-> storage.bytes; - -#if PY_VERSION_HEX >= 0x03000000 - new (storage) A((int)PyLong_AsLong(obj_ptr)); -#else - new (storage) A((int)PyInt_AsLong(obj_ptr)); -#endif - data->convertible = storage; - } -}; - -void a_map_indexing_suite() -{ - - to_python_converter< A , AToPython >(); - AFromPython(); - - class_< std::map >("AMap") - .def(map_indexing_suite, true >()) - ; - - class_< B >("B") - .add_property("a", make_getter(&B::a, return_value_policy()), - make_setter(&B::a, return_value_policy())) - ; -} - - diff --git a/test/andreas_beyer.cpp b/test/andreas_beyer.cpp deleted file mode 100644 index b28b1566..00000000 --- a/test/andreas_beyer.cpp +++ /dev/null @@ -1,61 +0,0 @@ -// Copyright David Abrahams 2006. 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 -#include -#include - -using namespace boost; - -class A : public enable_shared_from_this { - public: - A() : val(0) {}; - int val; - typedef shared_ptr A_ptr; - A_ptr self() { - A_ptr self; - self = shared_from_this(); - return self; - } - -}; - -class B { - public: - B() { - a = A::A_ptr(new A()); - } - void set(A::A_ptr _a) { - this->a = _a; - } - A::A_ptr get() { - return a; - } - A::A_ptr a; -}; - -template -void hold_python(shared_ptr& x) -{ - x = python::extract >( python::object(x) ); -} - -A::A_ptr get_b_a(shared_ptr b) -{ - hold_python(b->a); - return b->get(); -} - -BOOST_PYTHON_MODULE(andreas_beyer_ext) { - python::class_ ("A") - .def("self", &A::self) - .def_readwrite("val", &A::val) - ; - python::register_ptr_to_python< A::A_ptr >(); - - python::class_("B") - .def("set", &B::set) -// .def("get", &B::get) - .def("get", get_b_a) - ; -} diff --git a/test/andreas_beyer.py b/test/andreas_beyer.py deleted file mode 100644 index 84a54fbd..00000000 --- a/test/andreas_beyer.py +++ /dev/null @@ -1,24 +0,0 @@ -# Copyright David Abrahams 2004. 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) -''' - >>> from andreas_beyer_ext import * - >>> b=B() - >>> a=b.get() # let b create an A - >>> a2=b.get() - >>> assert id(a) == id(a2) -''' -def run(args = None): - import sys - import doctest - - if args is not None: - sys.argv = args - return doctest.testmod(sys.modules.get(__name__)) - -if __name__ == '__main__': - print "running..." - import sys - status = run()[0] - if (status == 0): print "Done." - sys.exit(status) diff --git a/test/args.cpp b/test/args.cpp deleted file mode 100644 index 592a8e50..00000000 --- a/test/args.cpp +++ /dev/null @@ -1,99 +0,0 @@ -// 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 -#include "test_class.hpp" -#include -#include -#include -#include -#include -#include -#include - -using namespace boost::python; - -#if BOOST_WORKAROUND(__SUNPRO_CC, BOOST_TESTED_AT(0x580)) || BOOST_WORKAROUND(BOOST_MSVC, BOOST_TESTED_AT(1500)) -# define make_tuple boost::python::make_tuple -#endif - -tuple f(int x = 1, double y = 4.25, char const* z = "wow") -{ - return make_tuple(x, y, z); -} - -BOOST_PYTHON_FUNCTION_OVERLOADS(f_overloads, f, 0, 3) - -typedef test_class<> Y; - -struct X -{ - X(int a0 = 0, int a1 = 1) : inner0(a0), inner1(a1) {} - tuple f(int x = 1, double y = 4.25, char const* z = "wow") - { - return make_tuple(x, y, z); - } - - Y const& inner(bool n) const { return n ? inner1 : inner0; } - - Y inner0; - Y inner1; -}; - -BOOST_PYTHON_MEMBER_FUNCTION_OVERLOADS(X_f_overloads, X::f, 0, 3) - - -tuple raw_func(tuple args, dict kw) -{ - return make_tuple(args, kw); -} - -BOOST_PYTHON_MODULE(args_ext) -{ - def("f", f, (arg("x")=1, arg("y")=4.25, arg("z")="wow") - , "This is f's docstring" - ); - - def("raw", raw_function(raw_func)); - -#if defined(BOOST_MSVC) && BOOST_MSVC <= 1200 - // MSVC6 gives a fatal error LNK1179: invalid or corrupt file: - // duplicate comdat error if we try to re-use the exact type of f - // here, so substitute long for int. - tuple (*f)(long,double,char const*) = 0; -#endif - def("f1", f, f_overloads("f1's docstring", args("x", "y", "z"))); - def("f2", f, f_overloads(args("x", "y", "z"))); - def("f3", f, f_overloads(args("x", "y", "z"), "f3's docstring")); - - class_("Y", init(args("value"), "Y's docstring")) - .def("value", &Y::value) - .def("raw", raw_function(raw_func)) - ; - - class_("X", "This is X's docstring", init<>(args("self"))) - .def(init >(args("self", "a0", "a1"))) - .def("f", &X::f - , "This is X.f's docstring" - , args("self","x", "y", "z")) - - // Just to prove that all the different argument combinations work - .def("inner0", &X::inner, return_internal_reference<>(), args("self", "n"), "docstring") - .def("inner1", &X::inner, return_internal_reference<>(), "docstring", args("self", "n")) - - .def("inner2", &X::inner, args("self", "n"), return_internal_reference<>(), "docstring") - .def("inner3", &X::inner, "docstring", return_internal_reference<>(), args("self", "n")) - - .def("inner4", &X::inner, args("self", "n"), "docstring", return_internal_reference<>()) - .def("inner5", &X::inner, "docstring", args("self", "n"), return_internal_reference<>()) - - .def("f1", &X::f, X_f_overloads(args("self", "x", "y", "z"))) - .def("f2", &X::f, X_f_overloads(args("self", "x", "y", "z"), "f2's docstring")) - .def("f2", &X::f, X_f_overloads(args("x", "y", "z"), "f2's docstring")) - ; - - def("inner", &X::inner, "docstring", args("self", "n"), return_internal_reference<>()); -} - -#include "module_tail.cpp" diff --git a/test/args.py b/test/args.py deleted file mode 100644 index 44a9cd25..00000000 --- a/test/args.py +++ /dev/null @@ -1,147 +0,0 @@ -# Copyright David Abrahams 2004. 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) -""" ->>> from args_ext import * - ->>> raw(3, 4, foo = 'bar', baz = 42) -((3, 4), {'foo': 'bar', 'baz': 42}) - - Prove that we can handle empty keywords and non-keywords - ->>> raw(3, 4) -((3, 4), {}) - ->>> raw(foo = 'bar') -((), {'foo': 'bar'}) - ->>> f(x= 1, y = 3, z = 'hello') -(1, 3.0, 'hello') - ->>> f(z = 'hello', x = 3, y = 2.5) -(3, 2.5, 'hello') - ->>> f(1, z = 'hi', y = 3) -(1, 3.0, 'hi') - ->>> try: f(1, 2, 'hello', bar = 'baz') -... except TypeError: pass -... else: print 'expected an exception: unknown keyword' - - - Exercise the functions using default stubs - ->>> f1(z = 'nix', y = .125, x = 2) -(2, 0.125, 'nix') ->>> f1(y = .125, x = 2) -(2, 0.125, 'wow') ->>> f1(x = 2) -(2, 4.25, 'wow') ->>> f1() -(1, 4.25, 'wow') - ->>> f2(z = 'nix', y = .125, x = 2) -(2, 0.125, 'nix') ->>> f2(y = .125, x = 2) -(2, 0.125, 'wow') ->>> f2(x = 2) -(2, 4.25, 'wow') ->>> f2() -(1, 4.25, 'wow') - ->>> f3(z = 'nix', y = .125, x = 2) -(2, 0.125, 'nix') ->>> f3(y = .125, x = 2) -(2, 0.125, 'wow') ->>> f3(x = 2) -(2, 4.25, 'wow') ->>> f3() -(1, 4.25, 'wow') - - Member function tests - ->>> q = X() ->>> q.f(x= 1, y = 3, z = 'hello') -(1, 3.0, 'hello') - ->>> q.f(z = 'hello', x = 3, y = 2.5) -(3, 2.5, 'hello') - ->>> q.f(1, z = 'hi', y = 3) -(1, 3.0, 'hi') - ->>> try: q.f(1, 2, 'hello', bar = 'baz') -... except TypeError: pass -... else: print 'expected an exception: unknown keyword' - - Exercise member functions using default stubs - ->>> q.f1(z = 'nix', y = .125, x = 2) -(2, 0.125, 'nix') ->>> q.f1(y = .125, x = 2) -(2, 0.125, 'wow') ->>> q.f1(x = 2) -(2, 4.25, 'wow') ->>> q.f1() -(1, 4.25, 'wow') ->>> q.f2.__doc__.splitlines()[1] -'f2( (X)self [, (int)x [, (float)y [, (str)z]]]) -> tuple :' - ->>> q.f2.__doc__.splitlines()[2] -" f2's docstring" - ->>> X.f.__doc__.splitlines()[1:5] -['f( (X)self, (int)x, (float)y, (str)z) -> tuple :', " This is X.f's docstring", '', ' C++ signature :'] - ->>> xfuncs = (X.inner0, X.inner1, X.inner2, X.inner3, X.inner4, X.inner5) ->>> for f in xfuncs: -... print f(q,1).value(), -... print f(q, n = 1).value(), -... print f(q, n = 0).value(), -... print f.__doc__.splitlines()[1:5] -1 1 0 ['inner0( (X)self, (bool)n) -> Y :', ' docstring', '', ' C++ signature :'] -1 1 0 ['inner1( (X)self, (bool)n) -> Y :', ' docstring', '', ' C++ signature :'] -1 1 0 ['inner2( (X)self, (bool)n) -> Y :', ' docstring', '', ' C++ signature :'] -1 1 0 ['inner3( (X)self, (bool)n) -> Y :', ' docstring', '', ' C++ signature :'] -1 1 0 ['inner4( (X)self, (bool)n) -> Y :', ' docstring', '', ' C++ signature :'] -1 1 0 ['inner5( (X)self, (bool)n) -> Y :', ' docstring', '', ' C++ signature :'] - ->>> x = X(a1 = 44, a0 = 22) ->>> x.inner0(0).value() -22 ->>> x.inner0(1).value() -44 - ->>> x = X(a0 = 7) ->>> x.inner0(0).value() -7 ->>> x.inner0(1).value() -1 - ->>> inner(n = 1, self = q).value() -1 - ->>> y = Y(value = 33) ->>> y.raw(this = 1, that = 'the other')[1] -{'this': 1, 'that': 'the other'} - -""" -def run(args = None): - import sys - import doctest - - if args is not None: - sys.argv = args - return doctest.testmod(sys.modules.get(__name__)) - -if __name__ == '__main__': - print "running..." - import sys - status = run()[0] - if (status == 0): print "Done." - import args_ext - help(args_ext) - sys.exit(status) - - - diff --git a/test/as_to_python_function.cpp b/test/as_to_python_function.cpp deleted file mode 100644 index cc083890..00000000 --- a/test/as_to_python_function.cpp +++ /dev/null @@ -1,13 +0,0 @@ -// 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 - -struct hopefully_illegal -{ - static PyObject* convert(int&); -}; - -PyObject* x = boost::python::converter::as_to_python_function::convert(0); diff --git a/test/auto_ptr.cpp b/test/auto_ptr.cpp deleted file mode 100644 index 0f61e96d..00000000 --- a/test/auto_ptr.cpp +++ /dev/null @@ -1,90 +0,0 @@ -// 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 -#include "test_class.hpp" -#include -#include -#include -#include - -#include - -#include - -using namespace boost::python; - -typedef test_class<> X; - -struct Y : X -{ - Y(int n) : X(n) {}; -}; - -int look(std::auto_ptr const& x) -{ - return (x.get()) ? x->value() : -1; -} - -int steal(std::auto_ptr x) -{ - return x->value(); -} - -int maybe_steal(std::auto_ptr& x, bool doit) -{ - int n = x->value(); - if (doit) - x.release(); - return n; -} - -std::auto_ptr make() -{ - return std::auto_ptr(new X(77)); -} - -std::auto_ptr callback(object f) -{ - std::auto_ptr x(new X(77)); - return call >(f.ptr(), x); -} - -std::auto_ptr extract_(object o) -{ - return extract&>(o) -#if BOOST_MSVC <= 1300 - () -#endif - ; -} - -BOOST_PYTHON_MODULE(auto_ptr_ext) -{ - class_, boost::noncopyable>("X", init()) - .def("value", &X::value) - ; - - class_, bases, boost::noncopyable>("Y", init()) - ; - - // VC6 auto_ptrs do not have converting constructors -#if BOOST_WORKAROUND(BOOST_DINKUMWARE_STDLIB, < 306) - scope().attr("broken_auto_ptr") = 1; -#else - scope().attr("broken_auto_ptr") = 0; - implicitly_convertible, std::auto_ptr >(); -#endif - - def("look", look); - def("steal", steal); - def("maybe_steal", maybe_steal); - def("make", make); - def("callback", callback); - def("extract", extract_); -} - -#include "module_tail.cpp" - diff --git a/test/auto_ptr.py b/test/auto_ptr.py deleted file mode 100644 index 2e4bed61..00000000 --- a/test/auto_ptr.py +++ /dev/null @@ -1,100 +0,0 @@ -# Copyright David Abrahams 2004. 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) -''' ->>> from auto_ptr_ext import * ->>> x = X(42) ->>> x.value() -42 ->>> look(x), look(x) -(42, 42) - ->>> maybe_steal(x, 0) -42 ->>> look(x) -42 - ->>> maybe_steal(x, 1) -42 ->>> broken_auto_ptr and -1 or look(x) --1 - ->>> x = X(69) ->>> steal(x) -69 ->>> broken_auto_ptr and -1 or look(x) --1 - ->>> if not broken_auto_ptr: -... try: x.value() -... except TypeError: pass -... else: print 'expected a TypeError exception' - ->>> x = make() ->>> look(x) -77 - ->>> z = callback(lambda z: z) ->>> z.value() -77 - ->>> extract(x).value() -77 - -# -# Test derived to base conversions -# - ->>> y = Y(42) ->>> y.value() -42 - ->>> try: maybe_steal(y, 0) -... except TypeError: pass -... else: print 'expected a TypeError exception' - ->>> y.value() -42 - ->>> broken_auto_ptr and 42 or steal(y) -42 - ->>> if not broken_auto_ptr: -... try: y.value() -... except TypeError: pass -... else: print 'expected a TypeError exception' - ->>> print look.__doc__.splitlines()[1] -look( (X)arg1) -> int : - ->>> print steal.__doc__.splitlines()[1] -steal( (X)arg1) -> int : - ->>> print maybe_steal.__doc__.splitlines()[1] -maybe_steal( (X)arg1, (bool)arg2) -> int : - ->>> print make.__doc__.splitlines()[1] -make() -> X : - ->>> print callback.__doc__.splitlines()[1] -callback( (object)arg1) -> X : - ->>> print extract.__doc__.splitlines()[1] -extract( (object)arg1) -> X : - -''' - -def run(args = None): - import sys - import doctest - - if args is not None: - sys.argv = args - return doctest.testmod(sys.modules.get(__name__)) - -if __name__ == '__main__': - print "running..." - import sys - status = run()[0] - if (status == 0): print "Done." - sys.exit(status) diff --git a/test/back_reference.cpp b/test/back_reference.cpp deleted file mode 100644 index 266ed291..00000000 --- a/test/back_reference.cpp +++ /dev/null @@ -1,112 +0,0 @@ -// 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 -#include -#include -#include -#include -#include -#include -#include -#define BOOST_ENABLE_ASSERT_HANDLER -#include -#include -#include -#include - -// This test shows that a class can be wrapped "as itself" but also -// acquire a back-reference iff has_back_reference<> is appropriately -// specialized. -using namespace boost::python; - -struct X -{ - explicit X(int x) : x(x), magic(7654321) { ++counter; } - X(X const& rhs) : x(rhs.x), magic(7654321) { ++counter; } - virtual ~X() { BOOST_ASSERT(magic == 7654321); magic = 6666666; x = 9999; --counter; } - - void set(int _x) { BOOST_ASSERT(magic == 7654321); this->x = _x; } - int value() const { BOOST_ASSERT(magic == 7654321); return x; } - static int count() { return counter; } - private: - void operator=(X const&); - private: - int x; - long magic; - static int counter; -}; - -int X::counter; - -struct Y : X -{ - Y(PyObject* self, int x) : X(x), self(self) {} - Y(PyObject* self, Y const& rhs) : X(rhs), self(self) {} - private: - Y(Y const&); - PyObject* self; -}; - -struct Z : X -{ - Z(PyObject* self, int x) : X(x), self(self) {} - Z(PyObject* self, Z const& rhs) : X(rhs), self(self) {} - private: - Z(Z const&); - PyObject* self; -}; - -Y const& copy_Y(Y const& y) { return y; } -Z const& copy_Z(Z const& z) { return z; } - -namespace boost { namespace python -{ - template <> - struct has_back_reference - : mpl::true_ - { - }; - - template <> - struct has_back_reference - : mpl::true_ - { - }; -}} - -// prove that back_references get initialized with the right PyObject* -object y_identity(back_reference y) -{ - return y.source(); -} - -// prove that back_references contain the right value -bool y_equality(back_reference y1, Y const& y2) -{ - return &y1.get() == &y2; -} - -BOOST_PYTHON_MODULE(back_reference_ext) -{ - def("copy_Y", copy_Y, return_value_policy()); - def("copy_Z", copy_Z, return_value_policy()); - def("x_instances", &X::count); - - class_("Y", init()) - .def("value", &Y::value) - .def("set", &Y::set) - ; - - class_ >("Z", init()) - .def("value", &Z::value) - .def("set", &Z::set) - ; - - def("y_identity", y_identity); - def("y_equality", y_equality); - -} - -#include "module_tail.cpp" diff --git a/test/back_reference.py b/test/back_reference.py deleted file mode 100644 index 6705ee7b..00000000 --- a/test/back_reference.py +++ /dev/null @@ -1,37 +0,0 @@ -# Copyright David Abrahams 2004. 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) -''' ->>> from back_reference_ext import * ->>> y = Y(3) ->>> z = Z(4) ->>> x_instances() -2 ->>> y2 = copy_Y(y) ->>> x_instances() -3 ->>> z2 = copy_Z(z) ->>> x_instances() -4 ->>> assert y_identity(y) is y ->>> y_equality(y, y) -1 - ->>> print y_identity.__doc__.splitlines()[1] -y_identity( (Y)arg1) -> object : -''' - -def run(args = None): - import sys - import doctest - - if args is not None: - sys.argv = args - return doctest.testmod(sys.modules.get(__name__)) - -if __name__ == '__main__': - print "running..." - import sys - status = run()[0] - if (status == 0): print "Done." - sys.exit(status) diff --git a/test/bases.cpp b/test/bases.cpp deleted file mode 100644 index 84beb061..00000000 --- a/test/bases.cpp +++ /dev/null @@ -1,62 +0,0 @@ -// 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 -#include -#include - -struct A; -struct B; - -template -struct choose_bases - : boost::python::detail::select_bases< - X - , typename boost::python::detail::select_bases< - Y - , typename boost::python::detail::select_bases::type - >::type> -{ - -}; - -int main() -{ - BOOST_STATIC_ASSERT((boost::python::detail::specifies_bases< - boost::python::bases >::value)); - - BOOST_STATIC_ASSERT((!boost::python::detail::specifies_bases< - boost::python::bases& >::value)); - - BOOST_STATIC_ASSERT((!boost::python::detail::specifies_bases< - void* >::value)); - - BOOST_STATIC_ASSERT((!boost::python::detail::specifies_bases< - int >::value)); - - BOOST_STATIC_ASSERT((!boost::python::detail::specifies_bases< - int[5] >::value)); - - typedef boost::python::detail::select_bases< - int - , boost::python::detail::select_bases::type > collected1; - - BOOST_STATIC_ASSERT((boost::is_same >::value)); - BOOST_STATIC_ASSERT((boost::is_same::type,boost::python::bases<> >::value)); - - typedef boost::python::detail::select_bases< - int - , boost::python::detail::select_bases< - boost::python::bases - , boost::python::detail::select_bases< - A - >::type - >::type - > collected2; - - BOOST_STATIC_ASSERT((boost::is_same >::value)); - BOOST_STATIC_ASSERT((boost::is_same,long>::type,boost::python::bases >::value)); - - return 0; -} diff --git a/test/ben_scott1.cpp b/test/ben_scott1.cpp deleted file mode 100644 index 5a675e23..00000000 --- a/test/ben_scott1.cpp +++ /dev/null @@ -1,54 +0,0 @@ -// Copyright David Abrahams 2004. 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 -#include -using namespace boost::python; -using namespace boost; - -struct Product {}; -typedef shared_ptr ProductPtr; - - -struct Creator -{ - virtual ~Creator() {} - virtual ProductPtr create() = 0; -}; - - -struct Factory -{ - void reg(Creator* c) { mC = c; } - ProductPtr create() - { - std::cout << "Name: " << (typeid(*mC)).name() << std::endl; - return mC->create(); - } - -private: - Creator* mC; -}; - -struct CreatorWrap : public Creator -{ - CreatorWrap(PyObject* self) : mSelf(self) {} - ProductPtr create() { return call_method(mSelf, "create"); } - PyObject* mSelf; -}; - -BOOST_PYTHON_MODULE(ben_scott1_ext) -{ - class_("Product"); - - class_("Creator") - .def("create", &CreatorWrap::create) - ; - - class_("Factory") - .def("reg", &Factory::reg, with_custodian_and_ward<1,2>()) - .def("create", &Factory::create) - ; -} - -#include "../test/module_tail.cpp" diff --git a/test/ben_scott1.py b/test/ben_scott1.py deleted file mode 100644 index 79130757..00000000 --- a/test/ben_scott1.py +++ /dev/null @@ -1,17 +0,0 @@ -# Copyright David Abrahams 2004. 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) -# This regression test checks that call_method(...) where T is a -# non-reference, non-pointer type that happens to be held inside the -# result object (and thus is found as an lvalue) works. -from ben_scott1_ext import * - -class CreatorImpl(Creator): - def create(self): - return Product() - -factory = Factory() -c = CreatorImpl() -factory.reg(c) - -a = factory.create() diff --git a/test/bienstman1.cpp b/test/bienstman1.cpp deleted file mode 100644 index dc006578..00000000 --- a/test/bienstman1.cpp +++ /dev/null @@ -1,40 +0,0 @@ -// Copyright David Abrahams 2004. 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 -#include -#include -#include -#include - -struct A {}; - -struct V -{ - virtual ~V() {}; // silence compiler warningsa - virtual void f() = 0; - - const A* inside() {return &a;} - - A a; -}; - -const A* outside(const V& v) {return &v.a;} - -BOOST_PYTHON_MODULE(bienstman1_ext) -{ - using namespace boost::python; - using boost::shared_ptr; - using boost::python::return_value_policy; - using boost::python::reference_existing_object; - - class_("A"); - - class_("V", no_init) - .def("inside", &V::inside, - return_value_policy()) - .def("outside", outside, - return_value_policy()) - ; -} - diff --git a/test/bienstman1.py b/test/bienstman1.py deleted file mode 100644 index 06f0fff8..00000000 --- a/test/bienstman1.py +++ /dev/null @@ -1,23 +0,0 @@ -# Copyright David Abrahams 2004. 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) -''' -# Try to reproduce a Numeric interaction bug if Numeric is installed. ->>> from bienstman1_ext import * ->>> try: from Numeric import * -... except: pass -''' -def run(args = None): - import sys - import doctest - - if args is not None: - sys.argv = args - return doctest.testmod(sys.modules.get(__name__)) - -if __name__ == '__main__': - print "running..." - import sys - status = run()[0] - if (status == 0): print "Done." - sys.exit(status) diff --git a/test/bienstman2.cpp b/test/bienstman2.cpp deleted file mode 100644 index 10f99923..00000000 --- a/test/bienstman2.cpp +++ /dev/null @@ -1,28 +0,0 @@ -// Copyright David Abrahams 2004. 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 -#include -#include - -struct C {}; - -struct D {}; - -struct E -{ - const D fe (const C&) {return D();} - const D fe2(const C&, const C&) {return D();} -}; - -BOOST_PYTHON_MODULE(bienstman2_ext) -{ - using namespace boost::python; - - class_("C"); - class_("D"); - class_("E") - .def("fe", &E::fe) // this compiles. - .def("fe2", &E::fe2) // this doesn't... well, now it does ;-) - ; -} diff --git a/test/bienstman2.py b/test/bienstman2.py deleted file mode 100644 index 359987d1..00000000 --- a/test/bienstman2.py +++ /dev/null @@ -1,20 +0,0 @@ -# Copyright David Abrahams 2004. 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) -''' ->>> import bienstman2_ext -''' -def run(args = None): - import sys - import doctest - - if args is not None: - sys.argv = args - return doctest.testmod(sys.modules.get(__name__)) - -if __name__ == '__main__': - print "running..." - import sys - status = run()[0] - if (status == 0): print "Done." - sys.exit(status) diff --git a/test/bienstman3.cpp b/test/bienstman3.cpp deleted file mode 100644 index d765b303..00000000 --- a/test/bienstman3.cpp +++ /dev/null @@ -1,26 +0,0 @@ -// Copyright David Abrahams 2004. 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 -#include -#include - -struct V -{ - virtual ~V() {}; // silence compiler warningsa - virtual void f() = 0; -}; - -struct B -{ - B(const V&) {} -}; - -BOOST_PYTHON_MODULE(bienstman3_ext) -{ - using namespace boost::python; - - class_("V", no_init); - class_("B", init()); - -} diff --git a/test/bienstman3.py b/test/bienstman3.py deleted file mode 100644 index 4f3e8711..00000000 --- a/test/bienstman3.py +++ /dev/null @@ -1,30 +0,0 @@ -# Copyright David Abrahams 2004. 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) -''' ->>> from bienstman3_ext import * - ->>> try: -... V() -... except RuntimeError, x: -... print x -... else: -... print 'expected an exception' -... -This class cannot be instantiated from Python - -''' -def run(args = None): - import sys - import doctest - - if args is not None: - sys.argv = args - return doctest.testmod(sys.modules.get(__name__)) - -if __name__ == '__main__': - print "running..." - import sys - status = run()[0] - if (status == 0): print "Done." - sys.exit(status) diff --git a/test/bienstman4.cpp b/test/bienstman4.cpp deleted file mode 100644 index 34b9e211..00000000 --- a/test/bienstman4.cpp +++ /dev/null @@ -1,39 +0,0 @@ -// 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 -#include -#include -#include -#include - -struct Type1 {}; - -struct Term {Term(Type1 const&) {} }; - -struct Expression {void add(Term const&) {} }; - -BOOST_PYTHON_MODULE(bienstman4_ext) -{ - using namespace boost::python; - using boost::mpl::list; - - implicitly_convertible(); - - class_("Expression") - .def("add", &Expression::add) - ; - - class_("T1") - ; - - class_("Term", init()) - ; - - Type1 t1; - Expression e; - e.add(t1); -} - diff --git a/test/bienstman4.py b/test/bienstman4.py deleted file mode 100644 index e2a5b065..00000000 --- a/test/bienstman4.py +++ /dev/null @@ -1,23 +0,0 @@ -# Copyright David Abrahams 2004. 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) -''' ->>> from bienstman4_ext import * ->>> t1 = T1() ->>> e = Expression() ->>> e.add(t1) -''' -def run(args = None): - import sys - import doctest - - if args is not None: - sys.argv = args - return doctest.testmod(sys.modules.get(__name__)) - -if __name__ == '__main__': - print "running..." - import sys - status = run()[0] - if (status == 0): print "Done." - sys.exit(status) diff --git a/test/bienstman5.cpp b/test/bienstman5.cpp deleted file mode 100644 index 657dadd1..00000000 --- a/test/bienstman5.cpp +++ /dev/null @@ -1,23 +0,0 @@ -// 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 -#include -#include -#include - -#include - -struct M {M(const std::complex&) {} }; - -BOOST_PYTHON_MODULE(bienstman5_ext) -{ - using namespace boost::python; - - class_("M", init const&>()) - ; -} - - diff --git a/test/bienstman5.py b/test/bienstman5.py deleted file mode 100644 index 59a9bc93..00000000 --- a/test/bienstman5.py +++ /dev/null @@ -1,21 +0,0 @@ -# Copyright David Abrahams 2004. 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) -''' ->>> from bienstman5_ext import * ->>> m = M(1j) -''' -def run(args = None): - import sys - import doctest - - if args is not None: - sys.argv = args - return doctest.testmod(sys.modules.get(__name__)) - -if __name__ == '__main__': - print "running..." - import sys - status = run()[0] - if (status == 0): print "Done." - sys.exit(status) diff --git a/test/borrowed.cpp b/test/borrowed.cpp deleted file mode 100755 index 2c1bd1b7..00000000 --- a/test/borrowed.cpp +++ /dev/null @@ -1,33 +0,0 @@ -// 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 -#include -#include - -using namespace boost::python; - -template -void assert_borrowed_ptr(T const&) -{ - BOOST_STATIC_ASSERT(boost::python::detail::is_borrowed_ptr::value); -} - -template -void assert_not_borrowed_ptr(T const&) -{ - BOOST_STATIC_ASSERT(!boost::python::detail::is_borrowed_ptr::value); -} - -int main() -{ - assert_borrowed_ptr(borrowed((PyObject*)0)); - assert_borrowed_ptr(borrowed((PyTypeObject*)0)); - assert_borrowed_ptr((detail::borrowed const*)0); - assert_borrowed_ptr((detail::borrowed volatile*)0); - assert_borrowed_ptr((detail::borrowed const volatile*)0); - assert_not_borrowed_ptr((PyObject*)0); - assert_not_borrowed_ptr(0); - return 0; -} diff --git a/test/callbacks.cpp b/test/callbacks.cpp deleted file mode 100644 index 66bd3524..00000000 --- a/test/callbacks.cpp +++ /dev/null @@ -1,150 +0,0 @@ -// 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 -#include -#include -#include -#include -#include -#include -#include -#include -#define BOOST_ENABLE_ASSERT_HANDLER -#include - -using namespace boost::python; -BOOST_STATIC_ASSERT(converter::is_object_manager >::value); - -int apply_int_int(PyObject* f, int x) -{ - return call(f, x); -} - -void apply_void_int(PyObject* f, int x) -{ - call(f, x); -} - -struct X -{ - explicit X(int x) : x(x), magic(7654321) { ++counter; } - X(X const& rhs) : x(rhs.x), magic(7654321) { ++counter; } - ~X() { BOOST_ASSERT(magic == 7654321); magic = 6666666; x = 9999; --counter; } - - void set(int _x) { BOOST_ASSERT(magic == 7654321); this->x = _x; } - int value() const { BOOST_ASSERT(magic == 7654321); return x; } - static int count() { return counter; } - private: - void operator=(X const&); - private: - int x; - long magic; - static int counter; -}; - -X apply_X_X(PyObject* f, X x) -{ - return call(f, x); -} - -void apply_void_X_ref(PyObject* f, X& x) -{ - call(f, boost::ref(x)); -} - -X& apply_X_ref_handle(PyObject* f, handle<> obj) -{ - return call(f, obj); -} - -X* apply_X_ptr_handle_cref(PyObject* f, handle<> const& obj) -{ - return call(f, obj); -} - -void apply_void_X_cref(PyObject* f, X const& x) -{ - call(f, boost::cref(x)); -} - -void apply_void_X_ptr(PyObject* f, X* x) -{ - call(f, ptr(x)); -} - -void apply_void_X_deep_ptr(PyObject* f, X* x) -{ - call(f, x); -} - -char const* apply_cstring_cstring(PyObject* f, char const* s) -{ - return call(f, s); -} - -char const* apply_cstring_pyobject(PyObject* f, PyObject* s) -{ - return call(f, borrowed(s)); -} - -char apply_char_char(PyObject* f, char c) -{ - return call(f, c); -} - -char const* apply_to_string_literal(PyObject* f) -{ - return call(f, "hello, world"); -} - -handle<> apply_to_own_type(handle<> x) -{ - // Tests that we can return handle<> from a callback and that we - // can pass arbitrary handle. - return call >(x.get(), type_handle(borrowed(x->ob_type))); -} - -object apply_object_object(PyObject* f, object x) -{ - return call(f, x); -} - -int X::counter; - -BOOST_PYTHON_MODULE(callbacks_ext) -{ - def("apply_object_object", apply_object_object); - def("apply_to_own_type", apply_to_own_type); - def("apply_int_int", apply_int_int); - def("apply_void_int", apply_void_int); - def("apply_X_X", apply_X_X); - def("apply_void_X_ref", apply_void_X_ref); - def("apply_void_X_cref", apply_void_X_cref); - def("apply_void_X_ptr", apply_void_X_ptr); - def("apply_void_X_deep_ptr", apply_void_X_deep_ptr); - - def("apply_X_ptr_handle_cref", apply_X_ptr_handle_cref - , return_value_policy()); - - def("apply_X_ref_handle", apply_X_ref_handle - , return_value_policy()); - - def("apply_cstring_cstring", apply_cstring_cstring); - def("apply_cstring_pyobject", apply_cstring_pyobject); - def("apply_char_char", apply_char_char); - def("apply_to_string_literal", apply_to_string_literal); - - - class_("X", init()) - .def(init()) - .def("value", &X::value) - .def("set", &X::set) - ; - - def("x_count", &X::count); -} - -#include "module_tail.cpp" diff --git a/test/callbacks.py b/test/callbacks.py deleted file mode 100644 index 640eb155..00000000 --- a/test/callbacks.py +++ /dev/null @@ -1,147 +0,0 @@ -# Copyright David Abrahams 2004. 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) -''' ->>> from callbacks_ext import * - ->>> def double(x): -... return x + x -... ->>> apply_int_int(double, 42) -84 ->>> apply_void_int(double, 42) - ->>> def identity(x): -... return x - -Once we have array conversion support, this test will fail. Er, -succeed: - ->>> try: apply_to_string_literal(identity) -... except ReferenceError: pass # expected -... else: print 'expected an exception!' - ->>> try: apply_X_ref_handle(lambda ignored:X(42), None) -... except ReferenceError: pass # expected -... else: print 'expected an exception!' - ->>> x = X(42) ->>> x.y = X(7) ->>> apply_X_ref_handle(lambda z:z.y, x).value() -7 - ->>> x = apply_X_X(identity, X(42)) ->>> x.value() -42 ->>> x_count() -1 ->>> del x ->>> x_count() -0 - ->>> def increment(x): -... x.set(x.value() + 1) -... ->>> x = X(42) ->>> apply_void_X_ref(increment, x) ->>> x.value() -43 - ->>> apply_void_X_cref(increment, x) ->>> x.value() # const-ness is not respected, sorry! -44 - ->>> last_x = 1 ->>> def decrement(x): -... global last_x -... last_x = x -... if x is not None: -... x.set(x.value() - 1) - ->>> apply_void_X_ptr(decrement, x) ->>> x.value() -43 ->>> last_x.value() -43 ->>> increment(last_x) ->>> x.value() -44 ->>> last_x.value() -44 - ->>> apply_void_X_ptr(decrement, None) ->>> assert last_x is None ->>> x.value() -44 - ->>> last_x = 1 ->>> apply_void_X_deep_ptr(decrement, None) ->>> assert last_x is None ->>> x.value() -44 - ->>> apply_void_X_deep_ptr(decrement, x) ->>> x.value() -44 ->>> last_x.value() -43 - ->>> y = apply_X_ref_handle(identity, x) ->>> assert y.value() == x.value() ->>> increment(x) ->>> assert y.value() == x.value() - ->>> y = apply_X_ptr_handle_cref(identity, x) ->>> assert y.value() == x.value() ->>> increment(x) ->>> assert y.value() == x.value() - ->>> y = apply_X_ptr_handle_cref(identity, None) ->>> y - ->>> def new_x(ignored): -... return X(666) -... ->>> try: apply_X_ref_handle(new_x, 1) -... except ReferenceError: pass -... else: print 'no error' - ->>> try: apply_X_ptr_handle_cref(new_x, 1) -... except ReferenceError: pass -... else: print 'no error' - ->>> try: apply_cstring_cstring(identity, 'hello') -... except ReferenceError: pass -... else: print 'no error' - ->>> apply_char_char(identity, 'x') -'x' - ->>> apply_cstring_pyobject(identity, 'hello') -'hello' - ->>> apply_cstring_pyobject(identity, None) - - ->>> apply_char_char(identity, 'x') -'x' - ->>> assert apply_to_own_type(identity) is type(identity) - ->>> assert apply_object_object(identity, identity) is identity -''' - -def run(args = None): - import sys - import doctest - - if args is not None: - sys.argv = args - return doctest.testmod(sys.modules.get(__name__)) - -if __name__ == '__main__': - print "running..." - import sys - status = run()[0] - if (status == 0): print "Done." - sys.exit(status) diff --git a/test/calling_conventions.cpp b/test/calling_conventions.cpp deleted file mode 100644 index 54f49aeb..00000000 --- a/test/calling_conventions.cpp +++ /dev/null @@ -1,158 +0,0 @@ -// -// adapted from bind_stdcall_test.cpp - test for bind.hpp + __stdcall (free functions) -// The purpose of this simple test is to determine if a function can be -// called from Python with the various existing calling conventions -// -// Copyright (c) 2001 Peter Dimov and Multi Media Ltd. -// -// 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) -// - -#if !defined(TEST_INCLUDE_RECURSION) - -#define TEST_INCLUDE_RECURSION - -//------------------------------------------------------------------------------ -// this section is the main body of the test extension module - -#define BOOST_PYTHON_ENABLE_CDECL -#define BOOST_PYTHON_ENABLE_STDCALL -#define BOOST_PYTHON_ENABLE_FASTCALL -#include -#include -#include -using namespace boost::python; - -// first define test functions for every calling convention - -#define TEST_DECLARE_FUNCTIONS - -#define TESTED_CALLING_CONVENTION __cdecl -#include "calling_conventions.cpp" -#undef TESTED_CALLING_CONVENTION - -#define TESTED_CALLING_CONVENTION __stdcall -#include "calling_conventions.cpp" -#undef TESTED_CALLING_CONVENTION - -#define TESTED_CALLING_CONVENTION __fastcall -#include "calling_conventions.cpp" -#undef TESTED_CALLING_CONVENTION - -#undef TEST_DECLARE_FUNCTIONS - -// then create a module wrapping the defined functions for every calling convention - -BOOST_PYTHON_MODULE( calling_conventions_ext ) -{ - -#define TEST_WRAP_FUNCTIONS - -#define TESTED_CALLING_CONVENTION __cdecl -#include "calling_conventions.cpp" -#undef TESTED_CALLING_CONVENTION - -#define TESTED_CALLING_CONVENTION __stdcall -#include "calling_conventions.cpp" -#undef TESTED_CALLING_CONVENTION - -#define TESTED_CALLING_CONVENTION __fastcall -#include "calling_conventions.cpp" -#undef TESTED_CALLING_CONVENTION - -#undef TEST_WRAP_FUNCTIONS - -} - -#else // !defined(TEST_INCLUDE_RECURSION) - -//------------------------------------------------------------------------------ -// this section defines the functions to be wrapped - -# if defined(TEST_DECLARE_FUNCTIONS) - -# if !defined(TESTED_CALLING_CONVENTION) -# error "One calling convention must be defined" -# endif // !defined(TESTED_CALLING_CONVENTION) - -namespace BOOST_PP_CAT(test, TESTED_CALLING_CONVENTION) { - - long TESTED_CALLING_CONVENTION f_0() - { - return 17041L; - } - - long TESTED_CALLING_CONVENTION f_1(long a) - { - return a; - } - - long TESTED_CALLING_CONVENTION f_2(long a, long b) - { - return a + 10 * b; - } - - long TESTED_CALLING_CONVENTION f_3(long a, long b, long c) - { - return a + 10 * b + 100 * c; - } - - long TESTED_CALLING_CONVENTION f_4(long a, long b, long c, long d) - { - return a + 10 * b + 100 * c + 1000 * d; - } - - long TESTED_CALLING_CONVENTION f_5(long a, long b, long c, long d, long e) - { - return a + 10 * b + 100 * c + 1000 * d + 10000 * e; - } - - long TESTED_CALLING_CONVENTION f_6(long a, long b, long c, long d, long e, long f) - { - return a + 10 * b + 100 * c + 1000 * d + 10000 * e + 100000 * f; - } - - long TESTED_CALLING_CONVENTION f_7(long a, long b, long c, long d, long e, long f, long g) - { - return a + 10 * b + 100 * c + 1000 * d + 10000 * e + 100000 * f + 1000000 * g; - } - - long TESTED_CALLING_CONVENTION f_8(long a, long b, long c, long d, long e, long f, long g, long h) - { - return a + 10 * b + 100 * c + 1000 * d + 10000 * e + 100000 * f + 1000000 * g + 10000000 * h; - } - - long TESTED_CALLING_CONVENTION f_9(long a, long b, long c, long d, long e, long f, long g, long h, long i) - { - return a + 10 * b + 100 * c + 1000 * d + 10000 * e + 100000 * f + 1000000 * g + 10000000 * h + 100000000 * i; - } - -} // namespace test##TESTED_CALLING_CONVENTION - -# endif // defined(TEST_DECLARE_FUNCTIONS) - -//------------------------------------------------------------------------------ -// this section wraps the functions - -# if defined(TEST_WRAP_FUNCTIONS) - -# if !defined(TESTED_CALLING_CONVENTION) -# error "One calling convention must be defined" -# endif // !defined(TESTED_CALLING_CONVENTION) - - def("f_0" BOOST_PP_STRINGIZE(TESTED_CALLING_CONVENTION), &BOOST_PP_CAT(test, TESTED_CALLING_CONVENTION)::f_0); - def("f_1" BOOST_PP_STRINGIZE(TESTED_CALLING_CONVENTION), &BOOST_PP_CAT(test, TESTED_CALLING_CONVENTION)::f_1); - def("f_2" BOOST_PP_STRINGIZE(TESTED_CALLING_CONVENTION), &BOOST_PP_CAT(test, TESTED_CALLING_CONVENTION)::f_2); - def("f_3" BOOST_PP_STRINGIZE(TESTED_CALLING_CONVENTION), &BOOST_PP_CAT(test, TESTED_CALLING_CONVENTION)::f_3); - def("f_4" BOOST_PP_STRINGIZE(TESTED_CALLING_CONVENTION), &BOOST_PP_CAT(test, TESTED_CALLING_CONVENTION)::f_4); - def("f_5" BOOST_PP_STRINGIZE(TESTED_CALLING_CONVENTION), &BOOST_PP_CAT(test, TESTED_CALLING_CONVENTION)::f_5); - def("f_6" BOOST_PP_STRINGIZE(TESTED_CALLING_CONVENTION), &BOOST_PP_CAT(test, TESTED_CALLING_CONVENTION)::f_6); - def("f_7" BOOST_PP_STRINGIZE(TESTED_CALLING_CONVENTION), &BOOST_PP_CAT(test, TESTED_CALLING_CONVENTION)::f_7); - def("f_8" BOOST_PP_STRINGIZE(TESTED_CALLING_CONVENTION), &BOOST_PP_CAT(test, TESTED_CALLING_CONVENTION)::f_8); - def("f_9" BOOST_PP_STRINGIZE(TESTED_CALLING_CONVENTION), &BOOST_PP_CAT(test, TESTED_CALLING_CONVENTION)::f_9); - -# endif // defined(TEST_WRAP_FUNCTIONS) - -#endif // !defined(TEST_INCLUDE_RECURSION) diff --git a/test/calling_conventions.py b/test/calling_conventions.py deleted file mode 100644 index ce74a843..00000000 --- a/test/calling_conventions.py +++ /dev/null @@ -1,81 +0,0 @@ -# Copyright Nicolas Lelong, 2010. 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) -""" ->>> from calling_conventions_ext import * ->>> f_0__cdecl() -17041 ->>> f_1__cdecl(1) -1 ->>> f_2__cdecl(1, 2) -21 ->>> f_3__cdecl(1, 2, 3) -321 ->>> f_4__cdecl(1, 2, 3, 4) -4321 ->>> f_5__cdecl(1, 2, 3, 4, 5) -54321 ->>> f_6__cdecl(1, 2, 3, 4, 5, 6) -654321 ->>> f_7__cdecl(1, 2, 3, 4, 5, 6, 7) -7654321 ->>> f_8__cdecl(1, 2, 3, 4, 5, 6, 7, 8) -87654321 ->>> f_9__cdecl(1, 2, 3, 4, 5, 6, 7, 8, 9) -987654321 ->>> f_0__stdcall() -17041 ->>> f_1__stdcall(1) -1 ->>> f_2__stdcall(1, 2) -21 ->>> f_3__stdcall(1, 2, 3) -321 ->>> f_4__stdcall(1, 2, 3, 4) -4321 ->>> f_5__stdcall(1, 2, 3, 4, 5) -54321 ->>> f_6__stdcall(1, 2, 3, 4, 5, 6) -654321 ->>> f_7__stdcall(1, 2, 3, 4, 5, 6, 7) -7654321 ->>> f_8__stdcall(1, 2, 3, 4, 5, 6, 7, 8) -87654321 ->>> f_9__stdcall(1, 2, 3, 4, 5, 6, 7, 8, 9) -987654321 ->>> f_0__fastcall() -17041 ->>> f_1__fastcall(1) -1 ->>> f_2__fastcall(1, 2) -21 ->>> f_3__fastcall(1, 2, 3) -321 ->>> f_4__fastcall(1, 2, 3, 4) -4321 ->>> f_5__fastcall(1, 2, 3, 4, 5) -54321 ->>> f_6__fastcall(1, 2, 3, 4, 5, 6) -654321 ->>> f_7__fastcall(1, 2, 3, 4, 5, 6, 7) -7654321 ->>> f_8__fastcall(1, 2, 3, 4, 5, 6, 7, 8) -87654321 ->>> f_9__fastcall(1, 2, 3, 4, 5, 6, 7, 8, 9) -987654321 -""" - -def run(args = None): - import sys - import doctest - - if args is not None: - sys.argv = args - return doctest.testmod(sys.modules.get(__name__)) - -if __name__ == '__main__': - print "running..." - import sys - status = run()[0] - if (status == 0): print "Done." - sys.exit(status) diff --git a/test/calling_conventions_mf.cpp b/test/calling_conventions_mf.cpp deleted file mode 100644 index 80ccc406..00000000 --- a/test/calling_conventions_mf.cpp +++ /dev/null @@ -1,159 +0,0 @@ -// -// adapted from bind_stdcall_mf_test.cpp - test for bind.hpp + __stdcall (free functions) -// The purpose of this simple test is to determine if a function can be -// called from Python with the various existing calling conventions -// -// Copyright (c) 2001 Peter Dimov and Multi Media Ltd. -// -// 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) -// - -#if !defined(TEST_INCLUDE_RECURSION) - -#define TEST_INCLUDE_RECURSION - -//------------------------------------------------------------------------------ -// this section is the main body of the test extension module - -#define BOOST_PYTHON_ENABLE_CDECL -#define BOOST_PYTHON_ENABLE_STDCALL -#define BOOST_PYTHON_ENABLE_FASTCALL -#include -#include -#include -using namespace boost::python; - -// first define test functions for every calling convention - -#define TEST_DECLARE_FUNCTIONS - -#define TESTED_CALLING_CONVENTION __cdecl -#include "calling_conventions_mf.cpp" -#undef TESTED_CALLING_CONVENTION - -#define TESTED_CALLING_CONVENTION __stdcall -#include "calling_conventions_mf.cpp" -#undef TESTED_CALLING_CONVENTION - -#define TESTED_CALLING_CONVENTION __fastcall -#include "calling_conventions_mf.cpp" -#undef TESTED_CALLING_CONVENTION - -#undef TEST_DECLARE_FUNCTIONS - -// then create a module wrapping the defined functions for every calling convention - -BOOST_PYTHON_MODULE( calling_conventions_mf_ext ) -{ - -#define TEST_WRAP_FUNCTIONS - -#define TESTED_CALLING_CONVENTION __cdecl -#include "calling_conventions_mf.cpp" -#undef TESTED_CALLING_CONVENTION - -#define TESTED_CALLING_CONVENTION __stdcall -#include "calling_conventions_mf.cpp" -#undef TESTED_CALLING_CONVENTION - -#define TESTED_CALLING_CONVENTION __fastcall -#include "calling_conventions_mf.cpp" -#undef TESTED_CALLING_CONVENTION - -#undef TEST_WRAP_FUNCTIONS - -} - -#else // !defined(TEST_INCLUDE_RECURSION) - -//------------------------------------------------------------------------------ -// this section defines the functions to be wrapped - -# if defined(TEST_DECLARE_FUNCTIONS) - -# if !defined(TESTED_CALLING_CONVENTION) -# error "One calling convention must be defined" -# endif // !defined(TESTED_CALLING_CONVENTION) - -namespace BOOST_PP_CAT(test, TESTED_CALLING_CONVENTION) { - -struct X -{ - mutable unsigned int hash; - - X(): hash(0) {} - - void TESTED_CALLING_CONVENTION f0() { f1(17); } - void TESTED_CALLING_CONVENTION g0() const { g1(17); } - - void TESTED_CALLING_CONVENTION f1(int a1) { hash = (hash * 17041 + a1) % 32768; } - void TESTED_CALLING_CONVENTION g1(int a1) const { hash = (hash * 17041 + a1 * 2) % 32768; } - - void TESTED_CALLING_CONVENTION f2(int a1, int a2) { f1(a1); f1(a2); } - void TESTED_CALLING_CONVENTION g2(int a1, int a2) const { g1(a1); g1(a2); } - - void TESTED_CALLING_CONVENTION f3(int a1, int a2, int a3) { f2(a1, a2); f1(a3); } - void TESTED_CALLING_CONVENTION g3(int a1, int a2, int a3) const { g2(a1, a2); g1(a3); } - - void TESTED_CALLING_CONVENTION f4(int a1, int a2, int a3, int a4) { f3(a1, a2, a3); f1(a4); } - void TESTED_CALLING_CONVENTION g4(int a1, int a2, int a3, int a4) const { g3(a1, a2, a3); g1(a4); } - - void TESTED_CALLING_CONVENTION f5(int a1, int a2, int a3, int a4, int a5) { f4(a1, a2, a3, a4); f1(a5); } - void TESTED_CALLING_CONVENTION g5(int a1, int a2, int a3, int a4, int a5) const { g4(a1, a2, a3, a4); g1(a5); } - - void TESTED_CALLING_CONVENTION f6(int a1, int a2, int a3, int a4, int a5, int a6) { f5(a1, a2, a3, a4, a5); f1(a6); } - void TESTED_CALLING_CONVENTION g6(int a1, int a2, int a3, int a4, int a5, int a6) const { g5(a1, a2, a3, a4, a5); g1(a6); } - - void TESTED_CALLING_CONVENTION f7(int a1, int a2, int a3, int a4, int a5, int a6, int a7) { f6(a1, a2, a3, a4, a5, a6); f1(a7); } - void TESTED_CALLING_CONVENTION g7(int a1, int a2, int a3, int a4, int a5, int a6, int a7) const { g6(a1, a2, a3, a4, a5, a6); g1(a7); } - - void TESTED_CALLING_CONVENTION f8(int a1, int a2, int a3, int a4, int a5, int a6, int a7, int a8) { f7(a1, a2, a3, a4, a5, a6, a7); f1(a8); } - void TESTED_CALLING_CONVENTION g8(int a1, int a2, int a3, int a4, int a5, int a6, int a7, int a8) const { g7(a1, a2, a3, a4, a5, a6, a7); g1(a8); } -}; - -} // namespace BOOST_PP_CAT(test, TESTED_CALLING_CONVENTION) - -# endif // defined(TEST_DECLARE_FUNCTIONS) - -//------------------------------------------------------------------------------ -// this section wraps the functions - -# if defined(TEST_WRAP_FUNCTIONS) - -# if !defined(TESTED_CALLING_CONVENTION) -# error "One calling convention must be defined" -# endif // !defined(TESTED_CALLING_CONVENTION) - -{ - - typedef BOOST_PP_CAT(test, TESTED_CALLING_CONVENTION)::X X; - - class_("X" BOOST_PP_STRINGIZE(TESTED_CALLING_CONVENTION)) - .def("f0", &X::f0) - .def("g0", &X::g0) - .def("f1", &X::f1) - .def("g1", &X::g1) - .def("f2", &X::f2) - .def("g2", &X::g2) - .def("f3", &X::f3) - .def("g3", &X::g3) - .def("f4", &X::f4) - .def("g4", &X::g4) - .def("f5", &X::f5) - .def("g5", &X::g5) - .def("f6", &X::f6) - .def("g6", &X::g6) - .def("f7", &X::f7) - .def("g7", &X::g7) - .def("f8", &X::f8) - .def("g8", &X::g8) - .def_readonly("hash", &X::hash) - ; - -} - -# endif // defined(TEST_WRAP_FUNCTIONS) - -#endif // !defined(TEST_INCLUDE_RECURSION) diff --git a/test/calling_conventions_mf.py b/test/calling_conventions_mf.py deleted file mode 100644 index 1ec9c2b6..00000000 --- a/test/calling_conventions_mf.py +++ /dev/null @@ -1,84 +0,0 @@ -# Copyright Nicolas Lelong, 2010. 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) -""" ->>> from calling_conventions_mf_ext import * ->>> x = X__cdecl() ->>> x.f0() ->>> x.g0() ->>> x.f1(1) ->>> x.g1(1) ->>> x.f2(1, 2) ->>> x.g2(1, 2) ->>> x.f3(1, 2, 3) ->>> x.g3(1, 2, 3) ->>> x.f4(1, 2, 3, 4) ->>> x.g4(1, 2, 3, 4) ->>> x.f5(1, 2, 3, 4, 5) ->>> x.g5(1, 2, 3, 4, 5) ->>> x.f6(1, 2, 3, 4, 5, 6) ->>> x.g6(1, 2, 3, 4, 5, 6) ->>> x.f7(1, 2, 3, 4, 5, 6, 7) ->>> x.g7(1, 2, 3, 4, 5, 6, 7) ->>> x.f8(1, 2, 3, 4, 5, 6, 7, 8) ->>> x.g8(1, 2, 3, 4, 5, 6, 7, 8) ->>> x.hash -2155 ->>> x = X__stdcall() ->>> x.f0() ->>> x.g0() ->>> x.f1(1) ->>> x.g1(1) ->>> x.f2(1, 2) ->>> x.g2(1, 2) ->>> x.f3(1, 2, 3) ->>> x.g3(1, 2, 3) ->>> x.f4(1, 2, 3, 4) ->>> x.g4(1, 2, 3, 4) ->>> x.f5(1, 2, 3, 4, 5) ->>> x.g5(1, 2, 3, 4, 5) ->>> x.f6(1, 2, 3, 4, 5, 6) ->>> x.g6(1, 2, 3, 4, 5, 6) ->>> x.f7(1, 2, 3, 4, 5, 6, 7) ->>> x.g7(1, 2, 3, 4, 5, 6, 7) ->>> x.f8(1, 2, 3, 4, 5, 6, 7, 8) ->>> x.g8(1, 2, 3, 4, 5, 6, 7, 8) ->>> x.hash -2155 ->>> x = X__fastcall() ->>> x.f0() ->>> x.g0() ->>> x.f1(1) ->>> x.g1(1) ->>> x.f2(1, 2) ->>> x.g2(1, 2) ->>> x.f3(1, 2, 3) ->>> x.g3(1, 2, 3) ->>> x.f4(1, 2, 3, 4) ->>> x.g4(1, 2, 3, 4) ->>> x.f5(1, 2, 3, 4, 5) ->>> x.g5(1, 2, 3, 4, 5) ->>> x.f6(1, 2, 3, 4, 5, 6) ->>> x.g6(1, 2, 3, 4, 5, 6) ->>> x.f7(1, 2, 3, 4, 5, 6, 7) ->>> x.g7(1, 2, 3, 4, 5, 6, 7) ->>> x.f8(1, 2, 3, 4, 5, 6, 7, 8) ->>> x.g8(1, 2, 3, 4, 5, 6, 7, 8) ->>> x.hash -2155 -""" - -def run(args = None): - import sys - import doctest - - if args is not None: - sys.argv = args - return doctest.testmod(sys.modules.get(__name__)) - -if __name__ == '__main__': - print "running..." - import sys - status = run()[0] - if (status == 0): print "Done." - sys.exit(status) diff --git a/test/class.cpp b/test/class.cpp deleted file mode 100644 index 078bebdf..00000000 --- a/test/class.cpp +++ /dev/null @@ -1,28 +0,0 @@ -// 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 -#include -#include -#include - -using namespace boost::python; - -struct X -{ - int x; - X(int n) : x(n) { } -}; - -int x_function(X& x) -{ return x.x; -} - - -BOOST_PYTHON_MODULE(class_ext) -{ - class_("X", init()); - def("x_function", x_function); -} - -#include "module_tail.cpp" diff --git a/test/class.py b/test/class.py deleted file mode 100755 index d68ff437..00000000 --- a/test/class.py +++ /dev/null @@ -1,40 +0,0 @@ -# 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) -''' ->>> from class_ext import * - -Ensure sanity: - - >>> x = X(42) - >>> x_function(x) - 42 - -Demonstrate extraction in the presence of metaclass changes: - - >>> class MetaX(X.__class__): - ... def __new__(cls, *args): - ... return super(MetaX, cls).__new__(cls, *args) - >>> class XPlusMetatype(X): - ... __metaclass__ = MetaX - >>> x = XPlusMetatype(42) - >>> x_function(x) - 42 - - -''' - -def run(args = None): - import sys - import doctest - - if args is not None: - sys.argv = args - return doctest.testmod(sys.modules.get(__name__)) - -if __name__ == '__main__': - print "running..." - import sys - status = run()[0] - if (status == 0): print "Done." - sys.exit(status) diff --git a/test/cltree.cpp b/test/cltree.cpp deleted file mode 100755 index 518ae37f..00000000 --- a/test/cltree.cpp +++ /dev/null @@ -1,74 +0,0 @@ -// Copyright David Abrahams 2005. 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 -#include -#include -#include - -/* Non-modifiable definitions */ - -class basic { -public: - basic() { name = "cltree.basic"; } - std::string repr() { return name+"()"; } -protected: - std::string name; -}; - -class constant: public basic { -public: - constant() { name = "cltree.constant"; } -}; - -class symbol: public basic { -public: - symbol() { name = "cltree.symbol"; } -}; - -class variable: public basic { -public: - variable() { name = "cltree.variable"; } -}; - -/* EOF: Non-modifiable definitions */ - -class symbol_wrapper: public symbol { -public: - symbol_wrapper(PyObject* /*self*/): symbol() { - name = "cltree.wrapped_symbol"; - } -}; - -class variable_wrapper: public variable { -public: - variable_wrapper(PyObject* /*self*/): variable() { - name = "cltree.wrapped_variable"; - } - - // This constructor is introduced only because cannot use - // boost::noncopyable, see below. - variable_wrapper(PyObject* /*self*/,variable v): variable(v) {} - -}; - -BOOST_PYTHON_MODULE(cltree) -{ - boost::python::class_("basic") - .def("__repr__",&basic::repr) - ; - - boost::python::class_, boost::noncopyable>("constant") - ; - - - boost::python::class_("symbol") - ; - - boost::python::class_, variable_wrapper>("variable") - ; -} - -#include "module_tail.cpp" - diff --git a/test/complicated.hpp b/test/complicated.hpp deleted file mode 100644 index 5ff19aea..00000000 --- a/test/complicated.hpp +++ /dev/null @@ -1,38 +0,0 @@ -// Copyright David Abrahams 2001. -// 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 COMPLICATED_DWA20011215_HPP -# define COMPLICATED_DWA20011215_HPP -# include - -# include "simple_type.hpp" - -struct complicated -{ - complicated(simple const&, int = 0); - ~complicated(); - - int get_n() const; - - char* s; - int n; -}; - -inline complicated::complicated(simple const&s, int _n) - : s(s.s), n(_n) -{ - std::cout << "constructing complicated: " << this->s << ", " << _n << std::endl; -} - -inline complicated::~complicated() -{ - std::cout << "destroying complicated: " << this->s << ", " << n << std::endl; -} - -inline int complicated::get_n() const -{ - return n; -} - -#endif // COMPLICATED_DWA20011215_HPP diff --git a/test/const_argument.cpp b/test/const_argument.cpp deleted file mode 100644 index 279c3dc1..00000000 --- a/test/const_argument.cpp +++ /dev/null @@ -1,28 +0,0 @@ -/* Copyright 2004 Jonathan Brandmeyer - * Use, modification and distribution are subject to 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) - * - * The purpose of this test is to determine if a function can be called from - * Python with a const value type as an argument, and whether or not the - * presence of a prototype without the cv-qualifier will work around the - * compiler's bug. - */ -#include -using namespace boost::python; - - -#if BOOST_WORKAROUND(BOOST_MSVC, == 1200) -bool accept_const_arg( object ); -#endif - -bool accept_const_arg( const object ) -{ - return true; -} - - -BOOST_PYTHON_MODULE( const_argument_ext ) -{ - def( "accept_const_arg", accept_const_arg ); -} diff --git a/test/const_argument.py b/test/const_argument.py deleted file mode 100644 index 15e87e80..00000000 --- a/test/const_argument.py +++ /dev/null @@ -1,23 +0,0 @@ -# Copyright Jonathan Brandmeyer, 2004. 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) -""" ->>> from const_argument_ext import * ->>> accept_const_arg(1) -1 -""" - -def run(args = None): - import sys - import doctest - - if args is not None: - sys.argv = args - return doctest.testmod(sys.modules.get(__name__)) - -if __name__ == '__main__': - print "running..." - import sys - status = run()[0] - if (status == 0): print "Done." - sys.exit(status) diff --git a/test/copy_ctor_mutates_rhs.cpp b/test/copy_ctor_mutates_rhs.cpp deleted file mode 100755 index 41eac495..00000000 --- a/test/copy_ctor_mutates_rhs.cpp +++ /dev/null @@ -1,23 +0,0 @@ -// 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) -#include -#include -#include -#include - -struct foo -{ - operator std::auto_ptr&() const; -}; - -int main() -{ - using namespace boost::python::detail; - BOOST_STATIC_ASSERT(!copy_ctor_mutates_rhs::value); - BOOST_STATIC_ASSERT(copy_ctor_mutates_rhs >::value); - BOOST_STATIC_ASSERT(!copy_ctor_mutates_rhs::value); - BOOST_STATIC_ASSERT(!copy_ctor_mutates_rhs::value); - return 0; -} diff --git a/test/crossmod_exception.py b/test/crossmod_exception.py deleted file mode 100644 index dd50dae2..00000000 --- a/test/crossmod_exception.py +++ /dev/null @@ -1,19 +0,0 @@ -# Copyright (C) 2003 Rational Discovery LLC. 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) - -print "running..." - -import crossmod_exception_a -import crossmod_exception_b - -try: - crossmod_exception_b.tossit() -except IndexError: - pass -try: - crossmod_exception_a.tossit() -except IndexError: - pass - -print "Done." diff --git a/test/crossmod_exception_a.cpp b/test/crossmod_exception_a.cpp deleted file mode 100755 index 9526129a..00000000 --- a/test/crossmod_exception_a.cpp +++ /dev/null @@ -1,18 +0,0 @@ -// Copyright (C) 2003 Rational Discovery LLC -// 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 - -namespace python = boost::python; - -void tossit(){ - PyErr_SetString(PyExc_IndexError,"a-blah!"); - throw python::error_already_set(); -} - -BOOST_PYTHON_MODULE(crossmod_exception_a) -{ - python::def("tossit",tossit); -} diff --git a/test/crossmod_exception_b.cpp b/test/crossmod_exception_b.cpp deleted file mode 100755 index e2ea491c..00000000 --- a/test/crossmod_exception_b.cpp +++ /dev/null @@ -1,18 +0,0 @@ -// Copyright (C) 2003 Rational Discovery LLC -// 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 - -namespace python = boost::python; - -void tossit(){ - PyErr_SetString(PyExc_IndexError,"b-blah!"); - throw python::error_already_set(); -} - -BOOST_PYTHON_MODULE(crossmod_exception_b) -{ - python::def("tossit",tossit); -} diff --git a/test/crossmod_opaque.py b/test/crossmod_opaque.py deleted file mode 100644 index a7a3cf2c..00000000 --- a/test/crossmod_opaque.py +++ /dev/null @@ -1,16 +0,0 @@ -# -*- coding: latin-1 -*- -# Copyright Gottfried Ganauge 2006. -# 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) - -if __name__ == '__main__': - print "running..." - - import crossmod_opaque_a - import crossmod_opaque_b - - crossmod_opaque_a.get() - crossmod_opaque_b.get() - - print "Done." diff --git a/test/crossmod_opaque_a.cpp b/test/crossmod_opaque_a.cpp deleted file mode 100644 index 80283f47..00000000 --- a/test/crossmod_opaque_a.cpp +++ /dev/null @@ -1,26 +0,0 @@ -// Copyright Gottfried Ganauge 2006. -// 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 -# include -# include -# include - -typedef struct opaque_ *opaque; - -opaque the_op = ((opaque) 0x47110815); - -opaque get() { return the_op; } - -BOOST_PYTHON_OPAQUE_SPECIALIZED_TYPE_ID(opaque_) - -namespace bpl = boost::python; - -BOOST_PYTHON_MODULE(crossmod_opaque_a) -{ - bpl::def ( - "get", - &::get, - bpl::return_value_policy()); -} diff --git a/test/crossmod_opaque_b.cpp b/test/crossmod_opaque_b.cpp deleted file mode 100644 index 1e3e18bc..00000000 --- a/test/crossmod_opaque_b.cpp +++ /dev/null @@ -1,26 +0,0 @@ -// Copyright Gottfried Ganauge 2006. -// 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 -# include -# include -# include - -typedef struct opaque_ *opaque; - -opaque the_op = ((opaque) 0x47110815); - -opaque get() { return the_op; } - -BOOST_PYTHON_OPAQUE_SPECIALIZED_TYPE_ID(opaque_) - -namespace bpl = boost::python; - -BOOST_PYTHON_MODULE(crossmod_opaque_b) -{ - bpl::def ( - "get", - &::get, - bpl::return_value_policy()); -} diff --git a/test/data_members.cpp b/test/data_members.cpp deleted file mode 100644 index 6d2cc7bd..00000000 --- a/test/data_members.cpp +++ /dev/null @@ -1,132 +0,0 @@ -// 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 -#include -#include -#include -#include "test_class.hpp" - -#if defined(_AIX) && defined(__EDG_VERSION__) && __EDG_VERSION__ < 245 -# include // works around a KCC intermediate code generation bug -#endif - - -using namespace boost::python; - -typedef test_class<> X; - -struct Y : test_class<1> -{ - Y(int v) : test_class<1>(v) {} - Y& operator=(Y const& rhs) { x = rhs.x; return *this; } - bool q; -}; - -double get_fair_value(X const& x) { return x.value(); } - - -struct VarBase -{ - VarBase(std::string name_) : name(name_) {} - - std::string const name; - std::string get_name1() const { return name; } - -}; - -struct Var : VarBase -{ - Var(std::string name_) : VarBase(name_), value(), name2(name.c_str()), y(6) {} - std::string const& get_name2() const { return name; } - float value; - char const* name2; - Y y; - - static int static1; - static Y static2; -}; - -int Var::static1 = 0; -Y Var::static2(0); - -// Compilability regression tests -namespace boost_python_test -{ - struct trivial - { - trivial() : value(123) {} - double value; - }; - - struct Color3 - { - static const Color3 black; - }; - - const Color3 Color3::black -#if !BOOST_WORKAROUND(BOOST_MSVC, <= 1300) - = {} -#endif - ; - - void compilability_test() - { - class_("trivial") - .add_property("property", make_getter(&trivial::value, return_value_policy())) - .def_readonly("readonly", &trivial::value) - ; - - class_< Color3 >("Color3", init< const Color3 & >()) - .def_readonly("BLACK", &Color3::black) // line 17 - ; - } -} - -BOOST_PYTHON_MODULE(data_members_ext) -{ - using namespace boost_python_test; - class_("X", init()) - .def("value", &X::value) - .def("set", &X::set) - .def_readonly("x", &X::x) - .add_property("fair_value", get_fair_value) - ; - - class_("Y", init()) - .def("value", &Y::value) - .def("set", &Y::set) - .def_readwrite("x", &Y::x) - .def_readwrite("q", &Y::q) - ; - - class_("Var", init()) - .def_readonly("name", &Var::name) - .def_readonly("name2", &Var::name2) - .def_readwrite("value", &Var::value) - .def_readonly("y", &Var::y) - - // Test return_by_value for plain values and for - // pointers... return_by_value was implemented as a - // side-effect of implementing data member support, so it made - // sense to add the test here. - .def("get_name1", &Var::get_name1, return_value_policy()) - .def("get_name2", &Var::get_name2, return_value_policy()) - - .add_property("name3", &Var::get_name1) - - // Test static data members - .def_readonly("ro1a", &Var::static1) - .def_readonly("ro1b", Var::static1) - .def_readwrite("rw1a", &Var::static1) - .def_readwrite("rw1b", Var::static1) - - .def_readonly("ro2a", &Var::static2) - .def_readonly("ro2b", Var::static2) - .def_readwrite("rw2a", &Var::static2) - .def_readwrite("rw2b", Var::static2) - ; -} - -#include "module_tail.cpp" diff --git a/test/data_members.py b/test/data_members.py deleted file mode 100644 index 70784853..00000000 --- a/test/data_members.py +++ /dev/null @@ -1,215 +0,0 @@ -# Copyright David Abrahams 2004. 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) -''' ->>> from data_members_ext import * - - ---- Test static data members --- - ->>> v = Var('slim shady') - ->>> Var.ro2a.x -0 ->>> Var.ro2b.x -0 ->>> Var.rw2a.x -0 ->>> Var.rw2b.x -0 ->>> v.ro2a.x -0 ->>> v.ro2b.x -0 ->>> v.rw2a.x -0 ->>> v.rw2b.x -0 ->>> Var.rw2a.x = 777 ->>> Var.ro2a.x -777 ->>> Var.ro2b.x -777 ->>> Var.rw2a.x -777 ->>> Var.rw2b.x -777 ->>> v.ro2a.x -777 ->>> v.ro2b.x -777 ->>> v.rw2a.x -777 ->>> v.rw2b.x -777 ->>> Var.rw2b = Y(888) - ->>> y = Y(99) ->>> y.q = True ->>> y.q -True ->>> y.q = False ->>> y.q -False - ->>> Var.ro2a.x -888 ->>> Var.ro2b.x -888 ->>> Var.rw2a.x -888 ->>> Var.rw2b.x -888 ->>> v.ro2a.x -888 ->>> v.ro2b.x -888 ->>> v.rw2a.x -888 ->>> v.rw2b.x -888 ->>> v.rw2b.x = 999 ->>> Var.ro2a.x -999 ->>> Var.ro2b.x -999 ->>> Var.rw2a.x -999 ->>> Var.rw2b.x -999 ->>> v.ro2a.x -999 ->>> v.ro2b.x -999 ->>> v.rw2a.x -999 ->>> v.rw2b.x -999 - - ->>> Var.ro1a -0 ->>> Var.ro1b -0 ->>> Var.rw1a -0 ->>> Var.rw1b -0 ->>> v.ro1a -0 ->>> v.ro1b -0 ->>> v.rw1a -0 ->>> v.rw1b -0 ->>> Var.rw1a = 777 ->>> Var.ro1a -777 ->>> Var.ro1b -777 ->>> Var.rw1a -777 ->>> Var.rw1b -777 ->>> v.ro1a -777 ->>> v.ro1b -777 ->>> v.rw1a -777 ->>> v.rw1b -777 ->>> Var.rw1b = 888 ->>> Var.ro1a -888 ->>> Var.ro1b -888 ->>> Var.rw1a -888 ->>> Var.rw1b -888 ->>> v.ro1a -888 ->>> v.ro1b -888 ->>> v.rw1a -888 ->>> v.rw1b -888 ->>> v.rw1b = 999 ->>> Var.ro1a -999 ->>> Var.ro1b -999 ->>> Var.rw1a -999 ->>> Var.rw1b -999 ->>> v.ro1a -999 ->>> v.ro1b -999 ->>> v.rw1a -999 ->>> v.rw1b -999 - - - - ----------------- - ->>> x = X(42) ->>> x.x -42 ->>> try: x.x = 77 -... except AttributeError: pass -... else: print 'no error' - ->>> x.fair_value -42.0 ->>> y = Y(69) ->>> y.x -69 ->>> y.x = 77 ->>> y.x -77 - ->>> v = Var("pi") ->>> v.value = 3.14 ->>> v.name -'pi' ->>> v.name2 -'pi' - ->>> v.get_name1() -'pi' - ->>> v.get_name2() -'pi' - ->>> v.y.x -6 ->>> v.y.x = -7 ->>> v.y.x --7 - ->>> v.name3 -'pi' - - -''' - -def run(args = None): - import sys - import doctest - - if args is not None: - sys.argv = args - return doctest.testmod(sys.modules.get(__name__)) - -if __name__ == '__main__': - print "running..." - import sys - status = run()[0] - if (status == 0): print "Done." - sys.exit(status) diff --git a/test/defaults.cpp b/test/defaults.cpp deleted file mode 100644 index 6d87e5d6..00000000 --- a/test/defaults.cpp +++ /dev/null @@ -1,173 +0,0 @@ -// 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 -#include -#include -#include -#include -#include -#include - -#if defined(_AIX) && defined(__EDG_VERSION__) && __EDG_VERSION__ < 245 -# include // works around a KCC intermediate code generation bug -#endif - -using namespace boost::python; -namespace bpl = boost::python; - -char const* const format = "int(%s); char(%s); string(%s); double(%s); "; - -/////////////////////////////////////////////////////////////////////////////// -// -// Overloaded functions -// -/////////////////////////////////////////////////////////////////////////////// -object -bar(int a, char b, std::string c, double d) -{ - return format % bpl::make_tuple(a, b, c, d); -} - -object -bar(int a, char b, std::string c) -{ - return format % bpl::make_tuple(a, b, c, 0.0); -} - -object -bar(int a, char b) -{ - return format % bpl::make_tuple(a, b, "default", 0.0); -} - -object -bar(int a) -{ - return format % bpl::make_tuple(a, 'D', "default", 0.0); -} - -BOOST_PYTHON_FUNCTION_OVERLOADS(bar_stubs, bar, 1, 4) - -/////////////////////////////////////////////////////////////////////////////// -// -// Functions with default arguments -// -/////////////////////////////////////////////////////////////////////////////// -object -foo(int a, char b = 'D', std::string c = "default", double d = 0.0) -{ - return format % bpl::make_tuple(a, b, c, d); -} - -BOOST_PYTHON_FUNCTION_OVERLOADS(foo_stubs, foo, 1, 4) - -/////////////////////////////////////////////////////////////////////////////// -// -// Overloaded member functions with default arguments -// -/////////////////////////////////////////////////////////////////////////////// -struct Y { - - Y() {} - - object - get_state() const - { - return format % bpl::make_tuple(a, b, c, d); - } - - int a; char b; std::string c; double d; -}; - - -struct X { - - X() {} - - X(int a, char b = 'D', std::string c = "constructor", double d = 0.0) - : state(format % bpl::make_tuple(a, b, c, d)) - {} - - X(std::string s, bool b) - : state("Got exactly two arguments from constructor: string(%s); bool(%s); " % bpl::make_tuple(s, b*1)) - {} - - object - bar(int a, char b = 'D', std::string c = "default", double d = 0.0) const - { - return format % bpl::make_tuple(a, b, c, d); - } - - Y const& - bar2(int a = 0, char b = 'D', std::string c = "default", double d = 0.0) - { - // tests zero arg member function and return_internal_reference policy - y.a = a; - y.b = b; - y.c = c; - y.d = d; - return y; - } - - object - foo(int a, bool b=false) const - { - return "int(%s); bool(%s); " % bpl::make_tuple(a, b*1); - } - - object - foo(std::string a, bool b=false) const - { - return "string(%s); bool(%s); " % bpl::make_tuple(a, b*1); - } - - object - foo(list a, list b, bool c=false) const - { - return "list(%s); list(%s); bool(%s); " % bpl::make_tuple(a, b, c*1); - } - - object - get_state() const - { - return state; - } - - Y y; - object state; -}; - -BOOST_PYTHON_MEMBER_FUNCTION_OVERLOADS(X_bar_stubs, bar, 1, 4) -BOOST_PYTHON_MEMBER_FUNCTION_OVERLOADS(X_bar_stubs2, bar2, 0, 4) -BOOST_PYTHON_MEMBER_FUNCTION_OVERLOADS(X_foo_2_stubs, foo, 1, 2) -BOOST_PYTHON_MEMBER_FUNCTION_OVERLOADS(X_foo_3_stubs, foo, 2, 3) - -/////////////////////////////////////////////////////////////////////////////// - -BOOST_PYTHON_MODULE(defaults_ext) -{ - def("foo", foo, foo_stubs()); - def("bar", (object(*)(int, char, std::string, double))0, bar_stubs()); - - class_("Y", init<>("doc of Y init")) // this should work - .def("get_state", &Y::get_state) - ; - - class_("X",no_init) - - .def(init >("doc of init", args("self", "a", "b", "c", "d"))) - .def(init(args("self", "s", "b"))[default_call_policies()]) // what's a good policy here? - .def("get_state", &X::get_state) - .def("bar", &X::bar, X_bar_stubs()) - .def("bar2", &X::bar2, X_bar_stubs2("doc of X::bar2")[return_internal_reference<>()]) - .def("foo", (object(X::*)(std::string, bool) const)0, X_foo_2_stubs()) - .def("foo", (object(X::*)(int, bool) const)0, X_foo_2_stubs()) - .def("foo", (object(X::*)(list, list, bool) const)0, X_foo_3_stubs()) - ; -} - -#include "module_tail.cpp" - diff --git a/test/defaults.py b/test/defaults.py deleted file mode 100644 index cd51a4a4..00000000 --- a/test/defaults.py +++ /dev/null @@ -1,140 +0,0 @@ -# Copyright David Abrahams 2004. 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) -""" ->>> from defaults_ext import * ->>> bar(1) -'int(1); char(D); string(default); double(0.0); ' - ->>> bar(2, 'X') -'int(2); char(X); string(default); double(0.0); ' - ->>> bar(3, 'Y', "Hello World") -'int(3); char(Y); string(Hello World); double(0.0); ' - ->>> bar(4, 'Z', "Hi There", 3.3) -'int(4); char(Z); string(Hi There); double(3.3); ' - ->>> foo(1) -'int(1); char(D); string(default); double(0.0); ' - ->>> foo(2, 'X') -'int(2); char(X); string(default); double(0.0); ' - ->>> foo(3, 'Y', "Hello World") -'int(3); char(Y); string(Hello World); double(0.0); ' - ->>> foo(4, 'Z', "Hi There", 3.3) -'int(4); char(Z); string(Hi There); double(3.3); ' - ->>> x = X() ->>> x.bar(1) -'int(1); char(D); string(default); double(0.0); ' - ->>> x.bar(2, 'X') -'int(2); char(X); string(default); double(0.0); ' - ->>> x.bar(3, 'Y', "Hello World") -'int(3); char(Y); string(Hello World); double(0.0); ' - ->>> x.bar(4, 'Z', "Hi There", 3.3) -'int(4); char(Z); string(Hi There); double(3.3); ' - ->>> x.foo(5) -'int(5); bool(0); ' - ->>> x.foo(6, 0) -'int(6); bool(0); ' - ->>> x.foo(7, 1) -'int(7); bool(1); ' - ->>> x.foo("A") -'string(A); bool(0); ' - ->>> x.foo("B", False) -'string(B); bool(0); ' - ->>> x.foo("C", True) -'string(C); bool(1); ' - ->>> x.foo([0,1,2], [2,3,4]) -'list([0, 1, 2]); list([2, 3, 4]); bool(0); ' - ->>> x.foo([0,1,2], [2,3,4], False) -'list([0, 1, 2]); list([2, 3, 4]); bool(0); ' - ->>> x.foo([0,1,2], [2,3,4], True) -'list([0, 1, 2]); list([2, 3, 4]); bool(1); ' - ->>> x = X(1) ->>> x.get_state() -'int(1); char(D); string(constructor); double(0.0); ' - ->>> x = X(1, 'X') ->>> x.get_state() -'int(1); char(X); string(constructor); double(0.0); ' - ->>> x = X(1, 'X', "Yabadabadoo") ->>> x.get_state() -'int(1); char(X); string(Yabadabadoo); double(0.0); ' - ->>> x = X(1, 'X', "Phoenix", 3.65) ->>> x.get_state() -'int(1); char(X); string(Phoenix); double(3.65); ' - ->>> x.bar2().get_state() -'int(0); char(D); string(default); double(0.0); ' - ->>> x.bar2(1).get_state() -'int(1); char(D); string(default); double(0.0); ' - ->>> x.bar2(1, 'K').get_state() -'int(1); char(K); string(default); double(0.0); ' - ->>> x.bar2(1, 'K', "Kim").get_state() -'int(1); char(K); string(Kim); double(0.0); ' - ->>> x.bar2(1, 'K', "Kim", 9.9).get_state() -'int(1); char(K); string(Kim); double(9.9); ' - ->>> x = X("Phoenix", 1) ->>> x.get_state() -'Got exactly two arguments from constructor: string(Phoenix); bool(1); ' - ->>> def selected_doc(obj, *args): -... doc = obj.__doc__.splitlines() -... return "\\n".join(["|"+doc[i] for i in args]) - ->>> print selected_doc(X.__init__, 1, 2, 4, 7, 9) -|__init__( (object)self [, (int)a [, (str)b [, (str)c [, (float)d]]]]) -> None : -| doc of init -| C++ signature : -|__init__( (object)self, (str)s, (bool)b) -> None : -| C++ signature : - ->>> print selected_doc(Y.__init__, 1, 2, 4) -|__init__( (object)arg1) -> None : -| doc of Y init -| C++ signature : - ->>> print selected_doc(X.bar2, 1, 2, 4) -|bar2( (X)arg1 [, (int)arg2 [, (str)arg3 [, (str)arg4 [, (float)arg5]]]]) -> Y : -| doc of X::bar2 -| C++ signature : - -""" -def run(args = None): - import sys - import doctest - - if args is not None: - sys.argv = args - return doctest.testmod(sys.modules.get(__name__)) - -if __name__ == '__main__': - print "running..." - import sys - status = run()[0] - if (status == 0): print "Done." - sys.exit(status) diff --git a/test/destroy_test.cpp b/test/destroy_test.cpp deleted file mode 100644 index cae95ae9..00000000 --- a/test/destroy_test.cpp +++ /dev/null @@ -1,59 +0,0 @@ -// Copyright David Abrahams 2004. 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 - -#include - -int count; -int marks[] = { - -1 - , -1, -1 - , -1, -1, -1, -1 - , -1 -}; -int* kills = marks; - -struct foo -{ - foo() : n(count++) {} - ~foo() - { - *kills++ = n; - } - int n; - - // This used to cause compiler errors with MSVC 9.0. - foo& operator~(); - foo& T(); -}; - -void assert_destructions(int n) -{ - for (int i = 0; i < n; ++i) - BOOST_TEST(marks[i] == i); - BOOST_TEST(marks[n] == -1); -} - -int main() -{ - assert_destructions(0); - typedef int a[2]; - - foo* f1 = new foo; - boost::python::detail::destroy_referent(f1); - assert_destructions(1); - - foo* f2 = new foo[2]; - typedef foo x[2]; - - boost::python::detail::destroy_referent(f2); - assert_destructions(3); - - typedef foo y[2][2]; - x* f3 = new y; - boost::python::detail::destroy_referent(f3); - assert_destructions(7); - - return boost::report_errors(); -} diff --git a/test/dict.cpp b/test/dict.cpp deleted file mode 100644 index 375905d6..00000000 --- a/test/dict.cpp +++ /dev/null @@ -1,91 +0,0 @@ -// Copyright David Abrahams 2004. 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 -#define BOOST_ENABLE_ASSERT_HANDLER -#include - -#include -#include -#include -#include -#include - -using namespace boost::python; - -object new_dict() -{ - return dict(); -} - -object data_dict() -{ - dict tmp1; - tmp1["key1"] = "value1"; - - dict tmp2; - tmp2["key2"] = "value2"; - tmp1[1] = tmp2; - return tmp1; -} - -object dict_from_sequence(object sequence) -{ - return dict(sequence); -} - -object dict_keys(dict data) -{ - return data.keys(); -} - -object dict_values(dict data) -{ - return data.values(); -} - -object dict_items(dict data) -{ - return data.items(); -} - -void work_with_dict(dict data1, dict data2) -{ - if (!data1.has_key("k1")) { - throw std::runtime_error("dict does not have key 'k1'"); - } - data1.update(data2); -} - -void test_templates(object print) -{ - std::string key = "key"; - - dict tmp; - tmp[1] = "a test string"; - print(tmp.get(1)); - //print(tmp[1]); - tmp[1.5] = 13; - print(tmp.get(1.5)); - print(tmp.get(44)); - print(tmp); - print(tmp.get(2,"default")); - print(tmp.setdefault(3,"default")); - - BOOST_ASSERT(!tmp.has_key(key)); - //print(tmp[3]); -} - -BOOST_PYTHON_MODULE(dict_ext) -{ - def("new_dict", new_dict); - def("data_dict", data_dict); - def("dict_keys", dict_keys); - def("dict_values", dict_values); - def("dict_items", dict_items); - def("dict_from_sequence", dict_from_sequence); - def("work_with_dict", work_with_dict); - def("test_templates", test_templates); -} - -#include "module_tail.cpp" diff --git a/test/dict.py b/test/dict.py deleted file mode 100644 index a321beea..00000000 --- a/test/dict.py +++ /dev/null @@ -1,45 +0,0 @@ -# Copyright David Abrahams 2004. 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) -""" ->>> from dict_ext import * ->>> def printer(*args): -... for x in args: print x, -... print -... ->>> print new_dict() -{} ->>> print data_dict() -{1: {'key2': 'value2'}, 'key1': 'value1'} ->>> tmp = data_dict() ->>> print dict_keys(tmp) -[1, 'key1'] ->>> print dict_values(tmp) -[{'key2': 'value2'}, 'value1'] ->>> print dict_items(tmp) -[(1, {'key2': 'value2'}), ('key1', 'value1')] ->>> print dict_from_sequence([(1,1),(2,2),(3,3)]) -{1: 1, 2: 2, 3: 3} ->>> test_templates(printer) #doctest: +NORMALIZE_WHITESPACE -a test string -13 -None -{1.5: 13, 1: 'a test string'} -default -default -""" - -def run(args = None): - import sys - import doctest - - if args is not None: - sys.argv = args - return doctest.testmod(sys.modules.get(__name__)) - -if __name__ == '__main__': - print "running..." - import sys - status = run()[0] - if (status == 0): print "Done." - sys.exit(status) diff --git a/test/docstring.cpp b/test/docstring.cpp deleted file mode 100644 index c6cc0252..00000000 --- a/test/docstring.cpp +++ /dev/null @@ -1,116 +0,0 @@ -// 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 -#include -#include -#include -#include -#include -#include -#include "test_class.hpp" - -// Just use math.h here; trying to use std::pow() causes too much -// trouble for non-conforming compilers and libraries. -#include - -using namespace boost::python; - -typedef test_class<> X; - -X* create(int x) -{ - return new X(x); -} - -unsigned long fact(unsigned long n) -{ - return n <= 1 ? n : n * fact(n - 1); -} - -BOOST_PYTHON_MODULE(docstring_ext) -{ - scope().attr("__doc__") = - "A simple test module for documentation strings\n" - "Exercised by docstring.py" - ; - - class_("X", - "A simple class wrapper around a C++ int\n" - "includes some error-checking" - - , init( - "this is the __init__ function\n" - "its documentation has two lines." - , args("self", "value") - ) - - ) - .def("value", &X::value, - "gets the value of the object" - , args("self")) - .def( "value", &X::value, - "also gets the value of the object" - , args("self")) - ; - - def("create", create, return_value_policy(), - "creates a new X object", args("value")); - - def("fact", fact, "compute the factorial", args("n")); - - { - docstring_options doc_options; - doc_options.disable_user_defined(); - def("fact_usr_off_1", fact, "usr off 1", args("n")); - doc_options.enable_user_defined(); - def("fact_usr_on_1", fact, "usr on 1", args("n")); - doc_options.disable_user_defined(); - def("fact_usr_off_2", fact, "usr off 2", args("n")); - } - def("fact_usr_on_2", fact, "usr on 2", args("n")); - - { - docstring_options doc_options(true, false); - def("fact_sig_off_1", fact, "sig off 1", args("n")); - doc_options.enable_signatures(); - def("fact_sig_on_1", fact, "sig on 1", args("n")); - doc_options.disable_signatures(); - def("fact_sig_off_2", fact, "sig off 2", args("n")); - } - def("fact_sig_on_2", fact, "sig on 2", args("n")); - - { - docstring_options doc_options(false); - def("fact_usr_off_sig_off_1", fact, "usr off sig off 1", args("n")); - { - docstring_options nested_doc_options; - def("fact_usr_on_sig_on_1", fact, "usr on sig on 1", args("n")); - nested_doc_options.disable_all(); - nested_doc_options.enable_user_defined(); - def("fact_usr_on_sig_off_1", fact, "usr on sig off 1", args("n")); - nested_doc_options.enable_all(); - def("fact_usr_on_sig_on_2", fact, "usr on sig on 2", args("n")); - } - def("fact_usr_off_sig_off_2", fact, "usr off sig off 2", args("n")); - } - - { - docstring_options doc_options(true); - doc_options.disable_cpp_signatures(); - def("fact_usr_on_psig_on_csig_off_1", fact, "usr on psig on csig off 1", args("n")); - doc_options.enable_cpp_signatures(); - doc_options.disable_py_signatures(); - def("fact_usr_on_psig_off_csig_on_1", fact, "usr on psig off csig on 1", args("n")); - doc_options.enable_py_signatures(); - doc_options.disable_user_defined(); - doc_options.disable_cpp_signatures(); - def("fact_usr_off_psig_on_csig_off_1", fact, "usr off psig on csig off 1", args("n")); - doc_options.enable_cpp_signatures(); - doc_options.disable_py_signatures(); - def("fact_usr_off_psig_off_csig_on_1", fact, "usr off psig off csig on 1", args("n")); - } -} - -#include "module_tail.cpp" diff --git a/test/docstring.py b/test/docstring.py deleted file mode 100644 index 528ce845..00000000 --- a/test/docstring.py +++ /dev/null @@ -1,153 +0,0 @@ -# Copyright David Abrahams & Ralf W. Grosse-Kunsteve 2004-2006. -# 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) -''' ->>> from docstring_ext import * - ->>> def selected_doc(obj, *args): -... doc = obj.__doc__.splitlines() -... return "\\n".join(["|"+doc[i] for i in args]) - ->>> print selected_doc(X.__init__, 1, 2, 3, 4, 5) -|__init__( (object)self, (int)value) -> None : -| this is the __init__ function -| its documentation has two lines. -| -| C++ signature : - ->>> print selected_doc(X.value, 1, 2, 4, 7, 8, 10) -|value( (X)self) -> int : -| gets the value of the object -| C++ signature : -|value( (X)self) -> int : -| also gets the value of the object -| C++ signature : - ->>> print selected_doc(create, 1, 2, 3, 4) -|create( (int)value) -> X : -| creates a new X object -| -| C++ signature : - ->>> print selected_doc(fact, 1, 2, 3, 4) -|fact( (int)n) -> int : -| compute the factorial -| -| C++ signature : - ->>> len(fact_usr_off_1.__doc__.splitlines()) -5 ->>> print selected_doc(fact_usr_off_1, 1, 3) -|fact_usr_off_1( (int)n) -> int : -| C++ signature : ->>> len(fact_usr_on_1.__doc__.splitlines()) -6 ->>> print selected_doc(fact_usr_on_1, 1, 2, 4) -|fact_usr_on_1( (int)n) -> int : -| usr on 1 -| C++ signature : ->>> len(fact_usr_off_2.__doc__.splitlines()) -5 ->>> print selected_doc(fact_usr_off_2, 1, 3) -|fact_usr_off_2( (int)n) -> int : -| C++ signature : ->>> len(fact_usr_on_2.__doc__.splitlines()) -6 ->>> print selected_doc(fact_usr_on_2, 1, 2, 4) -|fact_usr_on_2( (int)n) -> int : -| usr on 2 -| C++ signature : - - ->>> len(fact_sig_off_1.__doc__.splitlines()) -2 ->>> print selected_doc(fact_sig_off_1, 1) -|sig off 1 ->>> len(fact_sig_on_1.__doc__.splitlines()) -6 ->>> print selected_doc(fact_sig_on_1, 1, 2, 4) -|fact_sig_on_1( (int)n) -> int : -| sig on 1 -| C++ signature : - ->>> len(fact_sig_off_2.__doc__.splitlines()) -2 ->>> print selected_doc(fact_sig_off_2, 1) -|sig off 2 ->>> len(fact_sig_on_2.__doc__.splitlines()) -6 ->>> print selected_doc(fact_sig_on_2, 1, 2, 4) -|fact_sig_on_2( (int)n) -> int : -| sig on 2 -| C++ signature : - - ->>> print fact_usr_off_sig_off_1.__doc__ -None ->>> len(fact_usr_on_sig_on_1.__doc__.splitlines()) -6 ->>> print selected_doc(fact_usr_on_sig_on_1, 1, 2, 4) -|fact_usr_on_sig_on_1( (int)n) -> int : -| usr on sig on 1 -| C++ signature : - ->>> len(fact_usr_on_sig_off_1.__doc__.splitlines()) -2 ->>> print selected_doc(fact_usr_on_sig_off_1, 1) -|usr on sig off 1 ->>> len(fact_usr_on_sig_on_2.__doc__.splitlines()) -6 ->>> print selected_doc(fact_usr_on_sig_on_2, 1, 2, 4) -|fact_usr_on_sig_on_2( (int)n) -> int : -| usr on sig on 2 -| C++ signature : - ->>> print selected_doc(fact_usr_on_psig_on_csig_off_1, 1, 2) -|fact_usr_on_psig_on_csig_off_1( (int)n) -> int : -| usr on psig on csig off 1 - ->>> print selected_doc(fact_usr_on_psig_off_csig_on_1, 1, 3) -|usr on psig off csig on 1 -|C++ signature : - ->>> print fact_usr_off_psig_on_csig_off_1.__doc__.splitlines()[1] -fact_usr_off_psig_on_csig_off_1( (int)n) -> int - ->>> print selected_doc(fact_usr_off_psig_off_csig_on_1,1) -|C++ signature : - - -''' - -def run(args = None): - import sys - import doctest - - if args is not None: - sys.argv = args - - import docstring_ext - - result = doctest.testmod(sys.modules.get(__name__)) - - import pydoc - import re - docmodule = lambda m: re.sub(".\10", "", pydoc.text.docmodule(m)) - try: - print 'printing module help:' - print docmodule(docstring_ext) - except object, x: - print '********* failed **********' - print x - result = list(result) - result[0] += 1 - return tuple(result) - - return result - -if __name__ == '__main__': - print "running..." - import sys - status = run()[0] - if (status == 0): print "Done." - sys.exit(status) diff --git a/test/enable_shared_from_this.cpp b/test/enable_shared_from_this.cpp deleted file mode 100644 index c246284a..00000000 --- a/test/enable_shared_from_this.cpp +++ /dev/null @@ -1,48 +0,0 @@ -// 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 -#include -#include -#include -#include -#include -#include -#include "test_class.hpp" - -#include - -using namespace boost::python; -using boost::shared_ptr; - -class Test; -typedef shared_ptr TestPtr; - -class Test : public boost::enable_shared_from_this { -public: - static TestPtr construct() { - return TestPtr(new Test); - } - - void act() { - TestPtr kungFuDeathGrip(shared_from_this()); - } - - void take(TestPtr t) { - } -}; - -BOOST_PYTHON_MODULE(enable_shared_from_this_ext) -{ - class_("Test") - .def("construct", &Test::construct).staticmethod("construct") - .def("act", &Test::act) - .def("take", &Test::take) - ; -} - -#include "module_tail.cpp" - - diff --git a/test/enable_shared_from_this.py b/test/enable_shared_from_this.py deleted file mode 100755 index cca46ec8..00000000 --- a/test/enable_shared_from_this.py +++ /dev/null @@ -1,26 +0,0 @@ -# Copyright David Abrahams 2004. 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) -''' ->>> from enable_shared_from_this_ext import * - ->>> x = Test.construct() ->>> x.take(x) ->>> x.act() -''' - -def run(args = None): - import sys - import doctest - - if args is not None: - sys.argv = args - return doctest.testmod(sys.modules.get(__name__)) - -if __name__ == '__main__': - print "running..." - import sys - status = run()[0] - if (status == 0): print "Done." - sys.exit(status) - diff --git a/test/enum.cpp b/test/enum.cpp deleted file mode 100644 index e5c4f4fa..00000000 --- a/test/enum.cpp +++ /dev/null @@ -1,55 +0,0 @@ -// 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 -#include -#include -#include -#if BOOST_WORKAROUND(__MWERKS__, <= 0x2407) -# include -# include -#endif -using namespace boost::python; - -enum color { red = 1, green = 2, blue = 4, blood = 1 }; - -#if BOOST_WORKAROUND(__MWERKS__, <= 0x2407) -namespace boost // Pro7 has a hard time detecting enums -{ - template <> struct is_enum : boost::mpl::true_ {}; -} -#endif - -color identity_(color x) { return x; } - -struct colorized { - colorized() : x(red) {} - color x; -}; - -BOOST_PYTHON_MODULE(enum_ext) -{ - enum_("color") - .value("red", red) - .value("green", green) - .value("blue", blue) - .value("blood", blood) - .export_values() - ; - - def("identity", identity_); - -#if BOOST_WORKAROUND(__MWERKS__, <=0x2407) - color colorized::*px = &colorized::x; - class_("colorized") - .def_readwrite("x", px) - ; -#else - class_("colorized") - .def_readwrite("x", &colorized::x) - ; -#endif -} - -#include "module_tail.cpp" diff --git a/test/enum.py b/test/enum.py deleted file mode 100644 index c3ba3fe7..00000000 --- a/test/enum.py +++ /dev/null @@ -1,85 +0,0 @@ -# Copyright David Abrahams 2004. 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) -''' ->>> from enum_ext import * - ->>> identity(color.red) # in case of duplicated enums it always take the last enum -enum_ext.color.blood - ->>> identity(color.green) -enum_ext.color.green - ->>> identity(color.blue) -enum_ext.color.blue - ->>> identity(color(1)) # in case of duplicated enums it always take the last enum -enum_ext.color.blood - ->>> identity(color(2)) -enum_ext.color.green - ->>> identity(color(3)) -enum_ext.color(3) - ->>> identity(color(4)) -enum_ext.color.blue - - --- check export to scope --- - ->>> identity(red) -enum_ext.color.blood - ->>> identity(green) -enum_ext.color.green - ->>> identity(blue) -enum_ext.color.blue - ->>> try: identity(1) -... except TypeError: pass -... else: print 'expected a TypeError' - ->>> c = colorized() ->>> c.x -enum_ext.color.blood ->>> c.x = green ->>> c.x -enum_ext.color.green ->>> red == blood -True ->>> red == green -False ->>> hash(red) == hash(blood) -True ->>> hash(red) == hash(green) -False -''' - -# pickling of enums only works with Python 2.3 or higher -exercise_pickling = ''' ->>> import pickle ->>> p = pickle.dumps(color.green, pickle.HIGHEST_PROTOCOL) ->>> l = pickle.loads(p) ->>> identity(l) -enum_ext.color.green -''' - -def run(args = None): - import sys - import doctest - import pickle - - if args is not None: - sys.argv = args - self = sys.modules.get(__name__) - if (hasattr(pickle, "HIGHEST_PROTOCOL")): - self.__doc__ += exercise_pickling - return doctest.testmod(self) - -if __name__ == '__main__': - print "running..." - import sys - status = run()[0] - if (status == 0): print "Done." - sys.exit(status) diff --git a/test/exception_translator.cpp b/test/exception_translator.cpp deleted file mode 100644 index 1e91c929..00000000 --- a/test/exception_translator.cpp +++ /dev/null @@ -1,28 +0,0 @@ -// Copyright David Abrahams 2004. 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 -#include -#include - -struct error {}; - -void translate(error const& /*e*/) -{ - PyErr_SetString(PyExc_RuntimeError, "!!!error!!!"); -} - -void throw_error() -{ - throw error(); - -} - -BOOST_PYTHON_MODULE(exception_translator_ext) -{ - using namespace boost::python; - register_exception_translator(&translate); - - def("throw_error", throw_error); -} - diff --git a/test/exception_translator.py b/test/exception_translator.py deleted file mode 100644 index 9537c6f6..00000000 --- a/test/exception_translator.py +++ /dev/null @@ -1,27 +0,0 @@ -# Copyright David Abrahams 2004. 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) -''' ->>> from exception_translator_ext import * ->>> try: -... throw_error(); -... except RuntimeError, x: -... print x -... else: -... print 'Expected a RuntimeError!' -!!!error!!! -''' -def run(args = None): - import sys - import doctest - - if args is not None: - sys.argv = args - return doctest.testmod(sys.modules.get(__name__)) - -if __name__ == '__main__': - print "running..." - import sys - status = run()[0] - if (status == 0): print "Done." - sys.exit(status) diff --git a/test/exec.cpp b/test/exec.cpp deleted file mode 100644 index 9fb005ea..00000000 --- a/test/exec.cpp +++ /dev/null @@ -1,193 +0,0 @@ -// Copyright Stefan Seefeld 2005. -// 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 - -#include -#include - - -namespace python = boost::python; - -// An abstract base class -class Base : public boost::noncopyable -{ -public: - virtual ~Base() {}; - virtual std::string hello() = 0; -}; - -// C++ derived class -class CppDerived : public Base -{ -public: - virtual ~CppDerived() {} - virtual std::string hello() { return "Hello from C++!";} -}; - -// Familiar Boost.Python wrapper class for Base -struct BaseWrap : Base, python::wrapper -{ - virtual std::string hello() - { -#if BOOST_WORKAROUND(BOOST_MSVC, <= 1300) - // workaround for VC++ 6.x or 7.0, see - // http://boost.org/libs/python/doc/tutorial/doc/html/python/exposing.html#python.class_virtual_functions - return python::call(this->get_override("hello").ptr()); -#else - return this->get_override("hello")(); -#endif - } -}; - -// Pack the Base class wrapper into a module -BOOST_PYTHON_MODULE(embedded_hello) -{ - python::class_ base("Base"); -} - - -void eval_test() -{ - python::object result = python::eval("'abcdefg'.upper()"); - std::string value = python::extract(result) BOOST_EXTRACT_WORKAROUND; - BOOST_TEST(value == "ABCDEFG"); -} - -void exec_test() -{ - // Register the module with the interpreter - if (PyImport_AppendInittab(const_cast("embedded_hello"), -#if PY_VERSION_HEX >= 0x03000000 - PyInit_embedded_hello -#else - initembedded_hello -#endif - ) == -1) - throw std::runtime_error("Failed to add embedded_hello to the interpreter's " - "builtin modules"); - // Retrieve the main module - python::object main = python::import("__main__"); - - // Retrieve the main module's namespace - python::object global(main.attr("__dict__")); - - // Define the derived class in Python. - python::object result = python::exec( - "from embedded_hello import * \n" - "class PythonDerived(Base): \n" - " def hello(self): \n" - " return 'Hello from Python!' \n", - global, global); - - python::object PythonDerived = global["PythonDerived"]; - - // Creating and using instances of the C++ class is as easy as always. - CppDerived cpp; - BOOST_TEST(cpp.hello() == "Hello from C++!"); - - // But now creating and using instances of the Python class is almost - // as easy! - python::object py_base = PythonDerived(); - Base& py = python::extract(py_base) BOOST_EXTRACT_WORKAROUND; - - // Make sure the right 'hello' method is called. - BOOST_TEST(py.hello() == "Hello from Python!"); -} - -void exec_file_test(std::string const &script) -{ - // Run a python script in an empty environment. - python::dict global; - python::object result = python::exec_file(script.c_str(), global, global); - - // Extract an object the script stored in the global dictionary. - BOOST_TEST(python::extract(global["number"]) == 42); -} - -void exec_test_error() -{ - // Execute a statement that raises a python exception. - python::dict global; - python::object result = python::exec("print(unknown) \n", global, global); -} - -void exercise_embedding_html() -{ - using namespace boost::python; - /* code from: libs/python/doc/tutorial/doc/tutorial.qbk - (generates libs/python/doc/tutorial/doc/html/python/embedding.html) - */ - object main_module = import("__main__"); - object main_namespace = main_module.attr("__dict__"); - - object ignored = exec("hello = file('hello.txt', 'w')\n" - "hello.write('Hello world!')\n" - "hello.close()", - main_namespace); -} - -void check_pyerr(bool pyerr_expected=false) -{ - if (PyErr_Occurred()) - { - if (!pyerr_expected) { - BOOST_ERROR("Python Error detected"); - PyErr_Print(); - } - else { - PyErr_Clear(); - } - } - else - { - BOOST_ERROR("A C++ exception was thrown for which " - "there was no exception handler registered."); - } -} - -int main(int argc, char **argv) -{ - BOOST_TEST(argc == 2 || argc == 3); - std::string script = argv[1]; - // Initialize the interpreter - Py_Initialize(); - - if (python::handle_exception(eval_test)) { - check_pyerr(); - } - else if(python::handle_exception(exec_test)) { - check_pyerr(); - } - else if (python::handle_exception(boost::bind(exec_file_test, script))) { - check_pyerr(); - } - - if (python::handle_exception(exec_test_error)) - { - check_pyerr(/*pyerr_expected*/ true); - } - else - { - BOOST_ERROR("Python exception expected, but not seen."); - } - - if (argc > 2) { - // The main purpose is to test compilation. Since this test generates - // a file and I (rwgk) am uncertain about the side-effects, run it only - // if explicitly requested. - exercise_embedding_html(); - } - - // Boost.Python doesn't support Py_Finalize yet. - // Py_Finalize(); - return boost::report_errors(); -} - -// Including this file makes sure -// that on Windows, any crashes (e.g. null pointer dereferences) invoke -// the debugger immediately, rather than being translated into structured -// exceptions that can interfere with debugging. -#include "module_tail.cpp" diff --git a/test/exec.py b/test/exec.py deleted file mode 100644 index c7bf28f3..00000000 --- a/test/exec.py +++ /dev/null @@ -1,6 +0,0 @@ -# Copyright Stefan Seefeld 2006. 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) - -if 1: - number = 42 diff --git a/test/extract.cpp b/test/extract.cpp deleted file mode 100644 index 40584a07..00000000 --- a/test/extract.cpp +++ /dev/null @@ -1,143 +0,0 @@ -// 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 -#include -#include -#include -#include -#include -#include -#include -#include -#include -#define BOOST_ENABLE_ASSERT_HANDLER -#include -#include "test_class.hpp" - -using namespace boost::python; - -typedef test_class<> X; - -bool extract_bool(object x) { return extract(x); } - -boost::python::list extract_list(object x) -{ - extract get_list((x)); - - // Make sure we always have the right idea about whether it's a list - bool is_list_1 = get_list.check(); - bool is_list_2 = PyObject_IsInstance(x.ptr(), (PyObject*)&PyList_Type); - if (is_list_1 != is_list_2) { - throw std::runtime_error("is_list_1 == is_list_2 failure."); - } - return get_list(); -} - -char const* extract_cstring(object x) -{ - return extract(x); -} - -std::string extract_string(object x) -{ - std::string s = extract(x); - return s; -} - -std::string const& extract_string_cref(object x) -{ -#if defined(BOOST_MSVC) && BOOST_MSVC <= 1300 -# pragma warning(push) -# pragma warning(disable:4172) // msvc lies about returning a reference to temporary -#elif defined(_MSC_VER) && defined(__ICL) && __ICL <= 900 -# pragma warning(push) -# pragma warning(disable:473) // intel/win32 does too -#endif - - return extract(x); - -#if defined(BOOST_MSVC) && BOOST_MSVC <= 1300 || defined(_MSC_VER) && defined(__ICL) && __ICL <= 800 -# pragma warning(pop) -#endif -} - -X extract_X(object x) -{ - return extract(x); -} - -X* extract_X_ptr(object x) { return extract(x); } - -X& extract_X_ref(object x) -{ - extract get_x(x); - return get_x; -} - -int double_X(object n) -{ - extract x(n); - return x().value() + x().value(); -} - -bool check_bool(object x) { return extract(x).check(); } -bool check_list(object x) { return extract(x).check(); } -bool check_cstring(object x) { return extract(x).check(); } -bool check_string(object x) { return extract(x).check(); } -bool check_string_cref(object x) { return extract(x).check(); } -bool check_X(object x) { return extract(x).check(); } -bool check_X_ptr(object x) { return extract(x).check(); } -bool check_X_ref(object x) { return extract(x).check(); } - -std::string x_rep(X const& x) -{ - return "X(" + boost::lexical_cast(x.value()) + ")"; -} - -BOOST_PYTHON_MODULE(extract_ext) -{ - implicitly_convertible(); - - def("extract_bool", extract_bool); - def("extract_list", extract_list); - def("extract_cstring", extract_cstring); - def("extract_string", extract_string); - def("extract_string_cref", extract_string_cref, return_value_policy()); - def("extract_X", extract_X); - def("extract_X_ptr", extract_X_ptr, return_value_policy()); - def("extract_X_ref", extract_X_ref, return_value_policy()); - - def("check_bool", check_bool); - def("check_list", check_list); - def("check_cstring", check_cstring); - def("check_string", check_string); - def("check_string_cref", check_string_cref); - def("check_X", check_X); - def("check_X_ptr", check_X_ptr); - def("check_X_ref", check_X_ref); - - def("double_X", double_X); - - def("count_Xs", &X::count); - ; - - object x_class( - class_("X", init()) - .def( "__repr__", x_rep)); - - // Instantiate an X object through the Python interface - object x_obj = x_class(3); - - // Get the C++ object out of the Python object - X const& x = extract(x_obj); - if (x.value() != 3) { - throw std::runtime_error("x.value() == 3 failure."); - } -} - - -#include "module_tail.cpp" - diff --git a/test/extract.py b/test/extract.py deleted file mode 100644 index 842a9f6e..00000000 --- a/test/extract.py +++ /dev/null @@ -1,107 +0,0 @@ -# Copyright David Abrahams 2004. 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) -''' - >>> from extract_ext import * - -Just about anything has a truth value in Python - - >>> assert check_bool(None) - >>> extract_bool(None) - 0 - - >>> assert check_bool(2) - >>> extract_bool(2) - 1 - - >>> assert not check_bool('') - -Check that object manager types work properly. These are a different -case because they wrap Python objects instead of being wrapped by them. - - >>> assert not check_list(2) - >>> try: x = extract_list(2) - ... except TypeError, x: - ... if str(x) != 'Expecting an object of type list; got an object of type int instead': - ... print x - ... else: - ... print 'expected an exception, got', x, 'instead' - -Can't extract a list from a tuple. Use list(x) to convert a sequence -to a list: - - >>> assert not check_list((1, 2, 3)) - >>> assert check_list([1, 2, 3]) - >>> extract_list([1, 2, 3]) - [1, 2, 3] - -Can get a char const* from a Python string: - - >>> assert check_cstring('hello') - >>> extract_cstring('hello') - 'hello' - -Can't get a char const* from a Python int: - - >>> assert not check_cstring(1) - >>> try: x = extract_cstring(1) - ... except TypeError: pass - ... else: - ... print 'expected an exception, got', x, 'instead' - -Extract an std::string (class) rvalue from a native Python type - - >>> assert check_string('hello') - >>> extract_string('hello') - 'hello' - -Constant references are not treated as rvalues for the purposes of -extract: - - >>> assert not check_string_cref('hello') - -We can extract lvalues where appropriate: - - >>> x = X(42) - >>> check_X(x) - 1 - >>> extract_X(x) - X(42) - - >>> check_X_ptr(x) - 1 - >>> extract_X_ptr(x) - X(42) - >>> extract_X_ref(x) - X(42) - -Demonstrate that double-extraction of an rvalue works, and all created -copies of the object are destroyed: - - >>> n = count_Xs() - >>> double_X(333) - 666 - >>> count_Xs() - n - 0 - -General check for cleanliness: - - >>> del x - >>> count_Xs() - 0 -''' - -def run(args = None): - import sys - import doctest - - if args is not None: - sys.argv = args - return doctest.testmod(sys.modules.get(__name__)) - -if __name__ == '__main__': - print "running..." - import sys - status = run()[0] - if (status == 0): print "Done." - sys.exit(status) diff --git a/test/if_else.cpp b/test/if_else.cpp deleted file mode 100644 index 1c6258db..00000000 --- a/test/if_else.cpp +++ /dev/null @@ -1,44 +0,0 @@ -// 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 -#include -#include - - typedef char c1; - typedef char c2[2]; - typedef char c3[3]; - typedef char c4[4]; - -template -struct choose -{ - typedef typename boost::python::detail::if_< - (sizeof(c1) == size) - >::template then< - c1 - >::template elif< - (sizeof(c2) == size) - >::template then< - c2 - >::template elif< - (sizeof(c3) == size) - >::template then< - c3 - >::template elif< - (sizeof(c4) == size) - >::template then< - c4 - >::template else_::type type; -}; - -int main() -{ - BOOST_STATIC_ASSERT((boost::is_same::type,c1>::value)); - BOOST_STATIC_ASSERT((boost::is_same::type,c2>::value)); - BOOST_STATIC_ASSERT((boost::is_same::type,c3>::value)); - BOOST_STATIC_ASSERT((boost::is_same::type,c4>::value)); - BOOST_STATIC_ASSERT((boost::is_same::type,void*>::value)); - return 0; -} diff --git a/test/implicit.cpp b/test/implicit.cpp deleted file mode 100644 index a1bae59e..00000000 --- a/test/implicit.cpp +++ /dev/null @@ -1,48 +0,0 @@ -// 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 -#include -#include -#include -#include "test_class.hpp" - -using namespace boost::python; - -typedef test_class<> X; - -int x_value(X const& x) -{ - return x.value(); -} - -X make_x(int n) { return X(n); } - - -// foo/bar -- a regression for a vc7 bug workaround -struct bar {}; -struct foo -{ - virtual ~foo() {}; // silence compiler warnings - virtual void f() = 0; - operator bar() const { return bar(); } -}; - -BOOST_PYTHON_MODULE(implicit_ext) -{ - implicitly_convertible(); - implicitly_convertible(); - - def("x_value", x_value); - def("make_x", make_x); - - class_("X", init()) - .def("value", &X::value) - .def("set", &X::set) - ; - - implicitly_convertible(); -} - -#include "module_tail.cpp" diff --git a/test/implicit.py b/test/implicit.py deleted file mode 100644 index ac82d948..00000000 --- a/test/implicit.py +++ /dev/null @@ -1,44 +0,0 @@ -# Copyright David Abrahams 2004. 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) -''' ->>> from implicit_ext import * ->>> x_value(X(42)) -42 ->>> x_value(42) -42 ->>> x = make_x(X(42)) ->>> x.value() -42 ->>> try: make_x('fool') -... except TypeError: pass -... else: print 'no error' - ->>> print x_value.__doc__.splitlines()[1] -x_value( (X)arg1) -> int : - ->>> print make_x.__doc__.splitlines()[1] -make_x( (object)arg1) -> X : - ->>> print X.value.__doc__.splitlines()[1] -value( (X)arg1) -> int : - ->>> print X.set.__doc__.splitlines()[1] -set( (X)arg1, (object)arg2) -> None : - -''' - -def run(args = None): - import sys - import doctest - - if args is not None: - sys.argv = args - return doctest.testmod(sys.modules.get(__name__)) - -if __name__ == '__main__': - print "running..." - import sys - status = run()[0] - if (status == 0): print "Done." - sys.exit(status) diff --git a/test/import_.cpp b/test/import_.cpp deleted file mode 100644 index 3e21de0b..00000000 --- a/test/import_.cpp +++ /dev/null @@ -1,70 +0,0 @@ -// Copyright Stefan Seefeld 2007. -// 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 - -#include -#include -#include -#include - -namespace bpl = boost::python; - -void import_test(char const *py_file_path) -{ - // Retrieve the main module - bpl::object main = bpl::import("__main__"); - - // Retrieve the main module's namespace - bpl::object global(main.attr("__dict__")); - - // Inject search path for import_ module - - bpl::str script( - "import sys, os.path\n" - "path = os.path.dirname(%r)\n" - "sys.path.insert(0, path)" - % bpl::str(py_file_path)); - - bpl::object result = bpl::exec(script, global, global); - - // Retrieve the main module - bpl::object import_ = bpl::import("import_"); - int value = bpl::extract(import_.attr("value")) BOOST_EXTRACT_WORKAROUND; - std::cout << value << std::endl; - BOOST_TEST(value == 42); -} - -int main(int argc, char **argv) -{ - BOOST_TEST(argc == 2); - - // Initialize the interpreter - Py_Initialize(); - - if (bpl::handle_exception(boost::bind(import_test,argv[1]))) - { - if (PyErr_Occurred()) - { - BOOST_ERROR("Python Error detected"); - PyErr_Print(); - } - else - { - BOOST_ERROR("A C++ exception was thrown for which " - "there was no exception handler registered."); - } - } - - // Boost.Python doesn't support Py_Finalize yet. - // Py_Finalize(); - return boost::report_errors(); -} - -// Including this file makes sure -// that on Windows, any crashes (e.g. null pointer dereferences) invoke -// the debugger immediately, rather than being translated into structured -// exceptions that can interfere with debugging. -#include "module_tail.cpp" diff --git a/test/import_.py b/test/import_.py deleted file mode 100644 index 48de6e5e..00000000 --- a/test/import_.py +++ /dev/null @@ -1,5 +0,0 @@ -# Copyright Stefan Seefeld 2007. 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) - -value = 42 diff --git a/test/indirect_traits_test.cpp b/test/indirect_traits_test.cpp deleted file mode 100644 index 594cfe55..00000000 --- a/test/indirect_traits_test.cpp +++ /dev/null @@ -1,117 +0,0 @@ -// Copyright David Abrahams 2004. 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 -#define BOOST_ENABLE_ASSERT_HANDLER -#include -#include -#include -#include -#include - -//#define print(expr) printf("%s ==> %s\n", #expr, expr) - -// not all the compilers can handle an incomplete class type here. -struct X {}; - -using namespace boost::python::indirect_traits; - -typedef void (X::*pmf)(); - -BOOST_MPL_ASSERT((is_reference_to_function)); -BOOST_MPL_ASSERT_NOT((is_reference_to_function)); -BOOST_MPL_ASSERT_NOT((is_reference_to_function)); -BOOST_MPL_ASSERT_NOT((is_reference_to_function)); - -BOOST_MPL_ASSERT_NOT((is_pointer_to_function)); -BOOST_MPL_ASSERT((is_pointer_to_function)); -BOOST_MPL_ASSERT_NOT((is_pointer_to_function)); -BOOST_MPL_ASSERT_NOT((is_pointer_to_function)); -BOOST_MPL_ASSERT_NOT((is_pointer_to_function)); - -BOOST_MPL_ASSERT_NOT((is_reference_to_function_pointer)); -BOOST_MPL_ASSERT_NOT((is_reference_to_function_pointer)); -BOOST_MPL_ASSERT_NOT((is_reference_to_function_pointer)); -BOOST_MPL_ASSERT((is_reference_to_function_pointer)); -BOOST_MPL_ASSERT((is_reference_to_function_pointer)); -BOOST_MPL_ASSERT_NOT((is_reference_to_function_pointer)); - -BOOST_MPL_ASSERT((is_reference_to_pointer)); -BOOST_MPL_ASSERT((is_reference_to_pointer)); -BOOST_MPL_ASSERT((is_reference_to_pointer)); -BOOST_MPL_ASSERT((is_reference_to_pointer)); -BOOST_MPL_ASSERT((is_reference_to_pointer)); -BOOST_MPL_ASSERT((is_reference_to_pointer)); -BOOST_MPL_ASSERT((is_reference_to_pointer)); -BOOST_MPL_ASSERT((is_reference_to_pointer)); -BOOST_MPL_ASSERT_NOT((is_reference_to_pointer)); - -BOOST_MPL_ASSERT_NOT((is_reference_to_pointer)); -BOOST_MPL_ASSERT_NOT((is_reference_to_pointer)); -BOOST_MPL_ASSERT_NOT((is_reference_to_pointer)); - -BOOST_MPL_ASSERT_NOT((is_reference_to_const)); -BOOST_MPL_ASSERT((is_reference_to_const)); -BOOST_MPL_ASSERT_NOT((is_reference_to_const)); -BOOST_MPL_ASSERT((is_reference_to_const)); - -BOOST_MPL_ASSERT_NOT((is_reference_to_const)); -BOOST_MPL_ASSERT_NOT((is_reference_to_const)); -BOOST_MPL_ASSERT_NOT((is_reference_to_const)); - -BOOST_MPL_ASSERT((is_reference_to_non_const)); -BOOST_MPL_ASSERT_NOT((is_reference_to_non_const)); -BOOST_MPL_ASSERT((is_reference_to_non_const)); -BOOST_MPL_ASSERT_NOT((is_reference_to_non_const)); - -BOOST_MPL_ASSERT_NOT((is_reference_to_non_const)); -BOOST_MPL_ASSERT_NOT((is_reference_to_non_const)); -BOOST_MPL_ASSERT_NOT((is_reference_to_non_const)); - -BOOST_MPL_ASSERT_NOT((is_reference_to_volatile)); -BOOST_MPL_ASSERT_NOT((is_reference_to_volatile)); -BOOST_MPL_ASSERT((is_reference_to_volatile)); -BOOST_MPL_ASSERT((is_reference_to_volatile)); - -BOOST_MPL_ASSERT_NOT((is_reference_to_volatile)); -BOOST_MPL_ASSERT_NOT((is_reference_to_volatile)); -BOOST_MPL_ASSERT_NOT((is_reference_to_volatile)); - -namespace tt = boost::python::indirect_traits; - -BOOST_MPL_ASSERT_NOT((tt::is_reference_to_class)); -BOOST_MPL_ASSERT_NOT((tt::is_reference_to_class)); -BOOST_MPL_ASSERT_NOT((tt::is_reference_to_class)); - - -BOOST_MPL_ASSERT_NOT((tt::is_reference_to_class)); -BOOST_MPL_ASSERT_NOT((tt::is_reference_to_class)); - -BOOST_MPL_ASSERT_NOT((tt::is_reference_to_class)); - -BOOST_MPL_ASSERT((tt::is_reference_to_class)); -BOOST_MPL_ASSERT((tt::is_reference_to_class)); -BOOST_MPL_ASSERT((tt::is_reference_to_class)); -BOOST_MPL_ASSERT((tt::is_reference_to_class)); - -BOOST_MPL_ASSERT_NOT((is_pointer_to_class)); -BOOST_MPL_ASSERT_NOT((is_pointer_to_class)); -BOOST_MPL_ASSERT_NOT((is_pointer_to_class)); - -BOOST_MPL_ASSERT_NOT((is_pointer_to_class)); -BOOST_MPL_ASSERT_NOT((is_pointer_to_class)); -BOOST_MPL_ASSERT_NOT((is_pointer_to_class)); -BOOST_MPL_ASSERT_NOT((is_pointer_to_class)); -BOOST_MPL_ASSERT((is_pointer_to_class)); -BOOST_MPL_ASSERT((is_pointer_to_class)); -BOOST_MPL_ASSERT((is_pointer_to_class)); -BOOST_MPL_ASSERT((is_pointer_to_class)); - -BOOST_MPL_ASSERT((tt::is_reference_to_member_function_pointer)); -BOOST_MPL_ASSERT((tt::is_reference_to_member_function_pointer)); -BOOST_MPL_ASSERT((tt::is_reference_to_member_function_pointer)); -BOOST_MPL_ASSERT((tt::is_reference_to_member_function_pointer)); -BOOST_MPL_ASSERT_NOT((tt::is_reference_to_member_function_pointer)); -BOOST_MPL_ASSERT_NOT((tt::is_reference_to_member_function_pointer)); -BOOST_MPL_ASSERT_NOT((tt::is_reference_to_member_function_pointer)); - diff --git a/test/injected.cpp b/test/injected.cpp deleted file mode 100755 index 73e1e14b..00000000 --- a/test/injected.cpp +++ /dev/null @@ -1,39 +0,0 @@ -// 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) - -#include -#include -#include "test_class.hpp" -#include -#include -#include -#include - -using namespace boost::python; - -typedef test_class<> X; - -X* empty() { return new X(1000); } - -std::auto_ptr sum(int a, int b) { return std::auto_ptr(new X(a+b)); } - -boost::shared_ptr product(int a, int b, int c) -{ - return boost::shared_ptr(new X(a*b*c)); -} - -BOOST_PYTHON_MODULE(injected_ext) -{ - class_("X", init()) - .def("__init__", make_constructor(empty)) - .def("__init__", make_constructor(sum)) - .def("__init__", make_constructor(product - , default_call_policies() - , ( arg_("a"), arg_("b"), arg_("c")) - ), - "this is product's docstring") - .def("value", &X::value) - ; -} diff --git a/test/injected.py b/test/injected.py deleted file mode 100644 index 32ea0bf9..00000000 --- a/test/injected.py +++ /dev/null @@ -1,28 +0,0 @@ -# Copyright David Abrahams 2004. 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) -''' ->>> from injected_ext import * ->>> X(3,5).value() - (3+5) -0 ->>> X(a=3,b=5,c=7).value() - (3*5*7) -0 ->>> X().value() -1000 -''' - -def run(args = None): - import sys - import doctest - - if args is not None: - sys.argv = args - return doctest.testmod(sys.modules.get(__name__)) - -if __name__ == '__main__': - print "running..." - import sys - status = run()[0] - if (status == 0): print "Done." - sys.exit(status) - diff --git a/test/input_iterator.cpp b/test/input_iterator.cpp deleted file mode 100644 index 70b99418..00000000 --- a/test/input_iterator.cpp +++ /dev/null @@ -1,48 +0,0 @@ -// 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 -#include -#include -#include -#include -#include - -using namespace boost::python; - -typedef std::list list_int; - -// Prove that we can handle InputIterators which return rvalues. -struct doubler -{ - typedef int result_type; - int operator()(int x) const { return x * 2; } -}; - -typedef boost::transform_iterator doubling_iterator; -typedef std::pair list_range2; - -list_range2 range2(list_int& x) -{ - return list_range2( - boost::make_transform_iterator(x.begin(), doubler()) - , boost::make_transform_iterator(x.end(), doubler())); -} - -// We do this in a separate module from iterators_ext (iterators.cpp) -// to work around an MSVC6 linker bug, which causes it to complain -// about a "duplicate comdat" if the input iterator is instantiated in -// the same module with the others. -BOOST_PYTHON_MODULE(input_iterator) -{ - def("range2", &::range2); - - class_("list_range2") - // We can wrap InputIterators which return by-value - .def("__iter__" - , range(&list_range2::first, &list_range2::second)) - ; -} - -#include "module_tail.cpp" diff --git a/test/int_map_indexing_suite.cpp b/test/int_map_indexing_suite.cpp deleted file mode 100755 index 39785013..00000000 --- a/test/int_map_indexing_suite.cpp +++ /dev/null @@ -1,16 +0,0 @@ -// Copyright David Abrahams 2004. 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 -#include - -void int_map_indexing_suite() -{ - using namespace boost::python; - - // Compile check only... - class_ >("IntMap") - .def(map_indexing_suite >()) - ; -} diff --git a/test/iterator.cpp b/test/iterator.cpp deleted file mode 100644 index 458ba292..00000000 --- a/test/iterator.cpp +++ /dev/null @@ -1,137 +0,0 @@ -// 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 -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -using namespace boost::python; - -typedef std::list list_int; -typedef std::list list_list; - - -void push_back(list_int& x, int y) -{ - x.push_back(y); -} - -void push_list_back(list_list& x, list_int const& y) -{ - x.push_back(y); -} - -int back(list_int& x) -{ - return x.back(); -} - -typedef std::pair list_range; - -struct list_range2 : list_range -{ - list_int::iterator& begin() { return this->first; } - list_int::iterator& end() { return this->second; } -}; - -list_range range(list_int& x) -{ - return list_range(x.begin(), x.end()); -} - -struct two_lists -{ - two_lists() - { - int primes[] = { 2, 3, 5, 7, 11, 13 }; - std::copy(primes, primes + sizeof(primes)/sizeof(*primes), std::back_inserter(one)); - int evens[] = { 2, 4, 6, 8, 10, 12 }; - std::copy(evens, evens + sizeof(evens)/sizeof(*evens), std::back_inserter(two)); - } - - struct two_start - { - typedef list_int::iterator result_type; - result_type operator()(two_lists& ll) const { return ll.two.begin(); } - }; - friend struct two_start; - - list_int::iterator one_begin() { return one.begin(); } - list_int::iterator two_begin() { return two.begin(); } - - list_int::iterator one_end() { return one.end(); } - list_int::iterator two_end() { return two.end(); } - -private: - list_int one; - list_int two; -}; - -BOOST_PYTHON_MODULE(iterator_ext) -{ - using boost::python::iterator; // gcc 2.96 bug workaround - def("range", &::range); - - class_("list_int") - .def("push_back", push_back) - .def("back", back) - .def("__iter__", iterator()) - ; - - class_("list_range") - - // We can specify data members - .def("__iter__" - , range(&list_range::first, &list_range::second)) - ; - - // No runtime tests for this one yet - class_("list_range2") - - // We can specify member functions returning a non-const reference - .def("__iter__", range(&list_range2::begin, &list_range2::end)) - ; - - class_("two_lists") - - // We can spcify member functions - .add_property( - "primes" - , range(&two_lists::one_begin, &two_lists::one_end)) - - // Prove that we can explicitly specify call policies - .add_property( - "evens" - , range >( - &two_lists::two_begin, &two_lists::two_end)) - - // Prove that we can specify call policies and target - .add_property( - "twosies" - , range, two_lists>( - // And we can use adaptable function objects when - // partial specialization is available. -# ifndef BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION - two_lists::two_start() -# else - &two_lists::two_begin -# endif - , &two_lists::two_end)) - ; - - class_("list_list") - .def("push_back", push_list_back) - .def("__iter__", iterator >()) - ; -} - -#include "module_tail.cpp" diff --git a/test/iterator.py b/test/iterator.py deleted file mode 100644 index 96f5fd04..00000000 --- a/test/iterator.py +++ /dev/null @@ -1,77 +0,0 @@ -# Copyright David Abrahams 2004. 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) -''' ->>> from iterator_ext import * ->>> from input_iterator import * ->>> x = list_int() ->>> x.push_back(1) ->>> x.back() -1 ->>> x.push_back(3) ->>> x.push_back(5) ->>> for y in x: -... print y -1 -3 -5 ->>> z = range(x) ->>> for y in z: -... print y -1 -3 -5 - - Range2 wraps a transform_iterator which doubles the elements it - traverses. This proves we can wrap input iterators - ->>> z2 = range2(x) ->>> for y in z2: -... print y -2 -6 -10 - ->>> l2 = two_lists() ->>> for y in l2.primes: -... print y -2 -3 -5 -7 -11 -13 ->>> for y in l2.evens: -... print y -2 -4 -6 -8 -10 -12 ->>> ll = list_list() ->>> ll.push_back(x) ->>> x.push_back(7) ->>> ll.push_back(x) ->>> for a in ll: #doctest: +NORMALIZE_WHITESPACE -... for b in a: -... print b, -... print -... -1 3 5 -1 3 5 7 -''' -def run(args = None): - import sys - import doctest - - if args is not None: - sys.argv = args - return doctest.testmod(sys.modules.get(__name__)) - -if __name__ == '__main__': - print "running..." - import sys - status = run()[0] - if (status == 0): print "Done." - sys.exit(status) diff --git a/test/keywords.cpp b/test/keywords.cpp deleted file mode 100755 index 39bac062..00000000 --- a/test/keywords.cpp +++ /dev/null @@ -1,118 +0,0 @@ -// 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 -#include - -struct Foo -{ - Foo( - int a = 0 - , double b = 0 - , const std::string &n = std::string() - ) : - a_(a) - , b_(b) - , n_(n) - {} - - void set(int a=0, double b=0, const std::string &n=std::string()) - { - a_ = a; - b_ = b; - n_ = n; - } - - int geta() const { return a_; } - - double getb() const { return b_; } - - std::string getn() const { return n_; } - -private: - int a_; - double b_; - std::string n_; -}; - -struct Bar -{ - Bar( - int a = 0 - , double b = 0 - , const std::string &n = std::string() - ) : - a_(a) - , b_(b) - , n_(n) - {} - - void set(int a=0, double b=0, const std::string &n=std::string()) - { - a_ = a; - b_ = b; - n_ = n; - } - - void seta(int a) - { - a_ = a; - } - - int geta() const { return a_; } - - double getb() const { return b_; } - - std::string getn() const { return n_; } - -private: - int a_; - double b_; - std::string n_; -}; - -BOOST_PYTHON_MEMBER_FUNCTION_OVERLOADS(bar_set, Bar::set, 0,3) - -using namespace boost::python; -BOOST_PYTHON_MODULE(keywords) -{ -#if BOOST_WORKAROUND(__GNUC__, == 2) - using boost::python::arg; -#endif - - class_( - "Foo" - , init( - ( arg("a") = 0 - , arg("b") = 0.0 - , arg("n") = std::string() - ) - )) - - .def("set", &Foo::set, (arg("a") = 0, arg("b") = 0.0, arg("n") = std::string()) ) - - .def("set2", &Foo::set, (arg("a"), "b", "n") ) - - .def("a", &Foo::geta) - .def("b", &Foo::getb) - .def("n", &Foo::getn) - ; - - class_("Bar" - , init >() - ) - .def("set", &Bar::set, bar_set()) - .def("set2", &Bar::set, bar_set("set2's docstring")) - .def("seta", &Bar::seta, arg("a")) - - .def("a", &Bar::geta) - .def("b", &Bar::getb) - .def("n", &Bar::getn) - ; - -} - - - -#include "module_tail.cpp" diff --git a/test/keywords_test.py b/test/keywords_test.py deleted file mode 100644 index 261de0b3..00000000 --- a/test/keywords_test.py +++ /dev/null @@ -1,106 +0,0 @@ -# Copyright David Abrahams 2004. 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) -''' ->>> from keywords import * ->>> f = Foo() ->>> f.a(), f.b(), f.n() -(0, 0.0, '') ->>> f = Foo(1) ->>> f.a(), f.b(), f.n() -(1, 0.0, '') ->>> f = Foo(1,1.0) ->>> f.a(), f.b(), f.n() -(1, 1.0, '') ->>> f = Foo(1,1.0,"1") ->>> f.a(), f.b(), f.n() -(1, 1.0, '1') ->>> f = Foo(a=1) ->>> f.a(), f.b(), f.n() -(1, 0.0, '') ->>> f = Foo(b=1) ->>> f.a(), f.b(), f.n() -(0, 1.0, '') ->>> f = Foo(n="1") ->>> f.a(), f.b(), f.n() -(0, 0.0, '1') ->>> f = Foo(1,n="1") ->>> f.a(), f.b(), f.n() -(1, 0.0, '1') ->>> f.set() ->>> f.a(), f.b(), f.n() -(0, 0.0, '') ->>> f.set(1) ->>> f.a(), f.b(), f.n() -(1, 0.0, '') ->>> f.set(1,1.0) ->>> f.a(), f.b(), f.n() -(1, 1.0, '') ->>> f.set(1,1.0,"1") ->>> f.a(), f.b(), f.n() -(1, 1.0, '1') ->>> f.set(a=1) ->>> f.a(), f.b(), f.n() -(1, 0.0, '') ->>> f.set(b=1) ->>> f.a(), f.b(), f.n() -(0, 1.0, '') ->>> f.set(n="1") ->>> f.a(), f.b(), f.n() -(0, 0.0, '1') ->>> f.set(1,n="1") ->>> f.a(), f.b(), f.n() -(1, 0.0, '1') ->>> f.set2(b=2.0,n="2",a=2) ->>> f.a(), f.b(), f.n() -(2, 2.0, '2') - -# lets see how badly we've broken the 'regular' functions ->>> f = Bar() ->>> f.a(), f.b(), f.n() -(0, 0.0, '') ->>> f = Bar(1) ->>> f.a(), f.b(), f.n() -(1, 0.0, '') ->>> f = Bar(1,1.0) ->>> f.a(), f.b(), f.n() -(1, 1.0, '') ->>> f = Bar(1,1.0,"1") ->>> f.a(), f.b(), f.n() -(1, 1.0, '1') ->>> f.set() ->>> f.a(), f.b(), f.n() -(0, 0.0, '') ->>> f.set(1) ->>> f.a(), f.b(), f.n() -(1, 0.0, '') ->>> f.set(1,1.0) ->>> f.a(), f.b(), f.n() -(1, 1.0, '') ->>> f.set(1,1.0,"1") ->>> f.a(), f.b(), f.n() -(1, 1.0, '1') ->>> f.set2.__doc__.splitlines()[1] -'set2( (Bar)arg1 [, (int)arg2 [, (float)arg3 [, (str)arg4]]]) -> None :' ->>> f.set2.__doc__.splitlines()[2] -" set2's docstring" -''' - - - - -def run(args = None): - import sys - import doctest - - if args is not None: - sys.argv = args - return doctest.testmod(sys.modules.get(__name__)) - -if __name__ == '__main__': - print "running..." - import sys - status = run()[0] - if (status == 0): print "Done." - sys.exit(status) - diff --git a/test/list.cpp b/test/list.cpp deleted file mode 100644 index 3e9fcbe6..00000000 --- a/test/list.cpp +++ /dev/null @@ -1,154 +0,0 @@ -// 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 -#include -#include -#include -#include -#include -#include -#include -#define BOOST_ENABLE_ASSERT_HANDLER -#include -#include "test_class.hpp" - -using namespace boost::python; - -object new_list() -{ - return list(); -} - -list listify(object x) -{ - return list(x); -} - -object listify_string(char const* s) -{ - return list(s); -} - -std::string x_rep(test_class<> const& x) -{ - return "X(" + boost::lexical_cast(x.value()) + ")"; -} - -object apply_object_list(object f, list x) -{ - return f(x); -} - -list apply_list_list(object f, list x) -{ - return call(f.ptr(), x); -} - -void append_object(list& x, object y) -{ - x.append(y); -} - -void append_list(list& x, list const& y) -{ - x.append(y); -} - -typedef test_class<> X; - -int notcmp(object const& x, object const& y) -{ - return y < x ? -1 : y > x ? 1 : 0; -} - -void exercise(list x, object y, object print) -{ - x.append(y); - x.append(5); - x.append(X(3)); - - print("after append:"); - print(x); - - print("number of", y, "instances:", x.count(y)); - - print("number of 5s:", x.count(5)); - - x.extend("xyz"); - print("after extend:"); - print(x); - print("index of", y, "is:", x.index(y)); - print("index of 'l' is:", x.index("l")); - - x.insert(4, 666); - print("after inserting 666:"); - print(x); - print("inserting with object as index:"); - x.insert(x[x.index(5)], "---"); - print(x); - - print("popping..."); - x.pop(); - print(x); - x.pop(x[x.index(5)]); - print(x); - x.pop(x.index(5)); - print(x); - - print("removing", y); - x.remove(y); - print(x); - print("removing", 666); - x.remove(666); - print(x); - - print("reversing..."); - x.reverse(); - print(x); - - print("sorted:"); - x.pop(2); // make sorting predictable - x.pop(2); // remove [1,2] so the list is sortable in py3k - x.sort(); - print(x); - - print("reverse sorted:"); -#if PY_VERSION_HEX >= 0x03000000 - x.sort(*tuple(), **dict(make_tuple(make_tuple("reverse", true)))); -#else - x.sort(¬cmp); -#endif - print(x); - - list w; - w.append(5); - w.append(6); - w += "hi"; - BOOST_ASSERT(w[0] == 5); - BOOST_ASSERT(w[1] == 6); - BOOST_ASSERT(w[2] == 'h'); - BOOST_ASSERT(w[3] == 'i'); -} - -BOOST_PYTHON_MODULE(list_ext) -{ - def("new_list", new_list); - def("listify", listify); - def("listify_string", listify_string); - def("apply_object_list", apply_object_list); - def("apply_list_list", apply_list_list); - - def("append_object", append_object); - def("append_list", append_list); - - def("exercise", exercise); - - class_("X", init()) - .def( "__repr__", x_rep) - ; -} - -#include "module_tail.cpp" diff --git a/test/list.py b/test/list.py deleted file mode 100644 index 8be21123..00000000 --- a/test/list.py +++ /dev/null @@ -1,118 +0,0 @@ -# Copyright David Abrahams 2004. 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) -''' ->>> from list_ext import * - ->>> new_list() -[] - ->>> listify((1,2,3)) -[1, 2, 3] - ->>> letters = listify_string('hello') ->>> letters -['h', 'e', 'l', 'l', 'o'] - ->>> X(22) -X(22) - ->>> def identity(x): -... return x ->>> assert apply_object_list(identity, letters) is letters - - 5 is not convertible to a list - ->>> try: result = apply_object_list(identity, 5) -... except TypeError: pass -... else: print 'expected an exception, got', result, 'instead' - ->>> assert apply_list_list(identity, letters) is letters - - 5 is not convertible to a list as a return value - ->>> try: result = apply_list_list(len, letters) -... except TypeError: pass -... else: print 'expected an exception, got', result, 'instead' - ->>> append_object(letters, '.') ->>> letters -['h', 'e', 'l', 'l', 'o', '.'] - - tuples do not automatically convert to lists when passed as arguments - ->>> try: append_list(letters, (1,2)) -... except TypeError: pass -... else: print 'expected an exception' - ->>> append_list(letters, [1,2]) ->>> letters -['h', 'e', 'l', 'l', 'o', '.', [1, 2]] - - Check that subclass functions are properly called - ->>> class mylist(list): -... def append(self, o): -... list.append(self, o) -... if not hasattr(self, 'nappends'): -... self.nappends = 1 -... else: -... self.nappends += 1 -... ->>> l2 = mylist() ->>> append_object(l2, 'hello') ->>> append_object(l2, 'world') ->>> l2 -['hello', 'world'] ->>> l2.nappends -2 - ->>> def printer(*args): -... for x in args: print x, -... print -... - ->>> y = X(42) ->>> exercise(letters, y, printer) #doctest: +NORMALIZE_WHITESPACE -after append: -['h', 'e', 'l', 'l', 'o', '.', [1, 2], X(42), 5, X(3)] -number of X(42) instances: 1 -number of 5s: 1 -after extend: -['h', 'e', 'l', 'l', 'o', '.', [1, 2], X(42), 5, X(3), 'x', 'y', 'z'] -index of X(42) is: 7 -index of 'l' is: 2 -after inserting 666: -['h', 'e', 'l', 'l', 666, 'o', '.', [1, 2], X(42), 5, X(3), 'x', 'y', 'z'] -inserting with object as index: -['h', 'e', 'l', 'l', 666, '---', 'o', '.', [1, 2], X(42), 5, X(3), 'x', 'y', 'z'] -popping... -['h', 'e', 'l', 'l', 666, '---', 'o', '.', [1, 2], X(42), 5, X(3), 'x', 'y'] -['h', 'e', 'l', 'l', 666, 'o', '.', [1, 2], X(42), 5, X(3), 'x', 'y'] -['h', 'e', 'l', 'l', 666, 'o', '.', [1, 2], X(42), X(3), 'x', 'y'] -removing X(42) -['h', 'e', 'l', 'l', 666, 'o', '.', [1, 2], X(3), 'x', 'y'] -removing 666 -['h', 'e', 'l', 'l', 'o', '.', [1, 2], X(3), 'x', 'y'] -reversing... -['y', 'x', X(3), [1, 2], '.', 'o', 'l', 'l', 'e', 'h'] -sorted: -['.', 'e', 'h', 'l', 'l', 'o', 'x', 'y'] -reverse sorted: -['y', 'x', 'o', 'l', 'l', 'h', 'e', '.'] -''' - -def run(args = None): - import sys - import doctest - - if args is not None: - sys.argv = args - return doctest.testmod(sys.modules.get(__name__)) - -if __name__ == '__main__': - print "running..." - import sys - status = run()[0] - if (status == 0): print "Done." - sys.exit(status) diff --git a/test/long.cpp b/test/long.cpp deleted file mode 100644 index 61e4518f..00000000 --- a/test/long.cpp +++ /dev/null @@ -1,63 +0,0 @@ -// 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 -#include -#include -#include -#define BOOST_ENABLE_ASSERT_HANDLER -#include - -using namespace boost::python; - -object new_long() -{ - return long_(); -} - -long_ longify(object x) -{ - return long_(x); -} - -object longify_string(char const* s) -{ - return long_(s); -} - -char const* is_long1(long_& x) -{ - long_ y = x; - x += 50; - BOOST_ASSERT(x == y + 50); - return "yes"; -} - -int is_long2(char const*) -{ - return 0; -} - -// tests for accepting objects (and derived classes) in constructors -// from "Milind Patil" - -struct Y -{ - Y(boost::python::long_) {} -}; - -BOOST_PYTHON_MODULE(long_ext) -{ - def("new_long", new_long); - def("longify", longify); - def("longify_string", longify_string); - def("is_long", is_long1); - def("is_long", is_long2); - - class_< Y >("Y", init< boost::python::long_ >()) - ; -} - -#include "module_tail.cpp" diff --git a/test/long.py b/test/long.py deleted file mode 100644 index 13d8775b..00000000 --- a/test/long.py +++ /dev/null @@ -1,33 +0,0 @@ -# Copyright David Abrahams 2004. 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) -''' ->>> from long_ext import * ->>> print new_long() -0 ->>> print longify(42) -42 ->>> print longify_string('300') -300 ->>> is_long(20L) -'yes' ->>> is_long('20') -0 - ->>> x = Y(4294967295L) -''' - -def run(args = None): - import sys - import doctest - - if args is not None: - sys.argv = args - return doctest.testmod(sys.modules.get(__name__)) - -if __name__ == '__main__': - print "running..." - import sys - status = run()[0] - if (status == 0): print "Done." - sys.exit(status) diff --git a/test/m1.cpp b/test/m1.cpp deleted file mode 100644 index a873bc35..00000000 --- a/test/m1.cpp +++ /dev/null @@ -1,344 +0,0 @@ -// Copyright David Abrahams 2001. -// 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 -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "simple_type.hpp" -#include "complicated.hpp" - -// Declare some straightforward extension types -extern "C" void -dealloc(PyObject* self) -{ - PyObject_Del(self); -} - -// Noddy is a type we got from one of the Python sample files -struct NoddyObject : PyObject -{ - int x; -}; - -PyTypeObject NoddyType = { - PyVarObject_HEAD_INIT(NULL, 0) - const_cast("Noddy"), - sizeof(NoddyObject), - 0, - dealloc, /* tp_dealloc */ - 0, /* tp_print */ - 0, /* tp_getattr */ - 0, /* tp_setattr */ - 0, /* tp_compare */ - 0, /* tp_repr */ - 0, /* tp_as_number */ - 0, /* tp_as_sequence */ - 0, /* tp_as_mapping */ - 0, /* tp_hash */ - 0, /* tp_call */ - 0, /* tp_str */ - 0, /* tp_getattro */ - 0, /* tp_setattro */ - 0, /* tp_as_buffer */ - 0, /* tp_flags */ - 0, /* tp_doc */ - 0, /* tp_traverse */ - 0, /* tp_clear */ - 0, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - 0, /* tp_iter */ - 0, /* tp_iternext */ - 0, /* tp_methods */ - 0, /* tp_members */ - 0, /* tp_getset */ - 0, /* tp_base */ - 0, /* tp_dict */ - 0, /* tp_descr_get */ - 0, /* tp_descr_set */ - 0, /* tp_dictoffset */ - 0, /* tp_init */ - 0, /* tp_alloc */ - 0, /* tp_new */ - 0, /* tp_free */ - 0, /* tp_is_gc */ - 0, /* tp_bases */ - 0, /* tp_mro */ - 0, /* tp_cache */ - 0, /* tp_subclasses */ - 0, /* tp_weaklist */ -#if PYTHON_API_VERSION >= 1012 - 0 /* tp_del */ -#endif -}; - -// Create a Noddy containing 42 -PyObject* new_noddy() -{ - NoddyObject* noddy = PyObject_New(NoddyObject, &NoddyType); - noddy->x = 42; - return (PyObject*)noddy; -} - -// Simple is a wrapper around a struct simple, which just contains a char* -struct SimpleObject -{ - PyObject_HEAD - simple x; -}; - -struct extract_simple_object -{ - static simple& execute(SimpleObject& o) { return o.x; } -}; - -PyTypeObject SimpleType = { - PyVarObject_HEAD_INIT(NULL, 0) - const_cast("Simple"), - sizeof(SimpleObject), - 0, - dealloc, /* tp_dealloc */ - 0, /* tp_print */ - 0, /* tp_getattr */ - 0, /* tp_setattr */ - 0, /* tp_compare */ - 0, /* tp_repr */ - 0, /* tp_as_number */ - 0, /* tp_as_sequence */ - 0, /* tp_as_mapping */ - 0, /* tp_hash */ - 0, /* tp_call */ - 0, /* tp_str */ - 0, /* tp_getattro */ - 0, /* tp_setattro */ - 0, /* tp_as_buffer */ - 0, /* tp_flags */ - 0, /* tp_doc */ - 0, /* tp_traverse */ - 0, /* tp_clear */ - 0, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - 0, /* tp_iter */ - 0, /* tp_iternext */ - 0, /* tp_methods */ - 0, /* tp_members */ - 0, /* tp_getset */ - 0, /* tp_base */ - 0, /* tp_dict */ - 0, /* tp_descr_get */ - 0, /* tp_descr_set */ - 0, /* tp_dictoffset */ - 0, /* tp_init */ - 0, /* tp_alloc */ - 0, /* tp_new */ - 0, /* tp_free */ - 0, /* tp_is_gc */ - 0, /* tp_bases */ - 0, /* tp_mro */ - 0, /* tp_cache */ - 0, /* tp_subclasses */ - 0, /* tp_weaklist */ -#if PYTHON_API_VERSION >= 1012 - 0 /* tp_del */ -#endif -}; - -// Create a Simple containing "hello, world" -PyObject* new_simple() -{ - SimpleObject* simple = PyObject_New(SimpleObject, &SimpleType); - simple->x.s = const_cast("hello, world"); - return (PyObject*)simple; -} - -// -// Declare some wrappers/unwrappers to test the low-level conversion -// mechanism. -// -using boost::python::to_python_converter; - -// Wrap a simple by copying it into a Simple -struct simple_to_python - : to_python_converter - //, boost::python::converter::wrap_pytype<&SimpleType> -{ - static PyObject* convert(simple const& x) - { - SimpleObject* p = PyObject_New(SimpleObject, &SimpleType); - p->x = x; - return (PyObject*)p; - } - static PyTypeObject const *get_pytype(){return &SimpleType; } -}; - -struct int_from_noddy -{ - static int& execute(NoddyObject& p) - { - return p.x; - } -}; - -// -// Some C++ functions to expose to Python -// - -// Returns the length of s's held string -int f(simple const& s) -{ - return strlen(s.s); -} - -int f_mutable_ref(simple& s) -{ - return strlen(s.s); -} - -int f_mutable_ptr(simple* s) -{ - return strlen(s->s); -} - -int f_const_ptr(simple const* s) -{ - return strlen(s->s); -} - -int f2(SimpleObject const& s) -{ - return strlen(s.x.s); -} - -// A trivial passthru function for simple objects -simple const& g(simple const& x) -{ - return x; -} - -struct A -{ - A() : x(0) {} - virtual ~A() {} - char const* name() { return "A"; } - int x; -}; - -struct B : A -{ - B() : x(1) {} - static char const* name(B*) { return "B"; } - int x; -}; - -struct C : A -{ - C() : x(2) {} - char const* name() { return "C"; } - virtual ~C() {} - int x; -}; - -struct D : B, C -{ - D() : x(3) {} - char const* name() { return "D"; } - int x; -}; - -A take_a(A const& a) { return a; } -B take_b(B& b) { return b; } -C take_c(C* c) { return *c; } -D take_d(D* const& d) { return *d; } - -D take_d_shared_ptr(boost::shared_ptr d) { return *d; } - -boost::shared_ptr d_factory() { return boost::shared_ptr(new D); } - -struct Unregistered {}; -Unregistered make_unregistered(int) { return Unregistered(); } - -Unregistered* make_unregistered2(int) { return new Unregistered; } - -BOOST_PYTHON_MODULE(m1) -{ - using namespace boost::python; - using boost::shared_ptr; - - simple_to_python(); - - lvalue_from_pytype(); - - lvalue_from_pytype< -#if !defined(BOOST_MSVC) || BOOST_MSVC > 1300 // doesn't support non-type member pointer parameters - extract_member -#else - extract_simple_object -#endif - , &SimpleType - >(); - - lvalue_from_pytype,&SimpleType>(); - - def("new_noddy", new_noddy); - def("new_simple", new_simple); - - def("make_unregistered", make_unregistered); - def("make_unregistered2", make_unregistered2, return_value_policy()); - - // Expose f() in all its variations - def("f", f); - def("f_mutable_ref", f_mutable_ref); - def("f_mutable_ptr", f_mutable_ptr); - def("f_const_ptr", f_const_ptr); - - def("f2", f2); - - // Expose g() - def("g", g , return_value_policy() - ); - - def("take_a", take_a); - def("take_b", take_b); - def("take_c", take_c); - def("take_d", take_d); - - - def("take_d_shared_ptr", take_d_shared_ptr); - def("d_factory", d_factory); - - class_ >("A") - .def("name", &A::name) - ; - - // sequence points don't ensure that "A" is constructed before "B" - // or "C" below if we make them part of the same chain - class_ >("B") - .def("name", &B::name) - ; - - class_ >("C") - .def("name", &C::name) - ; - - class_ >("D") - .def("name", &D::name) - ; - - class_("complicated", - init()) - .def(init()) - .def("get_n", &complicated::get_n) - ; -} - -#include "module_tail.cpp" diff --git a/test/m2.cpp b/test/m2.cpp deleted file mode 100644 index 5bcdea60..00000000 --- a/test/m2.cpp +++ /dev/null @@ -1,108 +0,0 @@ -// Copyright David Abrahams 2001. -// 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) - -// This module exercises the converters exposed in m1 at a low level -// by exposing raw Python extension functions that use wrap<> and -// unwrap<> objects. -#include -#include -#include -#include -#include -#include "simple_type.hpp" - -#if PY_VERSION_HEX >= 0x03000000 -# define PyString_FromString PyUnicode_FromString -# define PyInt_FromLong PyLong_FromLong -#endif - -// Get a simple (by value) from the argument, and return the -// string it holds. -PyObject* unwrap_simple(simple x) -{ - return PyString_FromString(x.s); -} - -// Likewise, but demands that its possible to get a non-const -// reference to the simple. -PyObject* unwrap_simple_ref(simple& x) -{ - return PyString_FromString(x.s); -} - -// Likewise, with a const reference to the simple object. -PyObject* unwrap_simple_const_ref(simple const& x) -{ - return PyString_FromString(x.s); -} - -// Get an int (by value) from the argument, and convert it to a -// Python Int. -PyObject* unwrap_int(int x) -{ - return PyInt_FromLong(x); -} - -// Get a non-const reference to an int from the argument -PyObject* unwrap_int_ref(int& x) -{ - return PyInt_FromLong(x); -} - -// Get a const reference to an int from the argument. -PyObject* unwrap_int_const_ref(int const& x) -{ - return PyInt_FromLong(x); -} - -#if PY_VERSION_HEX >= 0x03000000 -# undef PyString_FromString -# undef PyInt_FromLong -#endif - -// rewrap extracts a T from the argument, then converts the T back -// to a PyObject* and returns it. -template -struct rewrap -{ - static T f(T x) { return x; } -}; - -BOOST_PYTHON_MODULE(m2) -{ - using boost::python::return_value_policy; - using boost::python::copy_const_reference; - using boost::python::copy_non_const_reference; - using boost::python::def; - - def("unwrap_int", unwrap_int); - def("unwrap_int_ref", unwrap_int_ref); - def("unwrap_int_const_ref", unwrap_int_const_ref); - def("unwrap_simple", unwrap_simple); - def("unwrap_simple_ref", unwrap_simple_ref); - def("unwrap_simple_const_ref", unwrap_simple_const_ref); - - def("wrap_int", &rewrap::f); - - def("wrap_int_ref", &rewrap::f - , return_value_policy() - ); - - def("wrap_int_const_ref", &rewrap::f - , return_value_policy() - ); - - def("wrap_simple", &rewrap::f); - - def("wrap_simple_ref", &rewrap::f - , return_value_policy() - ); - - def("wrap_simple_const_ref", &rewrap::f - , return_value_policy() - ); -} - -#include "module_tail.cpp" diff --git a/test/map_indexing_suite.cpp b/test/map_indexing_suite.cpp deleted file mode 100644 index b8771cf4..00000000 --- a/test/map_indexing_suite.cpp +++ /dev/null @@ -1,68 +0,0 @@ -// Copyright Joel de Guzman 2004. 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 -#include -#include -#include - -using namespace boost::python; - -struct X // a container element -{ - std::string s; - X():s("default") {} - X(std::string s):s(s) {} - std::string repr() const { return s; } - void reset() { s = "reset"; } - void foo() { s = "foo"; } - bool operator==(X const& x) const { return s == x.s; } - bool operator!=(X const& x) const { return s != x.s; } -}; - -std::string x_value(X const& x) -{ - return "gotya " + x.s; -} - - -BOOST_PYTHON_MODULE(map_indexing_suite_ext) -{ - class_("X") - .def(init<>()) - .def(init()) - .def(init()) - .def("__repr__", &X::repr) - .def("reset", &X::reset) - .def("foo", &X::foo) - ; - - def("x_value", x_value); - implicitly_convertible(); - - class_ >("XMap") - .def(map_indexing_suite >()) - ; - - void int_map_indexing_suite(); // moved to int_map_indexing_suite.cpp to - int_map_indexing_suite(); // avoid MSVC 6/7 internal structure overflow - -#if 0 - // Compile check only... - class_ >("IntMap") - .def(map_indexing_suite >()) - ; -#endif - - // Some more.. - class_ > >("TestMap") - .def(map_indexing_suite >, true>()) - ; - - void a_map_indexing_suite(); // moved to a_map_indexing_suite.cpp to - a_map_indexing_suite(); // avoid MSVC 6/7 internal structure overflow - -} - -#include "module_tail.cpp" diff --git a/test/map_indexing_suite.py b/test/map_indexing_suite.py deleted file mode 100644 index 9d9e2b26..00000000 --- a/test/map_indexing_suite.py +++ /dev/null @@ -1,242 +0,0 @@ -# Copyright Joel de Guzman 2004. 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) -''' - -##################################################################### -# Check an object that we will use as container element -##################################################################### - ->>> from map_indexing_suite_ext import * ->>> assert "map_indexing_suite_IntMap_entry" in dir() ->>> assert "map_indexing_suite_TestMap_entry" in dir() ->>> assert "map_indexing_suite_XMap_entry" in dir() ->>> assert "map_indexing_suite_AMap_entry" in dir() ->>> x = X('hi') ->>> x -hi ->>> x.reset() # a member function that modifies X ->>> x -reset ->>> x.foo() # another member function that modifies X ->>> x -foo - -# test that a string is implicitly convertible -# to an X ->>> x_value('bochi bochi') -'gotya bochi bochi' - -##################################################################### -# Iteration -##################################################################### ->>> def print_xmap(xmap): -... s = '[ ' -... for x in xmap: -... s += repr(x) -... s += ' ' -... s += ']' -... print s - -##################################################################### -# Setting (adding entries) -##################################################################### ->>> xm = XMap() ->>> xm['joel'] = 'apple' ->>> xm['tenji'] = 'orange' ->>> xm['mariel'] = 'grape' ->>> xm['tutit'] = 'banana' ->>> xm['kim'] = 'kiwi' - ->>> print_xmap(xm) -[ (joel, apple) (kim, kiwi) (mariel, grape) (tenji, orange) (tutit, banana) ] - -##################################################################### -# Changing an entry -##################################################################### ->>> xm['joel'] = 'pineapple' ->>> print_xmap(xm) -[ (joel, pineapple) (kim, kiwi) (mariel, grape) (tenji, orange) (tutit, banana) ] - -##################################################################### -# Deleting an entry -##################################################################### ->>> del xm['joel'] ->>> print_xmap(xm) -[ (kim, kiwi) (mariel, grape) (tenji, orange) (tutit, banana) ] - -##################################################################### -# adding an entry -##################################################################### ->>> xm['joel'] = 'apple' ->>> print_xmap(xm) -[ (joel, apple) (kim, kiwi) (mariel, grape) (tenji, orange) (tutit, banana) ] - -##################################################################### -# Indexing -##################################################################### ->>> len(xm) -5 ->>> xm['joel'] -apple ->>> xm['tenji'] -orange ->>> xm['mariel'] -grape ->>> xm['tutit'] -banana ->>> xm['kim'] -kiwi - -##################################################################### -# Calling a mutating function of a container element -##################################################################### ->>> xm['joel'].reset() ->>> xm['joel'] -reset - -##################################################################### -# Copying a container element -##################################################################### ->>> x = X(xm['mariel']) ->>> x -grape ->>> x.foo() ->>> x -foo ->>> xm['mariel'] # should not be changed to 'foo' -grape - -##################################################################### -# Referencing a container element -##################################################################### ->>> x = xm['mariel'] ->>> x -grape ->>> x.foo() ->>> x -foo ->>> xm['mariel'] # should be changed to 'foo' -foo - ->>> xm['mariel'] = 'grape' # take it back ->>> xm['joel'] = 'apple' # take it back - -##################################################################### -# Contains -##################################################################### ->>> assert 'joel' in xm ->>> assert 'mariel' in xm ->>> assert 'tenji' in xm ->>> assert 'tutit' in xm ->>> assert 'kim' in xm ->>> assert not 'X' in xm ->>> assert not 12345 in xm - -##################################################################### -# Some references to the container elements -##################################################################### - ->>> z0 = xm['joel'] ->>> z1 = xm['mariel'] ->>> z2 = xm['tenji'] ->>> z3 = xm['tutit'] ->>> z4 = xm['kim'] - ->>> z0 # proxy -apple ->>> z1 # proxy -grape ->>> z2 # proxy -orange ->>> z3 # proxy -banana ->>> z4 # proxy -kiwi - -##################################################################### -# Delete some container element -##################################################################### - ->>> del xm['tenji'] ->>> print_xmap(xm) -[ (joel, apple) (kim, kiwi) (mariel, grape) (tutit, banana) ] - ->>> del xm['tutit'] ->>> print_xmap(xm) -[ (joel, apple) (kim, kiwi) (mariel, grape) ] - -##################################################################### -# Show that the references are still valid -##################################################################### ->>> z0 # proxy -apple ->>> z1 # proxy -grape ->>> z2 # proxy detached -orange ->>> z3 # proxy detached -banana ->>> z4 # proxy -kiwi - -##################################################################### -# Show that iteration allows mutable access to the elements -##################################################################### ->>> for x in xm: -... x.data().reset() ->>> print_xmap(xm) -[ (joel, reset) (kim, reset) (mariel, reset) ] - -##################################################################### -# Some more... -##################################################################### - ->>> tm = TestMap() ->>> tm["joel"] = X("aaa") ->>> tm["kimpo"] = X("bbb") ->>> print_xmap(tm) -[ (joel, aaa) (kimpo, bbb) ] ->>> for el in tm: #doctest: +NORMALIZE_WHITESPACE -... print el.key(), -... dom = el.data() -joel kimpo - -##################################################################### -# Test custom converter... -##################################################################### - ->>> am = AMap() ->>> am[3] = 4 ->>> am[3] -4 ->>> for i in am: -... i.data() -4 - -##################################################################### -# END.... -##################################################################### - -''' - - -def run(args = None): - import sys - import doctest - - if args is not None: - sys.argxm = args - return doctest.testmod(sys.modules.get(__name__)) - -if __name__ == '__main__': - print 'running...' - import sys - status = run()[0] - if (status == 0): print "Done." - sys.exit(status) - - - - - diff --git a/test/minimal.cpp b/test/minimal.cpp deleted file mode 100644 index 5efee26b..00000000 --- a/test/minimal.cpp +++ /dev/null @@ -1,16 +0,0 @@ -// 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 -#include - -#if defined(_AIX) && defined(__EDG_VERSION__) && __EDG_VERSION__ < 245 -# include // works around a KCC intermediate code generation bug -#endif - -BOOST_PYTHON_MODULE(minimal_ext) -{ -} - -#include "module_tail.cpp" diff --git a/test/minimal.py b/test/minimal.py deleted file mode 100644 index 28e7918f..00000000 --- a/test/minimal.py +++ /dev/null @@ -1,7 +0,0 @@ -# Copyright David Abrahams 2004. 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) -print "IMPORTING minimal_ext" -import minimal_ext -print "DONE IMPORTING minimal_ext" - diff --git a/test/module_tail.cpp b/test/module_tail.cpp deleted file mode 100644 index f9cdca18..00000000 --- a/test/module_tail.cpp +++ /dev/null @@ -1,58 +0,0 @@ -// Copyright David Abrahams 2001. -// 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) - -#if defined(_WIN32) -# ifdef __MWERKS__ -# pragma ANSI_strict off -# endif -# include -# ifdef __MWERKS__ -# pragma ANSI_strict reset -# endif - -# ifdef _MSC_VER -# include // for _set_se_translator() -# pragma warning(push) -# pragma warning(disable:4297) -# pragma warning(disable:4535) -extern "C" void straight_to_debugger(unsigned int, EXCEPTION_POINTERS*) -{ - throw; -} -extern "C" void (*old_translator)(unsigned, EXCEPTION_POINTERS*) - = _set_se_translator(straight_to_debugger); -# pragma warning(pop) -# endif - -#endif // _WIN32 - -#include -#include -#include -struct test_failure : std::exception -{ - test_failure(char const* expr, char const* /*function*/, char const* file, unsigned line) - : msg(file + boost::python::str(":%s:") % line + ": Boost.Python assertion failure: " + expr) - {} - - ~test_failure() throw() {} - - char const* what() const throw() - { - return boost::python::extract(msg)(); - } - - boost::python::str msg; -}; - -namespace boost -{ - -void assertion_failed(char const * expr, char const * function, char const * file, long line) -{ - throw ::test_failure(expr,function, file, line); -} - -} // namespace boost diff --git a/test/multi_arg_constructor.cpp b/test/multi_arg_constructor.cpp deleted file mode 100644 index 7d49bb55..00000000 --- a/test/multi_arg_constructor.cpp +++ /dev/null @@ -1,27 +0,0 @@ -// Copyright David Abrahams 2004. 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 -#include -#include - -struct A -{ - A(const double, const double, const double, const double, const double - , const double, const double - , const double, const double - ) {} -}; - -BOOST_PYTHON_MODULE(multi_arg_constructor_ext) -{ - using namespace boost::python; - - class_( - "A" - , init() - ) - ; - -} - diff --git a/test/multi_arg_constructor.py b/test/multi_arg_constructor.py deleted file mode 100644 index eb8d338b..00000000 --- a/test/multi_arg_constructor.py +++ /dev/null @@ -1,21 +0,0 @@ -# Copyright David Abrahams 2004. 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) -''' ->>> from multi_arg_constructor_ext import * ->>> a = A(1.0, 2, 3, 4, 5, 6, 7.0, 8.1, 9.3) -''' -def run(args = None): - import sys - import doctest - - if args is not None: - sys.argv = args - return doctest.testmod(sys.modules.get(__name__)) - -if __name__ == '__main__': - print "running..." - import sys - status = run()[0] - if (status == 0): print "Done." - sys.exit(status) diff --git a/test/nested.cpp b/test/nested.cpp deleted file mode 100644 index de656d2b..00000000 --- a/test/nested.cpp +++ /dev/null @@ -1,51 +0,0 @@ -// 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 -#include -#include -#include -#include "test_class.hpp" -#if __GNUC__ != 2 -# include -#else -# include -#endif - -typedef test_class<> X; -typedef test_class<1> Y; - -std::ostream& operator<<(std::ostream& s, X const& x) -{ - return s << x.value(); -} - -std::ostream& operator<<(std::ostream& s, Y const& x) -{ - return s << x.value(); -} - - -BOOST_PYTHON_MODULE(nested_ext) -{ - using namespace boost::python; - - // Establish X as the current scope. - scope x_class - = class_("X", init()) - .def(str(self)) - ; - - - // Y will now be defined in the current scope - class_("Y", init()) - .def(str(self)) - ; -} - - -#include "module_tail.cpp" - - - diff --git a/test/nested.py b/test/nested.py deleted file mode 100644 index c3446e84..00000000 --- a/test/nested.py +++ /dev/null @@ -1,40 +0,0 @@ -# Copyright David Abrahams 2004. 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) -''' - >>> from nested_ext import * - - >>> X - - - >>> X.__module__ - 'nested_ext' - - >>> X.__name__ - 'X' - - >>> X.Y - - - >>> X.Y.__module__ - 'nested_ext' - - >>> X.Y.__name__ - 'Y' - -''' - -def run(args = None): - import sys - import doctest - - if args is not None: - sys.argv = args - return doctest.testmod(sys.modules.get(__name__)) - -if __name__ == '__main__': - print "running..." - import sys - status = run()[0] - if (status == 0): print "Done." - sys.exit(status) diff --git a/test/newtest.py b/test/newtest.py deleted file mode 100644 index 1862dcb4..00000000 --- a/test/newtest.py +++ /dev/null @@ -1,206 +0,0 @@ -# Copyright David Abrahams 2004. 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) -""" ->>> from m1 import * - ->>> from m2 import * - - Prove that we get an appropriate error from trying to return a type - for which we have no registered to_python converter - ->>> def check_unregistered(f, msgprefix): -... try: -... f(1) -... except TypeError, x: -... if not str(x).startswith(msgprefix): -... print str(x) -... else: -... print 'expected a TypeError' -... ->>> check_unregistered(make_unregistered, 'No to_python (by-value) converter found for C++ type') ->>> check_unregistered(make_unregistered2, 'No Python class registered for C++ class') - ->>> n = new_noddy() ->>> s = new_simple() ->>> unwrap_int(n) -42 ->>> unwrap_int_ref(n) -42 ->>> unwrap_int_const_ref(n) -42 ->>> unwrap_simple(s) -'hello, world' ->>> unwrap_simple_ref(s) -'hello, world' ->>> unwrap_simple_const_ref(s) -'hello, world' ->>> unwrap_int(5) -5 - -Can't get a non-const reference to a built-in integer object ->>> try: -... unwrap_int_ref(7) -... except: pass -... else: print 'no exception' - ->>> unwrap_int_const_ref(9) -9 - ->>> wrap_int(n) -42 - -try: wrap_int_ref(n) -... except: pass -... else: print 'no exception' - ->>> wrap_int_const_ref(n) -42 - ->>> unwrap_simple_ref(wrap_simple(s)) -'hello, world' - ->>> unwrap_simple_ref(wrap_simple_ref(s)) -'hello, world' - ->>> unwrap_simple_ref(wrap_simple_const_ref(s)) -'hello, world' - ->>> f(s) -12 - ->>> unwrap_simple(g(s)) -'hello, world' - ->>> f(g(s)) -12 - ->>> f_mutable_ref(g(s)) -12 - ->>> f_const_ptr(g(s)) -12 - ->>> f_mutable_ptr(g(s)) -12 - ->>> f2(g(s)) -12 - -Create an extension class which wraps "complicated" (init1 and get_n) -are a complicated constructor and member function, respectively. - ->>> c1 = complicated(s, 99) ->>> c1.get_n() -99 ->>> c2 = complicated(s) ->>> c2.get_n() -0 - - a quick regression test for a bug where None could be converted - to the target of any member function. To see it, we need to - access the __dict__ directly, to bypass the type check supplied - by the Method property which wraps the method when accessed as an - attribute. - ->>> try: A.__dict__['name'](None) -... except TypeError: pass -... else: print 'expected an exception!' - - ->>> a = A() ->>> b = B() ->>> c = C() ->>> d = D() - - ->>> take_a(a).name() -'A' - ->>> try: -... take_b(a) -... except: pass -... else: print 'no exception' - ->>> try: -... take_c(a) -... except: pass -... else: print 'no exception' - ->>> try: -... take_d(a) -... except: pass -... else: print 'no exception' - ------- ->>> take_a(b).name() -'A' - ->>> take_b(b).name() -'B' - ->>> try: -... take_c(b) -... except: pass -... else: print 'no exception' - ->>> try: -... take_d(b) -... except: pass -... else: print 'no exception' - -------- ->>> take_a(c).name() -'A' - ->>> try: -... take_b(c) -... except: pass -... else: print 'no exception' - ->>> take_c(c).name() -'C' - ->>> try: -... take_d(c) -... except: pass -... else: print 'no exception' - -------- ->>> take_a(d).name() -'A' ->>> take_b(d).name() -'B' ->>> take_c(d).name() -'C' ->>> take_d(d).name() -'D' - ->>> take_d_shared_ptr(d).name() -'D' - ->>> d_as_a = d_factory() ->>> dd = take_d(d_as_a) ->>> dd.name() -'D' ->>> print g.__doc__.splitlines()[1] -g( (Simple)arg1) -> Simple : - -""" - -def run(args = None): - - import sys - import doctest - - if args is not None: - sys.argv = args - - return doctest.testmod(sys.modules.get(__name__)) - -if __name__ == '__main__': - print "running..." - import sys - status = run()[0] - if (status == 0): print "Done." - sys.exit(status) diff --git a/test/numarray_tests.py b/test/numarray_tests.py deleted file mode 100644 index be3d9d4e..00000000 --- a/test/numarray_tests.py +++ /dev/null @@ -1,63 +0,0 @@ -# Copyright David Abrahams 2006. 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) -import printer - -# So we can coerce portably across Python versions -bool = type(1 == 1) - -''' ->>> from numpy_ext import * ->>> x = new_array() ->>> y = x.copy() ->>> p = _printer() ->>> check = p.check ->>> exercise_numarray(x, p) - ->>> check(str(y)) - ->>> check(y.argmax()); ->>> check(y.argmax(0)); - ->>> check(y.argmin()); ->>> check(y.argmin(0)); - ->>> check(y.argsort()); ->>> check(y.argsort(1)); - ->>> y.byteswap(); ->>> check(y); - ->>> check(y.diagonal()); ->>> check(y.diagonal(1)); ->>> check(y.diagonal(0, 0)); ->>> check(y.diagonal(0, 1, 0)); - ->>> check(y.is_c_array()); - -# coerce because numarray still returns an int and the C++ interface forces -# the return type to bool ->>> check( bool(y.isbyteswapped()) ); - ->>> check(y.trace()); ->>> check(y.trace(1)); ->>> check(y.trace(0, 0)); ->>> check(y.trace(0, 1, 0)); - ->>> check(y.new('D').getshape()); ->>> check(y.new('D').type()); ->>> y.sort(); ->>> check(y); ->>> check(y.type()); - ->>> check(y.factory((1.2, 3.4))); ->>> check(y.factory((1.2, 3.4), "f8")) ->>> check(y.factory((1.2, 3.4), "f8", true)) ->>> check(y.factory((1.2, 3.4), "f8", true, false)) ->>> check(y.factory((1.2, 3.4), "f8", true, false, None)) ->>> check(y.factory((1.2, 3.4), "f8", true, false, None, (1,2,1))) - ->>> p.results -[] ->>> del p -''' diff --git a/test/numeric_tests.py b/test/numeric_tests.py deleted file mode 100644 index 569ec19e..00000000 --- a/test/numeric_tests.py +++ /dev/null @@ -1,39 +0,0 @@ -# Copyright David Abrahams 2006. 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) -import printer -''' ->>> from numpy_ext import * ->>> x = new_array() ->>> x[1,1] = 0.0 - ->>> try: take_array(3) -... except TypeError: pass -... else: print 'expected a TypeError' - ->>> take_array(x) - ->>> print x -[[1 2 3] - [4 0 6] - [7 8 9]] - ->>> y = x.copy() - - ->>> p = _printer() ->>> check = p.check ->>> exercise(x, p) ->>> y[2,1] = 3 ->>> check(y); - ->>> check(y.astype('D')); - ->>> check(y.copy()); - ->>> check(y.typecode()); - ->>> p.results -[] ->>> del p -''' diff --git a/test/numpy.cpp b/test/numpy.cpp deleted file mode 100644 index 9472f92e..00000000 --- a/test/numpy.cpp +++ /dev/null @@ -1,136 +0,0 @@ -// 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 -#include -#include -#include -#include - -using namespace boost::python; -namespace py = boost::python; - -// See if we can invoke array() from C++ -numeric::array new_array() -{ - return numeric::array( - py::make_tuple( - py::make_tuple(1,2,3) - , py::make_tuple(4,5,6) - , py::make_tuple(7,8,9) - ) - ); -} - -// test argument conversion -void take_array(numeric::array /*x*/) -{ -} - -// A separate function to invoke the info() member. Must happen -// outside any doctests since this prints directly to stdout and the -// result text includes the address of the 'self' array. -void info(numeric::array const& z) -{ - z.info(); -} - -namespace -{ - object handle_error() - { - PyObject* type, *value, *traceback; - PyErr_Fetch(&type, &value, &traceback); - handle<> ty(type), v(value), tr(traceback); - return object("exception"); - str format("exception type: %sn"); - format += "exception value: %sn"; - format += "traceback:n%s" ; - object ret = format % py::make_tuple(ty, v, tr); - return ret; - } -} -#define CHECK(expr) \ -{ \ - object result; \ - try { result = object(expr); } \ - catch(error_already_set) \ - { \ - result = handle_error(); \ - } \ - check(result); \ -} - -// Tests which work on both Numeric and numarray array objects. Of -// course all of the operators "just work" since numeric::array -// inherits that behavior from object. -void exercise(numeric::array& y, object check) -{ - y[py::make_tuple(2,1)] = 3; - CHECK(y); - CHECK(y.astype('D')); - CHECK(y.copy()); - CHECK(y.typecode()); -} - -// numarray-specific tests. check is a callable object which we can -// use to record intermediate results, which are later compared with -// the results of corresponding python operations. -void exercise_numarray(numeric::array& y, object check) -{ - CHECK(str(y)); - - CHECK(y.argmax()); - CHECK(y.argmax(0)); - - CHECK(y.argmin()); - CHECK(y.argmin(0)); - - CHECK(y.argsort()); - CHECK(y.argsort(1)); - - y.byteswap(); - CHECK(y); - - CHECK(y.diagonal()); - CHECK(y.diagonal(1)); - CHECK(y.diagonal(0, 0)); - CHECK(y.diagonal(0, 1, 0)); - - CHECK(y.is_c_array()); - CHECK(y.isbyteswapped()); - - CHECK(y.trace()); - CHECK(y.trace(1)); - CHECK(y.trace(0, 0)); - CHECK(y.trace(0, 1, 0)); - - CHECK(y.new_("D").getshape()); - CHECK(y.new_("D").type()); - y.sort(); - CHECK(y); - CHECK(y.type()); - - CHECK(y.factory(py::make_tuple(1.2, 3.4))); - CHECK(y.factory(py::make_tuple(1.2, 3.4), "f8")); - CHECK(y.factory(py::make_tuple(1.2, 3.4), "f8", true)); - CHECK(y.factory(py::make_tuple(1.2, 3.4), "f8", true, false)); - CHECK(y.factory(py::make_tuple(1.2, 3.4), "f8", true, false, object())); - CHECK (y.factory(py::make_tuple(1.2, 3.4), "f8", true, false, object(), py::make_tuple(1,2,1))); - -} - -BOOST_PYTHON_MODULE(numpy_ext) -{ - def("new_array", new_array); - def("take_array", take_array); - def("exercise", exercise); - def("exercise_numarray", exercise_numarray); - def("set_module_and_type", &numeric::array::set_module_and_type); - def("get_module_name", &numeric::array::get_module_name); - def("info", info); -} - -#include "module_tail.cpp" diff --git a/test/numpy.py b/test/numpy.py deleted file mode 100644 index 84e8313d..00000000 --- a/test/numpy.py +++ /dev/null @@ -1,87 +0,0 @@ -# Copyright David Abrahams 2004. 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) - -false = 0; -true = 1; - -import doctest, numeric_tests -def _count_failures(test_modules = (numeric_tests,)): - failures = 0 - for m in test_modules: - failures += doctest.testmod(m)[0] - return failures - -def _run(args = None): - import sys, numarray_tests, numeric_tests - - if args is not None: - sys.argv = args - - # See which of the numeric modules are installed - has_numeric = 0 - try: import Numeric - except ImportError: pass - else: - has_numeric = 1 - m = Numeric - - has_numarray = 0 - try: import numarray - except ImportError: pass - else: - has_numarray = 1 - m = numarray - - # Bail if neither one is installed - if not (has_numeric or has_numarray): - return 0 - - # test the info routine outside the doctest. See numpy.cpp for an - # explanation - import numpy_ext - if (has_numarray): - numpy_ext.info(m.array((1,2,3))) - - failures = 0 - - # - # Run tests 4 different ways if both modules are installed, just - # to show that set_module_and_type() is working properly - # - - # run all the tests with default module search - print 'testing default extension module:', \ - numpy_ext.get_module_name() or '[numeric support not installed]' - - failures += _count_failures() - - # test against Numeric if installed - if has_numeric: - print 'testing Numeric module explicitly' - numpy_ext.set_module_and_type('Numeric', 'ArrayType') - - failures += _count_failures() - - if has_numarray: - print 'testing numarray module explicitly' - numpy_ext.set_module_and_type('numarray', 'NDArray') - # Add the _numarray_tests to the list of things to test in - # this case. - failures += _count_failures((numarray_tests, numeric_tests)) - - # see that we can go back to the default - numpy_ext.set_module_and_type('', '') - print 'testing default module again:', \ - numpy_ext.get_module_name() or '[numeric support not installed]' - - failures += _count_failures() - - return failures - -if __name__ == '__main__': - print "running..." - import sys - status = _run() - if (status == 0): print "Done." - sys.exit(status) diff --git a/test/object.cpp b/test/object.cpp deleted file mode 100644 index b1f01518..00000000 --- a/test/object.cpp +++ /dev/null @@ -1,392 +0,0 @@ -// 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 -#include -#include -#include - -using namespace boost::python; - -class NotCopyable -{ -} not_copyable; - -object ref_to_noncopyable() -{ - return object(boost::ref(not_copyable)); -} - -object call_object_3(object f) -{ - return f(3); -} - -object message() -{ - return object("hello, world!"); -} - -object number() -{ - return object(42); -} - -object obj_getattr(object x, char const* name) -{ - return x.attr(name); -} - -object obj_objgetattr(object x, object const& name) -{ - return x.attr(name); -} - -object obj_const_getattr(object const& x, char const* name) -{ - return x.attr(name); -} - -object obj_const_objgetattr(object const& x, object const& name) -{ - return x.attr(name); -} - -void obj_setattr(object x, char const* name, object value) -{ - x.attr(name) = value; -} - -void obj_objsetattr(object x, object const& name, object value) -{ - x.attr(name) = value; -} - -void obj_setattr42(object x, char const* name) -{ - x.attr(name) = 42; -} - -void obj_objsetattr42(object x, object const& name) -{ - x.attr(name) = 42; -} - -void obj_moveattr(object& x, char const* src, char const* dst) -{ - x.attr(dst) = x.attr(src); -} - -void obj_objmoveattr(object& x, object const& src, object const& dst) -{ - x.attr(dst) = x.attr(src); -} - -void obj_delattr(object x, char const* name) -{ - x.attr(name).del(); -} - -void obj_objdelattr(object x, object const& name) -{ - x.attr(name).del(); -} - -object obj_getitem(object x, object key) -{ - return x[key]; -} - -object obj_getitem3(object x) -{ - return x[3]; -} - -object obj_const_getitem(object const& x, object key) -{ - return x[key]; -} - -void obj_setitem(object x, object key, object value) -{ - x[key] = value; -} - -void obj_setitem42(object x, object key) -{ - x[key] = 42; -} - -void obj_moveitem(object& x, object src, object dst) -{ - x[dst] = x[src]; -} - -void obj_moveitem2(object const& x_src, object k_src, object& x_dst, object k_dst) -{ - x_dst[k_dst] = x_src[k_src]; -} - -bool test(object y) -{ - return y; -} - -bool test_not(object y) -{ - return !y; -} - -bool test_attr(object y, char* name) -{ - return y.attr(name); -} - -bool test_objattr(object y, object& name) -{ - return y.attr(name); -} - -bool test_not_attr(object y, char* name) -{ - return !y.attr(name); -} - -bool test_not_objattr(object y, object& name) -{ - return !y.attr(name); -} - -bool test_item(object y, object key) -{ - return y[key]; -} - -bool test_not_item(object y, object key) -{ - return !y[key]; -} - -bool check_string_slice() -{ - object s("hello, world"); - - if (s.slice(_,-3) != "hello, wo") - return false; - - if (s.slice(-3,_) != "rld") - return false; - - if (s.slice(_,_) != s) - return false; - - if (", " != s.slice(5,7)) - return false; - - return s.slice(2,-1).slice(1,-1) == "lo, wor"; -} - -object test_call(object c, object args, object kwds) -{ - return c(*args, **kwds); -} - -bool check_binary_operators() -{ - int y; - - object x(3); - -#define TEST_BINARY(op) \ - for (y = 1; y < 6; ++y) \ - { \ - if ((x op y) != (3 op y)) \ - return false; \ - } \ - for (y = 1; y < 6; ++y) \ - { \ - if ((y op x) != (y op 3)) \ - return false; \ - } \ - for (y = 1; y < 6; ++y) \ - { \ - object oy(y); \ - if ((oy op x) != (oy op 3)) \ - return false; \ - } - TEST_BINARY(>) - TEST_BINARY(>=) - TEST_BINARY(<) - TEST_BINARY(<=) - TEST_BINARY(==) - TEST_BINARY(!=) - - TEST_BINARY(+) - TEST_BINARY(-) - TEST_BINARY(*) - TEST_BINARY(/) - TEST_BINARY(%) - TEST_BINARY(<<) - TEST_BINARY(>>) - TEST_BINARY(&) - TEST_BINARY(^) - TEST_BINARY(|) - return true; -} - -bool check_inplace(object l, object o) -{ - int y; -#define TEST_INPLACE(op) \ - for (y = 1; y < 6; ++y) \ - { \ - object x(666); \ - x op##= y; \ - if (x != (666 op y)) \ - return false; \ - } \ - for (y = 1; y < 6; ++y) \ - { \ - object x(666); \ - x op##= object(y); \ - if (!(x == (666 op y))) \ - return false; \ - } - TEST_INPLACE(+) - TEST_INPLACE(-) - TEST_INPLACE(*) - TEST_INPLACE(/) - TEST_INPLACE(%) - TEST_INPLACE(<<) - TEST_INPLACE(>>) - TEST_INPLACE(&) - TEST_INPLACE(^) - TEST_INPLACE(|) - - l += l; - for (y = 0; y < 6; ++y) - { - if (l[y] != y % 3) - return false; - } - -#define TEST_ITEM_INPLACE(index, op, n, r1, r2) \ - l[index] op##= n; \ - if (l[index] != r1) \ - return false; \ - l[index] op##= object(n); \ - if (!(l[index] == r2)) \ - return false; - - TEST_ITEM_INPLACE(0,+,7,7,14) - TEST_ITEM_INPLACE(1,-,2,-1,-3) - TEST_ITEM_INPLACE(2,*,3,6,18) - TEST_ITEM_INPLACE(2,/,2,9,4) - TEST_ITEM_INPLACE(0,%,4,2,2) - l[0] += 1; - TEST_ITEM_INPLACE(0,<<,2,12,48) - TEST_ITEM_INPLACE(0,>>,1,24,12) - l[4] = 15; - TEST_ITEM_INPLACE(4,&,(16+4+1),5,5) - TEST_ITEM_INPLACE(0,^,1,13,12) - TEST_ITEM_INPLACE(0,|,1,13,13) - - o.attr("x0") = 0; - o.attr("x1") = 1; - o.attr("x2") = 2; - o.attr("x3") = 0; - o.attr("x4") = 1; - -#define TEST_ATTR_INPLACE(index, op, n, r1, r2) \ - o.attr("x" #index) op##= n; \ - if (o.attr("x" #index) != r1) \ - return false; \ - o.attr("x" #index) op##= object(n); \ - if (o.attr("x" #index) != r2) \ - return false; - - TEST_ATTR_INPLACE(0,+,7,7,14) - TEST_ATTR_INPLACE(1,-,2,-1,-3) - TEST_ATTR_INPLACE(2,*,3,6,18) - TEST_ATTR_INPLACE(2,/,2,9,4) - TEST_ATTR_INPLACE(0,%,4,2,2) - o.attr("x0") += 1; - TEST_ATTR_INPLACE(0,<<,2,12,48) - TEST_ATTR_INPLACE(0,>>,1,24,12) - o.attr("x4") = 15; - TEST_ATTR_INPLACE(4,&,(16+4+1),5,5) - TEST_ATTR_INPLACE(0,^,1,13,12) - TEST_ATTR_INPLACE(0,|,1,13,13) - - if (l[0] != o.attr("x0")) - return false; - if (l[1] != o.attr("x1")) - return false; - if (l[2] != o.attr("x2")) - return false; - if (l[3] != o.attr("x3")) - return false; - if (l[4] != o.attr("x4")) - return false; - - // set item 5 to be a list, by calling l.__class__ - l[5] = l.attr("__class__")(); - // append an element - l[5].attr("append")(2); - // Check its value - if (l[5][0] != 2) - return false; - - return true; -} - -BOOST_PYTHON_MODULE(object_ext) -{ - class_("NotCopyable", no_init); - - def("ref_to_noncopyable", ref_to_noncopyable); - def("call_object_3", call_object_3); - def("message", message); - def("number", number); - - def("obj_getattr", obj_getattr); - def("obj_objgetattr", obj_objgetattr); - def("obj_const_getattr", obj_const_getattr); - def("obj_const_objgetattr", obj_const_objgetattr); - def("obj_setattr", obj_setattr); - def("obj_objsetattr", obj_objsetattr); - def("obj_setattr42", obj_setattr42); - def("obj_objsetattr42", obj_objsetattr42); - def("obj_moveattr", obj_moveattr); - def("obj_objmoveattr", obj_objmoveattr); - def("obj_delattr", obj_delattr); - def("obj_objdelattr", obj_objdelattr); - - def("obj_getitem", obj_getitem); - def("obj_getitem3", obj_getitem); - def("obj_const_getitem", obj_const_getitem); - def("obj_setitem", obj_setitem); - def("obj_setitem42", obj_setitem42); - def("obj_moveitem", obj_moveitem); - def("obj_moveitem2", obj_moveitem2); - - def("test", test); - def("test_not", test_not); - - def("test_attr", test_attr); - def("test_objattr", test_objattr); - def("test_not_attr", test_not_attr); - def("test_not_objattr", test_not_objattr); - - def("test_item", test_item); - def("test_not_item", test_not_item); - - def("test_call", test_call); - def("check_binary_operators", check_binary_operators); - def("check_inplace", check_inplace); - def("check_string_slice", check_string_slice); - ; -} - -#include "module_tail.cpp" diff --git a/test/object.py b/test/object.py deleted file mode 100644 index 84972e64..00000000 --- a/test/object.py +++ /dev/null @@ -1,179 +0,0 @@ -# Copyright David Abrahams 2004. 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) -''' ->>> from object_ext import * - ->>> type(ref_to_noncopyable()) - - ->>> def print1(x): -... print x ->>> call_object_3(print1) -3 ->>> message() -'hello, world!' ->>> number() -42 - ->>> test('hi') -1 ->>> test(None) -0 ->>> test_not('hi') -0 ->>> test_not(0) -1 - - Attributes - ->>> class X: pass -... ->>> x = X() - ->>> try: obj_getattr(x, 'foo') -... except AttributeError: pass -... else: print 'expected an exception' ->>> try: obj_objgetattr(x, 'objfoo') -... except AttributeError: pass -... else: print 'expected an exception' - ->>> obj_setattr(x, 'foo', 1) ->>> x.foo -1 ->>> obj_objsetattr(x, 'objfoo', 1) ->>> try:obj_objsetattr(x, 1) -... except TypeError: pass -... else: print 'expected an exception' ->>> x.objfoo -1 ->>> obj_getattr(x, 'foo') -1 ->>> obj_objgetattr(x, 'objfoo') -1 ->>> try:obj_objgetattr(x, 1) -... except TypeError: pass -... else: print 'expected an exception' ->>> obj_const_getattr(x, 'foo') -1 ->>> obj_const_objgetattr(x, 'objfoo') -1 ->>> obj_setattr42(x, 'foo') ->>> x.foo -42 ->>> obj_objsetattr42(x, 'objfoo') ->>> x.objfoo -42 ->>> obj_moveattr(x, 'foo', 'bar') ->>> x.bar -42 ->>> obj_objmoveattr(x, 'objfoo', 'objbar') ->>> x.objbar -42 ->>> test_attr(x, 'foo') -1 ->>> test_objattr(x, 'objfoo') -1 ->>> test_not_attr(x, 'foo') -0 ->>> test_not_objattr(x, 'objfoo') -0 ->>> x.foo = None ->>> test_attr(x, 'foo') -0 ->>> x.objfoo = None ->>> test_objattr(x, 'objfoo') -0 ->>> test_not_attr(x, 'foo') -1 ->>> test_not_objattr(x, 'objfoo') -1 ->>> obj_delattr(x, 'foo') ->>> obj_objdelattr(x, 'objfoo') ->>> try:obj_delattr(x, 'foo') -... except AttributeError: pass -... else: print 'expected an exception' ->>> try:obj_objdelattr(x, 'objfoo') -... except AttributeError: pass -... else: print 'expected an exception' - - Items - ->>> d = {} ->>> obj_setitem(d, 'foo', 1) ->>> d['foo'] -1 ->>> obj_getitem(d, 'foo') -1 ->>> obj_const_getitem(d, 'foo') -1 ->>> obj_setitem42(d, 'foo') ->>> obj_getitem(d, 'foo') -42 ->>> d['foo'] -42 ->>> obj_moveitem(d, 'foo', 'bar') ->>> d['bar'] -42 ->>> obj_moveitem2(d, 'bar', d, 'baz') ->>> d['baz'] -42 ->>> test_item(d, 'foo') -1 ->>> test_not_item(d, 'foo') -0 ->>> d['foo'] = None ->>> test_item(d, 'foo') -0 ->>> test_not_item(d, 'foo') -1 - - Slices - ->>> assert check_string_slice() - - Operators - ->>> def print_args(*args, **kwds): -... print args, kwds ->>> test_call(print_args, (0, 1, 2, 3), {'a':'A'}) -(0, 1, 2, 3) {'a': 'A'} - - ->>> assert check_binary_operators() - ->>> class X: pass -... ->>> assert check_inplace(range(3), X()) - - - Now make sure that object is actually managing reference counts - ->>> import weakref ->>> class Z: pass -... ->>> z = Z() ->>> def death(r): print 'death' -... ->>> r = weakref.ref(z, death) ->>> z.foo = 1 ->>> obj_getattr(z, 'foo') -1 ->>> del z -death -''' - -def run(args = None): - import sys - import doctest - - if args is not None: - sys.argv = args - return doctest.testmod(sys.modules.get(__name__)) - -if __name__ == '__main__': - print "running..." - import sys - status = run()[0] - if (status == 0): print "Done." - sys.exit(status) diff --git a/test/object_fail1.cpp b/test/object_fail1.cpp deleted file mode 100755 index 6bb2eda5..00000000 --- a/test/object_fail1.cpp +++ /dev/null @@ -1,11 +0,0 @@ -// 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 - -int f(boost::python::object const& x) -{ - x._("hello") = 1; - return 0; -} diff --git a/test/object_manager.cpp b/test/object_manager.cpp deleted file mode 100755 index e3608c1f..00000000 --- a/test/object_manager.cpp +++ /dev/null @@ -1,33 +0,0 @@ -// 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 -#include -#include -#include - -using namespace boost::python; -using namespace boost::python::converter; - -struct X {}; - -int main() -{ - BOOST_STATIC_ASSERT(is_object_manager >::value); - BOOST_STATIC_ASSERT(!is_object_manager::value); - BOOST_STATIC_ASSERT(!is_object_manager::value); - - BOOST_STATIC_ASSERT(is_reference_to_object_manager&>::value); - BOOST_STATIC_ASSERT(is_reference_to_object_manager const&>::value); - BOOST_STATIC_ASSERT(is_reference_to_object_manager volatile&>::value); - BOOST_STATIC_ASSERT(is_reference_to_object_manager const volatile&>::value); - - BOOST_STATIC_ASSERT(!is_reference_to_object_manager >::value); - BOOST_STATIC_ASSERT(!is_reference_to_object_manager::value); - BOOST_STATIC_ASSERT(!is_reference_to_object_manager::value); - BOOST_STATIC_ASSERT(!is_reference_to_object_manager::value); - - return 0; -} - diff --git a/test/opaque.cpp b/test/opaque.cpp deleted file mode 100644 index f15e9458..00000000 --- a/test/opaque.cpp +++ /dev/null @@ -1,76 +0,0 @@ -// Copyright David Abrahams and Gottfried Ganssauge 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) -# include -# include -# include -# include - -typedef struct opaque_ *opaque; -typedef struct opaque2_ *opaque2; - -opaque the_op = ((opaque) 0x47110815); -opaque2 the_op2 = ((opaque2) 0x08154711); - -opaque get() { return the_op; } - -void use(opaque op) -{ - if (op != the_op) - throw std::runtime_error (std::string ("failed")); -} - -int useany(opaque op) -{ - return op ? 1 : 0; -} - -opaque getnull() -{ - return 0; -} - -void failuse (opaque op) -{ - if (op == the_op) - throw std::runtime_error (std::string ("success")); -} - -opaque2 get2 () { return the_op2; } - -void use2 (opaque2 op) -{ - if (op != the_op2) - throw std::runtime_error (std::string ("failed")); -} - -void failuse2 (opaque2 op) -{ - if (op == the_op2) - throw std::runtime_error (std::string ("success")); -} - -BOOST_PYTHON_OPAQUE_SPECIALIZED_TYPE_ID(opaque_) -BOOST_PYTHON_OPAQUE_SPECIALIZED_TYPE_ID(opaque2_) - -namespace bpl = boost::python; - -BOOST_PYTHON_MODULE(opaque_ext) -{ - bpl::def ( - "get", &::get, bpl::return_value_policy()); - bpl::def ("use", &::use); - bpl::def ("useany", &::useany); - bpl::def ("getnull", &::getnull, bpl::return_value_policy()); - bpl::def ("failuse", &::failuse); - - bpl::def ( - "get2", - &::get2, - bpl::return_value_policy()); - bpl::def ("use2", &::use2); - bpl::def ("failuse2", &::failuse2); -} - -# include "module_tail.cpp" diff --git a/test/opaque.py b/test/opaque.py deleted file mode 100644 index 2ee0aa0c..00000000 --- a/test/opaque.py +++ /dev/null @@ -1,87 +0,0 @@ -# -*- coding: latin-1 -*- -# Copyright Gottfried Ganauge 2003..2006. 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) - - -""" ->>> from opaque_ext import * - - - Check for correct conversion - ->>> use(get()) - - Check that None is converted to a NULL opaque pointer - ->>> useany(get()) -1 ->>> useany(None) -0 - - Check that we don't lose type information by converting NULL - opaque pointers to None - ->>> assert getnull() is None ->>> useany(getnull()) -0 - ->>> failuse(get()) -Traceback (most recent call last): - ... -RuntimeError: success - - Check that there is no conversion from integers ... - ->>> try: use(0) -... except TypeError: pass -... else: print 'expected a TypeError' - - ... and from strings to opaque objects - ->>> try: use("") -... except TypeError: pass -... else: print 'expected a TypeError' - - Now check the same for another opaque pointer type - ->>> use2(get2()) ->>> failuse2(get2()) -Traceback (most recent call last): - ... -RuntimeError: success ->>> try: use2(0) -... except TypeError: pass -... else: print 'expected a TypeError' ->>> try: use2("") -... except TypeError: pass -... else: print 'expected a TypeError' - - Check that opaque types are distinct - ->>> try: use(get2()) -... except TypeError: pass -... else: print 'expected a TypeError' ->>> try: use2(get()) -... except TypeError: pass -... else: print 'expected a TypeError' - - This used to result in a segmentation violation - ->>> type(get()) != type (get2()) -1 -""" -def run(args = None): - import sys - import doctest - - if args is not None: - sys.argv = args - return doctest.testmod(sys.modules.get(__name__)) - -if __name__ == '__main__': - print "running..." - import sys - status = run()[0] - if (status == 0): print "Done." - sys.exit(status) diff --git a/test/operators.cpp b/test/operators.cpp deleted file mode 100755 index c58f2b00..00000000 --- a/test/operators.cpp +++ /dev/null @@ -1,175 +0,0 @@ -// 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 -#include -#include -#include -#include "test_class.hpp" -#include -#include -#include -#include -//#include -// Just use math.h here; trying to use std::pow() causes too much -// trouble for non-conforming compilers and libraries. -#include - -#if __GNUC__ != 2 -# include -#else -# include -#endif - -using namespace boost::python; - - -using namespace boost::python; - -struct X : test_class<> -{ - typedef test_class<> base_t; - - X(int x) : base_t(x) {} - X const operator+(X const& r) const { return X(value() + r.value()); } - -// typedef int (X::*safe_bool)() const; -// operator safe_bool() const { return value() != 0 ? &X::value : 0; } -}; - -X operator-(X const& l, X const& r) { return X(l.value() - r.value()); } -X operator-(int l, X const& r) { return X(l - r.value()); } -X operator-(X const& l, int r) { return X(l.value() - r); } - -X operator-(X const& x) { return X(-x.value()); } - -X& operator-=(X& l, X const& r) { l.set(l.value() - r.value()); return l; } - -bool operator<(X const& x, X const& y) { return x.value() < y.value(); } -bool operator<(X const& x, int y) { return x.value() < y; } -bool operator<(int x, X const& y) { return x < y.value(); } - -X abs(X x) { return X(x.value() < 0 ? -x.value() : x.value()); } - -X pow(X x, int y) -{ - return X(int(pow(double(x.value()), double(y)))); -} - -X pow(X x, X y) -{ - return X(int(pow(double(x.value()), double(y.value())))); -} - -int pow(int x, X y) -{ - return int(pow(double(x), double(y.value()))); -} - -std::ostream& operator<<(std::ostream& s, X const& x) -{ - return s << x.value(); -} - -struct number - : boost::integer_arithmetic -{ - explicit number(long x_) : x(x_) {} - operator long() const { return x; } - - template - number& operator+=(T const& rhs) - { x += rhs; return *this; } - - template - number& operator-=(T const& rhs) - { x -= rhs; return *this; } - - template - number& operator*=(T const& rhs) - { x *= rhs; return *this; } - - template - number& operator/=(T const& rhs) - { x /= rhs; return *this; } - - template - number& operator%=(T const& rhs) - { x %= rhs; return *this; } - - long x; -}; - -BOOST_PYTHON_MODULE(operators_ext) -{ - class_("X", init()) - .def("value", &X::value) - .def(self + self) - .def(self - self) - .def(self - int()) - .def(other() - self) - .def(-self) - .def(self < other()) - .def(self < self) - .def(1 < self) - .def(self -= self) - - .def(abs(self)) - .def(str(self)) - - .def(pow(self,self)) - .def(pow(self,int())) - .def(pow(int(),self)) - .def( - !self - // "not self" is legal here but causes friction on a few - // nonconforming compilers; it's cute because it looks - // like python, but doing it here doesn't prove much and - // just causes tests to fail or complicated workarounds to - // be enacted. - ) - ; - - class_("number", init()) - // interoperate with self - .def(self += self) - .def(self + self) - .def(self -= self) - .def(self - self) - .def(self *= self) - .def(self * self) - .def(self /= self) - .def(self / self) - .def(self %= self) - .def(self % self) - - // Convert to Python int - .def(int_(self)) - - // interoperate with long - .def(self += long()) - .def(self + long()) - .def(long() + self) - .def(self -= long()) - .def(self - long()) - .def(long() - self) - .def(self *= long()) - .def(self * long()) - .def(long() * self) - .def(self /= long()) - .def(self / long()) - .def(long() / self) - .def(self %= long()) - .def(self % long()) - .def(long() % self) - ; - - class_ >("Z", init()) - .def(int_(self)) - .def(float_(self)) - .def(complex_(self)) - ; -} - -#include "module_tail.cpp" diff --git a/test/operators.py b/test/operators.py deleted file mode 100644 index f39134b6..00000000 --- a/test/operators.py +++ /dev/null @@ -1,102 +0,0 @@ -# Copyright David Abrahams 2004. 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) -''' ->>> from operators_ext import * - - Check __nonzero__ support - ->>> assert X(2) ->>> assert not X(0) - - ---- - ->>> x = X(42) ->>> x.value() -42 ->>> y = x - X(5) ->>> y.value() -37 ->>> y = x - 4 ->>> y.value() -38 ->>> y = 3 - x ->>> y.value() --39 ->>> (-y).value() -39 - ->>> (x + y).value() -3 - ->>> abs(y).value() -39 - ->>> x < 10 -0 ->>> x < 43 -1 - ->>> 10 < x -1 ->>> 43 < x -0 - ->>> x < y -0 ->>> y < x -1 - - ------ ->>> x > 10 -1 ->>> x > 43 -0 - ->>> 10 > x -0 ->>> 43 > x -1 - ->>> x > y -1 ->>> y > x -0 - ->>> y = x - 5 ->>> x -= y ->>> x.value() -5 ->>> str(x) -'5' - ->>> z = Z(10) ->>> int(z) -10 ->>> float(z) -10.0 ->>> complex(z) -(10+0j) - ->>> pow(2,x) -32 ->>> pow(x,2).value() -25 ->>> pow(X(2),x).value() -32 -''' - -def run(args = None): - import sys - import doctest - - if args is not None: - sys.argv = args - return doctest.testmod(sys.modules.get(__name__)) - -if __name__ == '__main__': - print "running..." - import sys - status = run()[0] - if (status == 0): print "Done." - sys.exit(status) diff --git a/test/operators_wrapper.cpp b/test/operators_wrapper.cpp deleted file mode 100644 index 12f30048..00000000 --- a/test/operators_wrapper.cpp +++ /dev/null @@ -1,42 +0,0 @@ -#include "boost/python.hpp" -#include - -struct vector -{ - virtual ~vector() {} - - vector operator+( const vector& ) const - { return vector(); } - - vector& operator+=( const vector& ) - { return *this; } - - vector operator-() const - { return *this; } -}; - -struct dvector : vector -{}; - -using namespace boost::python; - -struct vector_wrapper - : vector, wrapper< vector > -{ - vector_wrapper(vector const&) {} - vector_wrapper() {} -}; - -BOOST_PYTHON_MODULE( operators_wrapper_ext ) -{ - class_< vector_wrapper >( "vector" ) - .def( self + self ) - .def( self += self ) - .def( -self ) - ; - - scope().attr("v") = vector(); - std::auto_ptr dp(new dvector); - register_ptr_to_python< std::auto_ptr >(); - scope().attr("d") = dp; -} diff --git a/test/operators_wrapper.py b/test/operators_wrapper.py deleted file mode 100644 index 6c889b0a..00000000 --- a/test/operators_wrapper.py +++ /dev/null @@ -1,11 +0,0 @@ -from operators_wrapper_ext import * - -class D2(vector): pass -d2 = D2() - -for lhs in (v,d,d2): - -lhs - for rhs in (v,d,d2): - lhs + rhs - lhs += rhs - diff --git a/test/pickle1.cpp b/test/pickle1.cpp deleted file mode 100644 index cc4ad679..00000000 --- a/test/pickle1.cpp +++ /dev/null @@ -1,62 +0,0 @@ -// Copyright Ralf W. Grosse-Kunstleve 2002-2004. 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) - -/* - This example shows how to make an Extension Class "pickleable". - - The world class below can be fully restored by passing the - appropriate argument to the constructor. Therefore it is sufficient - to define the pickle interface method __getinitargs__. - - For more information refer to boost/libs/python/doc/pickle.html. - */ - -#include -#include -#include -#include - -#include - -namespace boost_python_test { - - // A friendly class. - class world - { - private: - std::string country; - public: - world(const std::string& _country) { - this->country = _country; - } - std::string greet() const { return "Hello from " + country + "!"; } - std::string get_country() const { return country; } - }; - - struct world_pickle_suite : boost::python::pickle_suite - { - static - boost::python::tuple - getinitargs(const world& w) - { - return boost::python::make_tuple(w.get_country()); - } - }; - - // To support test of "pickling not enabled" error message. - struct noop {}; -} - -BOOST_PYTHON_MODULE(pickle1_ext) -{ - using namespace boost::python; - using namespace boost_python_test; - class_("world", init()) - .def("greet", &world::greet) - .def_pickle(world_pickle_suite()) - ; - - // To support test of "pickling not enabled" error message. - class_("noop"); -} diff --git a/test/pickle1.py b/test/pickle1.py deleted file mode 100644 index 8369768d..00000000 --- a/test/pickle1.py +++ /dev/null @@ -1,41 +0,0 @@ -# Copyright David Abrahams 2004. 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) -r'''>>> import pickle1_ext - >>> import pickle - >>> pickle1_ext.world.__module__ - 'pickle1_ext' - >>> pickle1_ext.world.__safe_for_unpickling__ - 1 - >>> pickle1_ext.world.__name__ - 'world' - >>> pickle1_ext.world('Hello').__reduce__() - (, ('Hello',)) - >>> wd = pickle1_ext.world('California') - >>> pstr = pickle.dumps(wd) - >>> wl = pickle.loads(pstr) - >>> print wd.greet() - Hello from California! - >>> print wl.greet() - Hello from California! - - >>> noop = pickle1_ext.noop() - >>> try: pickle.dumps(noop) - ... except RuntimeError, e: print str(e)[:55] - Pickling of "pickle1_ext.noop" instances is not enabled -''' - -def run(args = None): - import sys - import doctest - - if args is not None: - sys.argv = args - return doctest.testmod(sys.modules.get(__name__)) - -if __name__ == '__main__': - print "running..." - import sys - status = run()[0] - if (status == 0): print "Done." - sys.exit(status) diff --git a/test/pickle2.cpp b/test/pickle2.cpp deleted file mode 100644 index c9610946..00000000 --- a/test/pickle2.cpp +++ /dev/null @@ -1,97 +0,0 @@ -// Copyright Ralf W. Grosse-Kunstleve 2002-2004. 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) - -/* - This example shows how to make an Extension Class "pickleable". - - The world class below contains member data (secret_number) that - cannot be restored by any of the constructors. Therefore it is - necessary to provide the __getstate__/__setstate__ pair of pickle - interface methods. - - For simplicity, the __dict__ is not included in the result of - __getstate__. This is not generally recommended, but a valid - approach if it is anticipated that the object's __dict__ will - always be empty. Note that safety guards are provided to catch - the cases where this assumption is not true. - - pickle3.cpp shows how to include the object's __dict__ in the - result of __getstate__. - - For more information refer to boost/libs/python/doc/pickle.html. - */ - -#include -#include -#include -#include -#include - -namespace boost_python_test { - - // A friendly class. - class world - { - public: - world(const std::string& _country) : secret_number(0) { - this->country = _country; - } - std::string greet() const { return "Hello from " + country + "!"; } - std::string get_country() const { return country; } - void set_secret_number(int number) { secret_number = number; } - int get_secret_number() const { return secret_number; } - private: - std::string country; - int secret_number; - }; - - struct world_pickle_suite : boost::python::pickle_suite - { - static - boost::python::tuple - getinitargs(const world& w) - { - return boost::python::make_tuple(w.get_country()); - } - - static - boost::python::tuple - getstate(const world& w) - { - return boost::python::make_tuple(w.get_secret_number()); - } - - static - void - setstate(world& w, boost::python::tuple state) - { - using namespace boost::python; - if (len(state) != 1) - { - PyErr_SetObject(PyExc_ValueError, - ("expected 1-item tuple in call to __setstate__; got %s" - % state).ptr() - ); - throw_error_already_set(); - } - - long number = extract(state[0]); - if (number != 42) - w.set_secret_number(number); - } - }; - -} - -BOOST_PYTHON_MODULE(pickle2_ext) -{ - using namespace boost_python_test; - boost::python::class_( - "world", boost::python::init()) - .def("greet", &world::greet) - .def("get_secret_number", &world::get_secret_number) - .def("set_secret_number", &world::set_secret_number) - .def_pickle(world_pickle_suite()) - ; -} diff --git a/test/pickle2.py b/test/pickle2.py deleted file mode 100644 index 2ad663ff..00000000 --- a/test/pickle2.py +++ /dev/null @@ -1,50 +0,0 @@ -# Copyright David Abrahams 2004. 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) -r'''>>> import pickle2_ext - >>> import pickle - >>> pickle2_ext.world.__module__ - 'pickle2_ext' - >>> pickle2_ext.world.__safe_for_unpickling__ - 1 - >>> pickle2_ext.world.__name__ - 'world' - >>> pickle2_ext.world('Hello').__reduce__() - (, ('Hello',), (0,)) - >>> for number in (24, 42): - ... wd = pickle2_ext.world('California') - ... wd.set_secret_number(number) - ... pstr = pickle.dumps(wd) - ... wl = pickle.loads(pstr) - ... print wd.greet(), wd.get_secret_number() - ... print wl.greet(), wl.get_secret_number() - Hello from California! 24 - Hello from California! 24 - Hello from California! 42 - Hello from California! 0 - -# Now show that the __dict__ is not taken care of. - >>> wd = pickle2_ext.world('California') - >>> wd.x = 1 - >>> wd.__dict__ - {'x': 1} - >>> try: pstr = pickle.dumps(wd) - ... except RuntimeError, err: print err - ... - Incomplete pickle support (__getstate_manages_dict__ not set) -''' - -def run(args = None): - import sys - import doctest - - if args is not None: - sys.argv = args - return doctest.testmod(sys.modules.get(__name__)) - -if __name__ == '__main__': - print "running..." - import sys - status = run()[0] - if (status == 0): print "Done." - sys.exit(status) diff --git a/test/pickle3.cpp b/test/pickle3.cpp deleted file mode 100644 index 7afe2dbf..00000000 --- a/test/pickle3.cpp +++ /dev/null @@ -1,107 +0,0 @@ -// Copyright Ralf W. Grosse-Kunstleve 2002-2004. 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) - -/* - This example shows how to make an Extension Class "pickleable". - - The world class below contains member data (secret_number) that - cannot be restored by any of the constructors. Therefore it is - necessary to provide the __getstate__/__setstate__ pair of pickle - interface methods. - - The object's __dict__ is included in the result of __getstate__. - This requires more code (compare with pickle2.cpp), but is - unavoidable if the object's __dict__ is not always empty. - - For more information refer to boost/libs/python/doc/pickle.html. - */ - -#include -#include -#include -#include -#include -#include -#include - -namespace boost_python_test { - - // A friendly class. - class world - { - public: - world(const std::string& _country) : secret_number(0) { - this->country = _country; - } - std::string greet() const { return "Hello from " + country + "!"; } - std::string get_country() const { return country; } - void set_secret_number(int number) { secret_number = number; } - int get_secret_number() const { return secret_number; } - private: - std::string country; - int secret_number; - }; - - struct world_pickle_suite : boost::python::pickle_suite - { - static - boost::python::tuple - getinitargs(const world& w) - { - return boost::python::make_tuple(w.get_country()); - } - - static - boost::python::tuple - getstate(boost::python::object w_obj) - { - world const& w = boost::python::extract(w_obj)(); - - return boost::python::make_tuple( - w_obj.attr("__dict__"), - w.get_secret_number()); - } - - static - void - setstate(boost::python::object w_obj, boost::python::tuple state) - { - using namespace boost::python; - world& w = extract(w_obj)(); - - if (len(state) != 2) - { - PyErr_SetObject(PyExc_ValueError, - ("expected 2-item tuple in call to __setstate__; got %s" - % state).ptr() - ); - throw_error_already_set(); - } - - // restore the object's __dict__ - dict d = extract(w_obj.attr("__dict__"))(); - d.update(state[0]); - - // restore the internal state of the C++ object - long number = extract(state[1]); - if (number != 42) - w.set_secret_number(number); - } - - static bool getstate_manages_dict() { return true; } - }; - -} - -BOOST_PYTHON_MODULE(pickle3_ext) -{ - using namespace boost_python_test; - boost::python::class_( - "world", boost::python::init()) - .def("greet", &world::greet) - .def("get_secret_number", &world::get_secret_number) - .def("set_secret_number", &world::set_secret_number) - .def_pickle(world_pickle_suite()) - ; -} diff --git a/test/pickle3.py b/test/pickle3.py deleted file mode 100644 index 6be3128c..00000000 --- a/test/pickle3.py +++ /dev/null @@ -1,45 +0,0 @@ -# Copyright David Abrahams 2004. 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) -r'''>>> import pickle3_ext - >>> import pickle - >>> pickle3_ext.world.__module__ - 'pickle3_ext' - >>> pickle3_ext.world.__safe_for_unpickling__ - 1 - >>> pickle3_ext.world.__getstate_manages_dict__ - 1 - >>> pickle3_ext.world.__name__ - 'world' - >>> pickle3_ext.world('Hello').__reduce__() - (, ('Hello',), ({}, 0)) - >>> for number in (24, 42): - ... wd = pickle3_ext.world('California') - ... wd.set_secret_number(number) - ... wd.x = 2 * number - ... wd.y = 'y' * number - ... wd.z = 3. * number - ... pstr = pickle.dumps(wd) - ... wl = pickle.loads(pstr) - ... print wd.greet(), wd.get_secret_number(), wd.x, wd.y, wd.z - ... print wl.greet(), wl.get_secret_number(), wl.x, wl.y, wl.z - Hello from California! 24 48 yyyyyyyyyyyyyyyyyyyyyyyy 72.0 - Hello from California! 24 48 yyyyyyyyyyyyyyyyyyyyyyyy 72.0 - Hello from California! 42 84 yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy 126.0 - Hello from California! 0 84 yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy 126.0 -''' - -def run(args = None): - import sys - import doctest - - if args is not None: - sys.argv = args - return doctest.testmod(sys.modules.get(__name__)) - -if __name__ == '__main__': - print "running..." - import sys - status = run()[0] - if (status == 0): print "Done." - sys.exit(status) diff --git a/test/pickle4.cpp b/test/pickle4.cpp deleted file mode 100644 index 1374cc7d..00000000 --- a/test/pickle4.cpp +++ /dev/null @@ -1,44 +0,0 @@ -// Copyright Ralf W. Grosse-Kunstleve 2004. 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) - -/* - This example shows how to enable pickling without using the - pickle_suite. The pickling interface (__getinitargs__) is - implemented in Python. - - For more information refer to boost/libs/python/doc/pickle.html. - */ - -#include -#include - -#include - -namespace boost_python_test { - - // A friendly class. - class world - { - private: - std::string country; - public: - world(const std::string& _country) { - this->country = _country; - } - std::string greet() const { return "Hello from " + country + "!"; } - std::string get_country() const { return country; } - }; - -} - -BOOST_PYTHON_MODULE(pickle4_ext) -{ - using namespace boost::python; - using namespace boost_python_test; - class_("world", init()) - .enable_pickling() - .def("greet", &world::greet) - .def("get_country", &world::get_country) - ; -} diff --git a/test/pickle4.py b/test/pickle4.py deleted file mode 100644 index a5069c90..00000000 --- a/test/pickle4.py +++ /dev/null @@ -1,39 +0,0 @@ -# Copyright David Abrahams 2004. 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) -r'''>>> import pickle4_ext - >>> import pickle - >>> def world_getinitargs(self): - ... return (self.get_country(),) - >>> pickle4_ext.world.__getinitargs__ = world_getinitargs - >>> pickle4_ext.world.__module__ - 'pickle4_ext' - >>> pickle4_ext.world.__safe_for_unpickling__ - 1 - >>> pickle4_ext.world.__name__ - 'world' - >>> pickle4_ext.world('Hello').__reduce__() - (, ('Hello',)) - >>> wd = pickle4_ext.world('California') - >>> pstr = pickle.dumps(wd) - >>> wl = pickle.loads(pstr) - >>> print wd.greet() - Hello from California! - >>> print wl.greet() - Hello from California! -''' - -def run(args = None): - import sys - import doctest - - if args is not None: - sys.argv = args - return doctest.testmod(sys.modules.get(__name__)) - -if __name__ == '__main__': - print "running..." - import sys - status = run()[0] - if (status == 0): print "Done." - sys.exit(status) diff --git a/test/pointee.cpp b/test/pointee.cpp deleted file mode 100644 index d962e79f..00000000 --- a/test/pointee.cpp +++ /dev/null @@ -1,34 +0,0 @@ -// 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 -#include -#include -#include -#include - -struct A; - -int main() -{ - BOOST_STATIC_ASSERT( - (boost::is_same< - boost::python::pointee >::type - , char** - >::value)); - - BOOST_STATIC_ASSERT( - (boost::is_same< - boost::python::pointee >::type - , A>::value)); - -#ifndef BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION - BOOST_STATIC_ASSERT( - (boost::is_same< - boost::python::pointee::type - , char - >::value)); -#endif - return 0; -} diff --git a/test/pointer_type_id_test.cpp b/test/pointer_type_id_test.cpp deleted file mode 100644 index 02e168c7..00000000 --- a/test/pointer_type_id_test.cpp +++ /dev/null @@ -1,43 +0,0 @@ -// Copyright David Abrahams 2004. 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 - -#include -#include - -int main() -{ - using namespace boost::python::converter; - - boost::python::type_info x - = boost::python::type_id(); - - - BOOST_TEST(pointer_type_id() == x); - BOOST_TEST(pointer_type_id() == x); - BOOST_TEST(pointer_type_id() == x); - BOOST_TEST(pointer_type_id() == x); - - BOOST_TEST(pointer_type_id() == x); - BOOST_TEST(pointer_type_id() == x); - BOOST_TEST(pointer_type_id() == x); - BOOST_TEST(pointer_type_id() == x); - - BOOST_TEST(pointer_type_id() == x); - BOOST_TEST(pointer_type_id() == x); - BOOST_TEST(pointer_type_id() == x); - BOOST_TEST(pointer_type_id() == x); - - BOOST_TEST(pointer_type_id() == x); - BOOST_TEST(pointer_type_id() == x); - BOOST_TEST(pointer_type_id() == x); - BOOST_TEST(pointer_type_id() == x); - - BOOST_TEST(pointer_type_id() == x); - BOOST_TEST(pointer_type_id() == x); - BOOST_TEST(pointer_type_id() == x); - BOOST_TEST(pointer_type_id() == x); - - return boost::report_errors(); -} diff --git a/test/pointer_vector.cpp b/test/pointer_vector.cpp deleted file mode 100644 index 08cd4861..00000000 --- a/test/pointer_vector.cpp +++ /dev/null @@ -1,52 +0,0 @@ -// Copyright Joel de Guzman 2005-2006. 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 -#include -#include - -using namespace boost::python; - -class Abstract -{ -public: - virtual ~Abstract() {}; // silence compiler warningsa - virtual std::string f() =0; -}; - -class Concrete1 : public Abstract -{ -public: - virtual std::string f() { return "harru"; } -}; - -typedef std::vector ListOfObjects; - -class DoesSomething -{ -public: - DoesSomething() {} - - ListOfObjects returnList() - { - ListOfObjects lst; - lst.push_back(new Concrete1()); return lst; - } -}; - -BOOST_PYTHON_MODULE(pointer_vector_ext) -{ -class_("Abstract", no_init) - .def("f", &Abstract::f) - ; - -class_("ListOfObjects") - .def( vector_indexing_suite() ) - ; - -class_("DoesSomething") - .def("returnList", &DoesSomething::returnList) - ; -} - - diff --git a/test/pointer_vector.py b/test/pointer_vector.py deleted file mode 100644 index 16900e8e..00000000 --- a/test/pointer_vector.py +++ /dev/null @@ -1,31 +0,0 @@ -# Copyright Joel de Guzman 2004. 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) -''' - ->>> import pointer_vector_ext ->>> d = pointer_vector_ext.DoesSomething() ->>> lst = d.returnList() ->>> lst[0].f(); -'harru' - -''' - - -def run(args = None): - import sys - import doctest - - if args is not None: - sys.argv = args - return doctest.testmod(sys.modules.get(__name__)) - -if __name__ == '__main__': - print 'running...' - import sys - status = run()[0] - if (status == 0): print "Done." - sys.exit(status) - - - diff --git a/test/polymorphism.cpp b/test/polymorphism.cpp deleted file mode 100644 index 02713ae2..00000000 --- a/test/polymorphism.cpp +++ /dev/null @@ -1,162 +0,0 @@ -// 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 -#include -#include -#include -#include -#include -#include -#include -#include - -using namespace boost::python; - -struct Callback -{ - Callback(PyObject* o) : mSelf(o) {} - PyObject* mSelf; -}; - -struct P -{ - virtual ~P(){} - virtual std::string f() = 0; - std::string g() { return "P::g()"; } -}; - -struct PCallback : P, Callback -{ - PCallback (PyObject* self) : Callback(self) {} - - std::string f() - { - return call_method(mSelf, "f"); - } -}; - -struct Q : virtual P -{ - std::string f() { return "Q::f()"; } -}; - -struct A -{ - virtual ~A(){} - virtual std::string f() { return "A::f()"; } -}; - -struct ACallback : A, Callback -{ - ACallback (PyObject* self) : Callback(self) {} - - - std::string f() - { - return call_method(mSelf, "f"); - } - - std::string default_f() - { - return A::f(); - } -}; - -struct B : A -{ - virtual std::string f() { return "B::f()"; } -}; - -struct C : A -{ - virtual std::string f() { return "C::f()"; } -}; - -struct D : A -{ - virtual std::string f() { return "D::f()"; } - std::string g() { return "D::g()"; } -}; - -struct DCallback : D, Callback -{ - DCallback (PyObject* self) : Callback(self) {} - - std::string f() - { - return call_method(mSelf, "f"); - } - - std::string default_f() - { - return A::f(); - } -}; - - -A& getBCppObj () -{ - static B b; - return b; -} - -std::string call_f(A& a) { return a.f(); } - -A* factory(unsigned choice) -{ - switch (choice % 3) - { - case 0: return new A; - break; - case 1: return new B; - break; - default: return new C; - break; - } -} - -C& getCCppObj () -{ - static C c; - return c; -} - -A* pass_a(A* x) { return x; } - -BOOST_PYTHON_MODULE_INIT(polymorphism_ext) -{ - class_("A") - .def("f", &A::f, &ACallback::default_f) - ; - - def("getBCppObj", getBCppObj, return_value_policy()); - - class_,boost::noncopyable>("C") - .def("f", &C::f) - ; - - class_,DCallback,boost::noncopyable>("D") - .def("f", &D::f, &DCallback::default_f) - .def("g", &D::g) - ; - - def("pass_a", &pass_a, return_internal_reference<>()); - - def("getCCppObj", getCCppObj, return_value_policy()); - - def("factory", factory, return_value_policy()); - - def("call_f", call_f); - - class_("P") - .def("f", pure_virtual(&P::f)) - ; - - class_ >("Q") - .def("g", &P::g) // make sure virtual inheritance doesn't interfere - ; -} - -//#include "module_tail.cpp" diff --git a/test/polymorphism.py b/test/polymorphism.py deleted file mode 100644 index 0218b810..00000000 --- a/test/polymorphism.py +++ /dev/null @@ -1,74 +0,0 @@ -# Copyright David Abrahams 2004. 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) -import unittest -from polymorphism_ext import * - -class PolymorphTest(unittest.TestCase): - - def testReturnCpp(self): - - # Python Created Object With Same Id As - # Cpp Created B Object - # b = B(872) - - # Get Reference To Cpp Created B Object - a = getBCppObj() - - # Python Created B Object and Cpp B Object - # Should have same result by calling f() - self.failUnlessEqual ('B::f()', a.f()) - self.failUnlessEqual ('B::f()', call_f(a)) - self.failUnlessEqual ('A::f()', call_f(A())) - - def test_references(self): - # B is not exposed to Python - a = getBCppObj() - self.failUnlessEqual(type(a), A) - - # C is exposed to Python - c = getCCppObj() - self.failUnlessEqual(type(c), C) - - def test_factory(self): - self.failUnlessEqual(type(factory(0)), A) - self.failUnlessEqual(type(factory(1)), A) - self.failUnlessEqual(type(factory(2)), C) - - def test_return_py(self): - - class X(A): - def f(self): - return 'X.f' - - x = X() - - self.failUnlessEqual ('X.f', x.f()) - self.failUnlessEqual ('X.f', call_f(x)) - - def test_wrapper_downcast(self): - a = pass_a(D()) - self.failUnlessEqual('D::g()', a.g()) - - def test_pure_virtual(self): - p = P() - self.assertRaises(RuntimeError, p.f) - - q = Q() - self.failUnlessEqual ('Q::f()', q.f()) - - class R(P): - def f(self): - return 'R.f' - - r = R() - self.failUnlessEqual ('R.f', r.f()) - - -if __name__ == "__main__": - - # remove the option which upsets unittest - import sys - sys.argv = [ x for x in sys.argv if x != '--broken-auto-ptr' ] - - unittest.main() diff --git a/test/polymorphism2.cpp b/test/polymorphism2.cpp deleted file mode 100755 index 8aefbc3a..00000000 --- a/test/polymorphism2.cpp +++ /dev/null @@ -1,172 +0,0 @@ -// 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 -#include -#include -#include -#include -#include -#include -#include -#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 -{ - virtual ~P(){} - virtual char const* f() = 0; - char const* g() { return "P::g()"; } -}; - -struct PCallback : P, wrapper

-{ - char const* f() - { -#if BOOST_WORKAROUND(BOOST_MSVC, <= 1300) - return call(this->get_override("f").ptr()); -#else - return this->get_override("f")(); -#endif - } -}; - -struct Q : virtual P -{ - char const* f() { return "Q::f()"; } -}; - -struct A -{ - virtual ~A(){} - virtual char const* f() { return "A::f()"; } -}; - -struct ACallback : A, wrapper -{ - char const* f() - { - if (override f = this->get_override("f")) -#if BOOST_WORKAROUND(BOOST_MSVC, <= 1300) - return call(f.ptr()); -#else - return f(); -#endif - - return A::f(); - } - - char const* default_f() { return this->A::f(); } -}; - -struct B : A -{ - virtual char const* f() { return "B::f()"; } -}; - -struct C : A -{ - virtual char const* f() { return "C::f()"; } -}; - -struct D : A -{ - virtual char const* f() { return "D::f()"; } - char const* g() { return "D::g()"; } -}; - -struct DCallback : D, wrapper -{ - char const* f() - { - if (override f = this->get_override("f")) -#if BOOST_WORKAROUND(BOOST_MSVC, <= 1300) - return call(f.ptr()); -#else - return f(); -#endif - //else - return D::f(); - } -}; - - -A& getBCppObj () -{ - static B b; - return b; -} - -char const* call_f(A& a) { return a.f(); } - -A* factory(unsigned choice) -{ - switch (choice % 3) - { - case 0: return new A; - break; - case 1: return new B; - break; - default: return new C; - break; - } -} - -C& getCCppObj () -{ - static C c; - return c; -} - -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") - .def("f", &A::f, &ACallback::default_f) - ; - - def("getBCppObj", getBCppObj, return_value_policy()); - - class_,boost::noncopyable>("C") - .def("f", &C::f) - ; - - class_,boost::noncopyable>("D") - .def("f", &D::f) - .def("g", &D::g) - ; - - def("pass_a", &pass_a, return_internal_reference<>()); - - def("getCCppObj", getCCppObj, return_value_policy()); - - def("factory", factory, return_value_policy()); - - def("call_f", call_f); - - class_("P") - .def("f", pure_virtual(&P::f)) - ; - - class_ >("Q") - .def("g", &P::g) // make sure virtual inheritance doesn't interfere - ; -} - -//#include "module_tail.cpp" diff --git a/test/polymorphism2.py b/test/polymorphism2.py deleted file mode 100644 index 2690bac9..00000000 --- a/test/polymorphism2.py +++ /dev/null @@ -1,94 +0,0 @@ -# Copyright David Abrahams 2004. 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) -import unittest -import sys - -class PolymorphTest(unittest.TestCase): - - def testReturnCpp(self): - - # Python Created Object With Same Id As - # Cpp Created B Object - # b = B(872) - - # Get Reference To Cpp Created B Object - a = getBCppObj() - - # Python Created B Object and Cpp B Object - # Should have same result by calling f() - self.failUnlessEqual ('B::f()', a.f()) - self.failUnlessEqual ('B::f()', call_f(a)) - self.failUnlessEqual ('A::f()', call_f(A())) - - def test_references(self): - # B is not exposed to Python - a = getBCppObj() - self.failUnlessEqual(type(a), A) - - # C is exposed to Python - c = getCCppObj() - self.failUnlessEqual(type(c), C) - - def test_factory(self): - self.failUnlessEqual(type(factory(0)), A) - self.failUnlessEqual(type(factory(1)), A) - self.failUnlessEqual(type(factory(2)), C) - - def test_return_py(self): - - class X(A): - def f(self): - return 'X.f' - - x = X() - - self.failUnlessEqual ('X.f', x.f()) - self.failUnlessEqual ('X.f', call_f(x)) - - def test_self_default(self): - - class X(A): - def f(self): - return 'X.f() -> ' + A.f(self) - - x = X() - - self.failUnlessEqual ('X.f() -> A::f()', x.f()) - - # This one properly raises the "dangling reference" exception - # self.failUnlessEqual ('X.f() -> A::f()', call_f(x)) - - def test_wrapper_downcast(self): - a = pass_a(D()) - self.failUnlessEqual('D::g()', a.g()) - - def test_pure_virtual(self): - p = P() - self.assertRaises(RuntimeError, p.f) - - q = Q() - self.failUnlessEqual ('Q::f()', q.f()) - - class R(P): - def f(self): - return 'R.f' - - r = R() - self.failUnlessEqual ('R.f', r.f()) - - -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 * - diff --git a/test/polymorphism2_auto_ptr.cpp b/test/polymorphism2_auto_ptr.cpp deleted file mode 100755 index 8cd5ef24..00000000 --- a/test/polymorphism2_auto_ptr.cpp +++ /dev/null @@ -1,6 +0,0 @@ -// Copyright David Abrahams 2005. 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) - -#define HELD_BY_AUTO_PTR -#include "polymorphism2.cpp" diff --git a/test/polymorphism2_auto_ptr.py b/test/polymorphism2_auto_ptr.py deleted file mode 100644 index 88cf664a..00000000 --- a/test/polymorphism2_auto_ptr.py +++ /dev/null @@ -1,5 +0,0 @@ -# Copyright David Abrahams 2005. 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) -import polymorphism2 -polymorphism2.test() diff --git a/test/printer.py b/test/printer.py deleted file mode 100644 index e08f7c45..00000000 --- a/test/printer.py +++ /dev/null @@ -1,13 +0,0 @@ -# Copyright David Abrahams 2006. 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) -class _printer(object): - def __init__(self): - self.results = []; - def __call__(self, *stuff): - for x in stuff: - self.results.append(str(x)) - def check(self, x): - if self.results[0] != str(x): - print ' Expected:\n %s\n but the C++ interface gave:\n %s' % (x, self.results[0]) - del self.results[0] diff --git a/test/properties.cpp b/test/properties.cpp deleted file mode 100755 index d338beb9..00000000 --- a/test/properties.cpp +++ /dev/null @@ -1,100 +0,0 @@ -// Copyright David Abrahams 2004. 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 - -using namespace boost::python; - -namespace test { - -// Hmm. return_internal_reference<>() wants to wrap a real class. -class ret_type -{ - public: - ret_type() : i(42.5) {} - double i; -}; - -class crash_me -{ - private: - ret_type i; - public: - ret_type& get_i() { return i; } -}; - -} - -struct X -{ - X( int value ) : m_value( value ) - { ++s_count; } - - X( const X &other ) : m_value( other.m_value ) - { ++s_count; } - - ~X() - { --s_count; } - - int get_value() const - { return m_value; } - - void set_value(int new_value) - { m_value = new_value; } - - static int get_instance_count() - { return s_count; } - - int m_value; - - static int s_count; -}; - -int X::s_count = 0; - -int get_X_instance_count() -{ return X::get_instance_count(); } - - - -BOOST_PYTHON_MODULE(properties_ext) -{ - typedef return_value_policy return_by_value_t; - typedef return_internal_reference<> return_by_internal_reference_t; - class_("X", init() ) - //defining read only property - .add_property( "value_r", &X::get_value ) - .add_property( "value_r_ds", &X::get_value, "value_r_ds is read-only") - //defining read \ write property - .add_property( "value_rw", &X::get_value, &X::set_value ) - .add_property( "value_rw_ds", &X::get_value, &X::set_value, - "value_rw_ds is read-write") - //defining read \ write property using make_getter and make_setter - .add_property( "value_direct", - make_getter( &X::m_value, return_by_value_t() ), - make_setter( &X::m_value, return_by_internal_reference_t() ) ) - //defining read only property for static member - .add_static_property( "instance_count", &X::get_instance_count ) - //defining read \ write property for static member using make_getter and make_setter - .add_static_property( "instance_count_direct", - make_getter( &X::s_count, return_by_value_t() ), - make_setter( &X::s_count, return_by_internal_reference_t() ) ) - //defining class property using a global function - .add_static_property( "instance_count_injected", &get_X_instance_count ); - - - class_< test::ret_type>( "ret_type") - .add_property( "i", &test::ret_type::i, &test::ret_type::i) - ; - - class_< test::crash_me> crash_me_wrapper( "crash_me"); - - crash_me_wrapper - .def( "get_i", &test::crash_me::get_i , return_internal_reference<>()) - ; - - crash_me_wrapper.add_property( "i", crash_me_wrapper.attr("get_i")); - -} - -#include "module_tail.cpp" diff --git a/test/properties.py b/test/properties.py deleted file mode 100644 index 720fb859..00000000 --- a/test/properties.py +++ /dev/null @@ -1,106 +0,0 @@ -# Copyright David Abrahams 2004. 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) -""" -This is test module for properties. - ->>> r = properties.ret_type() ->>> r.i = 22.5 ->>> r.i -22.5 ->>> c = properties.crash_me() ->>> c.i.i -42.5 - ->>> X = properties.X - ->>> x1 = X(1) - -value read only ->>> x1.value_r -1 - -value read - write ->>> x1.value_rw -1 - -value direct access ->>> x1.value_direct -1 - -class instance count read - only ->>> X.instance_count -1 - -class instance count direct ->>> X.instance_count_direct -1 - -class instance count injected ->>> X.instance_count_injected -1 - -class instance count from object ->>> x1.instance_count -1 - -class instance count from object ->>> x1.instance_count_direct -1 - -class instance count from object: ->>> x1.instance_count_injected -1 - -as expected you can't assign new value to read only property ->>> x1.value_r = 2 -Traceback (most recent call last): - File "properties.py", line 49, in ? - x1.value_r = 2 -AttributeError: can't set attribute - -setting value_rw to 2. value_direct: ->>> x1.value_rw = 2 ->>> x1.value_rw -2 - -setting value_direct to 3. value_direct: ->>> x1.value_direct = 3 ->>> x1.value_direct -3 - ->>> assert x1.value_r == 3 - ->>> x2 = X(2) - -after creating second intstance of X instances count is 2 ->>> x2.instance_count -2 - ->>> del x2 ->>> assert x1.instance_count == 1 - ->>> assert properties.X.value_r_ds.__doc__ == "value_r_ds is read-only" - ->>> assert properties.X.value_rw_ds.__doc__ == "value_rw_ds is read-write" - -""" - -#import sys; sys.path.append(r'P:\Actimize4.0\smart_const\py_smart_const___Win32_Debug') -import properties_ext as properties - - -def run(args = None): - import sys - import doctest - - if args is not None: - sys.argv = args - return doctest.testmod(sys.modules.get(__name__)) - -if __name__ == '__main__': - print "running..." - import sys - status = run()[0] - if (status == 0): print "Done." - sys.exit(status) diff --git a/test/pyrun.py b/test/pyrun.py deleted file mode 100644 index e033069e..00000000 --- a/test/pyrun.py +++ /dev/null @@ -1,7 +0,0 @@ -import sys - -pythonpath = sys.argv[1] -scriptfile = sys.argv[2] -sys.argv = sys.argv[2:] -sys.path.append(pythonpath) -execfile(scriptfile) diff --git a/test/pytype_function.cpp b/test/pytype_function.cpp deleted file mode 100644 index 46cce19e..00000000 --- a/test/pytype_function.cpp +++ /dev/null @@ -1,85 +0,0 @@ -// Copyright Joel de Guzman 2004. 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 -#include -#include -#include -#include - -using namespace boost::python; - -struct A -{ -}; - -struct B -{ - A a; - B(const A& a_):a(a_){} -}; - -// Converter from A to python int -struct BToPython -#ifndef BOOST_PYTHON_NO_PY_SIGNATURES - : converter::to_python_target_type //inherits get_pytype -#endif -{ - static PyObject* convert(const B& b) - { - return boost::python::incref(boost::python::object(b.a).ptr()); - } -}; - -// Conversion from python int to A -struct BFromPython -{ - BFromPython() - { - boost::python::converter::registry::push_back( - &convertible, - &construct, - boost::python::type_id< B >() -#ifndef BOOST_PYTHON_NO_PY_SIGNATURES - , &converter::expected_from_python_type::get_pytype//convertible to A can be converted to B -#endif - ); - } - - static void* convertible(PyObject* obj_ptr) - { - extract ex(obj_ptr); - if (!ex.check()) return 0; - return obj_ptr; - } - - static void construct( - PyObject* obj_ptr, - boost::python::converter::rvalue_from_python_stage1_data* data) - { - void* storage = ( - (boost::python::converter::rvalue_from_python_storage< B >*)data)-> storage.bytes; - - extract ex(obj_ptr); - new (storage) B(ex()); - data->convertible = storage; - } -}; - - -B func(const B& b) { return b ; } - - -BOOST_PYTHON_MODULE(pytype_function_ext) -{ - to_python_converter< B , BToPython,true >(); //has get_pytype - BFromPython(); - - class_("A") ; - - def("func", &func); - -} - -#include "module_tail.cpp" diff --git a/test/pytype_function.py b/test/pytype_function.py deleted file mode 100755 index 83674632..00000000 --- a/test/pytype_function.py +++ /dev/null @@ -1,32 +0,0 @@ -# Copyright David Abrahams 2004. 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) -""" ->>> from pytype_function_ext import * - ->>> print func.__doc__.splitlines()[1] -func( (A)arg1) -> A : - ->>> print func.__module__ -pytype_function_ext - ->>> print func.__name__ -func -""" -def run(args = None): - import sys - import doctest - - if args is not None: - sys.argv = args - return doctest.testmod(sys.modules.get(__name__)) - -if __name__ == '__main__': - print "running..." - import sys - status = run()[0] - if (status == 0): print "Done." - sys.exit(status) - - - diff --git a/test/raw_ctor.cpp b/test/raw_ctor.cpp deleted file mode 100755 index a825ae01..00000000 --- a/test/raw_ctor.cpp +++ /dev/null @@ -1,43 +0,0 @@ -// Copyright David Abrahams 2004. 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 -#include -#include -#include -#include -#include - -using namespace boost::python; - -class Foo -{ - public: - Foo(tuple args, dict kw) - : args(args), kw(kw) {} - - tuple args; - dict kw; -}; - -object init_foo(tuple args, dict kw) -{ - tuple rest(args.slice(1,_)); - return args[0].attr("__init__")(rest, kw); -} - -BOOST_PYTHON_MODULE(raw_ctor_ext) -{ - // using no_init postpones defining __init__ function until after - // raw_function for proper overload resolution order, since later - // defs get higher priority. - class_("Foo", no_init) - .def("__init__", raw_function(&init_foo)) - .def(init()) - .def_readwrite("args", &Foo::args) - .def_readwrite("kw", &Foo::kw) - ; -} - -#include "module_tail.cpp" diff --git a/test/raw_ctor.py b/test/raw_ctor.py deleted file mode 100644 index 686948ff..00000000 --- a/test/raw_ctor.py +++ /dev/null @@ -1,76 +0,0 @@ -# Copyright David Abrahams 2004. 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) -""" ->>> 'importing' -'importing' ->>> from raw_ctor_ext import * ->>> 'imported' -'imported' ->>> import sys ->>> sys.stdout.flush() ->>> f = Foo(1, 2, 'a', bar = 3, baz = 4) ->>> f.args -(1, 2, 'a') ->>> f.kw.items() -[('bar', 3), ('baz', 4)] -""" -def run(args = None): - import sys - import doctest - - if args is not None: - sys.argv = args - return doctest.testmod(sys.modules.get(__name__)) - -if __name__ == '__main__': - print "running..." - import sys - status = run()[0] - if (status == 0): print "Done." - sys.exit(status) - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/test/raw_pyobject_fail1.cpp b/test/raw_pyobject_fail1.cpp deleted file mode 100755 index f9dd54bc..00000000 --- a/test/raw_pyobject_fail1.cpp +++ /dev/null @@ -1,11 +0,0 @@ -// 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 - -int main() -{ - boost::python::converter::arg_to_python x(0); - return 0; -} diff --git a/test/raw_pyobject_fail2.cpp b/test/raw_pyobject_fail2.cpp deleted file mode 100755 index 62c57ae7..00000000 --- a/test/raw_pyobject_fail2.cpp +++ /dev/null @@ -1,13 +0,0 @@ -// 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 - -struct X : PyObject {}; - -int main() -{ - boost::python::converter::arg_to_python x(0); - return 0; -} diff --git a/test/register_ptr.cpp b/test/register_ptr.cpp deleted file mode 100644 index 6cd4d785..00000000 --- a/test/register_ptr.cpp +++ /dev/null @@ -1,55 +0,0 @@ -// Copyright David Abrahams 2004. 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 -#include - -using namespace boost; -using namespace python; - -struct A -{ - virtual int f() { return 0; } -}; - -shared_ptr New() { return shared_ptr( new A() ); } - -int Call( const shared_ptr & a ) -{ - return a->f(); -} - -int Fail( shared_ptr & a ) -{ - return a->f(); -} - -struct A_Wrapper: A -{ - A_Wrapper(PyObject* self_): self(self_) {} - A_Wrapper(PyObject* self_, const A& a): self(self_), A(a) {} - - int f() - { - return call_method(self, "f"); - } - - int default_f() - { - return A::f(); - } - - PyObject* self; -}; - -BOOST_PYTHON_MODULE(register_ptr) -{ - class_("A") - .def("f", &A::f, &A_Wrapper::default_f) - ; - register_ptr_to_python< shared_ptr >(); - def("New", &New); - def("Call", &Call); - def("Fail", &Fail); -} diff --git a/test/register_ptr_test.py b/test/register_ptr_test.py deleted file mode 100644 index 674e5572..00000000 --- a/test/register_ptr_test.py +++ /dev/null @@ -1,25 +0,0 @@ -# Copyright David Abrahams 2004. 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) -import unittest -from register_ptr import * - -class RegisterPtrTest(unittest.TestCase): - - def testIt(self): - - class B(A): - def f(self): - return 10 - - a = New() # this must work - b = B() - self.assertEqual(Call(a), 0) - self.assertEqual(Call(b), 10) - def fails(): - Fail(A()) - self.assertRaises(TypeError, fails) - self.assertEqual(Fail(a), 0) # ok, since a is held by shared_ptr - -if __name__ == '__main__': - unittest.main() diff --git a/test/result.cpp b/test/result.cpp deleted file mode 100755 index d5f43cc3..00000000 --- a/test/result.cpp +++ /dev/null @@ -1,111 +0,0 @@ -// 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 -#include -#include - -using boost::python::detail::result; -using boost::type; - -void expect_int(type*) {} -void expect_string(type*) {} - -struct X {}; - -int main() -{ - // Test the usage which works for functions, member functions, and data members - expect_int( - result((int(*)())0) - ); - - expect_int( - result((int(*)(char))0) - ); - - expect_int( - result((int(X::*)())0) - ); - - expect_int( - result((int(X::*)(char))0) - ); - - expect_int( - result((int(X::*))0) - ); - - expect_string( - result((char*(*)())0) - ); - - expect_string( - result((char*(*)(char))0) - ); - - expect_string( - result((char*(X::*)())0) - ); - - expect_string( - result((char*(X::*)(char))0) - ); - - expect_string( - result((char*(X::*))0) - ); - - // Show that we can use the general version that works for - // AdaptableFunctions - expect_int( - result((int(*)())0,0) - ); - - expect_int( - result((int(*)(char))0,0) - ); - - expect_int( - result((int(X::*)())0,0) - ); - - expect_int( - result((int(X::*)(char))0,0) - ); - - expect_int( - result((int(X::*))0,0) - ); - - expect_int( - result(std::plus(),0) - ); - - expect_string( - result((char*(*)())0,0) - ); - - expect_string( - result((char*(*)(char))0,0) - ); - - expect_string( - result((char*(X::*)())0,0) - ); - - expect_string( - result((char*(X::*)(char))0,0) - ); - - expect_string( - result((char*(X::*))0,0) - ); - - expect_string( - result(std::plus(),0) - ); - - return 0; -} diff --git a/test/return_arg.cpp b/test/return_arg.cpp deleted file mode 100755 index d8d3c1dd..00000000 --- a/test/return_arg.cpp +++ /dev/null @@ -1,67 +0,0 @@ -// Copyright David Abrahams and Nikolay Mladenov 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) - -#include -#include -#include -#include - -struct Widget -{ - Widget() - : sensitive_(true) - {} - - bool get_sensitive() const - { - return sensitive_; - } - - void set_sensitive(bool s) - { - this->sensitive_ = s; - } - - private: - bool sensitive_; -}; - -struct Label : Widget -{ - Label() {} - - std::string get_label() const - { - return label_; - } - - void set_label(const std::string &l) - { - label_ = l; - } - - private: - std::string label_; -}; - -void return_arg_f(boost::python::object) {} - -using namespace boost::python; -BOOST_PYTHON_MODULE(return_arg_ext) -{ - class_("Widget") - .def("sensitive", &Widget::get_sensitive) - .def("sensitive", &Widget::set_sensitive, return_self<>()) - ; - - class_ >("Label") - .def("label", &Label::get_label)//,return_arg<0>()) //error(s) - .def("label", &Label::set_label, return_self<>()) - ; - - def("return_arg", return_arg_f, return_arg<1>()); -} - -#include "module_tail.cpp" diff --git a/test/return_arg.py b/test/return_arg.py deleted file mode 100644 index f191d596..00000000 --- a/test/return_arg.py +++ /dev/null @@ -1,27 +0,0 @@ -# Copyright David Abrahams 2004. 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) -''' ->>> from return_arg_ext import * ->>> l1=Label() ->>> assert l1 is l1.label("bar") ->>> assert l1 is l1.label("bar").sensitive(0) ->>> assert l1.label("foo").sensitive(0) is l1.sensitive(1).label("bar") ->>> assert return_arg is return_arg(return_arg) - -''' - -def run(args = None): - import sys - import doctest - - if args is not None: - sys.argv = args - return doctest.testmod(sys.modules.get(__name__)) - -if __name__ == '__main__': - print "running..." - import sys - status = run()[0] - if (status == 0): print "Done." - sys.exit(status) diff --git a/test/select_arg_to_python_test.cpp b/test/select_arg_to_python_test.cpp deleted file mode 100644 index c5faace3..00000000 --- a/test/select_arg_to_python_test.cpp +++ /dev/null @@ -1,70 +0,0 @@ -// Copyright David Abrahams 2004. 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 -#include -#include -#include -#include - -// gcc 2.95.x and MIPSpro 7.3.1.3 linker seem to demand this definition -#if ((defined(__GNUC__) && __GNUC__ < 3)) \ - || (defined(__sgi) && defined(__EDG_VERSION__) && (__EDG_VERSION__ == 238)) -namespace boost { namespace python { -BOOST_PYTHON_DECL bool handle_exception_impl(function0) -{ - return true; -} -}} -#endif - -int result; - -#define ASSERT_SAME(T1,T2) assert_same< T1,T2 >() - -template -void assert_same(U* = 0, T* = 0) -{ - BOOST_STATIC_ASSERT((boost::is_same::value)); - -} - - -int main() -{ - using namespace boost::python::converter::detail; - using namespace boost::python::converter; - using namespace boost::python; - using namespace boost; - - - ASSERT_SAME( - select_arg_to_python::type, value_arg_to_python - ); - - ASSERT_SAME( - select_arg_to_python >::type, reference_arg_to_python - ); - - ASSERT_SAME( - select_arg_to_python >::type, pointer_shallow_arg_to_python - ); - - ASSERT_SAME( - select_arg_to_python::type, pointer_deep_arg_to_python - ); - - ASSERT_SAME( - select_arg_to_python >::type, object_manager_arg_to_python > - ); - - ASSERT_SAME( - select_arg_to_python::type, object_manager_arg_to_python - ); - - ASSERT_SAME( - select_arg_to_python::type, arg_to_python - ); - - return result; -} diff --git a/test/select_from_python_test.cpp b/test/select_from_python_test.cpp deleted file mode 100644 index bb60962a..00000000 --- a/test/select_from_python_test.cpp +++ /dev/null @@ -1,161 +0,0 @@ -// Copyright David Abrahams 2004. 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 -#include -#include - -// gcc 2.95.x, MIPSpro 7.3.1.3 and IBM XL for Linux linker seem to demand this definition -#if (defined(__GNUC__) && (__GNUC__ < 3)) \ - || (defined(__sgi) && defined(__EDG_VERSION__) && (__EDG_VERSION__ == 238)) \ - || (defined(__IBMCPP__) && defined(__linux__)) -namespace boost { namespace python { -BOOST_PYTHON_DECL bool handle_exception_impl(function0) -{ - return true; -} -}} -#endif - -int result; - -#define ASSERT_SAME(T1,T2) \ - if (!is_same< T1, T2 >::value) { \ - std::cout << "*********************\n"; \ - std::cout << python::type_id< T1 >() << " != " << python::type_id< T2 >() << "\n"; \ - std::cout << "*********************\n"; \ - result = 1; \ - } - -int main() -{ - using namespace boost::python::converter; - using namespace boost; - - - ASSERT_SAME( - select_arg_from_python::type, arg_rvalue_from_python - ); - - ASSERT_SAME( - select_arg_from_python::type, arg_rvalue_from_python - ); - - ASSERT_SAME( - select_arg_from_python::type, arg_rvalue_from_python - ); - - ASSERT_SAME( - select_arg_from_python::type, arg_rvalue_from_python - ); - - - - ASSERT_SAME( - select_arg_from_python::type, pointer_arg_from_python - ); - - ASSERT_SAME( - select_arg_from_python::type, pointer_arg_from_python - ); - - ASSERT_SAME( - select_arg_from_python::type, pointer_arg_from_python - ); - - ASSERT_SAME( - select_arg_from_python::type, pointer_arg_from_python - ); - - - - - ASSERT_SAME( - select_arg_from_python::type, reference_arg_from_python - ); - - ASSERT_SAME( - select_arg_from_python::type, arg_rvalue_from_python - ); - - ASSERT_SAME( - select_arg_from_python::type, reference_arg_from_python - ); - - ASSERT_SAME( - select_arg_from_python::type, reference_arg_from_python - ); - - - - ASSERT_SAME( - select_arg_from_python::type, reference_arg_from_python - ); - - ASSERT_SAME( - select_arg_from_python::type, reference_arg_from_python - ); - - ASSERT_SAME( - select_arg_from_python::type, reference_arg_from_python - ); - - ASSERT_SAME( - select_arg_from_python::type, reference_arg_from_python - ); - - - - ASSERT_SAME( - select_arg_from_python::type, pointer_cref_arg_from_python - ); - - ASSERT_SAME( - select_arg_from_python::type, pointer_cref_arg_from_python - ); - - ASSERT_SAME( - select_arg_from_python::type, pointer_cref_arg_from_python - ); - - ASSERT_SAME( - select_arg_from_python::type, pointer_cref_arg_from_python - ); - - - - ASSERT_SAME( - select_arg_from_python::type, reference_arg_from_python - ); - - ASSERT_SAME( - select_arg_from_python::type, reference_arg_from_python - ); - - ASSERT_SAME( - select_arg_from_python::type, reference_arg_from_python - ); - - ASSERT_SAME( - select_arg_from_python::type, reference_arg_from_python - ); - - - - ASSERT_SAME( - select_arg_from_python::type, reference_arg_from_python - ); - - ASSERT_SAME( - select_arg_from_python::type, reference_arg_from_python - ); - - ASSERT_SAME( - select_arg_from_python::type, reference_arg_from_python - ); - - ASSERT_SAME( - select_arg_from_python::type, reference_arg_from_python - ); - return result; -} diff --git a/test/select_holder.cpp b/test/select_holder.cpp deleted file mode 100644 index 4ecc52e7..00000000 --- a/test/select_holder.cpp +++ /dev/null @@ -1,76 +0,0 @@ -// 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 -#include -#include -#include -#include -#include -#include -#include - -struct BR {}; - -struct Base {}; -struct Derived : Base {}; - -namespace boost { namespace python -{ - // specialization - template <> - struct has_back_reference
- : mpl::true_ - { - }; -}} // namespace boost::python - -template -void assert_same(U* = 0, T* = 0) -{ - BOOST_STATIC_ASSERT((boost::is_same::value)); - -} - -template -void assert_holder(T* = 0, Held* = 0, Holder* = 0) -{ - using namespace boost::python::detail; - using namespace boost::python::objects; - - typedef typename class_metadata< - T,Held,not_specified,not_specified - >::holder h; - - assert_same( - (h*)0 - ); -} - -int test_main(int, char * []) -{ - using namespace boost::python::detail; - using namespace boost::python::objects; - - assert_holder >(); - - assert_holder >(); - assert_holder >(); - assert_holder >(); - - assert_holder >(); - - assert_holder - ,pointer_holder,Base> >(); - - assert_holder - ,pointer_holder_back_reference,Base> >(); - - assert_holder - ,pointer_holder_back_reference,BR> > (); - - return 0; -} - diff --git a/test/shared_ptr.cpp b/test/shared_ptr.cpp deleted file mode 100644 index e5f20a73..00000000 --- a/test/shared_ptr.cpp +++ /dev/null @@ -1,217 +0,0 @@ -// 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 -#include -#include -#include -#include -#include -#include "test_class.hpp" - -#include - -using namespace boost::python; -using boost::shared_ptr; - -typedef test_class<> X; -typedef test_class<1> Y; - -template -struct functions -{ - static int look(shared_ptr const& x) - { - return (x.get()) ? x->value() : -1; - } - - static void store(shared_ptr x) - { - storage = x; - } - - static void release_store() - { - store(shared_ptr()); - } - - static void modify(shared_ptr& x) - { - x.reset(); - } - - static shared_ptr get() { return storage; } - static shared_ptr &get1() { return storage; } - - static int look_store() - { - return look(get()); - } - - template - static void expose(C const& c) - { - def("look", &look); - def("store", &store); - def("modify", &modify); - def("identity", &identity); - def("null", &null); - - const_cast(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 identity(shared_ptr x) { return x; } - static shared_ptr null(T const&) { return shared_ptr(); } - - - static shared_ptr storage; -}; - -template shared_ptr functions::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(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 factory(int n) -{ - return shared_ptr(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) { return a->f(); } - }; - - struct B: A - { - int f() { return 1; } - }; - - boost::shared_ptr New(bool make) - { - return boost::shared_ptr( 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 Becker - -struct Test { - boost::shared_ptr x; -}; -// ------ - - -BOOST_PYTHON_MODULE(shared_ptr_ext) -{ - class_, 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. - objects::class_value_wrapper< - shared_ptr - , objects::make_ptr_instance,A> > - >(); - - def("New", &New); - - def("factory", factory); - - functions::expose( - class_("X", init()) - .def("value", &X::value) - ); - - functions::expose( - class_ >("Y", init()) - .def("value", &Y::value) - ); - - class_, boost::noncopyable>("YY", init()) - ; - - class_, bases >("YYY", init()) - ; - - functions::expose( - class_("Z", init()) - .def("value", &Z::value) - .def("v", &Z::v, &ZWrap::default_v) - ); - -// from Neal Becker - class_ ("Test") - .def_readonly ("x", &Test::x, "x") - ; -// ------ -} - -#include "module_tail.cpp" - diff --git a/test/shared_ptr.py b/test/shared_ptr.py deleted file mode 100644 index 554b4a6b..00000000 --- a/test/shared_ptr.py +++ /dev/null @@ -1,130 +0,0 @@ -# Copyright David Abrahams 2004. 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) -''' ->>> from shared_ptr_ext import * - - Test that shared_ptr can be converted to shared_ptr - ->>> Y.store(YYY(42)) - ->>> x = X(17) ->>> null_x = null(x) ->>> null_x # should be None ->>> identity(null_x) # should also be None - ->>> a = New(1) ->>> A.call_f(a) -1 ->>> New(0) - ->>> type(factory(3)) - ->>> type(factory(42)) - - ->>> class P(Z): -... def v(self): -... return -Z.v(self); -... def __del__(self): -... print 'bye' -... ->>> p = P(12) ->>> p.value() -12 ->>> p.v() --12 ->>> look(p) -12 ->>> try: modify(p) -... except TypeError: pass -... else: 'print expected a TypeError' ->>> look(None) --1 ->>> store(p) ->>> del p ->>> Z.get().v() --12 ->>> Z.count() -1 ->>> Z.look_store() -12 ->>> Z.release() -bye ->>> Z.count() -0 - ->>> z = Z(13) ->>> z.value() -13 ->>> z.v() -13 ->>> try: modify(z) -... except TypeError: pass -... else: 'print expected a TypeError' - ->>> Z.get() # should be None ->>> store(z) ->>> assert Z.get() is z # show that deleter introspection works ->>> del z ->>> Z.get().value() -13 ->>> Z.count() -1 ->>> Z.look_store() -13 ->>> Z.release() ->>> Z.count() -0 - ->>> x = X(17) ->>> x.value() -17 ->>> look(x) -17 ->>> try: modify(x) -... except TypeError: pass -... else: 'print expected a TypeError' ->>> look(None) --1 ->>> store(x) ->>> del x ->>> X.count() -1 ->>> X.look_store() -17 ->>> X.release() ->>> X.count() -0 - - ->>> y = Y(19) ->>> y.value() -19 ->>> modify(y) ->>> look(y) --1 ->>> store(Y(23)) ->>> Y.count() -1 ->>> Y.look_store() -23 ->>> Y.release() ->>> Y.count() -0 -''' - -def run(args = None): - import sys - import doctest - - if args is not None: - sys.argv = args - return doctest.testmod(sys.modules.get(__name__)) - -if __name__ == '__main__': - print "running..." - import sys - status = run()[0] - if (status == 0): print "Done." - sys.exit(status) diff --git a/test/simple_type.hpp b/test/simple_type.hpp deleted file mode 100644 index d1314ff9..00000000 --- a/test/simple_type.hpp +++ /dev/null @@ -1,13 +0,0 @@ -// Copyright David Abrahams 2001. -// 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 SIMPLE_TYPE_DWA2001128_HPP -# define SIMPLE_TYPE_DWA2001128_HPP - -struct simple -{ - char* s; -}; - -#endif // SIMPLE_TYPE_DWA2001128_HPP diff --git a/test/slice.cpp b/test/slice.cpp deleted file mode 100644 index 5072d7f7..00000000 --- a/test/slice.cpp +++ /dev/null @@ -1,140 +0,0 @@ -#include -#include -#include -#include - -// Copyright (c) 2004 Jonathan Brandmeyer -// Use, modification and distribution are subject to 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) - -using namespace boost::python; - -#if BOOST_WORKAROUND(__SUNPRO_CC, BOOST_TESTED_AT(0x580)) || BOOST_WORKAROUND(BOOST_MSVC, BOOST_TESTED_AT(1500)) -# define make_tuple boost::python::make_tuple -#endif - -// These checks are only valid under Python 2.3 -// (rich slicing wasn't supported for builtins under Python 2.2) -bool check_string_rich_slice() -{ - object s("hello, world"); - - // default slice - if (s[slice()] != "hello, world") - return false; - - // simple reverse - if (s[slice(_,_,-1)] != "dlrow ,olleh") - return false; - - // reverse with mixed-sign offsets - if (s[slice(-6,1,-1)] != " ,oll") - return false; - - // all of the object.cpp check_string_slice() checks should work - // with the form that omits the step argument. - if (s[slice(_,-3)] != "hello, wo") - return false; - if (s[slice(-3,_)] != "rld") - return false; - if (", " != s[slice(5,7)]) - return false; - - return s[slice(2,-1)][slice(1,-1)] == "lo, wor"; -} - -// Tried to get more info into the error message (actual array -// contents) but Numeric complains that treating an array as a boolean -// value doesn't make any sense. -#define ASSERT_EQUAL( e1, e2 ) \ - if (!all((e1) == (e2))) \ - return "assertion failed: " #e1 " == " #e2 "\nLHS:\n%s\nRHS:\n%s" % make_tuple(e1,e2); \ -else - -// These tests work with Python 2.2, but you must have Numeric installed. -object check_numeric_array_rich_slice( - char const* module_name, char const* array_type_name, object all) -{ - using numeric::array; - array::set_module_and_type(module_name, array_type_name); - - array original = array( make_tuple( make_tuple( 11, 12, 13, 14), - make_tuple( 21, 22, 23, 24), - make_tuple( 31, 32, 33, 34), - make_tuple( 41, 42, 43, 44))); - array upper_left_quadrant = array( make_tuple( make_tuple( 11, 12), - make_tuple( 21, 22))); - array odd_cells = array( make_tuple( make_tuple( 11, 13), - make_tuple( 31, 33))); - array even_cells = array( make_tuple( make_tuple( 22, 24), - make_tuple( 42, 44))); - array lower_right_quadrant_reversed = array( - make_tuple( make_tuple(44, 43), - make_tuple(34, 33))); - - // The following comments represent equivalent Python expressions used - // to validate the array behavior. - // original[::] == original - ASSERT_EQUAL(original[slice()],original); - - // original[:2,:2] == array( [[11, 12], [21, 22]]) - ASSERT_EQUAL(original[make_tuple(slice(_,2), slice(_,2))],upper_left_quadrant); - - // original[::2,::2] == array( [[11, 13], [31, 33]]) - ASSERT_EQUAL(original[make_tuple( slice(_,_,2), slice(_,_,2))],odd_cells); - - // original[1::2, 1::2] == array( [[22, 24], [42, 44]]) - ASSERT_EQUAL(original[make_tuple( slice(1,_,2), slice(1,_,2))],even_cells); - - // original[:-3:-1, :-3,-1] == array( [[44, 43], [34, 33]]) - ASSERT_EQUAL(original[make_tuple( slice(_,-3,-1), slice(_,-3,-1))],lower_right_quadrant_reversed); - - return object(1); -} - -// Verify functions accepting a slice argument can be called -bool accept_slice( slice) { return true; } - -#if BOOST_WORKAROUND( BOOST_MSVC, BOOST_TESTED_AT(1400)) \ - || BOOST_WORKAROUND( BOOST_INTEL_WIN, == 710) -int check_slice_get_indices(slice index); -#endif -int check_slice_get_indices( -#if !BOOST_WORKAROUND(__SUNPRO_CC, BOOST_TESTED_AT(0x590)) - const -#endif - slice index) -{ - // A vector of integers from [-5, 5]. - std::vector coll(11); - typedef std::vector::iterator coll_iterator; - - for (coll_iterator i = coll.begin(); i != coll.end(); ++i) { - *i = i - coll.begin() - 5; - } - - slice::range::iterator> bounds; - try { - bounds = index.get_indices(coll.begin(), coll.end()); - } - catch (std::invalid_argument) { - return 0; - } - int sum = 0; - while (bounds.start != bounds.stop) { - sum += *bounds.start; - std::advance( bounds.start, bounds.step); - } - sum += *bounds.start; - return sum; -} - - -BOOST_PYTHON_MODULE(slice_ext) -{ - def( "accept_slice", accept_slice); - def( "check_numeric_array_rich_slice", check_numeric_array_rich_slice); - def( "check_string_rich_slice", check_string_rich_slice); - def( "check_slice_get_indices", check_slice_get_indices); -} diff --git a/test/slice.py b/test/slice.py deleted file mode 100644 index 95f4883b..00000000 --- a/test/slice.py +++ /dev/null @@ -1,72 +0,0 @@ -# Copyright David Abrahams 2004. 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) -""" ->>> from slice_ext import * ->>> accept_slice(slice(1, None, (1,2))) -1 ->>> try: -... accept_slice(list((1,2))) -... print "test failed" -... except: -... print "test passed" -... -test passed ->>> try: -... from Numeric import array -... except: -... print 1 -... else: -... check_numeric_array_rich_slice('Numeric', 'ArrayType', lambda x:x) -... -1 ->>> try: -... from numarray import array, all -... except: -... print 1 -... else: -... check_numeric_array_rich_slice('numarray', 'NDArray', all) -... -1 ->>> import sys ->>> if sys.version_info[0] == 2 and sys.version_info[1] >= 3: -... check_string_rich_slice() -... elif sys.version_info[0] > 2: -... check_string_rich_slice() -... else: -... print 1 -... -1 ->>> check_slice_get_indices( slice(None)) -0 ->>> check_slice_get_indices( slice(2,-2)) -0 ->>> check_slice_get_indices( slice(2, None, 2)) -5 ->>> check_slice_get_indices( slice(2, None, -1)) --12 ->>> check_slice_get_indices( slice( 20, None)) -0 ->>> check_slice_get_indices( slice( -2, -5, -2)) -6 -""" - -# Performs an affirmative and negative argument resolution check, -# checks the operation of extended slicing in Numeric arrays -# (only performed if Numeric.array or numarray.array can be found). -# checks the operation of extended slicing in new strings (Python 2.3 only). - -def run(args = None): - import sys - import doctest - - if args is not None: - sys.argv = args - return doctest.testmod(sys.modules.get(__name__)) - -if __name__ == '__main__': - print "running..." - import sys - status = run()[0] - if (status == 0): print "Done." - sys.exit(status) diff --git a/test/staticmethod.cpp b/test/staticmethod.cpp deleted file mode 100644 index dcd75ca8..00000000 --- a/test/staticmethod.cpp +++ /dev/null @@ -1,48 +0,0 @@ -// 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 -#include -#include -#include -#include -#include -#define BOOST_ENABLE_ASSERT_HANDLER -#include - -using namespace boost::python; - -struct X -{ - explicit X(int x) : x(x), magic(7654321) { ++counter; } - X(X const& rhs) : x(rhs.x), magic(7654321) { ++counter; } - virtual ~X() { BOOST_ASSERT(magic == 7654321); magic = 6666666; x = 9999; --counter; } - - void set(int _x) { BOOST_ASSERT(magic == 7654321); this->x = _x; } - int value() const { BOOST_ASSERT(magic == 7654321); return x; } - static int count() { return counter; } - private: - void operator=(X const&); - private: - int x; - long magic; - static int counter; -}; -int X::counter; -int getXmagic(){return 7654321;} - -BOOST_PYTHON_MODULE(staticmethod_ext) -{ - class_("X", init()) - .def("value", &X::value) - .def("set", &X::set) - .def("count", &X::count) - .staticmethod("count") - .def("magic", &getXmagic) - .staticmethod("magic") - ; -} - -#include "module_tail.cpp" diff --git a/test/staticmethod.py b/test/staticmethod.py deleted file mode 100644 index cc2fb6a7..00000000 --- a/test/staticmethod.py +++ /dev/null @@ -1,57 +0,0 @@ -# Copyright David Abrahams 2004. 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) -''' ->>> from staticmethod_ext import * - ->>> class X1(X): -... pass - - ->>> x = X(16) ->>> x1 = X1(17) - - - ->>> x1.count() -2 - ->>> x.count() -2 - ->>> X1.count() -2 - ->>> X.count() -2 - - ->>> x1.magic() -7654321 - ->>> x.magic() -7654321 - ->>> X1.magic() -7654321 - ->>> X.magic() -7654321 - - -''' - -def run(args = None): - import sys - import doctest - - if args is not None: - sys.argv = args - return doctest.testmod(sys.modules.get(__name__)) - -if __name__ == '__main__': - print "running..." - import sys - status = run()[0] - if (status == 0): print "Done." - sys.exit(status) diff --git a/test/stl_iterator.cpp b/test/stl_iterator.cpp deleted file mode 100755 index 409e0da8..00000000 --- a/test/stl_iterator.cpp +++ /dev/null @@ -1,33 +0,0 @@ -// Copyright Eric Niebler 2005. -// 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 -#include -#include -#include -#include - -using namespace boost::python; - -typedef std::list list_int; - -void assign(list_int& x, object const& y) -{ - stl_input_iterator begin(y), end; - x.clear(); - for( ; begin != end; ++begin) - x.push_back(*begin); -} - -BOOST_PYTHON_MODULE(stl_iterator_ext) -{ - using boost::python::iterator; // gcc 2.96 bug workaround - - class_("list_int") - .def("assign", assign) - .def("__iter__", iterator()) - ; -} - -#include "module_tail.cpp" diff --git a/test/stl_iterator.py b/test/stl_iterator.py deleted file mode 100644 index 2c324c0a..00000000 --- a/test/stl_iterator.py +++ /dev/null @@ -1,39 +0,0 @@ -# Copyright Eric Niebler 2005. 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) -''' ->>> from stl_iterator_ext import * ->>> x = list_int() ->>> x.assign(iter([1,2,3,4,5])) ->>> for y in x: -... print y -1 -2 -3 -4 -5 ->>> def generator(): -... yield 1 -... yield 2 -... raise RuntimeError, "oops" ->>> try: -... x.assign(iter(generator())) -... print "NOT OK" -... except RuntimeError: -... print "OK" -OK -''' -def run(args = None): - import sys - import doctest - - if args is not None: - sys.argv = args - return doctest.testmod(sys.modules.get(__name__)) - -if __name__ == '__main__': - print "running..." - import sys - status = run()[0] - if (status == 0): print "Done." - sys.exit(status) diff --git a/test/str.cpp b/test/str.cpp deleted file mode 100644 index 0505b250..00000000 --- a/test/str.cpp +++ /dev/null @@ -1,84 +0,0 @@ -// Copyright David Abrahams 2004. 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 -#include - -#include -#include -#include -#define BOOST_ENABLE_ASSERT_HANDLER -#include - -using namespace boost::python; - -object convert_to_string(object data) -{ - return str(data); -} - -void work_with_string(object print) -{ - str data("this is a demo string"); - print(data.split(" ")); - print(data.split(" ",3)); - print(str("<->").join(data.split(" "))); - print(data.capitalize()); - print('[' + data.center(30) + ']'); - print(data.count("t")); -#if PY_VERSION_HEX < 0x03000000 - print(data.encode("utf-8")); - print(data.decode("utf-8")); -#else - print(data.encode("utf-8").attr("decode")("utf-8")); - print(data.encode("utf-8").attr("decode")("utf-8")); -#endif - - BOOST_ASSERT(!data.endswith("xx")); - BOOST_ASSERT(!data.startswith("test")); - - print(data.splitlines()); - print(data.strip()); - print(data.swapcase()); - print(data.title()); - - print("find"); - print(data.find("demo")); - print(data.find("demo"),3,5); - print(data.find(std::string("demo"))); - print(data.find(std::string("demo"),9)); - - print("expandtabs"); - str tabstr("\t\ttab\tdemo\t!"); - print(tabstr.expandtabs()); - print(tabstr.expandtabs(4)); - print(tabstr.expandtabs(7L)); - - print("operators"); - print( str("part1") + str("part2") ); -// print( str("a test string").slice(3,_) ); -// print( str("another test")[5] ); - - print(data.replace("demo",std::string("blabla"))); - print(data.rfind("i",5)); - print(data.rindex("i",5)); - - BOOST_ASSERT(!data.startswith("asdf")); - BOOST_ASSERT(!data.endswith("asdf")); - - print(data.translate(str('a')*256)); - - - bool tmp = data.isalnum() || data.isalpha() || data.isdigit() || data.islower() || - data.isspace() || data.istitle() || data.isupper(); - (void)tmp; // ignored. -} - - -BOOST_PYTHON_MODULE(str_ext) -{ - def("convert_to_string",convert_to_string); - def("work_with_string",work_with_string); -} - -#include "module_tail.cpp" diff --git a/test/str.py b/test/str.py deleted file mode 100644 index 5f10580c..00000000 --- a/test/str.py +++ /dev/null @@ -1,53 +0,0 @@ -# Copyright David Abrahams 2004. 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) -""" ->>> from str_ext import * ->>> def printer(*args): -... for x in args: print x, -... print -... ->>> work_with_string(printer) #doctest: +NORMALIZE_WHITESPACE -['this', 'is', 'a', 'demo', 'string'] -['this', 'is', 'a', 'demo string'] -this<->is<->a<->demo<->string -This is a demo string -[ this is a demo string ] -2 -this is a demo string -this is a demo string -['this is a demo string'] -this is a demo string -THIS IS A DEMO STRING -This Is A Demo String -find -10 -10 3 5 -10 -10 -expandtabs - tab demo ! - tab demo ! - tab demo ! -operators -part1part2 -this is a blabla string -18 -18 -aaaaaaaaaaaaaaaaaaaaa -""" - -def run(args = None): - import sys - import doctest - - if args is not None: - sys.argv = args - return doctest.testmod(sys.modules.get(__name__)) - -if __name__ == '__main__': - print "running..." - import sys - status = run()[0] - if (status == 0): print "Done." - sys.exit(status) diff --git a/test/string_literal.cpp b/test/string_literal.cpp deleted file mode 100644 index 7a349d6c..00000000 --- a/test/string_literal.cpp +++ /dev/null @@ -1,42 +0,0 @@ -// Copyright David Abrahams 2004. 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 -//#include - -#include -#include - -using namespace boost::python::detail; - - -template -void expect_string_literal(T const&) -{ - BOOST_STATIC_ASSERT(is_string_literal::value); -} - -int main() -{ - expect_string_literal("hello"); - BOOST_STATIC_ASSERT(!is_string_literal::value); - BOOST_STATIC_ASSERT(!is_string_literal::value); - BOOST_STATIC_ASSERT(!is_string_literal::value); - BOOST_STATIC_ASSERT(!is_string_literal::value); - - BOOST_STATIC_ASSERT(!is_string_literal::value); - BOOST_STATIC_ASSERT(!is_string_literal::value); - BOOST_STATIC_ASSERT(!is_string_literal::value); - BOOST_STATIC_ASSERT(!is_string_literal::value); - BOOST_STATIC_ASSERT(!is_string_literal::value); - BOOST_STATIC_ASSERT(!is_string_literal::value); - - BOOST_STATIC_ASSERT(!is_string_literal::value); - BOOST_STATIC_ASSERT(is_string_literal::value); - BOOST_STATIC_ASSERT(is_string_literal::value); - - BOOST_STATIC_ASSERT(!is_string_literal::value); - BOOST_STATIC_ASSERT(!is_string_literal::value); - BOOST_STATIC_ASSERT(!is_string_literal::value); - return boost::report_errors(); -} diff --git a/test/test_builtin_converters.cpp b/test/test_builtin_converters.cpp deleted file mode 100644 index f66e61bd..00000000 --- a/test/test_builtin_converters.cpp +++ /dev/null @@ -1,152 +0,0 @@ -// 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 -#include -#include -#include -#include -#include -#include - -template -struct by_value -{ - static T rewrap(T x) - { - return x; - } - static int size(void) - { - return sizeof(T); - } -}; - -template -struct by_const_reference -{ - static T rewrap(T const& x) - { - return x; - } -}; - -template -struct by_reference -{ - static T rewrap(T& x) - { - return x; - } -}; - -using boost::python::def; -using boost::python::handle; -using boost::python::object; -using boost::python::borrowed; - -// Used to test that arbitrary handle<>s can be returned -handle get_type(handle<> x) -{ - return handle(borrowed(x->ob_type)); -} - -handle<> return_null_handle() -{ - return handle<>(); -} - -char const* rewrap_value_mutable_cstring(char* x) { return x; } - -object identity_(object x) { return x; } - -BOOST_PYTHON_MODULE(builtin_converters_ext) -{ - def("get_type", get_type); - def("return_null_handle", return_null_handle); - -// These methods are used solely for getting some C++ type sizes - def("bool_size", by_value::size); - def("char_size", by_value::size); - def("int_size", by_value::size); - def("short_size", by_value::size); - def("long_size", by_value::size); -#ifdef HAVE_LONG_LONG - def("long_long_size", by_value::size); -#endif - - def("rewrap_value_bool", by_value::rewrap); - def("rewrap_value_char", by_value::rewrap); - def("rewrap_value_signed_char", by_value::rewrap); - def("rewrap_value_unsigned_char", by_value::rewrap); - def("rewrap_value_int", by_value::rewrap); - def("rewrap_value_unsigned_int", by_value::rewrap); - def("rewrap_value_short", by_value::rewrap); - def("rewrap_value_unsigned_short", by_value::rewrap); - def("rewrap_value_long", by_value::rewrap); - def("rewrap_value_unsigned_long", by_value::rewrap); -// using Python's macro instead of Boost's - we don't seem to get the -// config right all the time. -#ifdef HAVE_LONG_LONG - def("rewrap_value_long_long", by_value::rewrap); - def("rewrap_value_unsigned_long_long", by_value::rewrap); -# endif - def("rewrap_value_float", by_value::rewrap); - def("rewrap_value_double", by_value::rewrap); - def("rewrap_value_long_double", by_value::rewrap); - def("rewrap_value_complex_float", by_value >::rewrap); - def("rewrap_value_complex_double", by_value >::rewrap); - def("rewrap_value_complex_long_double", by_value >::rewrap); - def("rewrap_value_wstring", -# if defined(BOOST_NO_STD_WSTRING) || !defined(Py_USING_UNICODE) - identity_ -# else - by_value::rewrap -# endif - ); - def("rewrap_value_string", -# if defined(BOOST_NO_STD_WSTRING) || !defined(Py_USING_UNICODE) - identity_ -# else - by_value::rewrap -# endif - ); - def("rewrap_value_string", by_value::rewrap); - def("rewrap_value_cstring", by_value::rewrap); - def("rewrap_value_handle", by_value >::rewrap); - def("rewrap_value_object", by_value::rewrap); - - // Expose this to illustrate our failings ;-). See test_builtin_converters.py - def("rewrap_value_mutable_cstring", rewrap_value_mutable_cstring); - - - def("rewrap_const_reference_bool", by_const_reference::rewrap); - def("rewrap_const_reference_char", by_const_reference::rewrap); - def("rewrap_const_reference_signed_char", by_const_reference::rewrap); - def("rewrap_const_reference_unsigned_char", by_const_reference::rewrap); - def("rewrap_const_reference_int", by_const_reference::rewrap); - def("rewrap_const_reference_unsigned_int", by_const_reference::rewrap); - def("rewrap_const_reference_short", by_const_reference::rewrap); - def("rewrap_const_reference_unsigned_short", by_const_reference::rewrap); - def("rewrap_const_reference_long", by_const_reference::rewrap); - def("rewrap_const_reference_unsigned_long", by_const_reference::rewrap); -// using Python's macro instead of Boost's - we don't seem to get the -// config right all the time. -# ifdef HAVE_LONG_LONG - def("rewrap_const_reference_long_long", by_const_reference::rewrap); - def("rewrap_const_reference_unsigned_long_long", by_const_reference::rewrap); -# endif - def("rewrap_const_reference_float", by_const_reference::rewrap); - def("rewrap_const_reference_double", by_const_reference::rewrap); - def("rewrap_const_reference_long_double", by_const_reference::rewrap); - def("rewrap_const_reference_complex_float", by_const_reference >::rewrap); - def("rewrap_const_reference_complex_double", by_const_reference >::rewrap); - def("rewrap_const_reference_complex_long_double", by_const_reference >::rewrap); - def("rewrap_const_reference_string", by_const_reference::rewrap); - def("rewrap_const_reference_cstring", by_const_reference::rewrap); - def("rewrap_const_reference_handle", by_const_reference >::rewrap); - def("rewrap_const_reference_object", by_const_reference::rewrap); - def("rewrap_reference_object", by_reference::rewrap); -} - diff --git a/test/test_builtin_converters.py b/test/test_builtin_converters.py deleted file mode 100644 index 5a6c8c50..00000000 --- a/test/test_builtin_converters.py +++ /dev/null @@ -1,302 +0,0 @@ -# Copyright David Abrahams 2004. 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) -r""" ->>> from builtin_converters_ext import * - -# Provide values for integer converter tests ->>> def _signed_values(s): -... base = 2 ** (8 * s - 1) -... return [[-base, -1, 1, base - 1], [-base - 1, base]] ->>> def _unsigned_values(s): -... base = 2 ** (8 * s) -... return [[1, base - 1], [-1L, -1, base]] - -# Wrappers to simplify tests ->>> def should_pass(method, values): -... result = map(method, values[0]) -... if result != values[0]: -... print "Got %s but expected %s" % (result, values[0]) ->>> def test_overflow(method, values): -... for v in values[1]: -... try: method(v) -... except OverflowError: pass -... else: print "OverflowError expected" - -# Synthesize idendity functions in case long long not supported ->>> if not 'rewrap_value_long_long' in dir(): -... def rewrap_value_long_long(x): return long(x) -... def rewrap_value_unsigned_long_long(x): return long(x) -... def rewrap_const_reference_long_long(x): return long(x) -... def rewrap_const_reference_unsigned_long_long(x): return long(x) ->>> if not 'long_long_size' in dir(): -... def long_long_size(): return long_size() - ->>> try: bool_exists = bool -... except: pass -... else: -... rewrap_value_bool(True) -... rewrap_value_bool(False) -True -False - ->>> rewrap_value_bool(None) -0 ->>> rewrap_value_bool(0) -0 ->>> rewrap_value_bool(33) -1 ->>> rewrap_value_char('x') -'x' - - Note that there's currently silent truncation of strings passed to - char arguments. - ->>> rewrap_value_char('xy') -'x' ->>> rewrap_value_signed_char(42) -42 ->>> rewrap_value_unsigned_char(42) -42 ->>> rewrap_value_int(42) -42 ->>> rewrap_value_unsigned_int(42) -42 ->>> rewrap_value_short(42) -42 ->>> rewrap_value_unsigned_short(42) -42 ->>> rewrap_value_long(42) -42 ->>> rewrap_value_unsigned_long(42) -42 - - test unsigned long values which don't fit in a signed long. - strip any 'L' characters in case the platform has > 32 bit longs - ->>> hex(rewrap_value_unsigned_long(0x80000001L)).replace('L','') -'0x80000001' - ->>> rewrap_value_long_long(42) == 42 -True ->>> rewrap_value_unsigned_long_long(42) == 42 -True - - show that we have range checking. - ->>> should_pass(rewrap_value_signed_char, _signed_values(char_size())) ->>> should_pass(rewrap_value_short, _signed_values(short_size())) ->>> should_pass(rewrap_value_int, _signed_values(int_size())) ->>> should_pass(rewrap_value_long, _signed_values(long_size())) ->>> should_pass(rewrap_value_long_long, _signed_values(long_long_size())) - ->>> should_pass(rewrap_value_unsigned_char, _unsigned_values(char_size())) ->>> should_pass(rewrap_value_unsigned_short, _unsigned_values(short_size())) ->>> should_pass(rewrap_value_unsigned_int, _unsigned_values(int_size())) ->>> should_pass(rewrap_value_unsigned_long, _unsigned_values(long_size())) ->>> should_pass(rewrap_value_unsigned_long_long, -... _unsigned_values(long_long_size())) - ->>> test_overflow(rewrap_value_signed_char, _signed_values(char_size())) ->>> test_overflow(rewrap_value_short, _signed_values(short_size())) ->>> test_overflow(rewrap_value_int, _signed_values(int_size())) ->>> test_overflow(rewrap_value_long, _signed_values(long_size())) ->>> test_overflow(rewrap_value_long_long, _signed_values(long_long_size())) - ->>> test_overflow(rewrap_value_unsigned_char, _unsigned_values(char_size())) ->>> test_overflow(rewrap_value_unsigned_short, _unsigned_values(short_size())) ->>> test_overflow(rewrap_value_unsigned_int, _unsigned_values(int_size())) ->>> test_overflow(rewrap_value_unsigned_long, _unsigned_values(long_size())) - -# Exceptionally for PyLong_AsUnsignedLongLong(), a negative value raises -# TypeError on Python versions prior to 2.7 ->>> for v in _unsigned_values(long_long_size())[1]: -... try: rewrap_value_unsigned_long_long(v) -... except (OverflowError, TypeError): pass -... else: print "OverflowError or TypeError expected" - ->>> assert abs(rewrap_value_float(4.2) - 4.2) < .000001 ->>> rewrap_value_double(4.2) - 4.2 -0.0 ->>> rewrap_value_long_double(4.2) - 4.2 -0.0 - ->>> assert abs(rewrap_value_complex_float(4+.2j) - (4+.2j)) < .000001 ->>> assert abs(rewrap_value_complex_double(4+.2j) - (4+.2j)) < .000001 ->>> assert abs(rewrap_value_complex_long_double(4+.2j) - (4+.2j)) < .000001 - ->>> rewrap_value_cstring('hello, world') -'hello, world' ->>> rewrap_value_string('yo, wassup?') -'yo, wassup?' - ->>> print rewrap_value_wstring(u'yo, wassup?') -yo, wassup? - - test that overloading on unicode works: - ->>> print rewrap_value_string(u'yo, wassup?') -yo, wassup? - - wrap strings with embedded nulls: - ->>> rewrap_value_string('yo,\0wassup?') -'yo,\x00wassup?' - ->>> rewrap_value_handle(1) -1 ->>> x = 'hi' ->>> assert rewrap_value_handle(x) is x ->>> assert rewrap_value_object(x) is x - - Note that we can currently get a mutable pointer into an immutable - Python string: - ->>> rewrap_value_mutable_cstring('hello, world') -'hello, world' - ->>> rewrap_const_reference_bool(None) -0 ->>> rewrap_const_reference_bool(0) -0 - ->>> try: rewrap_const_reference_bool('yes') -... except TypeError: pass -... else: print 'expected a TypeError exception' - ->>> rewrap_const_reference_char('x') -'x' - - Note that there's currently silent truncation of strings passed to - char arguments. - ->>> rewrap_const_reference_char('xy') -'x' ->>> rewrap_const_reference_signed_char(42) -42 ->>> rewrap_const_reference_unsigned_char(42) -42 ->>> rewrap_const_reference_int(42) -42 ->>> rewrap_const_reference_unsigned_int(42) -42 ->>> rewrap_const_reference_short(42) -42 ->>> rewrap_const_reference_unsigned_short(42) -42 ->>> rewrap_const_reference_long(42) -42 ->>> rewrap_const_reference_unsigned_long(42) -42 ->>> rewrap_const_reference_long_long(42) == 42 -True ->>> rewrap_const_reference_unsigned_long_long(42) == 42 -True - - ->>> assert abs(rewrap_const_reference_float(4.2) - 4.2) < .000001 ->>> rewrap_const_reference_double(4.2) - 4.2 -0.0 ->>> rewrap_const_reference_long_double(4.2) - 4.2 -0.0 - ->>> assert abs(rewrap_const_reference_complex_float(4+.2j) - (4+.2j)) < .000001 ->>> assert abs(rewrap_const_reference_complex_double(4+.2j) - (4+.2j)) < .000001 ->>> assert abs(rewrap_const_reference_complex_long_double(4+.2j) - (4+.2j)) < .000001 - ->>> rewrap_const_reference_cstring('hello, world') -'hello, world' ->>> rewrap_const_reference_string('yo, wassup?') -'yo, wassup?' - ->>> rewrap_const_reference_handle(1) -1 ->>> x = 'hi' ->>> assert rewrap_const_reference_handle(x) is x ->>> assert rewrap_const_reference_object(x) is x ->>> assert rewrap_reference_object(x) is x - - -Check that None <==> NULL - ->>> rewrap_const_reference_cstring(None) - -But None cannot be converted to a string object: - ->>> try: rewrap_const_reference_string(None) -... except TypeError: pass -... else: print 'expected a TypeError exception' - -Now check implicit conversions between floating/integer types - ->>> rewrap_const_reference_float(42) -42.0 - ->>> rewrap_const_reference_float(42L) -42.0 - ->>> try: rewrap_const_reference_int(42.0) -... except TypeError: pass -... else: print 'expected a TypeError exception' - ->>> rewrap_value_float(42) -42.0 - ->>> try: rewrap_value_int(42.0) -... except TypeError: pass -... else: print 'expected a TypeError exception' - -Check that classic classes also work - ->>> class FortyTwo: -... def __int__(self): -... return 42 -... def __float__(self): -... return 42.0 -... def __complex__(self): -... return complex(4+.2j) -... def __str__(self): -... return '42' - ->>> try: rewrap_const_reference_float(FortyTwo()) -... except TypeError: pass -... else: print 'expected a TypeError exception' - ->>> try: rewrap_value_int(FortyTwo()) -... except TypeError: pass -... else: print 'expected a TypeError exception' - ->>> try: rewrap_const_reference_string(FortyTwo()) -... except TypeError: pass -... else: print 'expected a TypeError exception' - ->>> try: rewrap_value_complex_double(FortyTwo()) -... except TypeError: pass -... else: print 'expected a TypeError exception' - -# show that arbitrary handle instantiations can be returned ->>> assert get_type(1) is type(1) - ->>> assert return_null_handle() is None -""" - -def run(args = None): - import sys - import doctest - import builtin_converters_ext - - if 'rewrap_value_long_long' in dir(builtin_converters_ext): - print 'LONG_LONG supported, testing...' - else: - print 'LONG_LONG not supported, skipping those tests...' - - if args is not None: - sys.argv = args - return doctest.testmod(sys.modules.get(__name__)) - -if __name__ == '__main__': - print "running..." - import sys - status = run()[0] - if (status == 0): print "Done." - sys.exit(status) diff --git a/test/test_class.hpp b/test/test_class.hpp deleted file mode 100644 index 5404fdba..00000000 --- a/test/test_class.hpp +++ /dev/null @@ -1,32 +0,0 @@ -// 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) -#ifndef TEST_CLASS_DWA2002326_HPP -# define TEST_CLASS_DWA2002326_HPP -# include - -template -struct test_class -{ - explicit test_class(int x) : x(x), magic(7654321 + n) { ++counter; } - test_class(test_class const& rhs) : x(rhs.x), magic(7654321 + n) { ++counter; } - virtual ~test_class() { BOOST_TEST(magic == 7654321 + n); magic = 6666666; x = 9999; --counter; } - - void set(int _x) { BOOST_TEST(magic == 7654321 + n); this->x = _x; } - int value() const { BOOST_TEST(magic == 7654321 + n); return x; } - operator int() const { return x; } - static int count() { return counter; } - - int x; - long magic; - static int counter; - - private: - void operator=(test_class const&); -}; - -template -int test_class::counter; - -#endif // TEST_CLASS_DWA2002326_HPP diff --git a/test/test_cltree.py b/test/test_cltree.py deleted file mode 100644 index 016cf63d..00000000 --- a/test/test_cltree.py +++ /dev/null @@ -1,43 +0,0 @@ -# Copyright David Abrahams 2004. 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) -#!/usr/bin/env python - -from cltree import basic,symbol,constant,variable - -b = basic() -c = constant() -s = symbol() -v = variable() - -assert isinstance(b,basic) -assert not isinstance(b,symbol) -assert not isinstance(b,constant) -assert not isinstance(b,variable) - -assert isinstance(c,basic) -assert isinstance(c,constant) -assert not isinstance(c,symbol) -assert not isinstance(c,variable) - -assert not isinstance(s,basic) -assert isinstance(s,symbol) -assert not isinstance(s,constant) -assert not isinstance(s,variable) - -assert isinstance(v,basic) -assert not isinstance(v,symbol) -assert not isinstance(v,constant) -assert isinstance(v,variable) - -print 'b=',b -assert repr(b)=='cltree.basic()' -print 's=',s -assert repr(s)!='cltree.wrapped_symbol()' # because not isinstance(s,basic) -print 'c=',c -assert repr(c)=='cltree.constant()' -print 'v=',v -assert repr(v)=='cltree.wrapped_variable()' - - -print 'ok' diff --git a/test/test_overload_resolution.cpp b/test/test_overload_resolution.cpp deleted file mode 100644 index e15bcc6a..00000000 --- a/test/test_overload_resolution.cpp +++ /dev/null @@ -1,53 +0,0 @@ -// Copyright Troy D. Straszheim 2009 -// 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) -// -// -// example that shows problems with overloading and automatic conversion. -// if you call one of the below functions from python with bool/int/double, -// you'll see that the overload called is first match, not best match. -// See overload matching in luabind for an example of how to do this better. -// -// see this mail: -// http://mail.python.org/pipermail/cplusplus-sig/2009-March/014362.html -// -// This test isn't called by the cmake/jamfiles. For future use. -// -#include -#include -#include -#include -#include -#include -#include - -using boost::python::def; -using boost::python::handle; -using boost::python::object; -using boost::python::borrowed; - -std::string takes_bool(bool b) { return "bool"; } -std::string takes_int(int b) { return "int"; } -std::string takes_double(double b) { return "double"; } - - -BOOST_PYTHON_MODULE(overload_resolution) -{ - def("bid", takes_bool); - def("bid", takes_int); - def("bid", takes_double); - - def("dib", takes_double); - def("dib", takes_int); - def("dib", takes_bool); - - def("idb", takes_int); - def("idb", takes_double); - def("idb", takes_bool); - - def("bdi", takes_bool); - def("bdi", takes_double); - def("bdi", takes_int); -} - diff --git a/test/test_pointer_adoption.cpp b/test/test_pointer_adoption.cpp deleted file mode 100644 index a4e14af5..00000000 --- a/test/test_pointer_adoption.cpp +++ /dev/null @@ -1,125 +0,0 @@ -// 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 -#include -#include -#include -#include -#include - -using namespace boost::python; - -int a_instances = 0; - -int num_a_instances() { return a_instances; } - -struct inner -{ - inner(std::string const& s) - : s(s) - {} - - void change(std::string const& new_s) - { - this->s = new_s; - } - - std::string s; -}; - -struct Base -{ - virtual ~Base() {} -}; - -struct A : Base -{ - A(std::string const& s) - : x(s) - { - ++a_instances; - } - - ~A() - { - --a_instances; - } - - std::string content() const - { - return x.s; - } - - inner& get_inner() - { - return x; - } - - inner x; -}; - -struct B -{ - B() : x(0) {} - B(A* x_) : x(x_) {} - - inner const* adopt(A* _x) { this->x = _x; return &_x->get_inner(); } - - std::string a_content() - { - return x ? x->content() : std::string("empty"); - } - - A* x; -}; - - -A* create(std::string const& s) -{ - return new A(s); -} - -A* as_A(Base* b) -{ - return dynamic_cast(b); -} - -BOOST_PYTHON_MODULE(test_pointer_adoption_ext) -{ - def("num_a_instances", num_a_instances); - - // Specify the manage_new_object return policy to take - // ownership of create's result - def("create", create, return_value_policy()); - - def("as_A", as_A, return_internal_reference<>()); - - class_("Base") - ; - - class_ >("A", no_init) - .def("content", &A::content) - .def("get_inner", &A::get_inner, return_internal_reference<>()) - ; - - class_("inner", no_init) - .def("change", &inner::change) - ; - - class_("B") - .def(init()[with_custodian_and_ward_postcall<1,2>()]) - - .def("adopt", &B::adopt - // Adopt returns a pointer referring to a subobject of its 2nd argument (1st being "self") - , return_internal_reference<2 - // Meanwhile, self holds a reference to the 2nd argument. - , with_custodian_and_ward<1,2> >() - ) - - .def("a_content", &B::a_content) - ; -} - -#include "module_tail.cpp" diff --git a/test/test_pointer_adoption.py b/test/test_pointer_adoption.py deleted file mode 100644 index 5bb9dd6d..00000000 --- a/test/test_pointer_adoption.py +++ /dev/null @@ -1,93 +0,0 @@ -# Copyright David Abrahams 2004. 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) -""" ->>> from test_pointer_adoption_ext import * - ->>> num_a_instances() -0 - ->>> a = create('dynamically allocated') ->>> num_a_instances() -1 - ->>> a.content() -'dynamically allocated' - ->>> innards = a.get_inner() ->>> innards.change('with an exposed reference') ->>> a.content() -'with an exposed reference' - -# The a instance should be kept alive... ->>> a = None ->>> num_a_instances() -1 - -# ...until we're done with its innards ->>> innards = None ->>> num_a_instances() -0 - ->>> b = B() ->>> a = create('another') ->>> b.a_content() -'empty' ->>> innards = b.adopt(a); ->>> b.a_content() -'another' ->>> num_a_instances() -1 ->>> del a # innards and b are both holding a reference ->>> num_a_instances() -1 ->>> innards.change('yet another') ->>> b.a_content() -'yet another' - ->>> del innards ->>> num_a_instances() # b still owns a reference to a -1 ->>> del b ->>> num_a_instances() -0 - -Test call policies for constructors here - ->>> a = create('second a') ->>> num_a_instances() -1 ->>> b = B(a) ->>> num_a_instances() -1 ->>> a.content() -'second a' - ->>> del a ->>> num_a_instances() -1 ->>> b.a_content() -'second a' - ->>> del b ->>> num_a_instances() -0 - ->>> assert as_A(create('dynalloc')) is not None ->>> base = Base() ->>> assert as_A(base) is None -""" -def run(args = None): - import sys - import doctest - - if args is not None: - sys.argv = args - return doctest.testmod(sys.modules.get(__name__)) - -if __name__ == '__main__': - print "running..." - import sys - status = run()[0] - if (status == 0): print "Done." - sys.exit(status) diff --git a/test/tuple.cpp b/test/tuple.cpp deleted file mode 100644 index d48e91d8..00000000 --- a/test/tuple.cpp +++ /dev/null @@ -1,33 +0,0 @@ -// Copyright David Abrahams 2005. 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 -#include -#include -#include - -using namespace boost::python; - -object convert_to_tuple(object data) -{ - return tuple(data); -} - -void test_operators(tuple t1, tuple t2, object print) -{ - print(t1 + t2); -} - -tuple mktuple0() { return make_tuple(); } -tuple mktuple1(int x) { return make_tuple(x); } -tuple mktuple2(char const* a1, int x) { return make_tuple(a1, x); } - -BOOST_PYTHON_MODULE(tuple_ext) -{ - def("convert_to_tuple",convert_to_tuple); - def("test_operators",test_operators); - def("make_tuple", mktuple0); - def("make_tuple", mktuple1); - def("make_tuple", mktuple2); -} diff --git a/test/tuple.py b/test/tuple.py deleted file mode 100644 index 9d25aef4..00000000 --- a/test/tuple.py +++ /dev/null @@ -1,37 +0,0 @@ -# Copyright David Abrahams 2004. 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) -""" ->>> from tuple_ext import * ->>> def printer(*args): -... for x in args: print x, -... print -... ->>> print convert_to_tuple("this is a test string") -('t', 'h', 'i', 's', ' ', 'i', 's', ' ', 'a', ' ', 't', 'e', 's', 't', ' ', 's', 't', 'r', 'i', 'n', 'g') ->>> t1 = convert_to_tuple("this is") ->>> t2 = (1,2,3,4) ->>> test_operators(t1,t2,printer) #doctest: +NORMALIZE_WHITESPACE -('t', 'h', 'i', 's', ' ', 'i', 's', 1, 2, 3, 4) ->>> make_tuple() -() ->>> make_tuple(42) -(42,) ->>> make_tuple('hello', 42) -('hello', 42) -""" - -def run(args = None): - import sys - import doctest - - if args is not None: - sys.argv = args - return doctest.testmod(sys.modules.get(__name__)) - -if __name__ == '__main__': - print "running..." - import sys - status = run()[0] - if (status == 0): print "Done." - sys.exit(status) diff --git a/test/upcast.cpp b/test/upcast.cpp deleted file mode 100644 index 255429f1..00000000 --- a/test/upcast.cpp +++ /dev/null @@ -1,19 +0,0 @@ -// 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 -#include - -struct X { long x; }; -struct Y : X, PyObject {}; - -int main() -{ - PyTypeObject o; - Y y; - BOOST_TEST(&Py_REFCNT(boost::python::upcast(&o)) == &Py_REFCNT(&o)); - BOOST_TEST(&Py_REFCNT(boost::python::upcast(&y)) == &Py_REFCNT(&y)); - return boost::report_errors(); -} diff --git a/test/vector_indexing_suite.cpp b/test/vector_indexing_suite.cpp deleted file mode 100644 index 0f9cd74c..00000000 --- a/test/vector_indexing_suite.cpp +++ /dev/null @@ -1,62 +0,0 @@ -// Copyright Joel de Guzman 2004. 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 -#include -#include -#include - -using namespace boost::python; - -struct X // a container element -{ - std::string s; - X():s("default") {} - X(std::string s):s(s) {} - std::string repr() const { return s; } - void reset() { s = "reset"; } - void foo() { s = "foo"; } - bool operator==(X const& x) const { return s == x.s; } - bool operator!=(X const& x) const { return s != x.s; } -}; - -std::string x_value(X const& x) -{ - return "gotya " + x.s; -} - -BOOST_PYTHON_MODULE(vector_indexing_suite_ext) -{ - class_("X") - .def(init<>()) - .def(init()) - .def(init()) - .def("__repr__", &X::repr) - .def("reset", &X::reset) - .def("foo", &X::foo) - ; - - def("x_value", x_value); - implicitly_convertible(); - - class_ >("XVec") - .def(vector_indexing_suite >()) - ; - - // Compile check only... - class_ >("FloatVec") - .def(vector_indexing_suite >()) - ; - - // Compile check only... - class_ >("BoolVec") - .def(vector_indexing_suite >()) - ; - - // vector of strings - class_ >("StringVec") - .def(vector_indexing_suite >()) - ; -} - diff --git a/test/vector_indexing_suite.py b/test/vector_indexing_suite.py deleted file mode 100644 index 5fe2efe4..00000000 --- a/test/vector_indexing_suite.py +++ /dev/null @@ -1,370 +0,0 @@ -# Copyright Joel de Guzman 2004. 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) -''' - -##################################################################### -# Check an object that we will use as container element -##################################################################### - ->>> from vector_indexing_suite_ext import * ->>> x = X('hi') ->>> x -hi ->>> x.reset() # a member function that modifies X ->>> x -reset ->>> x.foo() # another member function that modifies X ->>> x -foo - -# test that a string is implicitly convertible -# to an X ->>> x_value('bochi bochi') -'gotya bochi bochi' - -##################################################################### -# Iteration -##################################################################### ->>> def print_xvec(xvec): -... s = '[ ' -... for x in xvec: -... s += repr(x) -... s += ' ' -... s += ']' -... print s - -##################################################################### -# Replace all the contents using slice syntax -##################################################################### - ->>> v = XVec() ->>> v[:] = [X('a'),X('b'),X('c'),X('d'),X('e')] ->>> print_xvec(v) -[ a b c d e ] - -##################################################################### -# Indexing -##################################################################### ->>> len(v) -5 ->>> v[0] -a ->>> v[1] -b ->>> v[2] -c ->>> v[3] -d ->>> v[4] -e ->>> v[-1] -e ->>> v[-2] -d ->>> v[-3] -c ->>> v[-4] -b ->>> v[-5] -a - -##################################################################### -# Deleting an element -##################################################################### - ->>> del v[0] ->>> v[0] = 'yaba' # must do implicit conversion ->>> print_xvec(v) -[ yaba c d e ] - -##################################################################### -# Calling a mutating function of a container element -##################################################################### ->>> v[3].reset() ->>> v[3] -reset - -##################################################################### -# Copying a container element -##################################################################### ->>> x = X(v[3]) ->>> x -reset ->>> x.foo() ->>> x -foo ->>> v[3] # should not be changed to 'foo' -reset - -##################################################################### -# Referencing a container element -##################################################################### ->>> x = v[3] ->>> x -reset ->>> x.foo() ->>> x -foo ->>> v[3] # should be changed to 'foo' -foo - -##################################################################### -# Slice -##################################################################### - ->>> sl = v[0:2] ->>> print_xvec(sl) -[ yaba c ] ->>> sl[0].reset() ->>> sl[0] -reset - -##################################################################### -# Reset the container again -##################################################################### ->>> v[:] = ['a','b','c','d','e'] # perform implicit conversion to X ->>> print_xvec(v) -[ a b c d e ] - -##################################################################### -# Slice: replace [1:3] with an element -##################################################################### ->>> v[1:3] = X('z') ->>> print_xvec(v) -[ a z d e ] - -##################################################################### -# Slice: replace [0:2] with a list -##################################################################### ->>> v[0:2] = ['1','2','3','4'] # perform implicit conversion to X ->>> print_xvec(v) -[ 1 2 3 4 d e ] - -##################################################################### -# Slice: delete [3:4] -##################################################################### ->>> del v[3:4] ->>> print_xvec(v) -[ 1 2 3 d e ] - -##################################################################### -# Slice: set [3:] to a list -##################################################################### ->>> v[3:] = [X('trailing'), X('stuff')] # a list ->>> print_xvec(v) -[ 1 2 3 trailing stuff ] - -##################################################################### -# Slice: delete [:3] -##################################################################### ->>> del v[:3] ->>> print_xvec(v) -[ trailing stuff ] - -##################################################################### -# Slice: insert a tuple to [0:0] -##################################################################### ->>> v[0:0] = ('leading','stuff') # can also be a tuple ->>> print_xvec(v) -[ leading stuff trailing stuff ] - -##################################################################### -# Reset the container again -##################################################################### ->>> v[:] = ['a','b','c','d','e'] - -##################################################################### -# Some references to the container elements -##################################################################### ->>> z0 = v[0] ->>> z1 = v[1] ->>> z2 = v[2] ->>> z3 = v[3] ->>> z4 = v[4] - ->>> z0 # proxy -a ->>> z1 # proxy -b ->>> z2 # proxy -c ->>> z3 # proxy -d ->>> z4 # proxy -e - -##################################################################### -# Delete a container element -##################################################################### - ->>> del v[2] ->>> print_xvec(v) -[ a b d e ] - -##################################################################### -# Show that the references are still valid -##################################################################### ->>> z0 # proxy -a ->>> z1 # proxy -b ->>> z2 # proxy detached -c ->>> z3 # proxy index adjusted -d ->>> z4 # proxy index adjusted -e - -##################################################################### -# Delete all container elements -##################################################################### ->>> del v[:] ->>> print_xvec(v) -[ ] - -##################################################################### -# Show that the references are still valid -##################################################################### ->>> z0 # proxy detached -a ->>> z1 # proxy detached -b ->>> z2 # proxy detached -c ->>> z3 # proxy detached -d ->>> z4 # proxy detached -e - -##################################################################### -# Reset the container again -##################################################################### ->>> v[:] = ['a','b','c','d','e'] - -##################################################################### -# renew the references to the container elements -##################################################################### ->>> z0 = v[0] ->>> z1 = v[1] ->>> z2 = v[2] ->>> z3 = v[3] ->>> z4 = v[4] - ->>> z0 # proxy -a ->>> z1 # proxy -b ->>> z2 # proxy -c ->>> z3 # proxy -d ->>> z4 # proxy -e - -##################################################################### -# Set [2:4] to a list such that there will be more elements -##################################################################### ->>> v[2:4] = ['x','y','v'] ->>> print_xvec(v) -[ a b x y v e ] - -##################################################################### -# Show that the references are still valid -##################################################################### ->>> z0 # proxy -a ->>> z1 # proxy -b ->>> z2 # proxy detached -c ->>> z3 # proxy detached -d ->>> z4 # proxy index adjusted -e - -##################################################################### -# Contains -##################################################################### ->>> v[:] = ['a','b','c','d','e'] # reset again - ->>> assert 'a' in v ->>> assert 'b' in v ->>> assert 'c' in v ->>> assert 'd' in v ->>> assert 'e' in v ->>> assert not 'X' in v ->>> assert not 12345 in v - -##################################################################### -# Show that iteration allows mutable access to the elements -##################################################################### ->>> v[:] = ['a','b','c','d','e'] # reset again ->>> for x in v: -... x.reset() ->>> print_xvec(v) -[ reset reset reset reset reset ] - -##################################################################### -# append -##################################################################### ->>> v[:] = ['a','b','c','d','e'] # reset again ->>> v.append('f') ->>> print_xvec(v) -[ a b c d e f ] - -##################################################################### -# extend -##################################################################### ->>> v[:] = ['a','b','c','d','e'] # reset again ->>> v.extend(['f','g','h','i','j']) ->>> print_xvec(v) -[ a b c d e f g h i j ] - -##################################################################### -# extend using a generator expression -##################################################################### ->>> v[:] = ['a','b','c','d','e'] # reset again ->>> def generator(): -... addlist = ['f','g','h','i','j'] -... for i in addlist: -... if i != 'g': -... yield i ->>> v.extend(generator()) ->>> print_xvec(v) -[ a b c d e f h i j ] - -##################################################################### -# vector of strings -##################################################################### ->>> sv = StringVec() ->>> sv.append('a') ->>> print sv[0] -a - -##################################################################### -# END.... -##################################################################### - -''' - - -def run(args = None): - import sys - import doctest - - if args is not None: - sys.argv = args - return doctest.testmod(sys.modules.get(__name__)) - -if __name__ == '__main__': - print 'running...' - import sys - status = run()[0] - if (status == 0): print "Done." - sys.exit(status) - - - - - diff --git a/test/virtual_functions.cpp b/test/virtual_functions.cpp deleted file mode 100644 index 774b11b1..00000000 --- a/test/virtual_functions.cpp +++ /dev/null @@ -1,125 +0,0 @@ -// 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 -#include -#include -#include -#include -#include -#include - -#define BOOST_ENABLE_ASSERT_HANDLER -#include - -using namespace boost::python; - -struct X -{ - explicit X(int x) : x(x), magic(7654321) { ++counter; } - X(X const& rhs) : x(rhs.x), magic(7654321) { ++counter; } - virtual ~X() { BOOST_ASSERT(magic == 7654321); magic = 6666666; x = 9999; --counter; } - - void set(int _x) { BOOST_ASSERT(magic == 7654321); this->x = _x; } - int value() const { BOOST_ASSERT(magic == 7654321); return x; } - static int count() { return counter; } - private: - void operator=(X const&); - private: - int x; - long magic; - static int counter; -}; - -struct Y : X -{ - Y(int x) : X(x) {}; -}; - -struct abstract : X -{ - abstract(int x) : X(x) {}; - int call_f(Y const& y) { return f(y); } - virtual int f(Y const& y) = 0; - abstract& call_g(Y const& y) { return g(y); } - virtual abstract& g(Y const& y) = 0; -}; - -struct concrete : X -{ - concrete(int x) : X(x) {}; - int call_f(Y const& y) { return f(y); } - virtual int f(Y const& y) { set(y.value()); return y.value(); } -}; - -struct abstract_callback : abstract -{ - abstract_callback(PyObject* p, int x) - : abstract(x), self(p) - {} - - int f(Y const& y) - { - return call_method(self, "f", boost::ref(y)); - } - - abstract& g(Y const& y) - { - return call_method(self, "g", boost::ref(y)); - } - - PyObject* self; -}; - -struct concrete_callback : concrete -{ - concrete_callback(PyObject* p, int x) - : concrete(x), self(p) - {} - - concrete_callback(PyObject* p, concrete const& x) - : concrete(x), self(p) - {} - - int f(Y const& y) - { - return call_method(self, "f", boost::ref(y)); - } - - int f_impl(Y const& y) - { - return this->concrete::f(y); - } - - PyObject* self; -}; - -int X::counter; - -BOOST_PYTHON_MODULE(virtual_functions_ext) -{ - class_("concrete", init()) - .def("value", &concrete::value) - .def("set", &concrete::set) - .def("call_f", &concrete::call_f) - .def("f", &concrete_callback::f_impl) - ; - - class_("abstract", init()) - - .def("value", &abstract::value) - .def("call_f", &abstract::call_f) - .def("call_g", &abstract::call_g, return_internal_reference<>()) - .def("set", &abstract::set) - ; - - class_("Y", init()) - .def("value", &Y::value) - .def("set", &Y::set) - ; -} - -#include "module_tail.cpp" diff --git a/test/virtual_functions.py b/test/virtual_functions.py deleted file mode 100644 index 1372f9af..00000000 --- a/test/virtual_functions.py +++ /dev/null @@ -1,110 +0,0 @@ -# Copyright David Abrahams 2004. 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) -''' ->>> from virtual_functions_ext import * - ->>> class C1(concrete): -... def f(self, y): -... return concrete.f(self, Y(-y.value())) - ->>> class C2(concrete): -... pass - ->>> class A1(abstract): -... def f(self, y): -... return y.value() * 2 -... def g(self, y): -... return self - ->>> class A2(abstract): -... pass - - ->>> y1 = Y(16) ->>> y2 = Y(17) - - - -# -# Test abstract with f,g overridden -# ->>> a1 = A1(42) ->>> a1.value() -42 - -# Call f,g indirectly from C++ ->>> a1.call_f(y1) -32 ->>> assert type(a1.call_g(y1)) is abstract - -# Call f directly from Python ->>> a1.f(y2) -34 - -# -# Test abstract with f not overridden -# ->>> a2 = A2(42) ->>> a2.value() -42 - -# Call f indirectly from C++ ->>> try: a2.call_f(y1) -... except AttributeError: pass -... else: print 'no exception' - -# Call f directly from Python ->>> try: a2.call_f(y2) -... except AttributeError: pass -... else: print 'no exception' - -############# Concrete Tests ############ - -# -# Test concrete with f overridden -# ->>> c1 = C1(42) ->>> c1.value() -42 - -# Call f indirectly from C++ ->>> c1.call_f(y1) --16 - -# Call f directly from Python ->>> c1.f(y2) --17 - -# -# Test concrete with f not overridden -# ->>> c2 = C2(42) ->>> c2.value() -42 - -# Call f indirectly from C++ ->>> c2.call_f(y1) -16 - -# Call f directly from Python ->>> c2.f(y2) -17 - - -''' - -def run(args = None): - import sys - import doctest - - if args is not None: - sys.argv = args - return doctest.testmod(sys.modules.get(__name__)) - -if __name__ == '__main__': - print "running..." - import sys - status = run()[0] - if (status == 0): print "Done." - sys.exit(status) diff --git a/test/voidptr.cpp b/test/voidptr.cpp deleted file mode 100755 index 82e412be..00000000 --- a/test/voidptr.cpp +++ /dev/null @@ -1,43 +0,0 @@ -// Copyright Niall Douglas 2005. -// 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 -# include -# include -# include - -static void *test=(void *) 78; - -void *get() -{ - return test; -} - -void *getnull() -{ - return 0; -} - -void use(void *a) -{ - if(a!=test) - throw std::runtime_error(std::string("failed")); -} - -int useany(void *a) -{ - return a ? 1 : 0; -} - - -namespace bpl = boost::python; - -BOOST_PYTHON_MODULE(voidptr_ext) -{ - bpl::def("get", &::get, bpl::return_value_policy()); - bpl::def("getnull", &::getnull, bpl::return_value_policy()); - bpl::def("use", &::use); - bpl::def("useany", &::useany); -} diff --git a/test/voidptr.py b/test/voidptr.py deleted file mode 100644 index da1fa9c1..00000000 --- a/test/voidptr.py +++ /dev/null @@ -1,54 +0,0 @@ -# Copyright Niall Douglas 2005. -# 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) - - -""" ->>> from voidptr_ext import * - - - Check for correct conversion - ->>> use(get()) - - Check that None is converted to a NULL void pointer - ->>> useany(get()) -1 ->>> useany(None) -0 - - Check that we don't lose type information by converting NULL - opaque pointers to None - ->>> assert getnull() is None ->>> useany(getnull()) -0 - - Check that there is no conversion from integers ... - ->>> try: use(0) -... except TypeError: pass -... else: print 'expected a TypeError' - - ... and from strings to opaque objects - ->>> try: use("") -... except TypeError: pass -... else: print 'expected a TypeError' -""" -def run(args = None): - import sys - import doctest - - if args is not None: - sys.argv = args - return doctest.testmod(sys.modules.get(__name__)) - -if __name__ == '__main__': - print "running..." - import sys - status = run()[0] - if (status == 0): print "Done." - sys.exit(status) diff --git a/test/wrapper_held_type.cpp b/test/wrapper_held_type.cpp deleted file mode 100755 index e9942279..00000000 --- a/test/wrapper_held_type.cpp +++ /dev/null @@ -1,69 +0,0 @@ -// Copyright David Abrahams 2005. 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 -#include -#include -#include -#include -#include - -#include - -struct data -{ - virtual ~data() {}; // silence compiler warnings - virtual int id() const - { - return 42; - } -}; - -std::auto_ptr create_data() -{ - return std::auto_ptr( new data ); -} - -void do_nothing( std::auto_ptr& ){} - - -namespace bp = boost::python; - -struct data_wrapper : data, bp::wrapper< data > -{ - data_wrapper(data const & arg ) - : data( arg ) - , bp::wrapper< data >() - {} - - data_wrapper() - : data() - , bp::wrapper< data >() - {} - - virtual int id() const - { - if( bp::override id = this->get_override( "id" ) ) - return bp::call(id.ptr()); // id(); - else - return data::id( ); - } - - virtual int default_id( ) const - { - return this->data::id( ); - } - -}; - -BOOST_PYTHON_MODULE(wrapper_held_type_ext) -{ - bp::class_< data_wrapper, std::auto_ptr< data > >( "data" ) - .def( "id", &data::id, &::data_wrapper::default_id ); - - bp::def( "do_nothing", &do_nothing ); - bp::def( "create_data", &create_data ); -} - -#include "module_tail.cpp" diff --git a/test/wrapper_held_type.py b/test/wrapper_held_type.py deleted file mode 100644 index 4b33ff73..00000000 --- a/test/wrapper_held_type.py +++ /dev/null @@ -1,34 +0,0 @@ -# Copyright David Abrahams 2005. 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) -''' ->>> from wrapper_held_type_ext import * ->>> d = data() ->>> print d.id() -42 ->>> do_nothing( d ) ->>> print d.id() -42 ->>> d = create_data() ->>> print d.id() -42 ->>> do_nothing( d ) ->>> print d.id() -42 -''' - -def run(args = None): - import sys - import doctest - - if args is not None: - sys.argv = args - return doctest.testmod(sys.modules.get(__name__)) - -if __name__ == '__main__': - print "running..." - import sys - status = run()[0] - if (status == 0): print "Done." - sys.exit(status) -