from hachoir.field import Field, FieldSet, ParserError class GenericVector(FieldSet): def __init__(self, parent, name, nb_items, item_class, item_name="item", description=None): # Sanity checks assert issubclass(item_class, Field) assert isinstance(item_class.static_size, int) if not (0 < nb_items): raise ParserError('Unable to create empty vector "%s" in %s' % (name, parent.path)) size = nb_items * item_class.static_size self.__nb_items = nb_items self._item_class = item_class self._item_name = item_name FieldSet.__init__(self, parent, name, description, size=size) def __len__(self): return self.__nb_items def createFields(self): name = self._item_name + "[]" parser = self._item_class for index in range(len(self)): yield parser(self, name) class UserVector(GenericVector): """ To implement: - item_name: name of a field without [] (eg. "color" becomes "color[0]"), default value is "item" - item_class: class of an item """ item_class = None item_name = "item" def __init__(self, parent, name, nb_items, description=None): GenericVector.__init__(self, parent, name, nb_items, self.item_class, self.item_name, description)