sisoputnfrba / so-commons-library

TADs de uso comun en aplicaciones desarrolladas en C
http://sisoputnfrba.github.io/so-commons-library/
GNU General Public License v3.0
106 stars 174 forks source link

Reemplazar un elemento de una lista por varios al iterarla con el iterador externo #140

Closed RaniAgus closed 2 years ago

RaniAgus commented 3 years ago

Caso de uso: Tengo una lista de t_segment*s y la quiero iterar para asignar un segmento libre. Para esto, itero la lista y, cuando lo encuentro, quiero poder reemplazar ese segmento por los dos nuevos t_segmento*s que se generaron al splitear el original. Se me ocurre algo como:

void list_iterator_replace(t_list_iterator* iterator, ...);

Por ejemplo, en el caso que mencionaba:

t_segment* segment_get(t_list* segment_table, int required_size) {
    t_list_iterator* iterator = list_iterator_create(segment_table);
    while(list_iterator_has_next(iterator)) {
        t_segment* segment = list_iterator_next(iterator);
        if(segment->size > required_size) {
            t_segment* new_segment = segment_split(segment, required_size);
            list_iterator_replace(iterator, segment, new_segment);
        }
        if(segment->size == required_size) {
            list_iterator_destroy(iterator);
            return segment;
        }
    }
    list_iterator_destroy(iterator);
    return NULL;
}

El index quedaría posicionado en new_segment para que al hacer next() pase al siguiente si hiciera falta que la iteración continúe.

EDIT: Lo cerré porque se podría hacer con un add()