Skip to content

ENH: Makeiterator_policies::sequence_fast_readonly satisfy ranges concept. #4127

@Skylion007

Description

@Skylion007

Discussed in #3850

Originally posted by zwhfly April 7, 2022
I found out that pybind11::detail::iterator_policies::sequence_fast_readonly is not default constructible.
This makes the type returned by pybind11::args::begin() not satisfying the std::input_or_output_iterator concept.

I added the default ctor directly in the header file: zwhfly@bfa326a, and made a test.

Given using Iter = decltype(std::declval<pybind11::args>().begin());, this change makes std::constructible_from<Iter> true, which makes std::default_initializable<Iter> true, which makes std::weakly_incrementable<Iter> true, which makes std::input_or_output_iterator<Iter> true, which makes pybind11::args satisfy std::ranges::range concept, which makes the following code work:

void f(pb11::args args)
{
    namespace views = std::ranges::views;
    auto vu = args | views::transform(
        [](pybind11::handle const & h) -> MyClass const & { return h.cast<MyClass const &>(); });
    some_library_function(vu.begin(), vu.end());
}

I'm not familiar with the source code of pybind11, so I wonder would this change cause any bad effect that I don't know of?
Could it be added?

Metadata

Metadata

Assignees

No one assigned

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions