sparse_array 0.0.3 → 0.0.4

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.
Files changed (4) hide show
  1. checksums.yaml +7 -0
  2. data/ext/sp_ar.c +262 -41
  3. data/lib/sparse_array/version.rb +1 -1
  4. metadata +19 -31
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 47d4908850c44898a7c73e8faa28501500b12ec1
4
+ data.tar.gz: cada5c68ec9064080013d6071bd4f72bfec2bbb3
5
+ SHA512:
6
+ metadata.gz: b345ff6ff95ec91173e7412ca54f63b96714d9e610145f1cb25ca09d810ffed38ab384021d552cfcbfc5269783335a16f616fe5721ef6f949e1f05e603d6c4a4
7
+ data.tar.gz: 42aa16e2fe7c96f6b5742e4ec70c1ff099c2db65de31be46e73c6b4f91331b10b8efa02c6882e0ec4c76daeedadb17ba1cf2b888da645ec0871101372a594917
data/ext/sp_ar.c CHANGED
@@ -87,6 +87,7 @@ static inline spar_index_t
87
87
  calc_pos(register spar_table* table, spar_index_t key)
88
88
  {
89
89
  uint64_t res = (uint64_t)key * 0x85ebca6bull;
90
+ res = (res >> 29) * 0x85ebca6bull;
90
91
  return ((spar_index_t)res ^ (spar_index_t)(res >> 32)) % table->num_bins;
91
92
  }
92
93
 
@@ -527,21 +528,14 @@ static VALUE
527
528
  sparse_array_each(VALUE self)
528
529
  {
529
530
  spar_table *table;
530
- VALUE keys;
531
- long i, size;
532
- VALUE *p;
531
+ VALUE y[2] = {Qnil, Qnil};
533
532
  RETURN_ENUMERATOR(self, 0, 0);
534
533
  GetSparseArray(self, table);
535
- keys = sparse_array_keys(self);
536
- size = RARRAY_LEN(keys);
537
- p = RARRAY_PTR(keys);
538
- for(i=0; i<size; i++) {
539
- spar_index_t k = NUM2UINT(p[i]);
540
- st_data_t v = Qnil;
541
- if (spar_lookup(table, k, &v))
542
- rb_yield(rb_assoc_new(p[i], (VALUE)v));
543
- }
544
- RB_GC_GUARD(keys);
534
+ SPAR_FOREACH_START(table);
535
+ y[0] = UINT2NUM(entry->key);
536
+ y[1] = (VALUE)value;
537
+ rb_yield_values2(2, y);
538
+ SPAR_FOREACH_END();
545
539
  return self;
546
540
  }
547
541
 
@@ -549,21 +543,12 @@ static VALUE
549
543
  sparse_array_each_key(VALUE self)
550
544
  {
551
545
  spar_table *table;
552
- VALUE keys;
553
- long i, size;
554
- VALUE *p;
555
546
  RETURN_ENUMERATOR(self, 0, 0);
556
547
  GetSparseArray(self, table);
557
- keys = sparse_array_keys(self);
558
- size = RARRAY_LEN(keys);
559
- p = RARRAY_PTR(keys);
560
- for(i=0; i<size; i++) {
561
- spar_index_t k = NUM2UINT(p[i]);
562
- st_data_t v = Qnil;
563
- if (spar_lookup(table, k, &v))
564
- rb_yield(p[i]);
565
- }
566
- RB_GC_GUARD(keys);
548
+ SPAR_FOREACH_START(table);
549
+ (void)value;
550
+ rb_yield(UINT2NUM(entry->key));
551
+ SPAR_FOREACH_END();
567
552
  return self;
568
553
  }
569
554
 
@@ -571,21 +556,11 @@ static VALUE
571
556
  sparse_array_each_value(VALUE self)
572
557
  {
573
558
  spar_table *table;
574
- VALUE keys;
575
- long i, size;
576
- VALUE *p;
577
559
  RETURN_ENUMERATOR(self, 0, 0);
578
- GetSparseArray(self, table);
579
- keys = sparse_array_keys(self);
580
- size = RARRAY_LEN(keys);
581
- p = RARRAY_PTR(keys);
582
- for(i=0; i<size; i++) {
583
- spar_index_t k = NUM2UINT(p[i]);
584
- st_data_t v = Qnil;
585
- if (spar_lookup(table, k, &v))
586
- rb_yield(v);
587
- }
588
- RB_GC_GUARD(keys);
560
+ GetSparseArrayInt(self, table);
561
+ SPAR_FOREACH_START(table);
562
+ rb_yield((VALUE)(value));
563
+ SPAR_FOREACH_END();
589
564
  return self;
590
565
  }
591
566
 
@@ -632,9 +607,233 @@ sparse_array_inspect(VALUE self)
632
607
  return rb_exec_recursive(sparse_array_inspect_rec, self, 0);
633
608
  }
634
609
 
610
+ /******** Ruby Sparse Int Array binding ********/
611
+
612
+ static const rb_data_type_t SparseArrayInt_data_type = {
613
+ "SparseArrayIntC",
614
+ {NULL, sparse_array_delete, sparse_array_memsize}
615
+ };
616
+
617
+ #define GetSparseArrayInt(value, pointer) \
618
+ TypedData_Get_Struct((value), spar_table, &SparseArrayInt_data_type, (pointer))
619
+
620
+ static VALUE
621
+ sparse_array_int_alloc(VALUE klass)
622
+ {
623
+ spar_table* table = spar_new_table();
624
+ return TypedData_Wrap_Struct(klass, &SparseArrayInt_data_type, table);
625
+ }
626
+
627
+ #if SIZEOF_LONG == SIZEOF_VOIDP
628
+ #define st_data2num(res) LONG2NUM((long)res)
629
+ #define num2st_data(val) NUM2LONG(val)
630
+ #else
631
+ #define st_data2num(res) LL2NUM((LONG_LONG)res)
632
+ #define num2st_data(val) NUM2LL(val)
633
+ #endif
634
+
635
+ static VALUE
636
+ sparse_array_int_get(VALUE self, VALUE ri)
637
+ {
638
+ spar_table *table;
639
+ spar_index_t i = NUM2UINT(ri);
640
+ st_data_t res = 0;
641
+ GetSparseArrayInt(self, table);
642
+ if (spar_lookup(table, i, &res)) {
643
+ return st_data2num(res);
644
+ }
645
+ return Qnil;
646
+ }
647
+
648
+ static VALUE
649
+ sparse_array_int_include(VALUE self, VALUE ri)
650
+ {
651
+ spar_table *table;
652
+ spar_index_t i = NUM2UINT(ri);
653
+ st_data_t res = Qnil;
654
+ GetSparseArrayInt(self, table);
655
+ if (spar_lookup(table, i, &res))
656
+ return Qtrue;
657
+ else
658
+ return Qfalse;
659
+ }
660
+
661
+ static VALUE
662
+ sparse_array_int_fetch(VALUE self, VALUE ri, VALUE def)
663
+ {
664
+ spar_table *table;
665
+ spar_index_t i = NUM2UINT(ri);
666
+ st_data_t res = 0;
667
+ GetSparseArrayInt(self, table);
668
+ if (spar_lookup(table, i, &res))
669
+ return st_data2num(res);
670
+ else
671
+ return def;
672
+ }
673
+
674
+ static VALUE
675
+ sparse_array_int_set(VALUE self, VALUE ri, VALUE val)
676
+ {
677
+ spar_table *table;
678
+ spar_index_t i = NUM2UINT(ri);
679
+ st_data_t val_ = num2st_data(val);
680
+ GetSparseArrayInt(self, table);
681
+ spar_insert(table, i, val_);
682
+ return val;
683
+ }
684
+
685
+ static VALUE
686
+ sparse_array_int_del(VALUE self, VALUE ri)
687
+ {
688
+ spar_table *table;
689
+ spar_index_t i = NUM2UINT(ri);
690
+ st_data_t res = 0;
691
+ GetSparseArrayInt(self, table);
692
+ if (spar_delete(table, i, &res))
693
+ return st_data2num(res);
694
+ return Qnil;
695
+ }
696
+
697
+ static VALUE
698
+ sparse_array_int_size(VALUE self)
699
+ {
700
+ spar_table *table;
701
+ GetSparseArrayInt(self, table);
702
+ return UINT2NUM(table->num_entries);
703
+ }
704
+
705
+ static VALUE
706
+ sparse_array_int_empty_p(VALUE self)
707
+ {
708
+ spar_table *table;
709
+ GetSparseArrayInt(self, table);
710
+ return table->num_entries ? Qfalse : Qtrue;
711
+ }
712
+
713
+ static VALUE
714
+ sparse_array_int_clear(VALUE self)
715
+ {
716
+ spar_table *table;
717
+ GetSparseArrayInt(self, table);
718
+ spar_clear(table);
719
+ return self;
720
+ }
721
+
722
+ static VALUE
723
+ sparse_array_int_keys(VALUE self)
724
+ {
725
+ spar_table *table;
726
+ VALUE res;
727
+ GetSparseArrayInt(self, table);
728
+ res = rb_ary_new2(table->num_entries);
729
+ SPAR_FOREACH_START(table);
730
+ (void)value;
731
+ rb_ary_push(res, UINT2NUM(entry->key));
732
+ SPAR_FOREACH_END();
733
+ return res;
734
+ }
735
+
736
+ static VALUE
737
+ sparse_array_int_values(VALUE self)
738
+ {
739
+ spar_table *table;
740
+ VALUE res;
741
+ GetSparseArrayInt(self, table);
742
+ res = rb_ary_new2(table->num_entries);
743
+ SPAR_FOREACH_START(table);
744
+ rb_ary_push(res, st_data2num((VALUE)value));
745
+ SPAR_FOREACH_END();
746
+ return res;
747
+ }
748
+
749
+ static VALUE
750
+ sparse_array_int_each(VALUE self)
751
+ {
752
+ spar_table *table;
753
+ VALUE y[2] = {Qnil, Qnil};
754
+ RETURN_ENUMERATOR(self, 0, 0);
755
+ GetSparseArrayInt(self, table);
756
+ SPAR_FOREACH_START(table);
757
+ y[0] = UINT2NUM(entry->key);
758
+ y[1] = st_data2num((VALUE)value);
759
+ rb_yield_values2(2, y);
760
+ SPAR_FOREACH_END();
761
+ return self;
762
+ }
763
+
764
+ static VALUE
765
+ sparse_array_int_each_key(VALUE self)
766
+ {
767
+ spar_table *table;
768
+ RETURN_ENUMERATOR(self, 0, 0);
769
+ GetSparseArrayInt(self, table);
770
+ SPAR_FOREACH_START(table);
771
+ (void)value;
772
+ rb_yield(UINT2NUM(entry->key));
773
+ SPAR_FOREACH_END();
774
+ return self;
775
+ }
776
+
777
+ static VALUE
778
+ sparse_array_int_each_value(VALUE self)
779
+ {
780
+ spar_table *table;
781
+ RETURN_ENUMERATOR(self, 0, 0);
782
+ GetSparseArrayInt(self, table);
783
+ SPAR_FOREACH_START(table);
784
+ rb_yield(st_data2num(value));
785
+ SPAR_FOREACH_END();
786
+ return self;
787
+ }
788
+
789
+ static VALUE
790
+ sparse_array_int_init_copy(VALUE self, VALUE copy)
791
+ {
792
+ spar_table *table;
793
+ spar_table *copied;
794
+ GetSparseArrayInt(self, table);
795
+ GetSparseArrayInt(copy, copied);
796
+ rb_obj_init_copy(self, copy);
797
+ spar_copy_to(table, copied);
798
+ return copy;
799
+ }
800
+
801
+ static VALUE
802
+ sparse_array_int_inspect_rec(VALUE self, VALUE dummy, int recur)
803
+ {
804
+ VALUE str;
805
+ spar_table *table;
806
+ GetSparseArrayInt(self, table);
807
+
808
+ if (recur) return rb_usascii_str_new2("<SparseArrayInt ...>");
809
+ str = rb_str_buf_new2("<SparseArrayInt");
810
+ SPAR_FOREACH_START(table);
811
+ #if SIZEOF_LONG == SIZEOF_VOIDP
812
+ rb_str_catf(str, " %u=>%lu", entry->key, value);
813
+ #else
814
+ rb_str_catf(str, " %u=>%llu", entry->key, value);
815
+ #endif
816
+ SPAR_FOREACH_END();
817
+ rb_str_buf_cat2(str, ">");
818
+ OBJ_INFECT(str, self);
819
+
820
+ return str;
821
+ }
822
+
823
+ static VALUE
824
+ sparse_array_int_inspect(VALUE self)
825
+ {
826
+ spar_table *table;
827
+ GetSparseArrayInt(self, table);
828
+ if (table->num_entries == 0)
829
+ return rb_usascii_str_new2("<SparseArrayInt>");
830
+ return rb_exec_recursive(sparse_array_int_inspect_rec, self, 0);
831
+ }
832
+
635
833
  void
636
834
  Init_sparse_array() {
637
- VALUE cls_sparse_array = rb_define_class("SparseArray", rb_cObject);
835
+ VALUE cls_sparse_array, cls_sparse_array_int;
836
+ cls_sparse_array = rb_define_class("SparseArray", rb_cObject);
638
837
  rb_define_alloc_func(cls_sparse_array, sparse_array_alloc);
639
838
  rb_define_method(cls_sparse_array, "[]", sparse_array_get, 1);
640
839
  rb_define_method(cls_sparse_array, "fetch", sparse_array_fetch, 2);
@@ -655,4 +854,26 @@ Init_sparse_array() {
655
854
  rb_define_method(cls_sparse_array, "inspect", sparse_array_inspect, 0);
656
855
  rb_define_method(cls_sparse_array, "initialize_copy", sparse_array_init_copy, 1);
657
856
  rb_include_module(cls_sparse_array, rb_mEnumerable);
857
+
858
+ cls_sparse_array_int = rb_define_class("SparseArrayInt", rb_cObject);
859
+ rb_define_alloc_func(cls_sparse_array_int, sparse_array_int_alloc);
860
+ rb_define_method(cls_sparse_array_int, "[]", sparse_array_int_get, 1);
861
+ rb_define_method(cls_sparse_array_int, "fetch", sparse_array_int_fetch, 2);
862
+ rb_define_method(cls_sparse_array_int, "[]=", sparse_array_int_set, 2);
863
+ rb_define_method(cls_sparse_array_int, "delete", sparse_array_int_del, 1);
864
+ rb_define_method(cls_sparse_array_int, "clear", sparse_array_int_clear, 0);
865
+ rb_define_method(cls_sparse_array_int, "empty?", sparse_array_int_empty_p, 0);
866
+ rb_define_method(cls_sparse_array_int, "size", sparse_array_int_size, 1);
867
+ rb_define_method(cls_sparse_array_int, "count", sparse_array_int_size, 1);
868
+ rb_define_method(cls_sparse_array_int, "include?", sparse_array_int_include, 1);
869
+ rb_define_method(cls_sparse_array_int, "has_key?", sparse_array_int_include, 1);
870
+ rb_define_method(cls_sparse_array_int, "keys", sparse_array_int_keys, 0);
871
+ rb_define_method(cls_sparse_array_int, "values", sparse_array_int_values, 0);
872
+ rb_define_method(cls_sparse_array_int, "each", sparse_array_int_each, 0);
873
+ rb_define_method(cls_sparse_array_int, "each_pair", sparse_array_int_each, 0);
874
+ rb_define_method(cls_sparse_array_int, "each_key", sparse_array_int_each_key, 0);
875
+ rb_define_method(cls_sparse_array_int, "each_value", sparse_array_int_each_value, 0);
876
+ rb_define_method(cls_sparse_array_int, "inspect", sparse_array_int_inspect, 0);
877
+ rb_define_method(cls_sparse_array_int, "initialize_copy", sparse_array_int_init_copy, 1);
878
+ rb_include_module(cls_sparse_array_int, rb_mEnumerable);
658
879
  }
@@ -1,3 +1,3 @@
1
1
  class SparseArray
2
- VERSION = "0.0.3"
2
+ VERSION = "0.0.4"
3
3
  end
metadata CHANGED
@@ -1,48 +1,43 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sparse_array
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.3
5
- prerelease:
4
+ version: 0.0.4
6
5
  platform: ruby
7
6
  authors:
8
7
  - Sokolov Yura aka funny_falcon
9
8
  autorequire:
10
9
  bindir: bin
11
10
  cert_chain: []
12
- date: 2013-12-17 00:00:00.000000000 Z
11
+ date: 2015-05-26 00:00:00.000000000 Z
13
12
  dependencies:
14
13
  - !ruby/object:Gem::Dependency
14
+ name: bundler
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - ~>
17
+ - - "~>"
18
18
  - !ruby/object:Gem::Version
19
19
  version: '1.3'
20
- none: false
20
+ type: :development
21
+ prerelease: false
21
22
  version_requirements: !ruby/object:Gem::Requirement
22
23
  requirements:
23
- - - ~>
24
+ - - "~>"
24
25
  - !ruby/object:Gem::Version
25
26
  version: '1.3'
26
- none: false
27
- prerelease: false
28
- name: bundler
29
- type: :development
30
27
  - !ruby/object:Gem::Dependency
28
+ name: rake
31
29
  requirement: !ruby/object:Gem::Requirement
32
30
  requirements:
33
- - - ! '>='
31
+ - - ">="
34
32
  - !ruby/object:Gem::Version
35
33
  version: '0'
36
- none: false
34
+ type: :development
35
+ prerelease: false
37
36
  version_requirements: !ruby/object:Gem::Requirement
38
37
  requirements:
39
- - - ! '>='
38
+ - - ">="
40
39
  - !ruby/object:Gem::Version
41
40
  version: '0'
42
- none: false
43
- prerelease: false
44
- name: rake
45
- type: :development
46
41
  description: Sparse Array - map from integers (0..2**32-1) to objects
47
42
  email:
48
43
  - funny.falcon@gmail.com
@@ -51,15 +46,16 @@ extensions:
51
46
  - ext/extconf.rb
52
47
  extra_rdoc_files: []
53
48
  files:
49
+ - Gemfile
50
+ - LICENSE.txt
54
51
  - ext/extconf.rb
55
52
  - ext/sp_ar.c
56
53
  - lib/sparse_array/version.rb
57
- - Gemfile
58
- - LICENSE.txt
59
54
  - sparse_array.gemspec
60
55
  homepage: https://github.com/funny-falcon/ruby_sparse_array
61
56
  licenses:
62
57
  - MIT
58
+ metadata: {}
63
59
  post_install_message:
64
60
  rdoc_options: []
65
61
  require_paths:
@@ -67,26 +63,18 @@ require_paths:
67
63
  - ext
68
64
  required_ruby_version: !ruby/object:Gem::Requirement
69
65
  requirements:
70
- - - ! '>='
66
+ - - ">="
71
67
  - !ruby/object:Gem::Version
72
- hash: -4038731035297289892
73
68
  version: '0'
74
- segments:
75
- - 0
76
- none: false
77
69
  required_rubygems_version: !ruby/object:Gem::Requirement
78
70
  requirements:
79
- - - ! '>='
71
+ - - ">="
80
72
  - !ruby/object:Gem::Version
81
- hash: -4038731035297289892
82
73
  version: '0'
83
- segments:
84
- - 0
85
- none: false
86
74
  requirements: []
87
75
  rubyforge_project:
88
- rubygems_version: 1.8.25
76
+ rubygems_version: 2.4.4
89
77
  signing_key:
90
- specification_version: 3
78
+ specification_version: 4
91
79
  summary: lightweight map from integers to objects
92
80
  test_files: []