16 |
# $Id$ |
# $Id$ |
17 |
|
|
18 |
import re |
import re |
19 |
|
import types |
20 |
|
|
21 |
_inf = float('1e1000') # FIXME: hack for infinity |
_inf = float('1e1000') # FIXME: hack for infinite |
22 |
|
|
23 |
class Range: |
class Range: |
24 |
|
|
29 |
parse_range = re.compile(range_re) |
parse_range = re.compile(range_re) |
30 |
|
|
31 |
def __init__(self, range=None): |
def __init__(self, range=None): |
32 |
self.SetRange(range) |
self._SetRange(range) |
33 |
|
|
34 |
def SetRange(self, range): |
def _SetRange(self, range): |
35 |
if isinstance(range, Range): |
if isinstance(range, Range): |
36 |
self.SetRange(str(range)) |
self._SetRange(range.GetRange()) |
37 |
elif range in [None, '']: |
elif range in [None, '']: |
38 |
self.SetRange(']-oo;oo[') |
self._SetRange(']-oo;oo[') |
39 |
|
elif type(range) == types.TupleType: |
40 |
|
if (len(range) == 4 and range[0] in ['[', ']'] |
41 |
|
and range[3] in ['[', ']']): |
42 |
|
self._left = range[0] |
43 |
|
self._begin = self.float(range[1]) |
44 |
|
self._end = self.float(range[2]) |
45 |
|
self._right = range[3] |
46 |
|
if (self._begin > self._end or |
47 |
|
(self._begin == self._end and |
48 |
|
(self._left != '[' or self._right != ']'))): |
49 |
|
raise ValueError("illegal range: %s" % (range,)) |
50 |
|
else: |
51 |
|
raise ValueError("can't parse range: %r" % (range,)) |
52 |
else: |
else: |
53 |
self._range = range |
self._range = range |
54 |
match = self.parse_range.match(self._range) |
match = self.parse_range.match(self._range) |
55 |
if match: |
if match: |
56 |
self._left = match.group('left') |
self._SetRange((match.group('left'), |
57 |
self._begin = self.float(match.group('begin')) |
match.group('begin'), |
58 |
self._end = self.float(match.group('end')) |
match.group('end'), |
59 |
self._right = match.group('right') |
match.group('right'))) |
60 |
else: |
else: |
61 |
raise ValueError("can't parse range: %s" % range) |
raise ValueError("can't parse range: %s" % (range,)) |
|
if (self._begin > self._end or |
|
|
(self._begin == self._end and |
|
|
(self._left != '[' or self._right != ']'))): |
|
|
raise ValueError("illegal range: %s" % range) |
|
62 |
|
|
63 |
def GetRange(self): |
def GetRange(self): |
64 |
"""return internal representation of range |
"""return internal representation of range |
68 |
""" |
""" |
69 |
return (self._left, self._begin, self._end, self._right) |
return (self._left, self._begin, self._end, self._right) |
70 |
|
|
71 |
def float(self, string): |
def float(self, value): |
72 |
if string == 'oo': |
"""convert string or number to float""" |
73 |
|
if value == 'oo': |
74 |
return _inf |
return _inf |
75 |
elif string == '-oo': |
elif value == '-oo': |
76 |
return -_inf |
return -_inf |
77 |
else: |
else: |
78 |
return float(string) |
return float(value) |
79 |
|
|
80 |
def _float2string(self, value): |
def _float2string(self, value): |
81 |
"""convert float value to string |
"""convert float value to string |
89 |
elif value == -_inf: |
elif value == -_inf: |
90 |
return '-oo' |
return '-oo' |
91 |
else: |
else: |
92 |
return "%g" % value |
return "%g" % (value,) |
93 |
|
|
94 |
def string(self, range): |
def string(self, range): |
95 |
"""convert internal representation to string""" |
"""convert internal representation to string""" |