/* kc3
 * Copyright from 2022 to 2025 kmx.io <contact@kmx.io>
 *
 * Permission is hereby granted to use this software granted the above
 * copyright notice and this permission paragraph are included in all
 * copies and substantial portions of this software.
 *
 * THIS SOFTWARE IS PROVIDED "AS-IS" WITHOUT ANY GUARANTEE OF
 * PURPOSE AND PERFORMANCE. IN NO EVENT WHATSOEVER SHALL THE
 * AUTHOR BE CONSIDERED LIABLE FOR THE USE AND PERFORMANCE OF
 * THIS SOFTWARE.
 */
/* Gen from set.h.in NAME=_NAME$ TYPE=_TYPE$ */
#ifndef LIBKC3_SET___NAME$_H
#define LIBKC3_SET___NAME$_H

#include "types.h"

/* Stack-allocation compatible functions, call set_clean___NAME$
   after use. */

void
set_clean___NAME$ (s_set___NAME$ *set);

s_set___NAME$ *
set_init___NAME$ (s_set___NAME$ *set, uw max);

/* Observers. */

s_set_item___NAME$ *
set_get___NAME$ (const s_set___NAME$ *set, const _TYPE$ data);

s_set_item___NAME$ *
set_get_h___NAME$ (const s_set___NAME$ *set, const _TYPE$ data, uw hash);

s_set_item___NAME$ *
set_get_hash___NAME$ (const s_set___NAME$ *set, uw hash);

s_set_item___NAME$ *
set_get_hash_next___NAME$ (const s_set_item___NAME$ *item);

bool *
set_has___NAME$ (const s_set___NAME$ *set,
                 const _TYPE$ data,
                 bool *dest);

/* Operators. */

s_set_item___NAME$ *
set_add___NAME$ (s_set___NAME$ *set, _TYPE$ data);

s_set_item___NAME$ *
set_add_collision___NAME$ (s_set___NAME$ *set, _TYPE$ data, uw hash, s_set_item___NAME$ *item);

s_set_item___NAME$ *
set_add_h___NAME$ (s_set___NAME$ *set, _TYPE$ data, uw hash);

bool
set_remove___NAME$ (s_set___NAME$ *set, const _TYPE$ data);

void
set_remove_all___NAME$ (s_set___NAME$ *set);

bool
set_remove_item___NAME$ (s_set___NAME$ *set, s_set_item___NAME$ *item);

s_set___NAME$ *
set_resize___NAME$ (s_set___NAME$ *set, uw max);

#endif /* LIBKC3_SET___NAME$_H */
