Skip to content

Commit

Permalink
improved constructors for nb::tuple and nb::list wrappers
Browse files Browse the repository at this point in the history
  • Loading branch information
wjakob committed Jul 3, 2023
1 parent 1d2aa6d commit 506185d
Show file tree
Hide file tree
Showing 4 changed files with 48 additions and 1 deletion.
18 changes: 18 additions & 0 deletions docs/api_core.rst
Expand Up @@ -620,6 +620,15 @@ Wrapper classes

Wrapper class representing Python ``tuple`` instances.

.. cpp:function:: tuple()

Create an empty tuple

.. cpp:function:: tuple(handle h)

Attempt to convert a given Python object into a tuple. Analogous to the
expression ``tuple(h)`` in Python.

.. cpp:function:: size_t size() const

Return the number of tuple elements.
Expand Down Expand Up @@ -648,6 +657,15 @@ Wrapper classes

Wrapper class representing Python ``list`` instances.

.. cpp:function:: list()

Create an empty list

.. cpp:function:: list(handle h)

Attempt to convert a given Python object into a list. Analogous to the
expression ``list(h)`` in Python.

.. cpp:function:: size_t size() const

Return the number of list elements.
Expand Down
8 changes: 8 additions & 0 deletions include/nanobind/nb_lib.h
Expand Up @@ -135,6 +135,14 @@ NB_CORE PyObject *float_from_obj(PyObject *o);

// ========================================================================

/// Convert a Python object into a Python list
NB_CORE PyObject *list_from_obj(PyObject *o);

/// Convert a Python object into a Python tuple
NB_CORE PyObject *tuple_from_obj(PyObject *o);

// ========================================================================

/// Get an object attribute or raise an exception
NB_CORE PyObject *getattr(PyObject *obj, const char *key);
NB_CORE PyObject *getattr(PyObject *obj, PyObject *key);
Expand Down
7 changes: 6 additions & 1 deletion include/nanobind/nb_types.h
Expand Up @@ -415,7 +415,10 @@ class bytes : public object {
};

class tuple : public object {
NB_OBJECT_DEFAULT(tuple, object, "tuple", PyTuple_Check)
NB_OBJECT(tuple, object, "tuple", PyTuple_Check)
tuple() : object(PyTuple_New(0), detail::steal_t()) { }
explicit tuple(handle h)
: object(detail::tuple_from_obj(h.ptr()), detail::steal_t{}) { }
size_t size() const { return (size_t) NB_TUPLE_GET_SIZE(m_ptr); }
template <typename T, detail::enable_if_t<std::is_arithmetic_v<T>> = 1>
detail::accessor<detail::num_item_tuple> operator[](T key) const;
Expand All @@ -433,6 +436,8 @@ class type_object : public object {
class list : public object {
NB_OBJECT(list, object, "list", PyList_Check)
list() : object(PyList_New(0), detail::steal_t()) { }
explicit list(handle h)
: object(detail::list_from_obj(h.ptr()), detail::steal_t{}) { }
size_t size() const { return (size_t) NB_LIST_GET_SIZE(m_ptr); }

template <typename T> void append(T &&value);
Expand Down
16 changes: 16 additions & 0 deletions src/common.cpp
Expand Up @@ -552,6 +552,22 @@ PyObject *float_from_obj(PyObject *o) {

// ========================================================================

PyObject *tuple_from_obj(PyObject *o) {
PyObject *result = PySequence_Tuple(o);
if (!result)
raise_python_error();
return result;
}

PyObject *list_from_obj(PyObject *o) {
PyObject *result = PySequence_List(o);
if (!result)
raise_python_error();
return result;
}

// ========================================================================

PyObject **seq_get(PyObject *seq, size_t *size_out, PyObject **temp_out) noexcept {
PyObject *temp = nullptr;
size_t size = 0;
Expand Down

0 comments on commit 506185d

Please sign in to comment.