CodeNebula
C++20stladvanced

std::ranges::input_range (C++20 Addition)

C++20 · The Big Four · Compiler flag: -std=c++20

Explanation

Concept for ranges that support at least single-pass input iteration. The weakest range concept that still allows reading elements.

Real-World Scenario

Process a stream of sensor readings where data can only be consumed once (e.g., from a network socket adapter).

Quick Snippet

snippet.cpp
#include <ranges>

template<std::ranges::input_range R>
auto sum(R&& r) {
    std::ranges::range_value_t<R> total{};
    for (auto&& elem : r) total += elem;
    return total;
}

Full Example

ranges_input_range.cpp
// CodeNebula - C++20 Example: std::ranges::input_range Concept
// Compile: g++ -std=c++20 -Wall -Wextra -o example ranges_input_range.cpp

#include <ranges>
#include <vector>
#include <list>
#include <sstream>
#include <iterator>
#include <iostream>

// std::ranges::input_range requires that iterators support at least
// single-pass reading (input iterator category).

// Accept any input range and compute its sum
template <std::ranges::input_range R>
    requires std::integral<std::ranges::range_value_t<R>>
auto sum_range(R&& r) {
    long long total = 0;
    for (auto&& val : r) {
        total += val;
    }
    return total;
}

// Count elements in any input range
template <std::ranges::input_range R>
std::size_t count_elements(R&& r) {
    std::size_t count = 0;
    for ([[maybe_unused]] auto&& val : r) {
        ++count;
    }
    return count;
}

int main() {
    // All standard containers model input_range
    static_assert(std::ranges::input_range<std::vector<int>>);
    static_assert(std::ranges::input_range<std::list<int>>);

    // istream_view is a classic single-pass input range
    std::istringstream iss("10 20 30 40 50");
    auto stream_range = std::ranges::istream_view<int>(iss);
    static_assert(std::ranges::input_range<decltype(stream_range)>);

    std::cout << "Stream values: ";
    for (int val : stream_range) {
        std::cout << val << " ";
    }
    std::cout << "\n";

    // Using sum_range with a vector
    std::vector<int> nums = {1, 2, 3, 4, 5};
    std::cout << "Sum of vector: " << sum_range(nums) << "\n";

    // Using with a view pipeline
    auto squares = nums | std::views::transform([](int x) { return x * x; });
    static_assert(std::ranges::input_range<decltype(squares)>);
    std::cout << "Sum of squares: " << sum_range(squares) << "\n";

    // Using count_elements with a filtered range
    auto evens = nums | std::views::filter([](int x) { return x % 2 == 0; });
    std::cout << "Even count: " << count_elements(evens) << "\n";

    return 0;
}
Run command
g++ -std=c++20 -Wall -Wextra -o example ranges_input_range.cpp