mirror of
https://github.com/pybind/pybind11.git
synced 2026-04-20 14:59:27 +00:00
Correct class names for KeysView, ValuesView and ItemsView in bind_map (#4353)
* Create templated abstract classes KeysView, ValuesView and ItemsView, and implement them on-the-fly when wrapping any specific map type * We don't want to wrap different ValuesView objects for double values and const double, for example, as both wrappers will be named ValuesView[float] * Fallback to C++ names if key or values types are not wrapped * Added a test for .keys(), .values() and .items() returning the same types for similarly-typed maps * Fixed wrong use of auto in a declarator list: the two descriptions might have different types * Fixes for clang-tidy issues: explicit single-argument constructor, using the 'override' keyword when overriding functions * Bugfix for old versions of clang++, which seem to have trouble with the struct being defined inside a module, which was also needlessly ugly anyway * Bugfix for clang++, which doesn't have some of the names in runtime uness they are specified to be static * A fix for clang-tidy performance-inefficient-string-concatenation issues - I personally think this looks uglier, but it's probably worth it for clang-tidy to be happy * Possible fix for clang++ linking issues - make the descriptions static constexpr to make sure they are known before linking * Correct names for previously-wrapped types as keys/values of maps * Bugfix - typo in type info names which caused things to segfault * Apply suggestions from code review Co-authored-by: Aaron Gokaslan <skylion.aaron@gmail.com> * Use detail::remove_cvref_t instead of doing remove_cv and remove_reference separately * Avoid names with double underscore, as they are reserved * Improved testing for KeysView, ValuesView and ItemsView: check type names + stricter asserts * Moved description logic to helper function in type_caster_base.h * style: pre-commit fixes * Fix a clang-tidy issue: do not use 'else' after 'return' * Apply suggestion by @Skylion007, with additional trivial simplification. Co-authored-by: Amir <aimir@local> Co-authored-by: aimir <aimir@localhost> Co-authored-by: Aaron Gokaslan <skylion.aaron@gmail.com> Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> Co-authored-by: Ralf W. Grosse-Kunstleve <rwgk@google.com>
This commit is contained in:
@@ -309,3 +309,29 @@ def test_map_delitem():
|
||||
del um["ua"]
|
||||
assert sorted(list(um)) == ["ub"]
|
||||
assert sorted(list(um.items())) == [("ub", 2.6)]
|
||||
|
||||
|
||||
def test_map_view_types():
|
||||
map_string_double = m.MapStringDouble()
|
||||
unordered_map_string_double = m.UnorderedMapStringDouble()
|
||||
map_string_double_const = m.MapStringDoubleConst()
|
||||
unordered_map_string_double_const = m.UnorderedMapStringDoubleConst()
|
||||
|
||||
assert map_string_double.keys().__class__.__name__ == "KeysView[str]"
|
||||
assert map_string_double.values().__class__.__name__ == "ValuesView[float]"
|
||||
assert map_string_double.items().__class__.__name__ == "ItemsView[str, float]"
|
||||
|
||||
keys_type = type(map_string_double.keys())
|
||||
assert type(unordered_map_string_double.keys()) is keys_type
|
||||
assert type(map_string_double_const.keys()) is keys_type
|
||||
assert type(unordered_map_string_double_const.keys()) is keys_type
|
||||
|
||||
values_type = type(map_string_double.values())
|
||||
assert type(unordered_map_string_double.values()) is values_type
|
||||
assert type(map_string_double_const.values()) is values_type
|
||||
assert type(unordered_map_string_double_const.values()) is values_type
|
||||
|
||||
items_type = type(map_string_double.items())
|
||||
assert type(unordered_map_string_double.items()) is items_type
|
||||
assert type(map_string_double_const.items()) is items_type
|
||||
assert type(unordered_map_string_double_const.items()) is items_type
|
||||
|
||||
Reference in New Issue
Block a user