correct stride in matrix example and test

This also matches the Eigen example for the row-major case.

This also enhances one of the tests to trigger a failure (and fixes it in the PR).  (This isn't really a flaw in pybind itself, but rather fixes wrong code in the test code and docs).
This commit is contained in:
Ansgar Burchardt 2017-09-21 23:07:48 +02:00 committed by Jason Rhinelander
parent d2757d0440
commit a22dd2d1df
3 changed files with 13 additions and 9 deletions

View File

@ -41,7 +41,7 @@ completely avoid copy operations with Python expressions like
py::format_descriptor<float>::format(), /* Python struct-style format descriptor */ py::format_descriptor<float>::format(), /* Python struct-style format descriptor */
2, /* Number of dimensions */ 2, /* Number of dimensions */
{ m.rows(), m.cols() }, /* Buffer dimensions */ { m.rows(), m.cols() }, /* Buffer dimensions */
{ sizeof(float) * m.rows(), /* Strides (in bytes) for each index */ { sizeof(float) * m.cols(), /* Strides (in bytes) for each index */
sizeof(float) } sizeof(float) }
); );
}); });

View File

@ -107,7 +107,7 @@ TEST_SUBMODULE(buffers, m) {
return py::buffer_info( return py::buffer_info(
m.data(), /* Pointer to buffer */ m.data(), /* Pointer to buffer */
{ m.rows(), m.cols() }, /* Buffer dimensions */ { m.rows(), m.cols() }, /* Buffer dimensions */
{ sizeof(float) * size_t(m.rows()), /* Strides (in bytes) for each index */ { sizeof(float) * size_t(m.cols()), /* Strides (in bytes) for each index */
sizeof(float) } sizeof(float) }
); );
}) })

View File

@ -36,17 +36,21 @@ def test_from_python():
# https://bitbucket.org/pypy/pypy/issues/2444 # https://bitbucket.org/pypy/pypy/issues/2444
@pytest.unsupported_on_pypy @pytest.unsupported_on_pypy
def test_to_python(): def test_to_python():
mat = m.Matrix(5, 5) mat = m.Matrix(5, 4)
assert memoryview(mat).shape == (5, 5) assert memoryview(mat).shape == (5, 4)
assert mat[2, 3] == 0 assert mat[2, 3] == 0
mat[2, 3] = 4 mat[2, 3] = 4.0
mat[3, 2] = 7.0
assert mat[2, 3] == 4 assert mat[2, 3] == 4
assert mat[3, 2] == 7
assert struct.unpack_from('f', mat, (3 * 4 + 2) * 4) == (7, )
assert struct.unpack_from('f', mat, (2 * 4 + 3) * 4) == (4, )
mat2 = np.array(mat, copy=False) mat2 = np.array(mat, copy=False)
assert mat2.shape == (5, 5) assert mat2.shape == (5, 4)
assert abs(mat2).sum() == 4 assert abs(mat2).sum() == 11
assert mat2[2, 3] == 4 assert mat2[2, 3] == 4 and mat2[3, 2] == 7
mat2[2, 3] = 5 mat2[2, 3] = 5
assert mat2[2, 3] == 5 assert mat2[2, 3] == 5
@ -58,7 +62,7 @@ def test_to_python():
del mat2 # holds a mat reference del mat2 # holds a mat reference
pytest.gc_collect() pytest.gc_collect()
assert cstats.alive() == 0 assert cstats.alive() == 0
assert cstats.values() == ["5x5 matrix"] assert cstats.values() == ["5x4 matrix"]
assert cstats.copy_constructions == 0 assert cstats.copy_constructions == 0
# assert cstats.move_constructions >= 0 # Don't invoke any # assert cstats.move_constructions >= 0 # Don't invoke any
assert cstats.copy_assignments == 0 assert cstats.copy_assignments == 0