/* Copyright (C) 2011-2020, Dirk Krause SPDX-License-Identifier: BSD-3-Clause */ /* WARNING: This file was generated by the dkct program (see http://dktools.sourceforge.net/ for details). Changes you make here will be lost if dkct is run again! You should modify the original source and run dkct on it. Original source: dk4sto.ctr */ #ifndef DK4STO_H_INCLUDED /** Avoid multiple inclusions. */ #define DK4STO_H_INCLUDED 1 #line 10 "dk4sto.ctr" /** @file Sorted and unsorted data storage in AVL trees or double linked lists. CRT on Windows: Optional. */ #ifndef DK4CONF_H_INCLUDED #if DK4_BUILDING_DKTOOLS4 #include "dk4conf.h" #else #include #endif #endif #ifndef DK4TYPES_H_INCLUDED #if DK4_BUILDING_DKTOOLS4 #include "dk4types.h" #else #include #endif #endif #ifndef DK4ERROR_H_INCLUDED #if DK4_BUILDING_DKTOOLS4 #include "dk4error.h" #else #include #endif #endif /** Evaluation result for an object. */ typedef union { double d; /**< Evaluation to double. */ float f; /**< Evaluation to float. */ long l; /**< Evaluation to long. */ unsigned long ul; /**< Evaluation to unsigned long. */ int i; /**< Evaluation to int. */ unsigned int ui; /**< Evaluation to unsigned int. */ short s; /**< Evaluation to short. */ unsigned short us; /**< Evaluation to unsigned short. */ char c; /**< Evaluation to char. */ unsigned char uc; /**< Evaluation to unsigned char. */ } dk4_object_eval_res_t; /** Internal node for dk4_sto_t. This structure is used internally by the dksto module. */ struct dk4__sto__node { struct dk4__sto__node *p; /**< Parent node in tree. */ struct dk4__sto__node *l; /**< Left child (tree) or neighbour (list). */ struct dk4__sto__node *r; /**< Right child (tree) or neighbour (list). */ void *o; /**< Object to store. */ dk4_object_eval_res_t v; /**< Object evaluation of @a o. */ short b; /**< Balance flag (used in tree only). */ short w; /**< Direction to walk. */ }; /** Internal node for dk4_sto_t. */ typedef struct dk4__sto__node dk4_sto_node_t; /** Pointer to internal node for dk4_sto_t. */ typedef dk4_sto_node_t *dk4_sto_node_p; /** Evaluation functions. These function type are used to evaluate and compare objects stored in a sorted dk4_sto_t. */ /** Object evaluation function for sorted storage. */ typedef char dk4_fct_eval_c_t(void const *obj, int crit); /** Object evaluation function for sorted storage. */ typedef unsigned char dk4_fct_eval_uc_t(void const *obj, int crit); /** Object evaluation function for sorted storage. */ typedef short dk4_fct_eval_s_t(void const *obj, int crit); /** Object evaluation function for sorted storage. */ typedef unsigned short dk4_fct_eval_us_t(void const *obj, int crit); /** Object evaluation function for sorted storage. */ typedef int dk4_fct_eval_i_t(void const *obj, int crit); /** Object evaluation function for sorted storage. */ typedef unsigned int dk4_fct_eval_ui_t(void const *obj, int crit); /** Object evaluation function for sorted storage. */ typedef long dk4_fct_eval_l_t(void const *obj, int crit); /** Object evaluation function for sorted storage. */ typedef unsigned long dk4_fct_eval_ul_t(void const *obj, int crit); /** Object evaluation function for sorted storage. */ typedef float dk4_fct_eval_f_t(void const *obj, int crit); /** Object evaluation function for sorted storage. */ typedef double dk4_fct_eval_d_t(void const *obj, int crit); /** Object comparison function for sorted storage. When comparing to objects while inserting a new object into a storage both @a o1 and @a o2 are object pointers. When this function is called from dk4sto_it_find_like() the @a o1 argument is an object pointer from the storage, @a o2 is the pointer passed to dk4sto_it_find_like(). */ typedef int dk4_fct_comp_t(void const *o1, void const *o2, int crit); /** Choice for object evaluation function. */ typedef union { dk4_fct_eval_c_t *c; /**< Evaluate to char. */ dk4_fct_eval_uc_t *uc; /**< Evaluate to unsigned char. */ dk4_fct_eval_s_t *s; /**< Evaluate to short. */ dk4_fct_eval_us_t *us; /**< Evaluate to unsigned short. */ dk4_fct_eval_i_t *i; /**< Evaluate to int. */ dk4_fct_eval_ui_t *ui; /**< Evaluate to unsigned int. */ dk4_fct_eval_l_t *l; /**< Evaluate to long. */ dk4_fct_eval_ul_t*ul; /**< Evaluate to unsigned long. */ dk4_fct_eval_f_t *f; /**< Evaluate to float. */ dk4_fct_eval_d_t *d; /**< Evaluate to double. */ dk4_fct_comp_t *comp; /**< Compare two objects. */ } dk4_object_eval_fct_t; /** Object storage. A storage can be used to store pointers to objects. */ typedef struct dk4__sto__t { dk4_object_eval_fct_t e; /**< Comparison or evaluation function. */ dk4_sto_node_p *d; /**< Critical path for delete operations. */ dk4_sto_node_t *r; /**< Tree root or start of list. */ void *i; /**< Double-linked list of iterators. */ int h; /**< Selection for comparison or evaluation. */ int c; /**< Comparison or evaluation criteria. */ int t; /**< Flag: Use tree, 1=tree, 0=list. */ short l; /**< Path length of critical path. */ } dk4_sto_t; /** Storage iterator. This structure can be used to iterate through a dk4_sto_t. */ struct dk4__sto__iterator { struct dk4__sto__iterator *l; /**< Left neighbour (preceeding iterator). */ struct dk4__sto__iterator *r; /**< Right neighbour (following iterator). */ dk4_sto_t *s; /**< Owner storage. */ dk4_sto_node_t *c; /**< Current node, current position. */ }; /** Storage iterator. Can be used to iterate through a dk4_sto_t. */ typedef struct dk4__sto__iterator dk4_sto_it_t; #ifdef __cplusplus extern "C" { #endif /** Create new storage. @param erp Error report, may be NULL. @return Pointer to new storage on succcess, NULL on error. Use dk4sto_close() to destroy the storage when done with it. Error codes: - DK4_E_INVALID_ARGUMENTS
if elsize or nelem is 0, - DK4_E_MATH_OVERFLOW
on numeric overflow when calculating the product of elsize and nelem, - DK4_E_MEMORY_ALLOCATION_FAILED
with mem.elsize and mem.nelem set if there is not enough memory available. */ dk4_sto_t * dk4sto_open(dk4_er_t *erp); /** Destroy storage, release memory. @param st Storage to destroy. */ void dk4sto_close(dk4_sto_t *st); /** Remove all pointers from a storage. @param st Storage. */ void dk4sto_remove_all(dk4_sto_t *st); /** Remove one pointer from storage. Warning: Do not use dk4sto_it_next() on any iterator of the storage after removing data from a storage. Reset the iterator! @param st Storage. @param o Object pointer to remove. @param erp Error report, may be NULL. @return 1 on success, 0 on error (not found). Error codes: - DK4_E_INVALID_ARGUMENTS
if st or o is NULL, - DK4_E_NOT_FOUND if o was not found in st. */ int dk4sto_remove(dk4_sto_t *st, void *o, dk4_er_t *erp); /** Add object pointer to storage. @param st Storage. @param o Object pointer to add. @param erp Error report, may be NULL. @return 1 on success, 0 on error (not enough memory). Error codes: - DK4_E_INVALID_ARGUMENTS
if st or os is NULL, - DK4_E_MEMORY_ALLOCATION_FAILED
with mem.elsize and mem.nelem set if there is not enough memory available. */ int dk4sto_add(dk4_sto_t *st, void *o, dk4_er_t *erp); /** Create iterator for storage. @param st Storage. @param erp Error report, may be NULL. @return Pointer to new iterator on success, NULL on error. Use dk4sto_it_close() to destroy the iterator when done with it. When closing/destroying a storage all iterators for that storage are destroyed automatically. Error codes: - DK4_E_INVALID_ARGUMENTS
if st is NULL, - DK4_E_MEMORY_ALLOCATION_FAILED
with mem.elsize and mem.nelem set if there is not enough memory available. */ dk4_sto_it_t * dk4sto_it_open(dk4_sto_t *st, dk4_er_t *erp); /** Destroy iterator. @param it Iterator to destroy. */ void dk4sto_it_close(dk4_sto_it_t *it); /** Reset iterator (next call to dk4sto_it_next() will return the first object pointer. @param it Iterator. */ void dk4sto_it_reset(dk4_sto_it_t *it); /** Return next object pointer. @param it Iterator. @return Pointer to next object on success, NULL on error (no more pointers available). */ void * dk4sto_it_next(dk4_sto_it_t *it); /** Find a pointer exactly. @param i Iterator. @param o Object pointer. @return Object pointer on success, NULL on error (object not found). The next calls to dk4sto_it_next() will return pointers to objects after the specified object \a o. */ void * dk4sto_it_find_exact(dk4_sto_it_t *i, void const *o); /** Find object pointer for object evaluating equally to \a o. @param i Iterator. @param o Object pointer. @param cr Comparison criteria. @return Object pointer on success, NULL on error (no such object). */ void * dk4sto_it_find_like(dk4_sto_it_t *i, void const *o, int cr); /** Set evaluation function. @param st Storage. @param f Function evaluating a pointer to a char. @param cr Evaluation criteria. @return 1 on success, 0 on error. */ int dk4sto_set_eval_c(dk4_sto_t *st, dk4_fct_eval_c_t *f, int cr); /** Set evaluation function. @param st Storage. @param f Function evaluating a pointer to an unsigned char. @param cr Evaluation criteria. @return 1 on success, 0 on error. */ int dk4sto_set_eval_uc(dk4_sto_t *st, dk4_fct_eval_uc_t *f, int cr); /** Set evaluation function. @param st Storage. @param f Function evaluating a pointer to a short. @param cr Evaluation criteria. @return 1 on success, 0 on error. */ int dk4sto_set_eval_s(dk4_sto_t *st, dk4_fct_eval_s_t *f, int cr); /** Set evaluation function. @param st Storage. @param f Function evaluating a pointer to an unsigned short. @param cr Evaluation criteria. @return 1 on success, 0 on error. */ int dk4sto_set_eval_us(dk4_sto_t *st, dk4_fct_eval_us_t *f, int cr); /** Set evaluation function. @param st Storage. @param f Function evaluating a pointer to an int. @param cr Evaluation criteria. @return 1 on success, 0 on error. */ int dk4sto_set_eval_i(dk4_sto_t *st, dk4_fct_eval_i_t *f, int cr); /** Set evaluation function. @param st Storage. @param f Function evaluating a pointer to an unsigned int. @param cr Evaluation criteria. @return 1 on success, 0 on error. */ int dk4sto_set_eval_ui(dk4_sto_t *st, dk4_fct_eval_ui_t *f, int cr); /** Set evaluation function. @param st Storage. @param f Function evaluating a pointer to a long. @param cr Evaluation criteria. @return 1 on success, 0 on error. */ int dk4sto_set_eval_l(dk4_sto_t *st, dk4_fct_eval_l_t *f, int cr); /** Set evaluation function. @param st Storage. @param f Function evaluating a pointer to an unsigned long. @param cr Evaluation criteria. @return 1 on success, 0 on error. */ int dk4sto_set_eval_ul(dk4_sto_t *st, dk4_fct_eval_ul_t *f, int cr); /** Set evaluation function. @param st Storage. @param f Function evaluating a pointer to a float. @param cr Evaluation criteria. @return 1 on success, 0 on error. */ int dk4sto_set_eval_f(dk4_sto_t *st, dk4_fct_eval_f_t *f, int cr); /** Set evaluation function. @param st Storage. @param f Function evaluating a pointer to a double. @param cr Evaluation criteria. @return 1 on success, 0 on error. */ int dk4sto_set_eval_d(dk4_sto_t *st, dk4_fct_eval_d_t *f, int cr); /** Set comparison function. @param st Storage. @param f Function comparing two object pointers. @param cr Comparison criteria. @return 1 on success, 0 on error. */ int dk4sto_set_comp(dk4_sto_t *st, dk4_fct_comp_t *f, int cr); /** Allow use of tree structures. This function must be called before adding any data. @param st Storage. @param ok Flag: Trees may be used. @return 1 on success, 0 on error. */ int dk4sto_use_trees(dk4_sto_t *st,int ok); /** Find object pointer at the trees root. @param s Storage. */ void * dk4sto_find_root(dk4_sto_t const *s); /** Find object pointer for the parent node of the last found object. @param i Iterator. @return Object pointer on success, NULL on error. */ void * dk4sto_it_find_parent(dk4_sto_it_t const *i); /** Find object pointer for node on left child of the last found object. @param i Iterator. @return Object pointer on success, NULL on error. */ void * dk4sto_it_find_left(dk4_sto_it_t const *i); /** Find object pointer for node on right child of the last found object. @param i Iterator. @return Object pointer on success, NULL on error. */ void * dk4sto_it_find_right(dk4_sto_it_t const *i); /** Find object pointer at the trees root. @param i Iterator. */ void * dk4sto_it_find_root(dk4_sto_it_t const *i); #ifdef __cplusplus } #endif #endif