Allow getting solver errors returned rather than raising error. The API allows setting a mask of which error kinds raise vs return. Also add some convenience methods: - `add_to` and `remove_from` constraint methods to solver. - add and remove multiple constraints and edit/suggest variables at once
102 lines
3.0 KiB
C
102 lines
3.0 KiB
C
#ifndef KIWI_CKIWI_H_
|
|
#define KIWI_CKIWI_H_
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#else
|
|
#include <stdbool.h>
|
|
#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 };
|
|
|
|
typedef struct KiwiVarRefType* KiwiVarRef;
|
|
typedef struct KiwiConstraintRefType* KiwiConstraintRef;
|
|
|
|
typedef struct KiwiTerm {
|
|
KiwiVarRef var;
|
|
double coefficient;
|
|
} KiwiTerm;
|
|
|
|
typedef struct KiwiExpression {
|
|
double constant;
|
|
int term_count;
|
|
KiwiTerm terms[1]; // LuaJIT: struct KiwiTerm terms_[?];
|
|
} KiwiExpression;
|
|
|
|
typedef struct KiwiErr {
|
|
enum KiwiErrKind kind;
|
|
const char* message;
|
|
bool must_free;
|
|
} KiwiErr;
|
|
|
|
typedef struct KiwiSolver
|
|
KiwiSolver; // LuaJIT: typedef struct { unsigned error_mask; } KiwiSolver;
|
|
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);
|
|
|
|
void kiwi_expression_del_vars(KiwiExpression* expr);
|
|
|
|
KiwiConstraintRef kiwi_constraint_new(
|
|
const KiwiExpression* lhs,
|
|
const KiwiExpression* rhs,
|
|
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, KiwiExpression* out, int out_size);
|
|
|
|
KiwiSolver* kiwi_solver_new(unsigned error_mask);
|
|
void kiwi_solver_del(KiwiSolver* s);
|
|
|
|
const KiwiErr* kiwi_solver_add_constraint(KiwiSolver* sp, KiwiConstraintRef constraint);
|
|
const KiwiErr* kiwi_solver_remove_constraint(KiwiSolver* sp, KiwiConstraintRef constraint);
|
|
bool kiwi_solver_has_constraint(const KiwiSolver* sp, KiwiConstraintRef constraint);
|
|
const KiwiErr* kiwi_solver_add_edit_var(KiwiSolver* sp, KiwiVarRef var, double strength);
|
|
const KiwiErr* kiwi_solver_remove_edit_var(KiwiSolver* sp, KiwiVarRef var);
|
|
bool kiwi_solver_has_edit_var(const KiwiSolver* sp, KiwiVarRef var);
|
|
const KiwiErr* kiwi_solver_suggest_value(KiwiSolver* sp, KiwiVarRef var, double value);
|
|
void kiwi_solver_update_vars(KiwiSolver* sp);
|
|
void kiwi_solver_reset(KiwiSolver* sp);
|
|
void kiwi_solver_dump(const KiwiSolver* sp);
|
|
char* kiwi_solver_dumps(const KiwiSolver* sp);
|
|
|
|
// LuaJIT end
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
// Local Variables:
|
|
// mode: c++
|
|
// End:
|
|
#endif // KIWI_CKIWI_H_
|