pybind11/tests
oremanj fd9bc8f54d Add basic support for tag-based static polymorphism (#1326)
* Add basic support for tag-based static polymorphism

Sometimes it is possible to look at a C++ object and know what its dynamic type is,
even if it doesn't use C++ polymorphism, because instances of the object and its
subclasses conform to some other mechanism for being self-describing; for example,
perhaps there's an enumerated "tag" or "kind" member in the base class that's always
set to an indication of the correct type. This might be done for performance reasons,
or to permit most-derived types to be trivially copyable. One of the most widely-known
examples is in LLVM: https://llvm.org/docs/HowToSetUpLLVMStyleRTTI.html

This PR permits pybind11 to be informed of such conventions via a new specializable
detail::polymorphic_type_hook<> template, which generalizes the previous logic for
determining the runtime type of an object based on C++ RTTI. Implementors provide
a way to map from a base class object to a const std::type_info* for the dynamic
type; pybind11 then uses this to ensure that casting a Base* to Python creates a
Python object that knows it's wrapping the appropriate sort of Derived.

There are a number of restrictions with this tag-based static polymorphism support
compared to pybind11's existing support for built-in C++ polymorphism:

- there is no support for this-pointer adjustment, so only single inheritance is permitted
- there is no way to make C++ code call new Python-provided subclasses
- when binding C++ classes that redefine a method in a subclass, the .def() must be
  repeated in the binding for Python to know about the update

But these are not much of an issue in practice in many cases, the impact on the
complexity of pybind11's innards is minimal and localized, and the support for
automatic downcasting improves usability a great deal.
2018-04-14 02:13:10 +02:00
..
test_cmake_build Add test for custom CMake export group 2017-08-07 23:08:20 +02:00
test_embed Fix segfault when reloading interpreter with external modules (#1092) 2018-01-11 19:46:10 -04:00
CMakeLists.txt Add basic support for tag-based static polymorphism (#1326) 2018-04-14 02:13:10 +02:00
conftest.py Allow binding factory functions as constructors 2017-08-17 09:33:27 -04:00
constructor_stats.h Support multiple inheritance from python 2017-06-12 09:56:55 -03:00
local_bindings.h Fix nullptr dereference when loading an external-only module_local type 2017-09-10 12:28:03 +02:00
object.h Improve custom holder support (#607) 2017-01-31 17:05:44 +01:00
pybind11_cross_module_tests.cpp Make TypeErrors more informative when an optional header is missing 2017-09-12 08:06:46 +02:00
pybind11_tests.cpp Update all remaining tests to new test styles 2017-08-05 18:46:22 -04:00
pybind11_tests.h Update all remaining tests to new test styles 2017-08-05 18:46:22 -04:00
pytest.ini Don't let pytest discover tests from test_cmake_build and test_embed 2017-06-10 16:44:21 +02:00
test_buffers.cpp correct stride in matrix example and test 2017-09-21 18:07:48 -03:00
test_buffers.py correct stride in matrix example and test 2017-09-21 18:07:48 -03:00
test_builtin_casters.cpp Matching Python 2 int behavior on Python 2 (#1186) 2017-11-30 13:33:24 -04:00
test_builtin_casters.py Matching Python 2 int behavior on Python 2 (#1186) 2017-11-30 13:33:24 -04:00
test_call_policies.cpp Add -Wdeprecated to test suite and fix associated warnings (#1191) 2017-11-22 17:37:41 -04:00
test_call_policies.py Fix application of keep_alive policy to constructors (regression) 2017-09-06 10:21:11 +02:00
test_callbacks.cpp Update all remaining tests to new test styles 2017-08-05 18:46:22 -04:00
test_callbacks.py Update all remaining tests to new test styles 2017-08-05 18:46:22 -04:00
test_chrono.cpp Update all remaining tests to new test styles 2017-08-05 18:46:22 -04:00
test_chrono.py Update all remaining tests to new test styles 2017-08-05 18:46:22 -04:00
test_class.cpp Use stricter brace initialization 2018-01-12 09:29:57 -04:00
test_class.py Use stricter brace initialization 2018-01-12 09:29:57 -04:00
test_constants_and_functions.cpp Add -Wdeprecated to test suite and fix associated warnings (#1191) 2017-11-22 17:37:41 -04:00
test_constants_and_functions.py Update all remaining tests to new test styles 2017-08-05 18:46:22 -04:00
test_copy_move.cpp Make it possible to generate constexpr signatures in C++11 mode 2017-09-16 12:02:49 +02:00
test_copy_move.py Update all remaining tests to new test styles 2017-08-05 18:46:22 -04:00
test_docstring_options.cpp Update all remaining tests to new test styles 2017-08-05 18:46:22 -04:00
test_docstring_options.py Update all remaining tests to new test styles 2017-08-05 18:46:22 -04:00
test_eigen.cpp Typo 2018-02-27 22:46:56 -04:00
test_eigen.py Fixes for numpy 1.14.0 compatibility 2018-01-11 11:43:54 -04:00
test_enum.cpp support docstrings in enum::value() (#1160) 2017-11-16 22:24:36 +01:00
test_enum.py Implement an enum_ property "name" 2018-04-07 19:11:35 -03:00
test_eval_call.py Add checks to maintain a consistent Python code style and prevent bugs (#515) 2016-11-20 21:21:54 +01:00
test_eval.cpp Update all remaining tests to new test styles 2017-08-05 18:46:22 -04:00
test_eval.py Update all remaining tests to new test styles 2017-08-05 18:46:22 -04:00
test_exceptions.cpp misc. typos 2018-01-11 16:39:50 -04:00
test_exceptions.py Fix builtin exception handlers to work across modules 2017-08-04 10:47:34 -04:00
test_factory_constructors.cpp Add -Wdeprecated to test suite and fix associated warnings (#1191) 2017-11-22 17:37:41 -04:00
test_factory_constructors.py Reduce binary size overhead of new-style constructors 2017-08-28 16:08:53 +02:00
test_iostream.cpp Utility for redirecting C++ streams to Python (#1009) 2017-08-25 02:12:43 +02:00
test_iostream.py Utility for redirecting C++ streams to Python (#1009) 2017-08-25 02:12:43 +02:00
test_kwargs_and_defaults.cpp Added py::args ref counting tests 2017-12-23 18:53:26 -04:00
test_kwargs_and_defaults.py Add spaces around "=" in signature repr. 2017-12-27 11:04:24 -04:00
test_local_bindings.cpp Fix nullptr dereference when loading an external-only module_local type 2017-09-10 12:28:03 +02:00
test_local_bindings.py Fix nullptr dereference when loading an external-only module_local type 2017-09-10 12:28:03 +02:00
test_methods_and_attributes.cpp Added write only property functions for issue #1142 (#1144) 2017-11-07 12:35:27 -04:00
test_methods_and_attributes.py Added write only property functions for issue #1142 (#1144) 2017-11-07 12:35:27 -04:00
test_modules.cpp Update all remaining tests to new test styles 2017-08-05 18:46:22 -04:00
test_modules.py Update all remaining tests to new test styles 2017-08-05 18:46:22 -04:00
test_multiple_inheritance.cpp Add -Wdeprecated to test suite and fix associated warnings (#1191) 2017-11-22 17:37:41 -04:00
test_multiple_inheritance.py Reimplement py::init<...> to use common factory code 2017-08-17 09:33:27 -04:00
test_numpy_array.cpp Update all remaining tests to new test styles 2017-08-05 18:46:22 -04:00
test_numpy_array.py Fixes for numpy 1.14.0 compatibility 2018-01-11 11:43:54 -04:00
test_numpy_dtypes.cpp Make register_dtype() accept any field containers (#1225) 2017-12-27 11:00:27 -04:00
test_numpy_dtypes.py Fix numpy dtypes test on big-endian architectures 2018-02-18 18:36:11 +01:00
test_numpy_vectorize.cpp Update all remaining tests to new test styles 2017-08-05 18:46:22 -04:00
test_numpy_vectorize.py Update all remaining tests to new test styles 2017-08-05 18:46:22 -04:00
test_opaque_types.cpp Improve macro type handling for types with commas 2018-03-10 14:24:23 -04:00
test_opaque_types.py Fix new flake8 E741 error from using l variable 2017-10-25 08:18:21 -03:00
test_operator_overloading.cpp Access C++ hash functions from Python and vice versa (#1034) 2017-08-30 14:22:00 +02:00
test_operator_overloading.py misc. typos 2018-01-11 16:39:50 -04:00
test_pickling.cpp Relax py::pickle() get/set type check 2017-09-06 15:20:52 +02:00
test_pickling.py Add py::pickle() adaptor for safer __getstate__/__setstate__ bindings 2017-08-30 11:11:38 +02:00
test_pytypes.cpp Fix implicit conversion of accessors to types derived from py::object 2017-09-11 10:09:32 +02:00
test_pytypes.py Fix new flake8 E741 error from using l variable 2017-10-25 08:18:21 -03:00
test_sequences_and_iterators.cpp Update all remaining tests to new test styles 2017-08-05 18:46:22 -04:00
test_sequences_and_iterators.py Fix new flake8 E741 error from using l variable 2017-10-25 08:18:21 -03:00
test_smart_ptr.cpp Add -Wdeprecated to test suite and fix associated warnings (#1191) 2017-11-22 17:37:41 -04:00
test_smart_ptr.py Update all remaining tests to new test styles 2017-08-05 18:46:22 -04:00
test_stl_binders.cpp Fix STL casters for containers with proxies (regression) 2017-09-10 12:25:10 +02:00
test_stl_binders.py fix return from std::map bindings to __delitem__ (#1229) 2018-01-11 19:43:37 -04:00
test_stl.cpp Fix STL casters for containers with proxies (regression) 2017-09-10 12:25:10 +02:00
test_stl.py Add spaces around "=" in signature repr. 2017-12-27 11:04:24 -04:00
test_tagbased_polymorphic.cpp Add basic support for tag-based static polymorphism (#1326) 2018-04-14 02:13:10 +02:00
test_tagbased_polymorphic.py Add basic support for tag-based static polymorphism (#1326) 2018-04-14 02:13:10 +02:00
test_virtual_functions.cpp Improve macro type handling for types with commas 2018-03-10 14:24:23 -04:00
test_virtual_functions.py Trivial typos 2017-11-01 22:48:36 -03:00