--- a/sources/range.h Wed Jan 27 14:06:45 2021 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,164 +0,0 @@ -/* - Copyright 2014 - 2016 Teemu Piippo - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions - are met: - - 1. Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - 2. Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - 3. Neither the name of the copyright holder nor the names of its - contributors may be used to endorse or promote products derived from - this software without specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED - TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A - PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER - OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ - -#pragma once -#include <algorithm> -#include <memory> -#include "basics.h" -BEGIN_ZFC_NAMESPACE - -// -// ------------------------------------------------------------------------------------------------- -// - -template<typename T> -class Range -{ - T m_a; - T m_b; - T m_step; - -public: - struct Iterator - { - T value; - T step; - - Iterator (T value, T step) : - value (value), - step (step) {} - - T& operator*() - { - return value; - } - - bool operator== (const Iterator& other) const - { - return value == other.value; - } - - bool operator!= (const Iterator& other) const - { - return value < other.value; - } - - Iterator& operator++() - { - value += step; return *this; - } - }; - - Range (T a, T b, T step = 1) : - m_a (a), - m_b (b), - m_step (step) - { - check_bounds(); - } - - Range() : - m_a (T()), - m_b (T()) {} - - Iterator begin() const - { - return Iterator(min(), m_step); - } - - Iterator end() const - { - return Iterator(max(), m_step); - } - - T min() const - { - return m_a; - } - - T max() const - { - return m_b; - } - - T step() const - { - return m_step; - } - - void check_bounds() - { - if (m_b < m_a) - std::swap (m_a, m_b); - } - - bool contains (T c) const - { - return c >= m_a - and c <= m_b; - } - - bool contains_exclusively (T c) const - { - return c > m_a - and c < m_b; - } - - bool overlaps (Range<T> const& other) const - { - return contains (other.m_a) - or contains (other.m_b); - } - - bool operator== (Range<T> const& other) const - { - return m_a == other.m_a - and m_b == other.m_b; - } - - bool operator!= (Range<T> const& other) const - { - return not operator== (other); - } -}; - -template<typename T> -Range<T> range(T a, T b, T step = 1) -{ - return Range<T>(a, b, step); -} - -template<typename T> -Range<T> range(T b) -{ - return Range<T>(T(), b); -} - -END_ZFC_NAMESPACE