File: range.h

package info (click to toggle)
intel-compute-runtime 20.44.18297-1
  • links: PTS, VCS
  • area: main
  • in suites: bullseye
  • size: 34,780 kB
  • sloc: cpp: 379,729; lisp: 4,931; python: 299; sh: 196; makefile: 8
file content (83 lines) | stat: -rw-r--r-- 1,726 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
/*
 * Copyright (C) 2017-2020 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(DataType *base, size_t count)
        : 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 S>
    Range(T (&base)[S])
        : Range(&base[0], S) {
    }

    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