Files
ljkiwi/ckiwi/ckiwi.h
John K. Luebs 84a01179cd Manage GC data better
Make sure that all cdata references for variables is tracked. This is
done by attaching finalizers to Expression and Term objects. Some
effort is made to avoid creating tracked temporary objects (esp Terms)
now.
2024-02-14 01:42:56 -06:00

103 lines
2.9 KiB
C

#ifndef CKIWI_H_
#define CKIWI_H_
#include <stddef.h>
#ifdef __cplusplus
extern "C" {
#endif
#define KIWI_REF_ISNULL(ref) ((ref).impl_ == NULL)
// LuaJIT start
enum KiwiErrKind {
KiwiErrNone,
KiwiErrUnsatisfiableConstraint = 1,
KiwiErrUnknownConstraint,
KiwiErrDuplicateConstraint,
KiwiErrUnknownEditVariable,
KiwiErrDuplicateEditVariable,
KiwiErrBadRequiredStrength,
KiwiErrInternalSolverError,
KiwiErrAlloc,
KiwiErrNullObject,
KiwiErrUnknown,
};
enum KiwiRelOp { KIWI_OP_LE, KIWI_OP_GE, KIWI_OP_EQ };
struct KiwiVarRefType;
struct KiwiConstraintRefType;
typedef struct KiwiVarRefType* KiwiVarRef;
typedef struct KiwiConstraintRefType* KiwiConstraintRef;
struct KiwiTerm {
KiwiVarRef var;
double coefficient;
};
typedef struct KiwiExpression {
double constant;
int term_count;
struct KiwiTerm terms[1]; // LuaJIT: struct KiwiTerm terms_[?];
}* KiwiExpressionPtr;
typedef const struct KiwiExpression* KiwiExpressionConstPtr;
typedef struct KiwiErr {
enum KiwiErrKind kind;
const char* message;
bool must_free;
} const* KiwiErrPtr;
struct KiwiSolver;
typedef struct KiwiSolver* KiwiSolverPtr;
KiwiVarRef kiwi_var_new(const char* name);
void kiwi_var_del(KiwiVarRef var);
KiwiVarRef kiwi_var_clone(KiwiVarRef var);
const char* kiwi_var_name(KiwiVarRef var);
void kiwi_var_set_name(KiwiVarRef var, const char* name);
double kiwi_var_value(KiwiVarRef var);
void kiwi_var_set_value(KiwiVarRef var, double value);
int kiwi_var_eq(KiwiVarRef var, KiwiVarRef other);
KiwiConstraintRef
kiwi_constraint_new(KiwiExpressionConstPtr expression, enum KiwiRelOp op, double strength);
void kiwi_constraint_del(KiwiConstraintRef constraint);
KiwiConstraintRef kiwi_constraint_clone(KiwiConstraintRef constraint);
double kiwi_constraint_strength(KiwiConstraintRef constraint);
enum KiwiRelOp kiwi_constraint_op(KiwiConstraintRef constraint);
bool kiwi_constraint_violated(KiwiConstraintRef constraint);
int kiwi_constraint_expression(KiwiConstraintRef constraint, KiwiExpressionPtr out, int out_size);
KiwiErrPtr kiwi_solver_add_constraint(KiwiSolverPtr sp, KiwiConstraintRef constraint);
KiwiErrPtr kiwi_solver_remove_constraint(KiwiSolverPtr sp, KiwiConstraintRef constraint);
bool kiwi_solver_has_constraint(KiwiSolverPtr sp, KiwiConstraintRef constraint);
KiwiErrPtr kiwi_solver_add_edit_var(KiwiSolverPtr sp, KiwiVarRef var, double strength);
KiwiErrPtr kiwi_solver_remove_edit_var(KiwiSolverPtr sp, KiwiVarRef var);
bool kiwi_solver_has_edit_var(KiwiSolverPtr sp, KiwiVarRef var);
KiwiErrPtr kiwi_solver_suggest_value(KiwiSolverPtr sp, KiwiVarRef var, double value);
void kiwi_solver_update_vars(KiwiSolverPtr sp);
void kiwi_solver_reset(KiwiSolverPtr sp);
void kiwi_solver_dump(KiwiSolverPtr sp);
char* kiwi_solver_dumps(KiwiSolverPtr sp);
KiwiSolverPtr kiwi_solver_new();
void kiwi_solver_del(KiwiSolverPtr sp);
// LuaJIT end
#ifdef __cplusplus
}
#endif
// Local Variables:
// mode: c++
// End:
#endif // CKIWI_H_