7#include <dr/concepts/concepts.hpp>
8#include <dr/sp/distributed_span.hpp>
12template <
int dimensions = 1>
class id {
14 static_assert(dimensions == 1);
16 id()
noexcept =
default;
18 id(std::size_t segment_id, std::size_t local_id, std::size_t global_id)
19 : segment_id_(segment_id), local_id_(local_id), global_id_(global_id) {}
21 std::size_t get(
int dimension)
const {
return global_id_; }
23 operator std::size_t()
const {
return global_id_; }
25 std::size_t segment()
const {
return segment_id_; }
27 std::size_t local_id()
const {
return local_id_; }
30 std::size_t segment_id_ = 0;
31 std::size_t local_id_ = 0;
32 std::size_t global_id_ = 0;
40 using size_type = std::size_t;
41 using difference_type = std::ptrdiff_t;
46 using iterator_category = std::random_access_iterator_tag;
60 size_type global_offset) noexcept
61 : global_offset_(global_offset), segment_id_(segment_id), idx_(idx) {}
64 operator+=(difference_type offset)
noexcept {
70 return segment_id_ == other.segment_id_ && idx_ == other.idx_;
73 constexpr difference_type
75 return difference_type(idx_) - difference_type(other.idx_);
80 return idx_ < other.idx_;
84 return value_type(segment_id_, idx_, get_global_idx());
88 size_type get_global_idx()
const noexcept {
return global_offset_ + idx_; }
90 size_type global_offset_ = 0;
91 size_type segment_id_ = 0;
99 static_assert(dimensions == 1);
102 using size_type = std::size_t;
103 using different_type = std::ptrdiff_t;
109 segment_range(std::size_t segment_id, std::size_t segment_size,
110 std::size_t global_offset)
111 : segment_id_(segment_id), segment_size_(segment_size),
112 global_offset_(global_offset) {}
117 return iterator(segment_id_, segment_size_, global_offset_);
120 size_type size()
const noexcept {
return segment_size_; }
122 value_type operator[](std::size_t idx) {
return *(begin() + idx); }
124 size_type rank()
const noexcept {
return 0; }
127 std::size_t segment_size_;
128 std::size_t segment_id_;
129 std::size_t global_offset_;
Definition: iterator_adaptor.hpp:23