Skip to content

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

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)

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

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions