11 from __future__
import absolute_import
16 from collections.abc
import MutableSequence, MutableMapping
19 from collections
import MutableSequence, MutableMapping
21 if sys.version_info >= (3, ):
24 _log = logging.getLogger(__name__)
25 is_64bits = sys.maxsize > 2**32
30 Basic property semantics implementation, with no validation/transformation. 32 __handled_types__ = (re.compile(
r'.*'), )
45 h.match(value)
if hasattr(h,
'match')
else h == value
47 raise TypeError(
'C++ type {!r} not supported'.
format(value))
52 Transformation for data when reading the property. 58 Validation/transformation of the data to be stored. 64 Allow overriding the definition of "is set" if we need helper types. 70 Option string version of value. 72 if hasattr(value,
'__opt_value__'):
73 return value.__opt_value__()
80 Used when merging two Configurable instances, by default just ensure 81 the two values do not conflict, but it can be overridden in 82 derived semantics to, for example, append to the two lists. 85 raise ValueError(
'cannot merge values %r and %r' % (a, b))
89 DefaultSemantics = PropertySemantics
93 __handled_types__ = (
'std::string', )
96 if not isinstance(value, basestring):
97 raise ValueError(
'cannot set property {} to {!r}'.
format(
103 __handled_types__ = (
'bool', )
110 __handled_types__ = (
'float',
'double')
113 from numbers
import Number
114 if not isinstance(value, Number):
116 'number expected, got {!r} in assignemnt to {}'.
format(
124 'signed char': (-128, 127),
125 'short': (-32768, 32767),
126 'int': (-2147483648, 2147483647),
127 'long': ((-9223372036854775808, 9223372036854775807)
if is_64bits
else 128 (-2147483648, 2147483647)),
129 'long long': (-9223372036854775808, 9223372036854775807),
130 'unsigned char': (0, 255),
131 'unsigned short': (0, 65535),
132 'unsigned int': (0, 4294967295),
134 18446744073709551615
if is_64bits
else 4294967295),
135 'unsigned long long': (0, 18446744073709551615),
138 __handled_types__ = tuple(INT_RANGES)
141 from numbers
import Number
142 if not isinstance(value, Number):
144 'number expected, got {!r} in assignemnt to {}'.
format(
148 _log.warning(
'converted %s to %d in assignment to %s', value, v,
151 if v < min_value
or v > max_value:
152 raise ValueError(
'value {} outside limits for {!r} {}'.
format(
158 __handled_types__ = (
'Algorithm',
'Auditor',
159 re.compile(
r'AlgTool(:I[a-zA-Z0-9_]*)*$'),
160 re.compile(
r'Service(:I[a-zA-Z0-9_]*)*$'))
163 super(ComponentSemantics, self).
__init__(cpp_type, name)
169 from .
import Configurable, Configurables
170 if isinstance(value, Configurable):
172 elif isinstance(value, basestring):
174 if value
in Configurable.instances:
175 value = Configurable.instances[value]
179 t, n = value.split(
'/')
182 value = Configurables.getByType(t).getInstance(n)
185 'cannot assign {!r} to {!r}, requested string or {!r}'.
format(
187 if value.__component_type__ != self.
cpp_type:
189 'wrong type for {!r}: expected {!r}, got {!r}'.
format(
193 if value.__interfaces__:
194 if not self.
interfaces.issubset(value.__interfaces__):
196 'wrong interfaces for {!r}: required {}'.
format(
198 except AttributeError:
203 return self.
store(value)
208 Return an iterator over the list of template arguments in a C++ type 211 >>> t = 'map<string, vector<int, allocator<int> >, allocator<v<i>, a<i>> >' 212 >>> list(extract_template_args(t)) 213 ['string', 'vector<int, allocator<int> >', 'allocator<v<i>, a<i>>'] 214 >>> list(extract_template_args('int')) 219 for p, c
in enumerate(cpp_type):
221 if template_level == 1:
222 yield cpp_type[arg_start:p].strip()
226 if template_level == 1:
230 if template_level == 0:
231 yield cpp_type[arg_start:p].strip()
246 return len(self.
data)
257 raise RuntimeError(
'cannot remove elements from the default value')
277 return repr(self.
data)
281 __handled_types__ = (re.compile(
r'(std::)?(vector|list)<.*>$'), )
284 super(SequenceSemantics, self).
__init__(cpp_type, name)
290 new_value.extend(value)
295 new_value.default = value
300 Option string version of value. 302 if not isinstance(value, _ListHelper):
304 return value.opt_value()
308 def __init__(self, key_semantics, value_semantics):
320 return len(self.
data)
333 raise RuntimeError(
'cannot remove elements from the default value')
337 for key
in self.
data:
355 def get(self, key, default=None):
372 return repr(self.
data)
376 __handled_types__ = (re.compile(
r'(std::)?(unordered_)?map<.*>$'), )
379 super(MappingSemantics, self).
__init__(cpp_type, name)
386 new_value.update(value)
391 new_value.default = value
396 Option string version of value. 398 if not isinstance(value, _DictHelper):
400 return value.opt_value()
404 c
for c
in globals().values()
405 if isinstance(c, type)
and PropertySemantics
in c.__bases__
410 for semantics
in SEMANTICS:
412 return semantics(cpp_type, name)
def opt_value(self, value)
def __delitem__(self, key)
def __init__(self, cpp_type, name=None)
GAUDI_API std::string format(const char *,...)
MsgStream format utility "a la sprintf(...)".
def opt_value(self, value)
def getSemanticsFor(cpp_type, name=None)
def get(self, key, default=None)
def __getitem__(self, key)
def opt_value(self, value)
def __setitem__(self, key, value)
def __init__(self, cpp_type, name=None)
def insert(self, key, value)
def __init__(self, cpp_type, name=None)
def __init__(self, semantics)
def extend(self, iterable)
def extract_template_args(cpp_type)
def __setitem__(self, key, value)
def __init__(self, cpp_type, name=None)
def __delitem__(self, key)
def __contains__(self, key)
def __init__(self, key_semantics, value_semantics)
def __getitem__(self, key)