Commit 00c7d6cc by Wenzel Jakob Committed by Wenzel Jakob

Merge branch 'stl_bind'

parents affb9f40 25c03cec
...@@ -108,6 +108,7 @@ set(PYBIND11_HEADERS ...@@ -108,6 +108,7 @@ set(PYBIND11_HEADERS
include/pybind11/pybind11.h include/pybind11/pybind11.h
include/pybind11/pytypes.h include/pybind11/pytypes.h
include/pybind11/stl.h include/pybind11/stl.h
include/pybind11/stl_bind.h
include/pybind11/typeid.h include/pybind11/typeid.h
) )
...@@ -128,6 +129,7 @@ set(PYBIND11_EXAMPLES ...@@ -128,6 +129,7 @@ set(PYBIND11_EXAMPLES
example/example14.cpp example/example14.cpp
example/example15.cpp example/example15.cpp
example/example16.cpp example/example16.cpp
example/example17.cpp
example/issues.cpp example/issues.cpp
) )
......
...@@ -99,6 +99,7 @@ Jonas Adler, ...@@ -99,6 +99,7 @@ Jonas Adler,
Sylvain Corlay, Sylvain Corlay,
Axel Huebl, Axel Huebl,
@hulucc, @hulucc,
Sergey Lyskov
Johan Mabille, Johan Mabille,
Tomasz Miąsko, and Tomasz Miąsko, and
Ben Pritchard. Ben Pritchard.
......
...@@ -779,6 +779,10 @@ exceptions: ...@@ -779,6 +779,10 @@ exceptions:
| | accesses in ``__getitem__``, | | | accesses in ``__getitem__``, |
| | ``__setitem__``, etc.) | | | ``__setitem__``, etc.) |
+--------------------------------------+------------------------------+ +--------------------------------------+------------------------------+
| :class:`pybind11::value_error` | ``ValueError`` (used to |
| | indicate wrong value passed |
| | in ``container.remove(...)`` |
+--------------------------------------+------------------------------+
| :class:`pybind11::error_already_set` | Indicates that the Python | | :class:`pybind11::error_already_set` | Indicates that the Python |
| | exception flag has already | | | exception flag has already |
| | been initialized | | | been initialized |
...@@ -1531,4 +1535,3 @@ work, it is important that all lines are indented consistently, i.e.: ...@@ -1531,4 +1535,3 @@ work, it is important that all lines are indented consistently, i.e.:
.. [#f4] http://www.sphinx-doc.org .. [#f4] http://www.sphinx-doc.org
.. [#f5] http://github.com/pybind/pbtest .. [#f5] http://github.com/pybind/pbtest
...@@ -25,6 +25,7 @@ void init_ex13(py::module &); ...@@ -25,6 +25,7 @@ void init_ex13(py::module &);
void init_ex14(py::module &); void init_ex14(py::module &);
void init_ex15(py::module &); void init_ex15(py::module &);
void init_ex16(py::module &); void init_ex16(py::module &);
void init_ex17(py::module &);
void init_issues(py::module &); void init_issues(py::module &);
#if defined(PYBIND11_TEST_EIGEN) #if defined(PYBIND11_TEST_EIGEN)
...@@ -50,6 +51,7 @@ PYBIND11_PLUGIN(example) { ...@@ -50,6 +51,7 @@ PYBIND11_PLUGIN(example) {
init_ex14(m); init_ex14(m);
init_ex15(m); init_ex15(m);
init_ex16(m); init_ex16(m);
init_ex17(m);
init_issues(m); init_issues(m);
#if defined(PYBIND11_TEST_EIGEN) #if defined(PYBIND11_TEST_EIGEN)
......
/*
example/example17.cpp -- Usage of stl_binders functions
Copyright (c) 2016 Sergey Lyskov
All rights reserved. Use of this source code is governed by a
BSD-style license that can be found in the LICENSE file.
*/
#include "example.h"
#include <pybind11/stl_bind.h>
class El {
public:
El() = delete;
El(int v) : a(v) { }
int a;
};
std::ostream & operator<<(std::ostream &s, El const&v) {
s << "El{" << v.a << '}';
return s;
}
void init_ex17(py::module &m) {
pybind11::class_<El>(m, "El")
.def(pybind11::init<int>());
pybind11::bind_vector<unsigned int>(m, "VectorInt");
pybind11::bind_vector<El>(m, "VectorEl");
pybind11::bind_vector<std::vector<El>>(m, "VectorVectorEl");
}
#!/usr/bin/env python
from __future__ import print_function
from example import VectorInt, El, VectorEl, VectorVectorEl
v_int = VectorInt([0, 0])
print(len(v_int))
print(bool(v_int))
v_int2 = VectorInt([0, 0])
print(v_int == v_int2)
v_int2[1] = 1
print(v_int != v_int2)
v_int2.append(2)
v_int2.append(3)
v_int2.insert(0, 1)
v_int2.insert(0, 2)
v_int2.insert(0, 3)
print(v_int2)
v_int.append(99)
v_int2[2:-2] = v_int
print(v_int2)
del v_int2[1:3]
print(v_int2)
del v_int2[0]
print(v_int2)
v_a = VectorEl()
v_a.append(El(1))
v_a.append(El(2))
print(v_a)
vv_a = VectorVectorEl()
vv_a.append(v_a)
vv_b = vv_a[0]
print(vv_b)
2
True
True
True
VectorInt[3, 2, 1, 0, 1, 2, 3]
VectorInt[3, 2, 0, 0, 99, 2, 3]
VectorInt[3, 0, 99, 2, 3]
VectorInt[0, 99, 2, 3]
VectorEl[El{1}, El{2}]
VectorEl[El{1}, El{2}]
...@@ -305,6 +305,7 @@ NAMESPACE_END(detail) ...@@ -305,6 +305,7 @@ NAMESPACE_END(detail)
class error_already_set : public std::runtime_error { public: error_already_set() : std::runtime_error(detail::error_string()) {} }; class error_already_set : public std::runtime_error { public: error_already_set() : std::runtime_error(detail::error_string()) {} };
PYBIND11_RUNTIME_EXCEPTION(stop_iteration) PYBIND11_RUNTIME_EXCEPTION(stop_iteration)
PYBIND11_RUNTIME_EXCEPTION(index_error) PYBIND11_RUNTIME_EXCEPTION(index_error)
PYBIND11_RUNTIME_EXCEPTION(value_error)
PYBIND11_RUNTIME_EXCEPTION(cast_error) /// Thrown when pybind11::cast or handle::call fail due to a type casting error PYBIND11_RUNTIME_EXCEPTION(cast_error) /// Thrown when pybind11::cast or handle::call fail due to a type casting error
[[noreturn]] PYBIND11_NOINLINE inline void pybind11_fail(const char *reason) { throw std::runtime_error(reason); } [[noreturn]] PYBIND11_NOINLINE inline void pybind11_fail(const char *reason) { throw std::runtime_error(reason); }
......
...@@ -396,6 +396,7 @@ protected: ...@@ -396,6 +396,7 @@ protected:
} }
} catch (const error_already_set &) { return nullptr; } catch (const error_already_set &) { return nullptr;
} catch (const index_error &e) { PyErr_SetString(PyExc_IndexError, e.what()); return nullptr; } catch (const index_error &e) { PyErr_SetString(PyExc_IndexError, e.what()); return nullptr;
} catch (const value_error &e) { PyErr_SetString(PyExc_ValueError, e.what()); return nullptr;
} catch (const stop_iteration &e) { PyErr_SetString(PyExc_StopIteration, e.what()); return nullptr; } catch (const stop_iteration &e) { PyErr_SetString(PyExc_StopIteration, e.what()); return nullptr;
} catch (const std::bad_alloc &e) { PyErr_SetString(PyExc_MemoryError, e.what()); return nullptr; } catch (const std::bad_alloc &e) { PyErr_SetString(PyExc_MemoryError, e.what()); return nullptr;
} catch (const std::domain_error &e) { PyErr_SetString(PyExc_ValueError, e.what()); return nullptr; } catch (const std::domain_error &e) { PyErr_SetString(PyExc_ValueError, e.what()); return nullptr;
......
...@@ -24,6 +24,7 @@ setup( ...@@ -24,6 +24,7 @@ setup(
'include/pybind11/numpy.h', 'include/pybind11/numpy.h',
'include/pybind11/pybind11.h', 'include/pybind11/pybind11.h',
'include/pybind11/stl.h', 'include/pybind11/stl.h',
'include/pybind11/stl_bind.h',
'include/pybind11/common.h', 'include/pybind11/common.h',
'include/pybind11/functional.h', 'include/pybind11/functional.h',
'include/pybind11/operators.h', 'include/pybind11/operators.h',
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment