/* kc3
 * Copyright 2022,2023,2024 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 skiplist.h.in NAME=_NAME$ TYPE=_TYPE$ */
/**
 * @file skiplist___NAME$.h
 * @brief Skiplist of _NAME$s.
 *
 * Skiplist containing _TYPE$.
 */
#ifndef LIBKC3_SKIPLIST___NAME$_H
#define LIBKC3_SKIPLIST___NAME$_H

#include "types.h"

#define SKIPLIST_HEIGHT_TABLE___NAME$(skiplist) \
  ((t_skiplist_height *) (((s_skiplist___NAME$ *) skiplist) + 1))

#define SKIPLIST_SIZE___NAME$(max_height) \
  (sizeof(s_skiplist___NAME$) + (max_height) * sizeof(t_skiplist_height))

void
skiplist_clean___NAME$ (s_skiplist___NAME$ *skiplist);

void
skiplist_delete___NAME$ (s_skiplist___NAME$ *skiplist);

s_skiplist_node___NAME$ *
skiplist_find___NAME$ (s_skiplist___NAME$ *skiplist, const _TYPE$ value);

/* do not call directly */
s_skiplist___NAME$ *
skiplist_init___NAME$ (s_skiplist___NAME$ *skiplist, u8 max_height, f64 spacing);

s_skiplist_node___NAME$ *
skiplist_insert___NAME$ (s_skiplist___NAME$ *skiplist, const _TYPE$ value);

s_skiplist___NAME$ *
skiplist_new___NAME$ (u8 max_height, f64 spacing);

s_skiplist_node___NAME$ *
skiplist_pred___NAME$ (s_skiplist___NAME$ *skiplist, const _TYPE$ value);

u8
skiplist_random_height___NAME$ (s_skiplist___NAME$ *skiplist);

bool
skiplist_remove___NAME$ (s_skiplist___NAME$ *skiplist, const _TYPE$ value);

#endif /* LIBKC3_SKIPLIST___NAME$_H */
