|     46 public: | 
    46 public: | 
|     47 	struct Iterator | 
    47 	struct Iterator | 
|     48 	{ | 
    48 	{ | 
|     49 		T value; | 
    49 		T value; | 
|     50 		T step; | 
    50 		T step; | 
|     51 		inline METHOD operator*() -> T&; | 
    51  | 
|     52 		inline METHOD operator== (const Iterator& other) const -> bool; | 
    52 		Iterator (T value, T step) : | 
|     53 		inline METHOD operator!= (const Iterator& other) const -> bool; | 
    53 			value (value), | 
|     54 		inline METHOD operator++() -> Iterator&; | 
    54 			step (step) {} | 
|         | 
    55  | 
|         | 
    56 		T& operator*() | 
|         | 
    57 		{ | 
|         | 
    58 			return value; | 
|         | 
    59 		} | 
|         | 
    60  | 
|         | 
    61 		bool operator== (const Iterator& other) const | 
|         | 
    62 		{ | 
|         | 
    63 			return value == other.value; | 
|         | 
    64 		} | 
|         | 
    65  | 
|         | 
    66 		bool operator!= (const Iterator& other) const | 
|         | 
    67 		{ | 
|         | 
    68 			return value != other.value; | 
|         | 
    69 		} | 
|         | 
    70  | 
|         | 
    71 		Iterator& operator++() | 
|         | 
    72 		{ | 
|         | 
    73 			value += step; return *this; | 
|         | 
    74 		} | 
|     55 	}; | 
    75 	}; | 
|     56  | 
    76  | 
|     57 	Range (const T& a, const T& b, const T& step = 1); | 
    77 	Range (T a, T b, T step = 1) : | 
|     58 	Range(); | 
    78 		m_a (a), | 
|         | 
    79 		m_b (b), | 
|         | 
    80 		m_step (step) | 
|         | 
    81 	{ | 
|         | 
    82 		check_bounds(); | 
|         | 
    83 	} | 
|     59  | 
    84  | 
|     60 	METHOD begin() const -> Iterator; | 
    85 	Range() : | 
|     61 	METHOD end() const -> Iterator; | 
    86 		m_a (T()), | 
|     62 	METHOD min() const -> T; | 
    87 		m_b (T()) {} | 
|     63 	METHOD max() const -> T; | 
    88  | 
|     64 	METHOD check_bounds() -> void; | 
    89 	Iterator begin() const | 
|     65 	METHOD contains (const T& c) const -> bool; | 
    90 	{ | 
|     66 	METHOD contains_exclusively (const T& c) const -> bool; | 
    91 		Iterator it; | 
|     67 	METHOD overlaps (Range<T> const& other) const -> bool; | 
    92 		it.value = min(); | 
|     68 	METHOD operator== (Range<T> const& other) const -> bool; | 
    93 		it.step = m_step; | 
|     69 	METHOD operator!= (Range<T> const& other) const -> bool; | 
    94 		return it; | 
|         | 
    95 	} | 
|         | 
    96  | 
|         | 
    97 	Iterator end() const | 
|         | 
    98 	{ | 
|         | 
    99 		Iterator it; | 
|         | 
   100 		it.value = max() + 1; | 
|         | 
   101 		it.step = m_step; | 
|         | 
   102 		return it; | 
|         | 
   103 	} | 
|         | 
   104  | 
|         | 
   105 	T min() const | 
|         | 
   106 	{ | 
|         | 
   107 		return m_a; | 
|         | 
   108 	} | 
|         | 
   109  | 
|         | 
   110 	T max() const | 
|         | 
   111 	{ | 
|         | 
   112 		return m_b; | 
|         | 
   113 	} | 
|         | 
   114  | 
|         | 
   115 	void check_bounds() | 
|         | 
   116 	{ | 
|         | 
   117 		if (m_b < m_a) | 
|         | 
   118 			std::swap (m_a, m_b); | 
|         | 
   119 	} | 
|         | 
   120  | 
|         | 
   121 	bool contains (T c) const | 
|         | 
   122 	{ | 
|         | 
   123 		return c >= m_a | 
|         | 
   124 		   and c <= m_b; | 
|         | 
   125 	} | 
|         | 
   126  | 
|         | 
   127 	bool contains_exclusively (T c) const | 
|         | 
   128 	{ | 
|         | 
   129 		return c > m_a | 
|         | 
   130 		   and c < m_b; | 
|         | 
   131 	} | 
|         | 
   132  | 
|         | 
   133 	bool overlaps (Range<T> const& other) const | 
|         | 
   134 	{ | 
|         | 
   135 		return contains (other.m_a) | 
|         | 
   136 			or contains (other.m_b); | 
|         | 
   137 	} | 
|         | 
   138  | 
|         | 
   139 	bool operator== (Range<T> const& other) const | 
|         | 
   140 	{ | 
|         | 
   141 		return m_a == other.m_a | 
|         | 
   142 		   and m_b == other.m_b; | 
|         | 
   143 	} | 
|         | 
   144  | 
|         | 
   145 	bool operator!= (Range<T> const& other) const | 
|         | 
   146 	{ | 
|         | 
   147 		return not operator== (other); | 
|         | 
   148 	} | 
|     70 }; | 
   149 }; | 
|     71  | 
        | 
|     72 // ------------------------------------------------------------------------------------------------- | 
        | 
|     73 // | 
        | 
|     74 template<typename T> | 
        | 
|     75 Range<T>::Range (const T& a, const T& b, const T& step) : | 
        | 
|     76 	m_a (a), | 
        | 
|     77 	m_b (b), | 
        | 
|     78 	m_step (step) | 
        | 
|     79 { | 
        | 
|     80 	check_bounds(); | 
        | 
|     81 } | 
        | 
|     82  | 
        | 
|     83 // ------------------------------------------------------------------------------------------------- | 
        | 
|     84 // | 
        | 
|     85 template<typename T> | 
        | 
|     86 Range<T>::Range() : | 
        | 
|     87 	m_a (T()), | 
        | 
|     88 	m_b (T()) {} | 
        | 
|     89  | 
        | 
|     90 // ------------------------------------------------------------------------------------------------- | 
        | 
|     91 // | 
        | 
|     92 template<typename T> inline METHOD | 
        | 
|     93 Range<T>::Iterator::operator*() -> T& | 
        | 
|     94 { | 
        | 
|     95 	return value; | 
        | 
|     96 } | 
        | 
|     97  | 
        | 
|     98 // ------------------------------------------------------------------------------------------------- | 
        | 
|     99 // | 
        | 
|    100 template<typename T> inline METHOD | 
        | 
|    101 Range<T>::Iterator::operator== (const Iterator& other) const -> bool | 
        | 
|    102 { | 
        | 
|    103 	return value == other.value; | 
        | 
|    104 } | 
        | 
|    105  | 
        | 
|    106 // ------------------------------------------------------------------------------------------------- | 
        | 
|    107 // | 
        | 
|    108 template<typename T> inline METHOD | 
        | 
|    109 Range<T>::Iterator::operator!= (const Iterator& other) const -> bool | 
        | 
|    110 { | 
        | 
|    111 	return value != other.value; | 
        | 
|    112 } | 
        | 
|    113  | 
        | 
|    114 // ------------------------------------------------------------------------------------------------- | 
        | 
|    115 // | 
        | 
|    116 template<typename T> inline METHOD | 
        | 
|    117 Range<T>::Iterator::operator++() -> Iterator& | 
        | 
|    118 { | 
        | 
|    119 	value += step; | 
        | 
|    120 	return *this; | 
        | 
|    121 } | 
        | 
|    122  | 
        | 
|    123 // ------------------------------------------------------------------------------------------------- | 
        | 
|    124 // | 
        | 
|    125 template<typename T> METHOD | 
        | 
|    126 Range<T>::check_bounds() -> void | 
        | 
|    127 { | 
        | 
|    128 	if (m_b < m_a) | 
        | 
|    129 		std::swap (m_a, m_b); | 
        | 
|    130 } | 
        | 
|    131  | 
        | 
|    132 // ------------------------------------------------------------------------------------------------- | 
        | 
|    133 // | 
        | 
|    134 template<typename T> METHOD | 
        | 
|    135 Range<T>::contains (const T& c) const -> bool | 
        | 
|    136 { | 
        | 
|    137 	return (c >= m_a) and (c <= m_b); | 
        | 
|    138 } | 
        | 
|    139  | 
        | 
|    140 // ------------------------------------------------------------------------------------------------- | 
        | 
|    141 // | 
        | 
|    142 template<typename T> METHOD | 
        | 
|    143 Range<T>::contains_exclusively (const T& c) const -> bool | 
        | 
|    144 { | 
        | 
|    145 	return (c > m_a) and (c < m_b); | 
        | 
|    146 } | 
        | 
|    147  | 
        | 
|    148 // ------------------------------------------------------------------------------------------------- | 
        | 
|    149 // | 
        | 
|    150 template<typename T> METHOD | 
        | 
|    151 Range<T>::overlaps (Range<T> const& other) const -> bool | 
        | 
|    152 { | 
        | 
|    153 	return contains (other.m_a) or contains (other.m_b); | 
        | 
|    154 } | 
        | 
|    155  | 
        | 
|    156 // ------------------------------------------------------------------------------------------------- | 
        | 
|    157 // | 
        | 
|    158 template<typename T> METHOD | 
        | 
|    159 Range<T>::operator== (Range<T> const& other) const -> bool | 
        | 
|    160 { | 
        | 
|    161 	return m_a == other.m_a and m_b == other.m_b; | 
        | 
|    162 } | 
        | 
|    163  | 
        | 
|    164 // ------------------------------------------------------------------------------------------------- | 
        | 
|    165 // | 
        | 
|    166 template<typename T> METHOD | 
        | 
|    167 Range<T>::operator!= (Range<T> const& other) const -> bool | 
        | 
|    168 { | 
        | 
|    169 	return not operator== (other); | 
        | 
|    170 } | 
        | 
|    171  | 
        | 
|    172 // ------------------------------------------------------------------------------------------------- | 
        | 
|    173 // | 
        | 
|    174 template<typename T> METHOD | 
        | 
|    175 Range<T>::min() const -> T | 
        | 
|    176 { | 
        | 
|    177 	return m_a; | 
        | 
|    178 } | 
        | 
|    179  | 
        | 
|    180 // ------------------------------------------------------------------------------------------------- | 
        | 
|    181 // | 
        | 
|    182 template<typename T> METHOD | 
        | 
|    183 Range<T>::max() const -> T | 
        | 
|    184 { | 
        | 
|    185 	return m_b; | 
        | 
|    186 } | 
        | 
|    187  | 
        | 
|    188 // ------------------------------------------------------------------------------------------------- | 
        | 
|    189 // | 
        | 
|    190 template<typename T> METHOD | 
        | 
|    191 Range<T>::begin() const -> Iterator | 
        | 
|    192 { | 
        | 
|    193 	Iterator it; | 
        | 
|    194 	it.value = min(); | 
        | 
|    195 	it.step = m_step; | 
        | 
|    196 	return it; | 
        | 
|    197 } | 
        | 
|    198  | 
        | 
|    199 // ------------------------------------------------------------------------------------------------- | 
        | 
|    200 // | 
        | 
|    201 template<typename T> METHOD | 
        | 
|    202 Range<T>::end() const -> Iterator | 
        | 
|    203 { | 
        | 
|    204 	Iterator it; | 
        | 
|    205 	it.value = max() + 1; | 
        | 
|    206 	it.step = m_step; | 
        | 
|    207 	return it; | 
        | 
|    208 } | 
        |