/*
 * pbxb64/hlib.h - Public C interface to PBXB64 native H-Lib containers.
 *
 * This header is designed to be parsable by PBXB64's own C frontend as well
 * as by MinGW/GCC.  It only exposes a small, concrete subset of the container
 * surface; the full machine-generated prototypes are in the c_hlib runtime
 * headers (c_hlib_*.h) which are compiled by MinGW, not by PBXB64's C frontend.
 */

#ifndef PBXB64_HLIB_H
#define PBXB64_HLIB_H

#include <stdint.h>

#ifdef __cplusplus
extern "C" {
#endif

/* ============================================================================
 * Opaque container handle
 * ============================================================================ */

typedef void* c_hlib_lnarr_t;
typedef void* c_hlib_lnstk_t;
typedef void* c_hlib_lnque_t;
typedef void* c_hlib_lnlst_t;

/* ============================================================================
 * Long array (LnArr)
 * ============================================================================ */

c_hlib_lnarr_t c_hlib_lnarr_new(void);
void           c_hlib_lnarr_final(c_hlib_lnarr_t a);
int32_t        c_hlib_lnarr_count(c_hlib_lnarr_t a);
void           c_hlib_lnarr_add(c_hlib_lnarr_t a, int32_t value);
void           c_hlib_lnarr_set(c_hlib_lnarr_t a, int32_t index, int32_t value);
int32_t        c_hlib_lnarr_get(c_hlib_lnarr_t a, int32_t index);
int32_t        c_hlib_lnarr_contains(c_hlib_lnarr_t a, int32_t value);

/* ============================================================================
 * Long stack (LnStk)
 * ============================================================================ */

c_hlib_lnstk_t c_hlib_lnstk_new(void);
void           c_hlib_lnstk_final(c_hlib_lnstk_t s);
int32_t        c_hlib_lnstk_count(c_hlib_lnstk_t s);
void           c_hlib_lnstk_push(c_hlib_lnstk_t s, int32_t value);
int32_t        c_hlib_lnstk_peek(c_hlib_lnstk_t s);
int32_t        c_hlib_lnstk_pop(c_hlib_lnstk_t s);

/* ============================================================================
 * Long queue (LnQue)
 * ============================================================================ */

c_hlib_lnque_t c_hlib_lnque_new(void);
void           c_hlib_lnque_final(c_hlib_lnque_t q);
int32_t        c_hlib_lnque_count(c_hlib_lnque_t q);
void           c_hlib_lnque_push(c_hlib_lnque_t q, int32_t value);
int32_t        c_hlib_lnque_peek(c_hlib_lnque_t q);
int32_t        c_hlib_lnque_pop(c_hlib_lnque_t q);

/* ============================================================================
 * Long list (LnLst)
 * ============================================================================ */

c_hlib_lnlst_t c_hlib_lnlst_new(void);
void           c_hlib_lnlst_final(c_hlib_lnlst_t l);
int32_t        c_hlib_lnlst_count(c_hlib_lnlst_t l);
void           c_hlib_lnlst_add(c_hlib_lnlst_t l, int32_t value);
void*          c_hlib_lnlst_first(c_hlib_lnlst_t l);
void*          c_hlib_lnlst_next(void* node);
int32_t        c_hlib_lnlst_get(void* node);
void           c_hlib_lnlst_set(void* node, int32_t value);
int32_t        c_hlib_lnlst_contains(c_hlib_lnlst_t l, int32_t value);

#ifdef __cplusplus
}
#endif

#endif /* PBXB64_HLIB_H */
