Browse Source

Use the result map for key dedupe

This is a wee bit more cache-friendly than using a std::set with
string keys.
pull/184/head
John Högberg 6 years ago
committed by Paul J. Davis
parent
commit
6bc427e405
1 changed files with 3 additions and 8 deletions
  1. +3
    -8
      c_src/objects.cc

+ 3
- 8
c_src/objects.cc View File

@ -19,11 +19,12 @@ BEGIN_C
int int
make_object(ErlNifEnv* env, ERL_NIF_TERM pairs, ERL_NIF_TERM* out, make_object(ErlNifEnv* env, ERL_NIF_TERM pairs, ERL_NIF_TERM* out,
int ret_map, int dedupe_keys)
int ret_map, int dedupe_keys)
{ {
ERL_NIF_TERM ret; ERL_NIF_TERM ret;
ERL_NIF_TERM key; ERL_NIF_TERM key;
ERL_NIF_TERM val; ERL_NIF_TERM val;
ERL_NIF_TERM old_val;
std::set<std::string> seen; std::set<std::string> seen;
@ -34,13 +35,7 @@ make_object(ErlNifEnv* env, ERL_NIF_TERM pairs, ERL_NIF_TERM* out,
if(!enif_get_list_cell(env, pairs, &key, &pairs)) { if(!enif_get_list_cell(env, pairs, &key, &pairs)) {
assert(0 == 1 && "Unbalanced object pairs."); assert(0 == 1 && "Unbalanced object pairs.");
} }
ErlNifBinary bin;
if(!enif_inspect_binary(env, key, &bin)) {
return 0;
}
std::string skey((char*) bin.data, bin.size);
if(seen.count(skey) == 0) {
seen.insert(skey);
if(!enif_get_map_value(env, ret, key, &old_val)) {
if(!enif_make_map_put(env, ret, key, val, &ret)) { if(!enif_make_map_put(env, ret, key, val, &ret)) {
return 0; return 0;
} }

Loading…
Cancel
Save