forked from NUDT-compiler/nudt-compiler-cpp
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
41 lines
1.2 KiB
41 lines
1.2 KiB
#pragma once
|
|
|
|
#include <iterator>
|
|
|
|
namespace ir {
|
|
|
|
template <typename IterT> struct range {
|
|
using iterator = IterT;
|
|
using value_type = typename std::iterator_traits<iterator>::value_type;
|
|
using reference = typename std::iterator_traits<iterator>::reference;
|
|
|
|
private:
|
|
iterator b;
|
|
iterator e;
|
|
|
|
public:
|
|
explicit range(iterator b, iterator e) : b(b), e(e) {}
|
|
iterator begin() { return b; }
|
|
iterator end() { return e; }
|
|
iterator begin() const { return b; }
|
|
iterator end() const { return e; }
|
|
auto size() const { return std::distance(b, e); }
|
|
auto empty() const { return b == e; }
|
|
};
|
|
|
|
//! create `range` object from iterator pair [begin, end)
|
|
template <typename IterT> range<IterT> make_range(IterT b, IterT e) {
|
|
return range<IterT>(b, e);
|
|
}
|
|
//! create `range` object from a container who has `begin()` and `end()` methods
|
|
template <typename ContainerT>
|
|
range<typename ContainerT::iterator> make_range(ContainerT &c) {
|
|
return make_range(c.begin(), c.end());
|
|
}
|
|
//! create `range` object from a container who has `begin()` and `end()` methods
|
|
template <typename ContainerT>
|
|
range<typename ContainerT::const_iterator> make_range(const ContainerT &c) {
|
|
return make_range(c.begin(), c.end());
|
|
}
|
|
|
|
} // namespace ir
|