cppx-core
Range_.hpp
Go to the documentation of this file.
1 #pragma once // Source encoding: UTF-8 with BOM (π is a lowercase Greek "pi").
2 #include <cppx-core/iterators/Forward_iterator_impl_.hpp> // cppx::Forward_iterator_impl_
3 #include <cppx-core/language/types/Truth.hpp> // cppx::Truth
4 
5 #include <c/assert.hpp>
6 
7 namespace cppx{
8 
9  template< class Integer >
10  class Range_
11  {
12  Integer m_lower;
13  Integer m_upper;
14 
15  class Iterator:
16  public Forward_iterator_impl_<Iterator, Integer>
17  {
18  Integer m_current;
19 
20  public:
21  void advance() { ++m_current; }
22 
23  auto operator*() const noexcept
24  -> Integer
25  { return m_current; }
26 
27  friend auto operator==( const Iterator& a, const Iterator& b ) noexcept
28  -> Truth
29  { return a.m_current == b.m_current; }
30 
31  explicit Iterator( const Integer value ) noexcept
32  : m_current{ value }
33  {}
34  };
35 
36  public:
37  constexpr auto lower() const noexcept -> Integer { return m_lower; }
38  constexpr auto upper() const noexcept -> Integer { return m_upper; }
39 
40  constexpr auto size() const noexcept -> Integer { return 1 + m_upper - m_lower; }
41 
42  constexpr auto contains( const Integer x ) const noexcept
43  -> Truth
44  { return m_lower <= x and x <= m_upper; }
45 
46  auto begin() const noexcept -> Iterator { return Iterator( m_lower ); }
47  auto end() const noexcept -> Iterator { return Iterator( m_upper + 1 ); }
48 
49  constexpr Range_( const Integer lower, const Integer upper ) noexcept
50  : m_lower( lower )
51  , m_upper( upper )
52  {}
53  };
54 
55  using Range = Range_<int>;
56 
57  template< class Integer >
58  void reversed( const Range_<Integer>& ) = delete; // TODO: implement
59 
60  template< class Integer = int >
61  inline constexpr auto up_to( const Integer n ) noexcept
63  { return Range_<Integer>( 0, n - 1 ); }
64 
65  template< class Integer >
66  auto is_in( const Range_<Integer>& range, const Integer v )
67  -> Truth
68  { return range.contains( v ); }
69 
70 } // namespace cppx
A drop-in replacement for bool without implicit conversion from/to types other than bool.
Definition: Truth.hpp:34
constexpr auto lower() const noexcept -> Integer
Definition: Range_.hpp:37
auto operator *(const int n, const string_view &s) -> string
Definition: string-util.hpp:43
constexpr Range_(const Integer lower, const Integer upper) noexcept
Definition: Range_.hpp:49
void advance(P_< const char > &p, const Size distance)
auto begin() const noexcept -> Iterator
Definition: Range_.hpp:46
auto is_in(const basic_string_view< Char > &sv, const Char ch) noexcept -> Truth
Definition: is_in.hpp:21
Truth is a drop-in replacement for bool without implicit conversion from/to types other than bool.
constexpr auto contains(const Integer x) const noexcept -> Truth
Definition: Range_.hpp:42
constexpr auto size() const noexcept -> Integer
Definition: Range_.hpp:40
constexpr auto up_to(const Integer n) noexcept -> Range_< Integer >
Definition: Range_.hpp:61
auto end() const noexcept -> Iterator
Definition: Range_.hpp:47
void reversed(const Range_< Integer > &)=delete
constexpr auto upper() const noexcept -> Integer
Definition: Range_.hpp:38