155 |
155 |
def __init__(self, wireType):
|
156 |
156 |
self._wireType = wireType
|
157 |
157 |
self._converters = {}
|
|
158 |
self._priorities = {}
|
158 |
159 |
|
159 |
160 |
def getWireType(self):
|
160 |
161 |
return self._wireType
|
161 |
162 |
|
162 |
|
def addConverter(self, converter, replaceExisting=False):
|
|
163 |
def addConverter(self, converter, replaceExisting=False, priority = 0):
|
163 |
164 |
key = (converter.getWireSchema(), converter.getDataType())
|
164 |
165 |
if key in self._converters and not replaceExisting:
|
165 |
166 |
raise RuntimeError("There already is a converter with wire-schema `%s' and data-type `%s'"
|
166 |
167 |
% key)
|
167 |
168 |
self._converters[key] = converter
|
|
169 |
self._priorities[converter] = priority
|
|
170 |
|
|
171 |
def getPriority(self, converter):
|
|
172 |
return self._priorities[converter]
|
168 |
173 |
|
169 |
174 |
def _getConverterForWireSchema(self, wireSchema):
|
170 |
175 |
for ((converterWireSchema, ignored), converter) in self._converters.items():
|
... | ... | |
172 |
177 |
return converter
|
173 |
178 |
|
174 |
179 |
def _getConverterForDataType(self, dataType):
|
175 |
|
for ((ignored, converterDataType), converter) in self._converters.items():
|
|
180 |
for ((ignored, converterDataType), converter) \
|
|
181 |
in sorted(self._converters.items(),
|
|
182 |
key = lambda x: self._priorities[x[1]]):
|
176 |
183 |
if issubclass(dataType, converterDataType):
|
177 |
184 |
return converter
|
178 |
185 |
|
... | ... | |
231 |
238 |
def __init__(self, wireType):
|
232 |
239 |
super(UnambiguousConverterMap, self).__init__(wireType)
|
233 |
240 |
|
234 |
|
def addConverter(self, converter, replaceExisting=False):
|
|
241 |
def addConverter(self, converter, replaceExisting = False, priority = 0 ):
|
235 |
242 |
for (wireSchema, dataType) in self.getConverters().keys():
|
236 |
243 |
if wireSchema == converter.getWireSchema():
|
237 |
244 |
if dataType == converter.getDataType():
|
... | ... | |
239 |
246 |
else:
|
240 |
247 |
raise RuntimeError("Trying to register ambiguous converter with data type `%s' for wire-schema `%s' (present converter is for data type `%s')."
|
241 |
248 |
% (converter.getDataType(), wireSchema, dataType))
|
242 |
|
super(UnambiguousConverterMap, self).addConverter(converter, replaceExisting)
|
|
249 |
super(UnambiguousConverterMap, self) \
|
|
250 |
.addConverter(converter,
|
|
251 |
replaceExisting= replaceExisting,
|
|
252 |
priority = priority)
|
243 |
253 |
|
244 |
254 |
__globalConverterMaps = {}
|
245 |
255 |
|
246 |
|
def registerGlobalConverter(converter, replaceExisting=False):
|
|
256 |
def registerGlobalConverter(converter, replaceExisting = False, priority = 0):
|
247 |
257 |
"""
|
248 |
258 |
Register B{converter} as a globally available converter.
|
249 |
259 |
|
... | ... | |
255 |
265 |
an error is raised.
|
256 |
266 |
"""
|
257 |
267 |
mapForWireType = getGlobalConverterMap(converter.getWireType())
|
258 |
|
mapForWireType.addConverter(converter, replaceExisting)
|
|
268 |
mapForWireType.addConverter(converter,
|
|
269 |
replaceExisting = replaceExisting,
|
|
270 |
priority = priority)
|
259 |
271 |
|
260 |
272 |
def getGlobalConverterMap(wireType):
|
261 |
273 |
"""
|
... | ... | |
340 |
352 |
|
341 |
353 |
makeStructBasedConverter('DoubleConverter', Real, 'double', '<d', 8)
|
342 |
354 |
makeStructBasedConverter('FloatConverter', Real, 'float', '<f', 4)
|
343 |
|
makeStructBasedConverter('Uint32Converter', Integral, 'uint32', '<I', 4)
|
344 |
|
makeStructBasedConverter('Int32Converter', Integral, 'int32', '<i', 4)
|
|
355 |
makeStructBasedConverter('Uint32Converter', int, 'uint32', '<I', 4)
|
|
356 |
makeStructBasedConverter('Int32Converter', int, 'int32', '<i', 4)
|
345 |
357 |
makeStructBasedConverter('Uint64Converter', Integral, 'uint64', '<Q', 8)
|
346 |
358 |
makeStructBasedConverter('Int64Converter', Integral, 'int64', '<q', 8)
|
347 |
359 |
makeStructBasedConverter('BoolConverter', bool, 'bool', '?', 1)
|
... | ... | |
431 |
443 |
return str(self)
|
432 |
444 |
|
433 |
445 |
registerGlobalConverter(NoneConverter())
|
434 |
|
registerGlobalConverter(DoubleConverter())
|
435 |
|
registerGlobalConverter(FloatConverter())
|
436 |
|
registerGlobalConverter(Uint32Converter())
|
437 |
|
registerGlobalConverter(Int32Converter())
|
438 |
|
registerGlobalConverter(Uint64Converter())
|
439 |
|
registerGlobalConverter(Int64Converter())
|
|
446 |
registerGlobalConverter(DoubleConverter(), priority = 6)
|
|
447 |
registerGlobalConverter(FloatConverter(), priority = 5)
|
|
448 |
registerGlobalConverter(Uint32Converter(), priority = 1)
|
|
449 |
registerGlobalConverter(Int32Converter(), priority = 2)
|
|
450 |
registerGlobalConverter(Uint64Converter(), priority = 3)
|
|
451 |
registerGlobalConverter(Int64Converter(), priority = 4)
|
440 |
452 |
registerGlobalConverter(BoolConverter())
|
441 |
453 |
registerGlobalConverter(StringConverter(wireSchema="utf-8-string", dataType=str, encoding="utf_8"))
|
442 |
454 |
registerGlobalConverter(ByteArrayConverter())
|
443 |
|
-
|