aboutsummaryrefslogtreecommitdiffstats
path: root/3rdparty/pybind11/docs/classes.rst
diff options
context:
space:
mode:
authorgatecat <gatecat@ds0.me>2022-09-14 09:28:47 +0200
committergatecat <gatecat@ds0.me>2022-09-14 09:28:47 +0200
commita72f898ff4c4237424c468044a6db9d6953b541e (patch)
tree1c4a543f661dd1b281aecf4660388491702fa8d8 /3rdparty/pybind11/docs/classes.rst
parentf1349e114f3a16ccd002e8513339e18f5be4d31b (diff)
downloadnextpnr-a72f898ff4c4237424c468044a6db9d6953b541e.tar.gz
nextpnr-a72f898ff4c4237424c468044a6db9d6953b541e.tar.bz2
nextpnr-a72f898ff4c4237424c468044a6db9d6953b541e.zip
3rdparty: Bump vendored pybind11 version for py3.11 support
Signed-off-by: gatecat <gatecat@ds0.me>
Diffstat (limited to '3rdparty/pybind11/docs/classes.rst')
-rw-r--r--3rdparty/pybind11/docs/classes.rst59
1 files changed, 34 insertions, 25 deletions
diff --git a/3rdparty/pybind11/docs/classes.rst b/3rdparty/pybind11/docs/classes.rst
index f3610ef3..c0c53135 100644
--- a/3rdparty/pybind11/docs/classes.rst
+++ b/3rdparty/pybind11/docs/classes.rst
@@ -44,14 +44,14 @@ interactive Python session demonstrating this example is shown below:
% python
>>> import example
- >>> p = example.Pet('Molly')
+ >>> p = example.Pet("Molly")
>>> print(p)
<example.Pet object at 0x10cd98060>
>>> p.getName()
- u'Molly'
- >>> p.setName('Charly')
+ 'Molly'
+ >>> p.setName("Charly")
>>> p.getName()
- u'Charly'
+ 'Charly'
.. seealso::
@@ -122,12 +122,12 @@ This makes it possible to write
.. code-block:: pycon
- >>> p = example.Pet('Molly')
+ >>> p = example.Pet("Molly")
>>> p.name
- u'Molly'
- >>> p.name = 'Charly'
+ 'Molly'
+ >>> p.name = "Charly"
>>> p.name
- u'Charly'
+ 'Charly'
Now suppose that ``Pet::name`` was a private internal variable
that can only be accessed via setters and getters.
@@ -174,10 +174,10 @@ Native Python classes can pick up new attributes dynamically:
.. code-block:: pycon
>>> class Pet:
- ... name = 'Molly'
+ ... name = "Molly"
...
>>> p = Pet()
- >>> p.name = 'Charly' # overwrite existing
+ >>> p.name = "Charly" # overwrite existing
>>> p.age = 2 # dynamically add a new attribute
By default, classes exported from C++ do not support this and the only writable
@@ -195,7 +195,7 @@ Trying to set any other attribute results in an error:
.. code-block:: pycon
>>> p = example.Pet()
- >>> p.name = 'Charly' # OK, attribute defined in C++
+ >>> p.name = "Charly" # OK, attribute defined in C++
>>> p.age = 2 # fail
AttributeError: 'Pet' object has no attribute 'age'
@@ -213,7 +213,7 @@ Now everything works as expected:
.. code-block:: pycon
>>> p = example.Pet()
- >>> p.name = 'Charly' # OK, overwrite value in C++
+ >>> p.name = "Charly" # OK, overwrite value in C++
>>> p.age = 2 # OK, dynamically add a new attribute
>>> p.__dict__ # just like a native Python class
{'age': 2}
@@ -280,11 +280,11 @@ expose fields and methods of both types:
.. code-block:: pycon
- >>> p = example.Dog('Molly')
+ >>> p = example.Dog("Molly")
>>> p.name
- u'Molly'
+ 'Molly'
>>> p.bark()
- u'woof!'
+ 'woof!'
The C++ classes defined above are regular non-polymorphic types with an
inheritance relationship. This is reflected in Python:
@@ -332,7 +332,7 @@ will automatically recognize this:
>>> type(p)
PolymorphicDog # automatically downcast
>>> p.bark()
- u'woof!'
+ 'woof!'
Given a pointer to a polymorphic base, pybind11 performs automatic downcasting
to the actual derived type. Note that this goes beyond the usual situation in
@@ -434,8 +434,7 @@ you can use ``py::detail::overload_cast_impl`` with an additional set of parenth
.def("set", overload_cast_<int>()(&Pet::set), "Set the pet's age")
.def("set", overload_cast_<const std::string &>()(&Pet::set), "Set the pet's name");
-.. [#cpp14] A compiler which supports the ``-std=c++14`` flag
- or Visual Studio 2015 Update 2 and newer.
+.. [#cpp14] A compiler which supports the ``-std=c++14`` flag.
.. note::
@@ -446,8 +445,7 @@ you can use ``py::detail::overload_cast_impl`` with an additional set of parenth
Enumerations and internal types
===============================
-Let's now suppose that the example class contains an internal enumeration type,
-e.g.:
+Let's now suppose that the example class contains internal types like enumerations, e.g.:
.. code-block:: cpp
@@ -457,10 +455,15 @@ e.g.:
Cat
};
+ struct Attributes {
+ float age = 0;
+ };
+
Pet(const std::string &name, Kind type) : name(name), type(type) { }
std::string name;
Kind type;
+ Attributes attr;
};
The binding code for this example looks as follows:
@@ -471,22 +474,28 @@ The binding code for this example looks as follows:
pet.def(py::init<const std::string &, Pet::Kind>())
.def_readwrite("name", &Pet::name)
- .def_readwrite("type", &Pet::type);
+ .def_readwrite("type", &Pet::type)
+ .def_readwrite("attr", &Pet::attr);
py::enum_<Pet::Kind>(pet, "Kind")
.value("Dog", Pet::Kind::Dog)
.value("Cat", Pet::Kind::Cat)
.export_values();
-To ensure that the ``Kind`` type is created within the scope of ``Pet``, the
-``pet`` :class:`class_` instance must be supplied to the :class:`enum_`.
+ py::class_<Pet::Attributes>(pet, "Attributes")
+ .def(py::init<>())
+ .def_readwrite("age", &Pet::Attributes::age);
+
+
+To ensure that the nested types ``Kind`` and ``Attributes`` are created within the scope of ``Pet``, the
+``pet`` :class:`class_` instance must be supplied to the :class:`enum_` and :class:`class_`
constructor. The :func:`enum_::export_values` function exports the enum entries
into the parent scope, which should be skipped for newer C++11-style strongly
typed enums.
.. code-block:: pycon
- >>> p = Pet('Lucy', Pet.Cat)
+ >>> p = Pet("Lucy", Pet.Cat)
>>> p.type
Kind.Cat
>>> int(p.type)
@@ -508,7 +517,7 @@ The ``name`` property returns the name of the enum value as a unicode string.
.. code-block:: pycon
- >>> p = Pet( "Lucy", Pet.Cat )
+ >>> p = Pet("Lucy", Pet.Cat)
>>> pet_type = p.type
>>> pet_type
Pet.Cat