Distributed Ranges
Loading...
Searching...
No Matches
span.hpp
1// SPDX-FileCopyrightText: Intel Corporation
2//
3// SPDX-License-Identifier: BSD-3-Clause
4
5#pragma once
6
7#include <iterator>
8
9#include <dr/detail/ranges_shim.hpp>
10
11namespace dr::sp {
12
13template <typename T, rng::random_access_iterator Iter = T *>
14class span : public rng::view_interface<dr::sp::span<T, Iter>> {
15public:
16 static_assert(std::is_same_v<std::iter_value_t<Iter>, T>);
17
18 using value_type = std::iter_value_t<Iter>;
19 using size_type = std::size_t;
20 using difference_type = std::iter_difference_t<Iter>;
21 using reference = std::iter_reference_t<Iter>;
22 using iterator = Iter;
23
24 template <rng::random_access_range R>
25 span(R &&r) : begin_(rng::begin(r)), end_(rng::end(r)) {}
26 span(Iter first, Iter last) : begin_(first), end_(last) {}
27 span(Iter first, std::size_t count) : begin_(first), end_(first + count) {}
28
29 span() = default;
30 span(const span &) noexcept = default;
31 span &operator=(const span &) noexcept = default;
32
33 std::size_t size() const noexcept { return std::size_t(end() - begin()); }
34
35 bool empty() const noexcept { return size() == 0; }
36
37 Iter begin() const noexcept { return begin_; }
38
39 Iter end() const noexcept { return end_; }
40
41 reference operator[](size_type index) const { return *(begin() + index); }
42
43 span first(size_type n) const { return span(begin(), begin() + n); }
44
45 span last(size_type n) const { return span(end() - n, end()); }
46
47 span subspan(std::size_t offset, std::size_t count) const {
48 return span(begin() + offset, begin() + offset + count);
49 }
50
51private:
52 Iter begin_, end_;
53};
54
55template <rng::random_access_range R>
56span(R &&) -> span<rng::range_value_t<R>, rng::iterator_t<R>>;
57
58template <rng::random_access_iterator Iter>
59span(Iter first, std::size_t count) -> span<std::iter_value_t<Iter>, Iter>;
60
61} // namespace dr::sp
Definition: index.hpp:34
Definition: span.hpp:14