%PDF- %PDF-
| Direktori : /proc/thread-self/root/lib/python3/dist-packages/pythran/pythonic/builtins/ |
| Current File : //proc/thread-self/root/lib/python3/dist-packages/pythran/pythonic/builtins/xrange.hpp |
#ifndef PYTHONIC_BUILTIN_XRANGE_HPP
#define PYTHONIC_BUILTIN_XRANGE_HPP
#include "pythonic/include/builtins/xrange.hpp"
#include "pythonic/utils/functor.hpp"
#include <iterator>
PYTHONIC_NS_BEGIN
namespace builtins
{
namespace
{
long _init_last(long _begin, long _end, long _step)
{
if (_step > 0)
return _begin +
std::max(0L, _step * ((_end - _begin + _step - 1) / _step));
else
return _begin +
std::min(0L, _step * ((_end - _begin + _step + 1) / _step));
}
}
xrange_iterator::xrange_iterator(long v, long s) : value_(v), step_(s)
{
}
long xrange_iterator::operator*() const
{
return value_;
}
xrange_iterator &xrange_iterator::operator++()
{
value_ += step_;
return *this;
}
xrange_iterator xrange_iterator::operator++(int)
{
xrange_iterator self(*this);
value_ += step_;
return self;
}
xrange_iterator &xrange_iterator::operator+=(long n)
{
value_ += step_ * n;
return *this;
}
bool xrange_iterator::operator!=(xrange_iterator const &other) const
{
return value_ != other.value_;
}
bool xrange_iterator::operator==(xrange_iterator const &other) const
{
return value_ == other.value_;
}
bool xrange_iterator::operator<(xrange_iterator const &other) const
{
return step_ * value_ < step_ * other.value_;
}
long xrange_iterator::operator-(xrange_iterator const &other) const
{
return (value_ - other.value_) / step_;
}
xrange::xrange(long b, long e, long s)
: begin_(b), end_(_init_last(b, e, s)), step_(s)
{
}
xrange::xrange(long e) : begin_(0), end_(e), step_(1)
{
}
xrange_iterator xrange::begin() const
{
return xrange_iterator(begin_, step_);
}
xrange_iterator xrange::end() const
{
return xrange_iterator(end_, step_);
}
typename xrange::reverse_iterator xrange::rbegin() const
{
return {end_ - step_, -step_};
}
typename xrange::reverse_iterator xrange::rend() const
{
return {begin_ - step_, -step_};
}
}
PYTHONIC_NS_END
#endif