#ifndef _ELEM_H_
#define _ELEM_H_
#ifndef _NUMB_H_
#error "Need to include numb.h before elem.h"
#endif
#ifdef __cplusplus
extern "C" {
#endif
enum element_type
{
ELEM_ERR = 0, ELEM_FREE, ELEM_NUMB, ELEM_STRG, ELEM_NAME
};
typedef enum element_type ElemType;
typedef struct element Elem;
#define ELEM_NULL ((Elem*)0)
extern void elem_init(void);
extern void elem_exit(void);
extern Elem* elem_new_numb(Numb const* n) expects_NONNULL returns_NONNULL;
extern Elem* elem_new_strg(char const* s) expects_NONNULL returns_NONNULL;
extern Elem* elem_new_name(char const* s) expects_NONNULL returns_NONNULL;
extern void elem_free(Elem* elem) expects_NONNULL;
extern bool elem_is_valid(Elem const* elem) is_PURE;
extern Elem* elem_copy(Elem const* elem) expects_NONNULL returns_NONNULL;
extern bool elem_cmp(Elem const* elem_a, Elem const* elem_b) expects_NONNULL;
extern ElemType elem_get_type(Elem const* elem) expects_NONNULL is_PURE;
extern Numb const* elem_get_numb(Elem const* elem) expects_NONNULL returns_NONNULL is_PURE;
extern char const* elem_get_strg(Elem const* elem) expects_NONNULL returns_NONNULL is_PURE;
extern char const* elem_get_name(Elem const* elem) expects_NONNULL returns_NONNULL is_PURE;
extern void elem_print(FILE* fp, Elem const* elem, bool use_quotes) expects_NONNULL;
extern unsigned int elem_hash(Elem const* elem) expects_NONNULL is_PURE;
extern char* elem_tostr(Elem const* elem) expects_NONNULL returns_NONNULL;
#ifdef __cplusplus
}
#endif
#endif