Skip to content

Instantly share code, notes, and snippets.

@Algo-ryth-mix
Created July 7, 2021 15:55
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save Algo-ryth-mix/b00e9b84b2e8ed75ab372a85685e5cea to your computer and use it in GitHub Desktop.
Save Algo-ryth-mix/b00e9b84b2e8ed75ab372a85685e5cea to your computer and use it in GitHub Desktop.
Python like range for c++
/*
Copyright 2021 Raphael Baier
Permission to use, copy, modify, and/or distribute this software for any purpose with or without
fee is hereby granted, provided that the above copyright notice and this permission notice appear
in all copies.
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS
SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
OF THIS SOFTWARE.
*/
template <class KVT>
struct range_iterator
{
using iterator_category = std::forward_iterator_tag;
using difference_type = KVT;
using value_type = KVT;
using pointer = value_type*;
using reference = value_type&;
KVT key_value;
KVT operator*()
{
return key_value;
}
range_iterator<KVT>& operator++()
{
key_value++;
return *this;
}
range_iterator<KVT>& operator--()
{
key_value--;
return *this;
}
range_iterator<KVT> operator++(int)
{
return range_iterator<KVT>{key_value+1};
}
range_iterator<KVT> operator--(int)
{
return range_iterator<KVT>{key_value-1};
}
friend bool operator==(const range_iterator<KVT> &lhs,const range_iterator<KVT> &rhs)
{
return lhs.key_value == rhs.key_value;
}
friend bool operator!=(const range_iterator<KVT> &lhs,const range_iterator<KVT> &rhs)
{
return lhs.key_value != rhs.key_value;
}
};
class range
{
public:
range(size_t upper_bound,size_t lower_bound = 0) : m_upper(upper_bound), m_lower(lower_bound)
{
}
range_iterator<size_t> begin()
{
return range_iterator<size_t>{m_lower};
}
range_iterator<size_t> end()
{
return range_iterator<size_t>{m_upper};
}
private:
size_t m_upper, m_lower;
};
//Usage:
// for(size_t i : range(10)) {
// ...
// }
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment