bitmapper 0.1.1 → 0.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -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