erlang各种有用的函数包括一些有用nif封装,还有一些性能测试case。
Nelze vybrat více než 25 témat Téma musí začínat písmenem nebo číslem, může obsahovat pomlčky („-“) a může být dlouhé až 35 znaků.
 
 
 
 
 
 

134 řádky
5.2 KiB

#include "erl_nif.h"
#include "NeuralTable.h"
#include <stdio.h>
// 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);