• Jason Rhinelander's avatar
    Expand std::string_view support to str, bytes, memoryview (#3521) · b4939fcb
    Jason Rhinelander authored
    * Expand string_view support to str, bytes, memoryview
    
    1. Allows constructing a str or bytes implicitly from a string_view;
       this is essentially a small shortcut allowing a caller to write
       `py::bytes{sv}` rather than `py::bytes{sv.data(), sv.size()}`.
    
    2. Allows implicit conversion *to* string_view from py::bytes -- this
       saves a fair bit more as currently there is no simple way to get such
       a view of the bytes without copying it (or resorting to Python API
       calls).
    
       (This is not done for `str` because when the str contains unicode we
       have to allocate to a temporary and so there might not be some string
       data we can properly view without owning.)
    
    3. Allows `memoryview::from_memory` to accept a string_view.  As with
       the other from_memory calls, it's entirely your responsibility to
       keep it alive.
    
    This also required moving the string_view availability detection into
    detail/common.h because this PR needs it in pytypes.h, which is higher
    up the include chain than cast.h where it was being detected currently.
    
    * Move string_view include to pytypes.h
    
    * CI-testing a fix for the "ambiguous conversion" issue.
    
    This change is known to fix the `tensorflow::tstring` issue reported under https://github.com/pybind/pybind11/pull/3521#issuecomment-985100965
    
    
    
    TODO: Minimal reproducer for the `tensorflow::tstring` issue.
    
    * Make clang-tidy happy (hopefully).
    
    * Adding minimal reproducer for the `tensorflow::tstring` issue.
    
    Error without the enable_if trick:
    
    ```
    /usr/local/google/home/rwgk/forked/pybind11/tests/test_builtin_casters.cpp:169:16: error: ambiguous conversion for functional-style cast from 'TypeWithBothOperatorStringAndStringView' to 'py::bytes'
            return py::bytes(TypeWithBothOperatorStringAndStringView());
                   ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    /usr/local/google/home/rwgk/forked/pybind11/include/pybind11/detail/../pytypes.h:1174:5: note: candidate constructor
        bytes(const std::string &s) : bytes(s.data(), s.size()) { }
        ^
    /usr/local/google/home/rwgk/forked/pybind11/include/pybind11/detail/../pytypes.h:1191:5: note: candidate constructor
        bytes(std::string_view s) : bytes(s.data(), s.size()) { }
        ^
    ```
    
    * Adding missing NOLINTNEXTLINE
    
    * Also apply ambiguous conversion workaround to str()
    Co-authored-by: default avatarRalf W. Grosse-Kunstleve <rwgk@google.com>
    b4939fcb
test_builtin_casters.cpp 14.6 KB