scylla-gdb.py: collection_element: add circular_buffer support
Also add a __getitem__() to circular_buffer and mask indexes so they are mapped to [`_impl.begin`, `_impl.end`). Signed-off-by: Botond Dénes <bdenes@scylladb.com> Message-Id: <20200803053646.14689-1-bdenes@scylladb.com>
This commit is contained in:
@@ -2358,6 +2358,9 @@ class circular_buffer(object):
|
||||
def __init__(self, ref):
|
||||
self.ref = ref
|
||||
|
||||
def _mask(self, i):
|
||||
return i & (int(self['_impl']['capacity']) - 1)
|
||||
|
||||
def __iter__(self):
|
||||
impl = self.ref['_impl']
|
||||
st = impl['storage']
|
||||
@@ -2365,7 +2368,7 @@ class circular_buffer(object):
|
||||
i = impl['begin']
|
||||
end = impl['end']
|
||||
while i < end:
|
||||
yield st[i % cap]
|
||||
yield st[self._mask(i)]
|
||||
i += 1
|
||||
|
||||
def size(self):
|
||||
@@ -2375,6 +2378,10 @@ class circular_buffer(object):
|
||||
def __len__(self):
|
||||
return self.size()
|
||||
|
||||
def __getitem__(self, item):
|
||||
impl = self.ref['_impl']
|
||||
return (impl['storage'] + self._mask(int(impl['begin']) + item)).dereference()
|
||||
|
||||
def external_memory_footprint(self):
|
||||
impl = self.ref['_impl']
|
||||
return int(impl['capacity']) * self.ref.type.template_argument(0).sizeof
|
||||
@@ -3735,6 +3742,8 @@ class scylla_gdb_func_collection_element(gdb.Function):
|
||||
return std_vector(collection)[int(key)]
|
||||
elif typ.name.startswith('std::__cxx11::list<'):
|
||||
return std_list(collection)[int(key)]
|
||||
elif typ.name.startswith('seastar::circular_buffer<'):
|
||||
return circular_buffer(collection)[int(key)]
|
||||
|
||||
raise ValueError("Unsupported container type: {}".format(typ.name))
|
||||
|
||||
|
||||
Reference in New Issue
Block a user