erlang各种有用的函数包括一些有用nif封装,还有一些性能测试case。
Du kannst nicht mehr als 25 Themen auswählen Themen müssen entweder mit einem Buchstaben oder einer Ziffer beginnen. Sie können Bindestriche („-“) enthalten und bis zu 35 Zeichen lang sein.

134 Zeilen
5.2 KiB

vor 5 Jahren
  1. #include "erl_nif.h"
  2. #include "NeuralTable.h"
  3. #include <stdio.h>
  4. // Prototypes
  5. static ERL_NIF_TERM neural_new(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[]);
  6. static ERL_NIF_TERM neural_put(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[]);
  7. static ERL_NIF_TERM neural_put_new(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[]);
  8. static ERL_NIF_TERM neural_increment(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[]);
  9. static ERL_NIF_TERM neural_unshift(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[]);
  10. static ERL_NIF_TERM neural_shift(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[]);
  11. static ERL_NIF_TERM neural_swap(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[]);
  12. static ERL_NIF_TERM neural_get(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[]);
  13. static ERL_NIF_TERM neural_delete(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[]);
  14. static ERL_NIF_TERM neural_garbage(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[]);
  15. static ERL_NIF_TERM neural_garbage_size(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[]);
  16. static ERL_NIF_TERM neural_empty(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[]);
  17. static ERL_NIF_TERM neural_drain(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[]);
  18. static ERL_NIF_TERM neural_dump(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[]);
  19. static ERL_NIF_TERM neural_key_pos(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[]);
  20. static ErlNifFunc nif_funcs[] =
  21. {
  22. {"make_table", 2, neural_new},
  23. {"do_fetch", 2, neural_get},
  24. {"do_delete", 2, neural_delete},
  25. {"do_dump", 1, neural_dump},
  26. {"do_drain", 1, neural_drain},
  27. {"empty", 1, neural_empty},
  28. {"insert", 3, neural_put},
  29. {"insert_new", 3, neural_put_new},
  30. {"do_increment", 3, neural_increment},
  31. {"do_unshift", 3, neural_unshift},
  32. {"do_shift", 3, neural_shift},
  33. {"do_swap", 3, neural_swap},
  34. {"garbage", 1, neural_garbage},
  35. {"garbage_size", 1, neural_garbage_size},
  36. {"key_pos", 1, neural_key_pos}
  37. };
  38. static ERL_NIF_TERM neural_key_pos(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[]) {
  39. // This function is directly exposed, so no strict guards or patterns protecting us.
  40. if (argc != 1 || !enif_is_atom(env, argv[0])) { return enif_make_badarg(env); }
  41. return NeuralTable::GetKeyPosition(env, argv[0]);
  42. }
  43. static ERL_NIF_TERM neural_new(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[]) {
  44. return NeuralTable::MakeTable(env, argv[0], argv[1]);
  45. }
  46. static ERL_NIF_TERM neural_put(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[]) {
  47. return NeuralTable::Insert(env, argv[0], argv[1], argv[2]);
  48. }
  49. static ERL_NIF_TERM neural_put_new(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[]) {
  50. return NeuralTable::InsertNew(env, argv[0], argv[1], argv[2]);
  51. }
  52. static ERL_NIF_TERM neural_increment(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[]) {
  53. if (!enif_is_atom(env, argv[0]) || !enif_is_number(env, argv[1]) || !enif_is_list(env, argv[2])) {
  54. return enif_make_badarg(env);
  55. }
  56. return NeuralTable::Increment(env, argv[0], argv[1], argv[2]);
  57. }
  58. static ERL_NIF_TERM neural_shift(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[]) {
  59. return NeuralTable::Shift(env, argv[0], argv[1], argv[2]);
  60. }
  61. static ERL_NIF_TERM neural_unshift(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[]) {
  62. return NeuralTable::Unshift(env, argv[0], argv[1], argv[2]);
  63. }
  64. static ERL_NIF_TERM neural_swap(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[]){
  65. return NeuralTable::Swap(env, argv[0], argv[1], argv[2]);
  66. }
  67. static ERL_NIF_TERM neural_get(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[]) {
  68. return NeuralTable::Get(env, argv[0], argv[1]);
  69. }
  70. static ERL_NIF_TERM neural_delete(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[]) {
  71. return NeuralTable::Delete(env, argv[0], argv[1]);
  72. }
  73. static ERL_NIF_TERM neural_empty(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[]) {
  74. if (!enif_is_atom(env, argv[0])) { return enif_make_badarg(env); }
  75. return NeuralTable::Empty(env, argv[0]);
  76. }
  77. static ERL_NIF_TERM neural_dump(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[]) {
  78. if (!enif_is_atom(env, argv[0])) { return enif_make_badarg(env); }
  79. return NeuralTable::Dump(env, argv[0]);
  80. }
  81. static ERL_NIF_TERM neural_drain(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[]) {
  82. if (!enif_is_atom(env, argv[0])) { return enif_make_badarg(env); }
  83. return NeuralTable::Drain(env, argv[0]);
  84. }
  85. static ERL_NIF_TERM neural_garbage(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[]) {
  86. if (!enif_is_atom(env, argv[0])) { return enif_make_badarg(env); }
  87. return NeuralTable::GarbageCollect(env, argv[0]);
  88. }
  89. static ERL_NIF_TERM neural_garbage_size(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[]) {
  90. if (!enif_is_atom(env, argv[0])) { return enif_make_badarg(env); }
  91. return NeuralTable::GarbageSize(env, argv[0]);
  92. }
  93. static void neural_resource_cleanup(ErlNifEnv* env, void* arg)
  94. {
  95. /* Delete any dynamically allocated memory stored in neural_handle */
  96. /* neural_handle* handle = (neural_handle*)arg; */
  97. }
  98. static int on_load(ErlNifEnv* env, void** priv_data, ERL_NIF_TERM load_info)
  99. {
  100. NeuralTable::Initialize();
  101. return 0;
  102. }
  103. static void on_unload(ErlNifEnv *env, void *priv_data) {
  104. NeuralTable::Shutdown();
  105. }
  106. ERL_NIF_INIT(neural, nif_funcs, &on_load, NULL, NULL, &on_unload);