/* c3
 * Copyright 2022 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 SKIPLIST___NAME$_H
#define SKIPLIST___NAME$_H

#include "types.h"

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

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

#define SKIPLIST_INIT_ALLOCA___NAME$(max_height, spacing) \
  (skiplist_init___NAME$(alloca(SKIPLIST_SIZE___NAME$(max_height)), \
                         (max_height), (spacing)))

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, _TYPE$ value);

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, _TYPE$ value);

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

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

u8
skiplist_random_height___NAME$ (s_skiplist___NAME$ *skiplist);

e_bool
skiplist_remove___NAME$ (s_skiplist___NAME$ *skiplist, _TYPE$ value);

#endif /* SKIPLIST___NAME$_H */
