mirror of
https://github.com/lvgl/lvgl.git
synced 2026-03-23 14:03:13 +08:00
chore(gdb): add LVArray dynamic array wrapper with typed iteration
This commit is contained in:
@@ -28,6 +28,7 @@ from .lvgl import (
|
||||
LVImageHeaderCache,
|
||||
create_cache_iterator,
|
||||
LVRedBlackTree,
|
||||
LVArray,
|
||||
)
|
||||
from . import cmds as cmds
|
||||
|
||||
@@ -59,4 +60,5 @@ __all__ = [
|
||||
"LVImageCache",
|
||||
"LVImageHeaderCache",
|
||||
"create_cache_iterator",
|
||||
"LVArray",
|
||||
]
|
||||
|
||||
@@ -29,6 +29,7 @@ from .misc import (
|
||||
LVImageCache,
|
||||
LVImageHeaderCache,
|
||||
create_cache_iterator,
|
||||
LVArray,
|
||||
)
|
||||
|
||||
__all__ = [
|
||||
@@ -64,4 +65,5 @@ __all__ = [
|
||||
"LVImageCache",
|
||||
"LVImageHeaderCache",
|
||||
"create_cache_iterator",
|
||||
"LVArray",
|
||||
]
|
||||
|
||||
@@ -15,6 +15,7 @@ from .lv_cache_iter_base import LVCacheIteratorBase
|
||||
from .lv_cache_iter_factory import create_cache_iterator
|
||||
from .lv_image_cache import LVImageCache
|
||||
from .lv_image_header_cache import LVImageHeaderCache
|
||||
from .lv_array import LVArray
|
||||
|
||||
__all__ = [
|
||||
"LVList",
|
||||
@@ -37,4 +38,5 @@ __all__ = [
|
||||
"LVImageCache",
|
||||
"LVImageHeaderCache",
|
||||
"create_cache_iterator",
|
||||
"LVArray",
|
||||
]
|
||||
|
||||
52
scripts/gdb/lvglgdb/lvgl/misc/lv_array.py
Normal file
52
scripts/gdb/lvglgdb/lvgl/misc/lv_array.py
Normal file
@@ -0,0 +1,52 @@
|
||||
from typing import Union
|
||||
|
||||
import gdb
|
||||
|
||||
from lvglgdb.value import Value, ValueInput
|
||||
|
||||
|
||||
class LVArray(Value):
|
||||
"""LVGL dynamic array wrapper"""
|
||||
|
||||
def __init__(self, arr: ValueInput, element_type: Union[gdb.Type, str] = None):
|
||||
super().__init__(Value.normalize(arr, "lv_array_t"))
|
||||
self.element_type = (
|
||||
gdb.lookup_type(element_type)
|
||||
if isinstance(element_type, str)
|
||||
else element_type
|
||||
)
|
||||
|
||||
@property
|
||||
def size(self) -> int:
|
||||
return int(self.super_value("size"))
|
||||
|
||||
@property
|
||||
def capacity(self) -> int:
|
||||
return int(self.super_value("capacity"))
|
||||
|
||||
@property
|
||||
def element_size(self) -> int:
|
||||
return int(self.super_value("element_size"))
|
||||
|
||||
def __len__(self) -> int:
|
||||
return self.size
|
||||
|
||||
def _element_at(self, data: Value, index: int) -> Value:
|
||||
"""Get element at index from data pointer."""
|
||||
addr = int(data) + index * self.element_size
|
||||
val = Value(gdb.Value(addr))
|
||||
if self.element_type:
|
||||
return val.cast(self.element_type, ptr=True).dereference()
|
||||
return val
|
||||
|
||||
def __iter__(self):
|
||||
data = self.super_value("data")
|
||||
for i in range(self.size):
|
||||
yield self._element_at(data, i)
|
||||
|
||||
def __getitem__(self, index):
|
||||
if isinstance(index, str):
|
||||
return super().__getitem__(index)
|
||||
if index < 0 or index >= self.size:
|
||||
raise IndexError(f"index {index} out of range [0, {self.size})")
|
||||
return self._element_at(self.super_value("data"), index)
|
||||
Reference in New Issue
Block a user