/* * block_list.h -- Implementa las listas de bloques. * Copyright (C) 2018 Juan MarĂ­n Noguera * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ /** * \file block_list.h Implementa las listas de bloques. */ #ifndef __BLOCK_LIST_H #define __BLOCK_LIST_H #include "block.h" #include "screen.h" /** Representa un nodo de la lista de bloques. Usado para iterar sobre esta. */ typedef struct BlockNode *BlockNode; /** Representa una lista de bloques. */ typedef struct BlockList *BlockList; /** * \brief Crea una lista vacía de bloques. * \return Una nueva lista vacía de bloques. */ BlockList block_list_create(); /** * \brief Libera una lista de bloques, junto con todos sus elementos. * \param bl La lista de bloques a liberar. * \remarks Si la lista es liberada, todo iterador sobre ella dejará de * ser válido (ver block_list_begin). */ void block_list_free(BlockList bl); /** * \brief Devuelve un iterador para la lista, que apunta al primer elemento de * esta (si existe). * \param bl La lista sobre la que iterar. * \return Iterador de la lista apuntando al primer elemento. Si la lista * está vacía, el iterador apunta al final (ver block_list_isend). */ BlockNode block_list_begin(BlockList bl); /** * \brief Devuelve el bloque apuntado por un iterador de lista de bloques. * \param bn El iterador. * \return El elemento actual al que apunta el iterador. */ Block block_list_current(BlockNode bn); /** * \brief Devuelve un iterador que apunta al elemento siguiente al que apunta * este. * \param bn El iterador. * \return Un iterador al siguiente elemento. * \remarks No se debe liberar el apuntador anterior al reemplazarlo por el * nuevo (ni en ningún otro caso). Si bn apunta al último * elemento, el iterador devuelto apuntará al final (ver * block_list_isend). */ BlockNode block_list_next(BlockNode bn); /** * \brief Elimina de la lista el elemento actual al que apunta el iterador (el * devuelto por block_list_current), liberándolo. * \param bn El iterador. * \remarks Tras llamar a esta función, el iterador apuntará al * elemento siguiente al que apuntaba. */ void block_list_delete(BlockNode bn); /** * \brief Elimina de la lista el elemento actual al que apunta el iterador (el * devuelto por block_list_current), pero sin liberar la memoria ocupada por * el bloque en sí. * \param bn El iterador. * \remarks Tras llamar a esta función, el iterador apuntará al * elemento siguiente al que apuntaba. */ void block_list_delete_preserving(BlockNode bn); /** * \brief Comprueba si el apuntador pasado como parámetro apunta al * final. * \param bn El iterador. * \return Un valor distinto de 0 si el elemento es el final, o 0 si no lo es. * \remarks Es un error llamar a block_list_current, block_list_next o * block_list_delete con un iterador que apunta al final, pues es como si * apuntase al elemento posterior al último. */ int block_list_isend(BlockNode bn); /** * \brief Comprueba si la lista de bloques es vacía. * \param bl La lista a comprobar. * \return Un valor distinto de 0 si la lista es vacía, o 0 si no lo es. */ int block_list_isempty(BlockList bl); /** * \brief Añade un elemento al final de la lista. * \param bl La lista en la que añadir el elemento. * \param e El elemento a añadir. */ void block_list_append(BlockList bl, Block e); /** * \brief Ordena una lista de bloques según la coordenada horizontal de * los bloques. * \param bl La lista de bloques a ordenar. * \return La lista de bloques ordenada. * \remarks Esta función libera la memoria ocupada por la lista de * bloques que se le pasa como parámetro, salvo la correspondiente a los * bloques en sí, que pasa a ser accesible desde la lista de bloques * devuelta. La función asume que la coordenada horizontal de todos los * bloques es mayor o igual a cero; de lo contrario la lista devuelta * podrí no estar bien ordenada. */ BlockList block_list_sort(BlockList bl); /** * \brief Dibuja todos los elementos de la lista de bloques, suponiendo que * están ordenados por posición en el mundo de izquierda y derecha * y eliminando los elementos que quedan a la izquierda del área visible * del mundo. * \param bl La lista de bloques. * \param scr La ventana sobre la que dibujar los bloques. * \param scroll La distnacia en píxeles desde la parte izquierda del * mundo hasta la parte izquierda de la ventana. */ void block_list_render(Screen scr, BlockList bl, int scroll); #endif // __BLOCK_LIST_H