P4C
The P4 Compiler
Loading...
Searching...
No Matches
range.h
1/*
2 * SPDX-FileCopyrightText: 2013 Barefoot Networks, Inc.
3 * Copyright 2013-present Barefoot Networks, Inc.
4 *
5 * SPDX-License-Identifier: Apache-2.0
6 */
7
8#ifndef LIB_RANGE_H_
9#define LIB_RANGE_H_
10
11#include <iostream>
12
13namespace P4 {
14
15template <class T>
16class RangeIter {
17 int incr;
18 T cur, fin;
19 explicit RangeIter(T end) : incr(0), cur(end), fin(end) {}
20
21 public:
22 RangeIter(T start, T end)
23 : incr(start <= end ? 1 : -1), cur(start), fin(static_cast<T>(end + incr)) {}
24 RangeIter begin() const { return *this; }
25 RangeIter end() const { return RangeIter(fin); }
26 T operator*() const { return cur; }
27 bool operator==(const RangeIter &a) const { return cur == a.cur; }
28 bool operator!=(const RangeIter &a) const { return cur != a.cur; }
29 RangeIter &operator++() {
30 cur = static_cast<T>(cur + incr);
31 return *this;
32 }
33 template <class U>
34 friend std::ostream &operator<<(std::ostream &, const RangeIter<U> &);
35};
36
37template <class T>
38static inline RangeIter<T> Range(T a, T b) {
39 return RangeIter<T>(a, b);
40}
41template <class T>
42static inline RangeIter<T> Range(std::pair<T, T> p) {
43 return RangeIter<T>(p.first, p.second);
44}
45template <class T>
46static inline RangeIter<T> ReverseRange(std::pair<T, T> p) {
47 return RangeIter<T>(p.second, p.first);
48}
49
50template <class T>
51std::ostream &operator<<(std::ostream &out, const RangeIter<T> &r) {
52 out << r.cur;
53 if (r.cur + r.incr != r.fin) out << ".." << (r.fin - r.incr);
54 return out;
55}
56
57} // namespace P4
58
59#endif /* LIB_RANGE_H_ */
Definition range.h:16
TODO: this is not really specific to BMV2, it should reside somewhere else.
Definition applyOptionsPragmas.cpp:13