%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/range.hpp |
#ifndef PYTHONIC_BUILTIN_RANGE_HPP
#define PYTHONIC_BUILTIN_RANGE_HPP
#include "pythonic/include/builtins/range.hpp"
#include <climits>
#include "pythonic/builtins/range.hpp"
#include "pythonic/types/list.hpp"
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));
}
}
range_iterator::range_iterator(long v, long s) : value_(v), step_(s)
{
}
long range_iterator::operator*() const
{
return value_;
}
range_iterator &range_iterator::operator++()
{
value_ += step_;
return *this;
}
range_iterator range_iterator::operator++(int)
{
range_iterator self(*this);
value_ += step_;
return self;
}
range_iterator &range_iterator::operator+=(long n)
{
value_ += step_ * n;
return *this;
}
range_iterator &range_iterator::operator--()
{
value_ -= step_;
return *this;
}
range_iterator range_iterator::operator--(int)
{
range_iterator self(*this);
value_ -= step_;
return self;
}
range_iterator &range_iterator::operator-=(long n)
{
value_ -= step_ * n;
return *this;
}
bool range_iterator::operator!=(range_iterator const &other) const
{
return value_ != other.value_;
}
bool range_iterator::operator==(range_iterator const &other) const
{
return value_ == other.value_;
}
bool range_iterator::operator<(range_iterator const &other) const
{
const long sign = +1 | (step_ >> (sizeof(long) * CHAR_BIT - 1));
return sign * value_ < sign * other.value_;
}
long range_iterator::operator-(range_iterator const &other) const
{
return (value_ - other.value_) / step_;
}
range::range(long b, long e, long s)
: begin_(b), end_(_init_last(b, e, s)), step_(s)
{
}
range::range(long e) : begin_(0), end_(e), step_(1)
{
}
range_iterator range::begin() const
{
return range_iterator(begin_, step_);
}
range_iterator range::end() const
{
return range_iterator(end_, step_);
}
typename range::reverse_iterator range::rbegin() const
{
return {end_ - step_, -step_};
}
typename range::reverse_iterator range::rend() const
{
return {begin_ - step_, -step_};
}
long range::size() const
{
return (end_ - begin_) / step_;
}
long range::operator[](long i) const
{
return begin_ + i * step_;
}
}
PYTHONIC_NS_END
/* overload std::get */
namespace std
{
template <size_t I>
long get(pythonic::builtins::range const &t)
{
return t[I];
}
}
#endif