|
|
- #include "neural_utils.h"
-
- unsigned long int estimate_size(ErlNifEnv *env, ERL_NIF_TERM term) {
- if (enif_is_atom(env, term)) {
- return WORD_SIZE;
- }
-
- // Treating all numbers like longs.
- if (enif_is_number(env, term)) {
- return 2 * WORD_SIZE;
- }
-
- if (enif_is_binary(env, term)) {
- ErlNifBinary bin;
- enif_inspect_binary(env, term, &bin);
- return bin.size + (6 * WORD_SIZE);
- }
-
- if (enif_is_list(env, term)) {
- unsigned long int size = 0;
- ERL_NIF_TERM it, curr;
- it = term;
- size += WORD_SIZE;
- while (!enif_is_empty_list(env, it)) {
- enif_get_list_cell(env, it, &curr, &it);
- size += estimate_size(env, curr) + WORD_SIZE;
- }
- return size;
- }
-
- if (enif_is_tuple(env, term)) {
- unsigned long int size = 0;
- const ERL_NIF_TERM *tpl;
- int arity;
- enif_get_tuple(env, term, &arity, &tpl);
- for (int i = 0; i < arity; ++i) {
- size += estimate_size(env, tpl[i]);
- }
- return size;
- }
-
- // Return 1 word by default
- return WORD_SIZE;
- }
-
-
|