You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

194 lines
4.9 KiB
C

1 year ago
/*
* linked_list.h
*
* Copyright 2013-2018 Michael Zillgith
*
* This file is part of libIEC61850.
*
* libIEC61850 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.
*
* libIEC61850 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 libIEC61850. If not, see <http://www.gnu.org/licenses/>.
*
* See COPYING file for the complete license text.
*/
#ifndef LINKED_LIST_H_
#define LINKED_LIST_H_
#include "libiec61850_common_api.h"
#ifdef __cplusplus
extern "C" {
#endif
/**
* \addtogroup common_api_group
*/
/**@{*/
/**
* \defgroup LINKED_LIST LinkedList data type definition and handling functions
*/
/**@{*/
struct sLinkedList {
void* data;
struct sLinkedList* next;
};
/**
* \brief Reference to a linked list or to a linked list element.
*/
typedef struct sLinkedList* LinkedList;
/**
* \brief Create a new LinkedList object
*
* \return the newly created LinkedList instance
*/
LIB61850_API LinkedList
LinkedList_create(void);
/**
* \brief Delete a LinkedList object
*
* This function destroy the LinkedList object. It will free all data structures used by the LinkedList
* instance. It will call free for all elements of the linked list. This function should only be used if
* simple objects (like dynamically allocated strings) are stored in the linked list.
*
* \param self the LinkedList instance
*/
LIB61850_API void
LinkedList_destroy(LinkedList self);
typedef void (*LinkedListValueDeleteFunction) (void*);
/**
* \brief Delete a LinkedList object
*
* This function destroy the LinkedList object. It will free all data structures used by the LinkedList
* instance. It will call a user provided function for each data element. This user provided function is
* responsible to properly free the data element.
*
* \param self the LinkedList instance
* \param valueDeleteFunction a function that is called for each data element of the LinkedList with the pointer
* to the linked list data element.
*/
LIB61850_API void
LinkedList_destroyDeep(LinkedList self, LinkedListValueDeleteFunction valueDeleteFunction);
/**
* \brief Delete a LinkedList object without freeing the element data
*
* This function should be used statically allocated data objects are stored in the LinkedList instance.
* Other use cases would be if the data elements in the list should not be deleted.
*
* \param self the LinkedList instance
*/
LIB61850_API void
LinkedList_destroyStatic(LinkedList self);
/**
* \brief Add a new element to the list
*
* This function will add a new data element to the list. The new element will the last element in the
* list.
*
* \param self the LinkedList instance
* \param data data to append to the LinkedList instance
*/
LIB61850_API void
LinkedList_add(LinkedList self, void* data);
/**
* \brief Check if the specified data is contained in the list
*
* \param self the LinkedList instance
* \param data data to remove from the LinkedList instance
*
* \return true if data is part of the list, false otherwise
*/
LIB61850_API bool
LinkedList_contains(LinkedList self, void* data);
/**
* \brief Removed the specified element from the list
*
* \param self the LinkedList instance
* \param data data to remove from the LinkedList instance
*
* \return true if data has been removed from the list, false otherwise
*/
LIB61850_API bool
LinkedList_remove(LinkedList self, void* data);
/**
* \brief Get the list element specified by index (starting with 0).
*
* \param self the LinkedList instance
* \param index index of the requested element.
*/
LIB61850_API LinkedList
LinkedList_get(LinkedList self, int index);
/**
* \brief Get the next element in the list (iterator).
*
* \param self the LinkedList instance
*/
LIB61850_API LinkedList
LinkedList_getNext(LinkedList self);
/**
* \brief Get the last element in the list.
*
* \param listElement the LinkedList instance
*/
LIB61850_API LinkedList
LinkedList_getLastElement(LinkedList self);
/**
* \brief Insert a new element int the list
*
* \param listElement the LinkedList instance
*/
LIB61850_API LinkedList
LinkedList_insertAfter(LinkedList listElement, void* data);
/**
* \brief Get the size of the list
*
* \param self the LinkedList instance
*
* \return number of data elements stored in the list
*/
LIB61850_API int
LinkedList_size(LinkedList self);
LIB61850_API void*
LinkedList_getData(LinkedList self);
LIB61850_API void
LinkedList_printStringList(LinkedList self);
/**@}*/
/**@}*/
#ifdef __cplusplus
}
#endif
#endif /* LINKED_LIST_H_ */