Indexes all fields in the `Structure` starting with the given
        *index* and returns the :class:`Index` after the last :class:`Field`
        in the `Structure`.

        :param Index index: start :class:`Index` for the first :class:`Field`
            in the `Structure`.
        :keyword bool nested: if ``True`` all :class:`Pointer` fields of the
            `Structure` indexes their referenced :attr:`~Pointer.data` object
            fields as well (chained method call).

def index_fields(self, index=Index(), **options):
        """ Indexes all fields in the `Structure` starting with the given
        *index* and returns the :class:`Index` after the last :class:`Field`
        in the `Structure`.

        :param Index index: start :class:`Index` for the first :class:`Field`
            in the `Structure`.
        :keyword bool nested: if ``True`` all :class:`Pointer` fields of the
            `Structure` indexes their referenced :attr:`~Pointer.data` object
            fields as well (chained method call).
        """
        for name, item in self.items():
            # Container
            if is_container(item):
                index = item.index_fields(index, **options)
            # Pointer
            elif is_pointer(item) and get_nested(options):
                index = item.index_field(index)
                item.index_data()
            # Field
            elif is_field(item):
                index = item.index_field(index)
            else:
                raise MemberTypeError(self, item, name, index)
        return index