Created
November 28, 2014 21:01
-
-
Save zakird/688495bd4d2e627f8752 to your computer and use it in GitHub Desktop.
Judy Array Counting
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <assert.h> | |
#include <stdint.h> | |
#include <arpa/inet.h> | |
#include <Judy.h> | |
void lml_set(Pvoid_t *a, uint64_t k1, uint64_t k2, uint64_t v) | |
{ | |
Word_t *v_; | |
Pvoid_t b = *a; | |
JLI(v_, b, k1); | |
Pvoid_t* a2 = (Pvoid_t*) *v_; | |
Word_t *v2_; | |
JLI(v2_, a2, k2); | |
*v2_ = v; | |
*v_ = a2; | |
*a = b; | |
} | |
void lml_dump_l2_counts(Pvoid_t *a) | |
{ | |
Pvoid_t b = *a; | |
Word_t Index = 0; | |
Word_t * PValue; | |
JLF(PValue, b, Index); | |
while (PValue != NULL) | |
{ | |
int retv; | |
JLC(retv, *PValue, 0, -1); | |
printf("%lu -> %i\n", Index, retv); | |
JLN(PValue, b, Index); | |
} | |
*a = b; | |
} | |
void lml_dump_l2_ip_counts(Pvoid_t *a) | |
{ | |
Pvoid_t b = *a; | |
Word_t Index = 0; | |
Word_t * PValue; | |
JLF(PValue, b, Index); | |
while (PValue != NULL) | |
{ | |
int retv; | |
JLC(retv, *PValue, 0, -1); | |
struct in_addr t; | |
t.s_addr = (uint32_t) Index; | |
if (retv > 10) { | |
printf("%s -> %i\n", inet_ntoa(t), retv); | |
} | |
JLN(PValue, b, Index); | |
} | |
*a = b; | |
} | |
void l_set(Pvoid_t *a, uint64_t k, uint64_t v) | |
{ | |
Pvoid_t b = *a; | |
Word_t *v_; | |
JLI(v_, b, k); | |
*v_ = v; | |
*a = b; | |
} | |
void l_incr(Pvoid_t *a, uint64_t k) | |
{ | |
Pvoid_t b = *a; | |
Word_t *v_; | |
JLI(v_, b, k); | |
(*v_)++; | |
*a = b; | |
} | |
uint64_t l_get(Pvoid_t *a, uint64_t k) | |
{ | |
Pvoid_t b = *a; | |
Word_t *v_; | |
JLG(v_, b, k); | |
if (!v_) { | |
printf("invalid key\n"); | |
return 0; | |
} | |
*a = b; | |
return (uint64_t) *v_; | |
} | |
void l_del(Pvoid_t *a, uint64_t k) | |
{ | |
Pvoid_t b = *a; | |
int rc; | |
JLD(rc, b, k); | |
*a = b; | |
} | |
void l_dump(Pvoid_t *a) | |
{ | |
Pvoid_t b = *a; | |
Word_t Index = 0; | |
Word_t * PValue; | |
JLF(PValue, b, Index); | |
while (PValue != NULL) | |
{ | |
printf("%lu -> %lu\n", Index, *PValue); | |
JLN(PValue, b, Index); | |
} | |
*a = b; | |
} | |
void l_dump_ips(Pvoid_t *a) | |
{ | |
Pvoid_t b = *a; | |
Word_t Index = 0; | |
Word_t * PValue; | |
JLF(PValue, b, Index); | |
while (PValue != NULL) | |
{ | |
struct in_addr t; | |
t.s_addr = (uint32_t) Index; | |
printf("%s, %lu\n", inet_ntoa(t), *PValue); | |
JLN(PValue, b, Index); | |
} | |
*a = b; | |
} | |
void b_set(Pvoid_t *a, uint64_t v) | |
{ | |
Pvoid_t b = *a; | |
int retval; | |
J1S(retval, b, v); | |
*a = b; | |
} | |
int b_get(Pvoid_t *a, uint64_t v) | |
{ | |
Pvoid_t b = *a; | |
int retval; | |
J1T(retval, b, v); | |
*a = b; | |
return retval; | |
} | |
int b_count(Pvoid_t *a) { | |
Pvoid_t b = *a; | |
int retval; | |
J1C(retval, b, 0, -1); | |
return retval; | |
} | |
#if 0 | |
int main(void) | |
{ | |
Pvoid_t* a = (Pvoid_t*) NULL; | |
lml_set(&a, 1, 1, 1); | |
lml_set(&a, 1, 2, 1); | |
lml_set(&a, 1, 3, 1); | |
lml_dump_l2counts(&a); | |
} | |
#endif |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment