diff options
| author | Miodrag Milanovic <mmicko@gmail.com> | 2020-07-23 08:58:19 +0200 | 
|---|---|---|
| committer | Miodrag Milanovic <mmicko@gmail.com> | 2020-07-23 08:58:19 +0200 | 
| commit | 444e535f000fd7b53dadf6726d5cd29ac34cc75f (patch) | |
| tree | 1ac675d8f0381de320849294fa70c946f631e7f6 /3rdparty/pybind11/docs/basics.rst | |
| parent | e6991ad5dc79f6118838f091cc05f10d3377eb4a (diff) | |
| download | nextpnr-444e535f000fd7b53dadf6726d5cd29ac34cc75f.tar.gz nextpnr-444e535f000fd7b53dadf6726d5cd29ac34cc75f.tar.bz2 nextpnr-444e535f000fd7b53dadf6726d5cd29ac34cc75f.zip  | |
Add pybind11 2.5 source
Diffstat (limited to '3rdparty/pybind11/docs/basics.rst')
| -rw-r--r-- | 3rdparty/pybind11/docs/basics.rst | 293 | 
1 files changed, 293 insertions, 0 deletions
diff --git a/3rdparty/pybind11/docs/basics.rst b/3rdparty/pybind11/docs/basics.rst new file mode 100644 index 00000000..7bf4d426 --- /dev/null +++ b/3rdparty/pybind11/docs/basics.rst @@ -0,0 +1,293 @@ +.. _basics: + +First steps +########### + +This sections demonstrates the basic features of pybind11. Before getting +started, make sure that development environment is set up to compile the +included set of test cases. + + +Compiling the test cases +======================== + +Linux/MacOS +----------- + +On Linux  you'll need to install the **python-dev** or **python3-dev** packages as +well as **cmake**. On Mac OS, the included python version works out of the box, +but **cmake** must still be installed. + +After installing the prerequisites, run + +.. code-block:: bash + +   mkdir build +   cd build +   cmake .. +   make check -j 4 + +The last line will both compile and run the tests. + +Windows +------- + +On Windows, only **Visual Studio 2015** and newer are supported since pybind11 relies +on various C++11 language features that break older versions of Visual Studio. + +To compile and run the tests: + +.. code-block:: batch + +   mkdir build +   cd build +   cmake .. +   cmake --build . --config Release --target check + +This will create a Visual Studio project, compile and run the target, all from the +command line. + +.. Note:: + +    If all tests fail, make sure that the Python binary and the testcases are compiled +    for the same processor type and bitness (i.e. either **i386** or **x86_64**). You +    can specify **x86_64** as the target architecture for the generated Visual Studio +    project using ``cmake -A x64 ..``. + +.. seealso:: + +    Advanced users who are already familiar with Boost.Python may want to skip +    the tutorial and look at the test cases in the :file:`tests` directory, +    which exercise all features of pybind11. + +Header and namespace conventions +================================ + +For brevity, all code examples assume that the following two lines are present: + +.. code-block:: cpp + +    #include <pybind11/pybind11.h> + +    namespace py = pybind11; + +Some features may require additional headers, but those will be specified as needed. + +.. _simple_example: + +Creating bindings for a simple function +======================================= + +Let's start by creating Python bindings for an extremely simple function, which +adds two numbers and returns their result: + +.. code-block:: cpp + +    int add(int i, int j) { +        return i + j; +    } + +For simplicity [#f1]_, we'll put both this function and the binding code into +a file named :file:`example.cpp` with the following contents: + +.. code-block:: cpp + +    #include <pybind11/pybind11.h> + +    int add(int i, int j) { +        return i + j; +    } + +    PYBIND11_MODULE(example, m) { +        m.doc() = "pybind11 example plugin"; // optional module docstring + +        m.def("add", &add, "A function which adds two numbers"); +    } + +.. [#f1] In practice, implementation and binding code will generally be located +         in separate files. + +The :func:`PYBIND11_MODULE` macro creates a function that will be called when an +``import`` statement is issued from within Python. The module name (``example``) +is given as the first macro argument (it should not be in quotes). The second +argument (``m``) defines a variable of type :class:`py::module <module>` which +is the main interface for creating bindings. The method :func:`module::def` +generates binding code that exposes the ``add()`` function to Python. + +.. note:: + +    Notice how little code was needed to expose our function to Python: all +    details regarding the function's parameters and return value were +    automatically inferred using template metaprogramming. This overall +    approach and the used syntax are borrowed from Boost.Python, though the +    underlying implementation is very different. + +pybind11 is a header-only library, hence it is not necessary to link against +any special libraries and there are no intermediate (magic) translation steps. +On Linux, the above example can be compiled using the following command: + +.. code-block:: bash + +    $ c++ -O3 -Wall -shared -std=c++11 -fPIC `python3 -m pybind11 --includes` example.cpp -o example`python3-config --extension-suffix` + +For more details on the required compiler flags on Linux and MacOS, see +:ref:`building_manually`. For complete cross-platform compilation instructions, +refer to the :ref:`compiling` page. + +The `python_example`_ and `cmake_example`_ repositories are also a good place +to start. They are both complete project examples with cross-platform build +systems. The only difference between the two is that `python_example`_ uses +Python's ``setuptools`` to build the module, while `cmake_example`_ uses CMake +(which may be preferable for existing C++ projects). + +.. _python_example: https://github.com/pybind/python_example +.. _cmake_example: https://github.com/pybind/cmake_example + +Building the above C++ code will produce a binary module file that can be +imported to Python. Assuming that the compiled module is located in the +current directory, the following interactive Python session shows how to +load and execute the example: + +.. code-block:: pycon + +    $ python +    Python 2.7.10 (default, Aug 22 2015, 20:33:39) +    [GCC 4.2.1 Compatible Apple LLVM 7.0.0 (clang-700.0.59.1)] on darwin +    Type "help", "copyright", "credits" or "license" for more information. +    >>> import example +    >>> example.add(1, 2) +    3L +    >>> + +.. _keyword_args: + +Keyword arguments +================= + +With a simple code modification, it is possible to inform Python about the +names of the arguments ("i" and "j" in this case). + +.. code-block:: cpp + +    m.def("add", &add, "A function which adds two numbers", +          py::arg("i"), py::arg("j")); + +:class:`arg` is one of several special tag classes which can be used to pass +metadata into :func:`module::def`. With this modified binding code, we can now +call the function using keyword arguments, which is a more readable alternative +particularly for functions taking many parameters: + +.. code-block:: pycon + +    >>> import example +    >>> example.add(i=1, j=2) +    3L + +The keyword names also appear in the function signatures within the documentation. + +.. code-block:: pycon + +    >>> help(example) + +    .... + +    FUNCTIONS +        add(...) +            Signature : (i: int, j: int) -> int + +            A function which adds two numbers + +A shorter notation for named arguments is also available: + +.. code-block:: cpp + +    // regular notation +    m.def("add1", &add, py::arg("i"), py::arg("j")); +    // shorthand +    using namespace pybind11::literals; +    m.def("add2", &add, "i"_a, "j"_a); + +The :var:`_a` suffix forms a C++11 literal which is equivalent to :class:`arg`. +Note that the literal operator must first be made visible with the directive +``using namespace pybind11::literals``. This does not bring in anything else +from the ``pybind11`` namespace except for literals. + +.. _default_args: + +Default arguments +================= + +Suppose now that the function to be bound has default arguments, e.g.: + +.. code-block:: cpp + +    int add(int i = 1, int j = 2) { +        return i + j; +    } + +Unfortunately, pybind11 cannot automatically extract these parameters, since they +are not part of the function's type information. However, they are simple to specify +using an extension of :class:`arg`: + +.. code-block:: cpp + +    m.def("add", &add, "A function which adds two numbers", +          py::arg("i") = 1, py::arg("j") = 2); + +The default values also appear within the documentation. + +.. code-block:: pycon + +    >>> help(example) + +    .... + +    FUNCTIONS +        add(...) +            Signature : (i: int = 1, j: int = 2) -> int + +            A function which adds two numbers + +The shorthand notation is also available for default arguments: + +.. code-block:: cpp + +    // regular notation +    m.def("add1", &add, py::arg("i") = 1, py::arg("j") = 2); +    // shorthand +    m.def("add2", &add, "i"_a=1, "j"_a=2); + +Exporting variables +=================== + +To expose a value from C++, use the ``attr`` function to register it in a +module as shown below. Built-in types and general objects (more on that later) +are automatically converted when assigned as attributes, and can be explicitly +converted using the function ``py::cast``. + +.. code-block:: cpp + +    PYBIND11_MODULE(example, m) { +        m.attr("the_answer") = 42; +        py::object world = py::cast("World"); +        m.attr("what") = world; +    } + +These are then accessible from Python: + +.. code-block:: pycon + +    >>> import example +    >>> example.the_answer +    42 +    >>> example.what +    'World' + +.. _supported_types: + +Supported data types +==================== + +A large number of data types are supported out of the box and can be used +seamlessly as functions arguments, return values or with ``py::cast`` in general. +For a full overview, see the :doc:`advanced/cast/index` section.  | 
