Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
sqlmapproject
GitHub Repository: sqlmapproject/sqlmap
Path: blob/master/lib/utils/xrange.py
2989 views
1
#!/usr/bin/env python
2
3
"""
4
Copyright (c) 2006-2025 sqlmap developers (https://sqlmap.org)
5
See the file 'LICENSE' for copying permission
6
"""
7
8
import numbers
9
10
class xrange(object):
11
"""
12
Advanced (re)implementation of xrange (supports slice/copy/etc.)
13
Reference: http://code.activestate.com/recipes/521885-a-pythonic-implementation-of-xrange/
14
15
>>> list(xrange(1, 9)) == list(range(1, 9))
16
True
17
>>> list(xrange(8, 0, -16)) == list(range(8, 0, -16))
18
True
19
>>> list(xrange(0, 8, 16)) == list(range(0, 8, 16))
20
True
21
>>> list(xrange(0, 4, 5)) == list(range(0, 4, 5))
22
True
23
>>> list(xrange(4, 0, 3)) == list(range(4, 0, 3))
24
True
25
>>> list(xrange(0, -3)) == list(range(0, -3))
26
True
27
>>> list(xrange(0, 7, 2)) == list(range(0, 7, 2))
28
True
29
>>> foobar = xrange(1, 10)
30
>>> 7 in foobar
31
True
32
>>> 11 in foobar
33
False
34
>>> foobar[0]
35
1
36
"""
37
38
__slots__ = ['_slice']
39
40
def __init__(self, *args):
41
if args and isinstance(args[0], type(self)):
42
self._slice = slice(args[0].start, args[0].stop, args[0].step)
43
else:
44
self._slice = slice(*args)
45
if self._slice.stop is None:
46
raise TypeError("xrange stop must not be None")
47
48
@property
49
def start(self):
50
if self._slice.start is not None:
51
return self._slice.start
52
return 0
53
54
@property
55
def stop(self):
56
return self._slice.stop
57
58
@property
59
def step(self):
60
if self._slice.step is not None:
61
return self._slice.step
62
return 1
63
64
def __hash__(self):
65
return hash(self._slice)
66
67
def __repr__(self):
68
return '%s(%r, %r, %r)' % (type(self).__name__, self.start, self.stop, self.step)
69
70
def __len__(self):
71
return self._len()
72
73
def _len(self):
74
return max(0, 1 + int((self.stop - 1 - self.start) // self.step))
75
76
def __contains__(self, value):
77
return (self.start <= value < self.stop) and (value - self.start) % self.step == 0
78
79
def __getitem__(self, index):
80
if isinstance(index, slice):
81
start, stop, step = index.indices(self._len())
82
return xrange(self._index(start),
83
self._index(stop), step * self.step)
84
elif isinstance(index, numbers.Integral):
85
if index < 0:
86
fixed_index = index + self._len()
87
else:
88
fixed_index = index
89
90
if not 0 <= fixed_index < self._len():
91
raise IndexError("Index %d out of %r" % (index, self))
92
93
return self._index(fixed_index)
94
else:
95
raise TypeError("xrange indices must be slices or integers")
96
97
def _index(self, i):
98
return self.start + self.step * i
99
100
def index(self, i):
101
if self.start <= i < self.stop:
102
return i - self.start
103
else:
104
raise ValueError("%d is not in list" % i)
105
106