bitmapper 0.1.1 → 0.1.2

Sign up to get free protection for your applications and to get access to all the features.
@@ -29,7 +29,8 @@ void allocate_map(Bitmapper* map, int index_len){
29
29
  map->bkt_size = pow(10, 10 - index_len);
30
30
  map->bkt_count = size;
31
31
  map->index_len = index_len;
32
- map->white_list_char = NULL;
32
+ map->filter_enabled = 0;
33
+ map->filter_status = bit_bucket_create(size);
33
34
  sprintf(map->fill_str, "%%llu%%0%illu\n",10-index_len);
34
35
  }
35
36
 
@@ -46,19 +47,29 @@ void free_map(Bitmapper* map){
46
47
  map->bkts[i] = NULL;
47
48
  }
48
49
  }
49
- if(map->white_list_char != NULL) free(map->white_list_char);
50
+ if(map->filter_status != NULL) bit_bucket_free(map->filter_status);
50
51
  if(map->bkts != NULL) free(map->bkts);
51
52
  }
52
53
 
53
- void set_white_list_char(Bitmapper* map, char c){
54
- if(map->white_list_char !=NULL) free(map->white_list_char);
55
- map->white_list_char = (char*)malloc(sizeof(char));
56
- map->white_list_char[0] = c;
54
+ void enable_filter(Bitmapper* map){
55
+ map->filter_enabled = 1;
57
56
  }
58
57
 
59
- void clear_white_list_char(Bitmapper* map){
60
- if(map->white_list_char !=NULL) free(map->white_list_char);
61
- map->white_list_char = NULL;
58
+ void disable_filter(Bitmapper* map){
59
+ map->filter_enabled = 0;
60
+ }
61
+
62
+ int set_in_filter(Bitmapper* map, unsigned long long int number){
63
+ map->filter_enabled = 1;
64
+ return bit_bucket_set_bit(map->filter_status, number);
65
+ }
66
+
67
+ int status_for_filter(Bitmapper* map, unsigned long long int number){
68
+ return bit_bucket_get_bit(map->filter_status, number);
69
+ }
70
+
71
+ int clear_in_filter(Bitmapper* map, unsigned long long int number){
72
+ return bit_bucket_clear_bit(map->filter_status, number);
62
73
  }
63
74
 
64
75
  /*
@@ -73,6 +84,7 @@ BitBucket* create_bucket_for(BitBucket* bkt, unsigned long long int size){
73
84
 
74
85
  /*
75
86
  Adds the given number to the bucket reperesented by the given index
87
+ if filter is enabled and the index is set in filter_status
76
88
  @param Bitmapper* the mapepr object to use
77
89
  @param unsigned long long int the offset to be added(if the offset is greater
78
90
  than bucket size it is rejected)
@@ -80,6 +92,7 @@ BitBucket* create_bucket_for(BitBucket* bkt, unsigned long long int size){
80
92
  */
81
93
  int add_num_in_bkt(Bitmapper* map,unsigned long long int offset, unsigned long long int bkt_index){
82
94
  if(bkt_index > map->bkt_count) return 1;
95
+ if(map->filter_enabled == 1 && status_for_filter(map, bkt_index) == 0) return 0; /* ignore silently */
83
96
  if((map->bkts[bkt_index]) == NULL)
84
97
  map->bkts[bkt_index] = (BitBucket*)create_bucket_for(map->bkts[bkt_index], map->bkt_size);
85
98
  if(bit_bucket_set_bit(map->bkts[bkt_index], offset) != 0){
@@ -112,6 +125,7 @@ int add_num(Bitmapper* map,unsigned long long int full_num){
112
125
  */
113
126
  int remove_num_in_bkt(Bitmapper* map,unsigned long long int offset, unsigned long long int bkt_index){
114
127
  if(bkt_index > map->bkt_count) return 1;
128
+ if(map->filter_enabled == 1 && status_for_filter(map, bkt_index) == 0) return 0; /* ignore silently */
115
129
  if(map->bkts[bkt_index] == NULL)
116
130
  return 0;
117
131
  if(bit_bucket_clear_bit(map->bkts[bkt_index], offset) != 0){
@@ -177,10 +191,7 @@ int add_numbers_in_file(Bitmapper* map,FILE *in){
177
191
  sprintf(scan_str, "%%%is%%%is\n",map->index_len, 10-map->index_len);
178
192
  while(fgets(msisdn, 15, in)!=NULL){
179
193
  sscanf(msisdn,scan_str, index, rest_num);
180
- if(map->white_list_char !=NULL && strncmp(index, map->white_list_char, 1) != 0){
181
- }else{
182
- add_num_in_bkt(map, atoll(rest_num), atoll(index) );
183
- }
194
+ add_num_in_bkt(map, atoll(rest_num), atoll(index) );
184
195
  }
185
196
  }
186
197
 
@@ -12,16 +12,21 @@ typedef struct Bitmapper{
12
12
  unsigned long long int bkt_size; /* size of each bucket in bits */
13
13
  /* the format specifier used to dump number to file from buckets */
14
14
  int index_len;
15
- char *white_list_char;
16
15
  char fill_str[20];
16
+ int filter_enabled;
17
+ BitBucket* filter_status;
17
18
  } Bitmapper;
18
19
 
19
20
  Bitmapper* create_map();
20
21
  void allocate_map(Bitmapper*, int);
21
22
  void free_map(Bitmapper*);
22
23
  BitBucket* create_bucket_for(BitBucket*, unsigned long long int);
23
- void set_white_list_char(Bitmapper*, char);
24
- void clear_white_list_char(Bitmapper*);
24
+
25
+ void enable_filter(Bitmapper*);
26
+ void disable_filter(Bitmapper*);
27
+ int set_for_filter(Bitmapper* , unsigned long long int);
28
+ int status_for_filter(Bitmapper*, unsigned long long int );
29
+ int clear_in_filter(Bitmapper*, unsigned long long int);
25
30
 
26
31
  int add_num_in_bkt(Bitmapper* ,unsigned long long int, unsigned long long int);
27
32
  int add_num(Bitmapper* ,unsigned long long int);
@@ -192,26 +192,47 @@ VALUE bm_num_status(VALUE self, VALUE num){
192
192
  return (VALUE)Qfalse;
193
193
  }
194
194
 
195
+ VALUE bm_enable_filter(VALUE self){
196
+ Bitmapper* map;
197
+ Data_Get_Struct(self, Bitmapper, map);
198
+ enable_filter(map);
199
+ return self;
200
+ }
195
201
 
196
- VALUE bm_set_filter(VALUE self, VALUE vCh){
197
- int status;
198
- char ch;
202
+ VALUE bm_disable_filter(VALUE self){
203
+ Bitmapper* map;
204
+ Data_Get_Struct(self, Bitmapper, map);
205
+ disable_filter(map);
206
+ return self;
207
+ }
208
+
209
+ VALUE bm_set_filters(VALUE self, VALUE val){
210
+ int i;
199
211
  Bitmapper* map;
212
+ VALUE tmp;
200
213
 
214
+ if(TYPE(val) != T_ARRAY) rb_raise(rb_eRuntimeError, "Should be of type Array");
201
215
  Data_Get_Struct(self, Bitmapper, map);
202
- vCh = rb_funcall(vCh, rb_intern("to_s"), 0); /* hack */
203
- ch = NUM2CHR(vCh);
204
- set_white_list_char(map, ch);
216
+ for(i=0; i< RARRAY_LEN(val); i++){
217
+ tmp = RARRAY_PTR(val)[i];
218
+ tmp = rb_funcall(tmp, rb_intern("to_s"), 0); /* hack */
219
+ set_in_filter(map, bm_to_ll(tmp));
220
+ }
205
221
  return (VALUE)Qtrue;
206
222
  }
207
223
 
208
- VALUE bm_clear_filter(VALUE self){
209
- int status;
210
- VALUE return_val;
224
+ VALUE bm_clear_filters(VALUE self, VALUE val){
225
+ int i;
211
226
  Bitmapper* map;
227
+ VALUE tmp;
212
228
 
229
+ if(TYPE(val) != T_ARRAY) rb_raise(rb_eRuntimeError, "Should be of type Array");
213
230
  Data_Get_Struct(self, Bitmapper, map);
214
- clear_white_list_char(map);
231
+ for(i=0; i< RARRAY_LEN(val); i++){
232
+ tmp = RARRAY_PTR(val)[i];
233
+ tmp = rb_funcall(tmp, rb_intern("to_s"), 0); /* hack */
234
+ clear_in_filter(map, bm_to_ll(tmp));
235
+ }
215
236
  return (VALUE)Qtrue;
216
237
  }
217
238
 
@@ -224,8 +245,12 @@ void Init_bitmapper(){
224
245
  rb_define_method(rb_cBitmapper, "add", bm_add_from_file, 1);
225
246
  rb_define_method(rb_cBitmapper, "remove", bm_remove_from_file, 1);
226
247
  rb_define_method(rb_cBitmapper, "dump_to", bm_dump_to_file, 1);
227
- rb_define_method(rb_cBitmapper, "set_filter", bm_set_filter, 1);
228
- rb_define_method(rb_cBitmapper, "clear_filter", bm_clear_filter, 0);
248
+
249
+ rb_define_method(rb_cBitmapper, "enable_filter", bm_enable_filter, 0);
250
+ rb_define_method(rb_cBitmapper, "disable_filter", bm_disable_filter, 0);
251
+ rb_define_method(rb_cBitmapper, "set_filters", bm_set_filters, 1);
252
+ rb_define_method(rb_cBitmapper, "clear_filters", bm_clear_filters, 1);
253
+
229
254
  rb_define_method(rb_cBitmapper, "load_from_str", bm_load_str_to_bkt, 2);
230
255
  rb_define_method(rb_cBitmapper, "dump_to_str", bm_dump_bkt_str, 2);
231
256
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: bitmapper
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.1
4
+ version: 0.1.2
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-07-05 00:00:00.000000000 Z
12
+ date: 2012-07-16 00:00:00.000000000 Z
13
13
  dependencies: []
14
14
  description: A fast, in-memory, bit map filter!
15
15
  email: gouthamvel@gmail.com