#include "erl_nif.h" #include "NeuralTable.h" #include // Prototypes static ERL_NIF_TERM neural_new(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[]); static ERL_NIF_TERM neural_put(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[]); static ERL_NIF_TERM neural_put_new(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[]); static ERL_NIF_TERM neural_increment(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[]); static ERL_NIF_TERM neural_unshift(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[]); static ERL_NIF_TERM neural_shift(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[]); static ERL_NIF_TERM neural_swap(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[]); static ERL_NIF_TERM neural_get(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[]); static ERL_NIF_TERM neural_delete(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[]); static ERL_NIF_TERM neural_garbage(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[]); static ERL_NIF_TERM neural_garbage_size(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[]); static ERL_NIF_TERM neural_empty(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[]); static ERL_NIF_TERM neural_drain(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[]); static ERL_NIF_TERM neural_dump(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[]); static ERL_NIF_TERM neural_key_pos(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[]); static ErlNifFunc nif_funcs[] = { {"make_table", 2, neural_new}, {"do_fetch", 2, neural_get}, {"do_delete", 2, neural_delete}, {"do_dump", 1, neural_dump}, {"do_drain", 1, neural_drain}, {"empty", 1, neural_empty}, {"insert", 3, neural_put}, {"insert_new", 3, neural_put_new}, {"do_increment", 3, neural_increment}, {"do_unshift", 3, neural_unshift}, {"do_shift", 3, neural_shift}, {"do_swap", 3, neural_swap}, {"garbage", 1, neural_garbage}, {"garbage_size", 1, neural_garbage_size}, {"key_pos", 1, neural_key_pos} }; static ERL_NIF_TERM neural_key_pos(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[]) { // This function is directly exposed, so no strict guards or patterns protecting us. if (argc != 1 || !enif_is_atom(env, argv[0])) { return enif_make_badarg(env); } return NeuralTable::GetKeyPosition(env, argv[0]); } static ERL_NIF_TERM neural_new(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[]) { return NeuralTable::MakeTable(env, argv[0], argv[1]); } static ERL_NIF_TERM neural_put(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[]) { return NeuralTable::Insert(env, argv[0], argv[1], argv[2]); } static ERL_NIF_TERM neural_put_new(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[]) { return NeuralTable::InsertNew(env, argv[0], argv[1], argv[2]); } static ERL_NIF_TERM neural_increment(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[]) { if (!enif_is_atom(env, argv[0]) || !enif_is_number(env, argv[1]) || !enif_is_list(env, argv[2])) { return enif_make_badarg(env); } return NeuralTable::Increment(env, argv[0], argv[1], argv[2]); } static ERL_NIF_TERM neural_shift(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[]) { return NeuralTable::Shift(env, argv[0], argv[1], argv[2]); } static ERL_NIF_TERM neural_unshift(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[]) { return NeuralTable::Unshift(env, argv[0], argv[1], argv[2]); } static ERL_NIF_TERM neural_swap(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[]){ return NeuralTable::Swap(env, argv[0], argv[1], argv[2]); } static ERL_NIF_TERM neural_get(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[]) { return NeuralTable::Get(env, argv[0], argv[1]); } static ERL_NIF_TERM neural_delete(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[]) { return NeuralTable::Delete(env, argv[0], argv[1]); } static ERL_NIF_TERM neural_empty(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[]) { if (!enif_is_atom(env, argv[0])) { return enif_make_badarg(env); } return NeuralTable::Empty(env, argv[0]); } static ERL_NIF_TERM neural_dump(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[]) { if (!enif_is_atom(env, argv[0])) { return enif_make_badarg(env); } return NeuralTable::Dump(env, argv[0]); } static ERL_NIF_TERM neural_drain(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[]) { if (!enif_is_atom(env, argv[0])) { return enif_make_badarg(env); } return NeuralTable::Drain(env, argv[0]); } static ERL_NIF_TERM neural_garbage(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[]) { if (!enif_is_atom(env, argv[0])) { return enif_make_badarg(env); } return NeuralTable::GarbageCollect(env, argv[0]); } static ERL_NIF_TERM neural_garbage_size(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[]) { if (!enif_is_atom(env, argv[0])) { return enif_make_badarg(env); } return NeuralTable::GarbageSize(env, argv[0]); } static void neural_resource_cleanup(ErlNifEnv* env, void* arg) { /* Delete any dynamically allocated memory stored in neural_handle */ /* neural_handle* handle = (neural_handle*)arg; */ } static int on_load(ErlNifEnv* env, void** priv_data, ERL_NIF_TERM load_info) { NeuralTable::Initialize(); return 0; } static void on_unload(ErlNifEnv *env, void *priv_data) { NeuralTable::Shutdown(); } ERL_NIF_INIT(neural, nif_funcs, &on_load, NULL, NULL, &on_unload);