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')
264 return self.
data != other.data
283 return repr(self.
data)
287 __handled_types__ = (re.compile(
r'(std::)?(vector|list)<.*>$'), )
289 def __init__(self, cpp_type, name=None, valueSem=None):
290 super(SequenceSemantics, self).
__init__(cpp_type, name)
296 new_value.extend(value)
301 new_value.default = value
306 Option string version of value. 308 if not isinstance(value, _ListHelper):
310 return value.opt_value()
315 Extend the sequence-semantics with a merge-method to behave like a 316 OrderedSet: Values are unique but the order is maintained. 317 Use 'OrderedSet<T>' as fifth parameter of the Gaudi::Property<T> constructor 318 to invoke this merging method. 320 __handled_types__ = (re.compile(
r"^OrderedSet<.*>$"), )
323 super(OrderedSetSemantics, self).
__init__(cpp_type, name)
333 def __init__(self, key_semantics, value_semantics):
345 return len(self.
data)
358 raise RuntimeError(
'cannot remove elements from the default value')
362 for key
in self.
data:
380 def get(self, key, default=None):
391 for key, value
in otherMap.items():
403 return repr(self.
data)
407 __handled_types__ = (re.compile(
r'(std::)?(unordered_)?map<.*>$'), )
410 super(MappingSemantics, self).
__init__(cpp_type, name)
417 new_value.update(value)
422 new_value.default = value
427 Option string version of value. 429 if not isinstance(value, _DictHelper):
431 return value.opt_value()
435 c
for c
in globals().values()
if isinstance(c, type)
436 and issubclass(c, PropertySemantics)
and c
is not PropertySemantics
441 for semantics
in SEMANTICS:
443 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 update(self, otherMap)
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, cpp_type, name=None)
def __init__(self, key_semantics, value_semantics)
def __getitem__(self, key)
def __init__(self, cpp_type, name=None, valueSem=None)