File: range.h

package info (click to toggle)
intel-compute-runtime-legacy 24.35.30872.40-1
  • links: PTS, VCS
  • area: main
  • in suites: sid
  • size: 73,292 kB
  • sloc: cpp: 826,355; lisp: 3,686; sh: 677; makefile: 148; python: 21
file content (87 lines) | stat: -rw-r--r-- 1,856 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
/*
 * Copyright (C) 2018-2023 Intel Corporation
 *
 * SPDX-License-Identifier: MIT
 *
 */

#pragma once
#include <iterator>

namespace NEO {

template <typename DataType>
struct Range {
    using iterator = DataType *;
    using const_iterator = const DataType *;
    using reverse_iterator = std::reverse_iterator<iterator>;
    using const_reverse_iterator = std::reverse_iterator<const_iterator>;

    Range()
        : begIt(nullptr), endIt(nullptr) {
    }

    explicit Range(DataType *base, size_t count = 1)
        : begIt(base), endIt(base + count) {
    }

    template <typename SequentialContainerT, typename BeginT = decltype(((SequentialContainerT *)nullptr)->size())>
    Range(SequentialContainerT &container)
        : Range(&*container.begin(), container.size()) {
    }

    template <typename T, size_t size>
    Range(T (&base)[size])
        : Range(&base[0], size) {
    }
    Range &operator=(const Range &) = delete;

    iterator begin() {
        return begIt;
    }

    iterator end() {
        return endIt;
    }

    const_iterator begin() const {
        return begIt;
    }

    const_iterator end() const {
        return endIt;
    }

    reverse_iterator rbegin() {
        return reverse_iterator(end());
    }

    const_reverse_iterator rbegin() const {
        return const_reverse_iterator(end());
    }

    reverse_iterator rend() {
        return reverse_iterator(end()) + (endIt - begIt);
    }

    const_reverse_iterator rend() const {
        return const_reverse_iterator(end()) + (endIt - begIt);
    }

    bool empty() const {
        return begIt == endIt;
    }

    size_t size() const {
        return endIt - begIt;
    }

    iterator begIt;
    iterator endIt;
};

template <typename T>
inline Range<T> createRange(T *base, size_t count) {
    return Range<T>(base, count);
}
} // namespace NEO