Skip to content

ranges: sentinel с операцией >= #638

@AverageBeerEnjoyer

Description

@AverageBeerEnjoyer

<Описание вашей идеи>

Из фич 20 стандарта мне очень понравилась std::ranges::iota_view. Помогает избежать опечаток в инкременте классического for.
Но есть проблема: в текущем виде конструкция

for (int i: views::iota(init_val, sentinel_val))

эквивалентна

for (int i = init_val; i != sentinel_val; ++i)

и если по каким-то причинам init_val > sentinel_val, цикл не остановится

проблема решается добавлением сентинела с переопределенной операцией ==

<Примеры, где ваша идея будет полезна. Чем больше примеров и чем большую аудиторию они охватывают - тем лучше>

int init_val = 0;
int sentinel_val = -1;
for(int i: views::iota(init_val, sentinel_val)) {
    println("{}", i);
}

будут выводится числа начиная с 0
цикл остановится, когда после переполнения i увеличится с INT32_MIN до -1

получается, каждое использование iota_view требует либо дополнительной валидации ее параметров, либо кастомного сентинела,
кроме случаев, где мы гарантированно уверенны в том, что init_val <= sentinel_val

<Код c реализацией вашей идеи, если есть>

struct ubound
{
    int bound = 0;
    bool operator==(int x) const { return x >= bound; }
};

тогда эти 2 цикла эквивалентны

for (int i: views::iota(init_val, ubound{sentinel_val}))
for (int i = init_val; i < sentinel_val; ++i)

возможно, даже получится собрать какой-то набор сентинелов, используемых чаще всего

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    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