blob: 7f17b9890b0300d24ec52adbe12527ccd98dced8 [file] [edit]
# Copyright 2018 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
from __future__ import absolute_import
from __future__ import division
from __future__ import print_function
from six.moves import zip # pylint: disable=redefined-builtin
from tracing.value.diagnostics import diagnostic
class RelatedNameMap(diagnostic.Diagnostic):
__slots__ = ('_map',)
def __init__(self, entries=None):
super(RelatedNameMap, self).__init__()
self._map = entries or {}
def __len__(self):
return len(self._map)
def __eq__(self, other):
if not isinstance(other, RelatedNameMap):
return False
if set(self._map) != set(other._map):
return False
for key, name in self._map.items():
if name != other.Get(key):
return False
return True
def __hash__(self):
return id(self)
def CanAddDiagnostic(self, other):
return isinstance(other, RelatedNameMap)
def AddDiagnostic(self, other):
for key, name in other._map.items():
existing = self.Get(key)
if existing is None:
self.Set(key, name)
elif existing != name:
raise ValueError('Histogram names differ: "%s" != "%s"' % (
existing, name))
def Get(self, key):
return self._map.get(key)
def Set(self, key, name):
self._map[key] = name
def __iter__(self):
for key, name in self._map.items():
yield key, name
def Values(self):
return list(self._map.values())
def Serialize(self, serializer):
keys = list(self._map.keys())
keys.sort()
names = [serializer.GetOrAllocateId(self.Get(k)) for k in keys]
keys_id = serializer.GetOrAllocateId([
serializer.GetOrAllocateId(k) for k in keys])
return [keys_id] + names
def _AsDictInto(self, dct):
dct['names'] = dict(self._map)
def _AsProto(self):
raise NotImplementedError()
@staticmethod
def Deserialize(data, deserializer):
names = RelatedNameMap()
for key, name in zip(deserializer.GetObject(data[0]), data[1:]):
names.Set(deserializer.GetObject(key), deserializer.GetObject(name))
return names
@staticmethod
def FromDict(dct):
names = RelatedNameMap()
for key, name in dct['names'].items():
names.Set(key, name)
return names
@staticmethod
def FromProto(d):
raise NotImplementedError()