usamin 7.7.2 → 7.7.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +1 -0
- data/Gemfile.lock +3 -3
- data/README.md +2 -0
- data/ext/usamin/extconf.rb +6 -1
- data/ext/usamin/usamin.cpp +313 -56
- data/lib/usamin/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 5cfc0cdfc9880a6f26fc88def407ab4c5d43312be395d427621d895652b53369
|
4
|
+
data.tar.gz: d2fc7676aa1dca66ffdcf4ad653a152fba1fceec93a8ad92a9f269f12810c072
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 3ff8ab25015ae9a00bf8a43ccd943f32bb77075788d66263f0543b5f3e181a4c0d550390af62b518cc6d0360a7f4aacc2dc78d054bd792bcf4e507de0b1e6b46
|
7
|
+
data.tar.gz: a2cc8b6eac41f97eacb043359641482238caa2526ca50ddf2d26d78ebea276963df2c04330de73dcf43101a67cbf91eeef49a6a0c51462724ee54472d31c4df1
|
data/.gitignore
CHANGED
data/Gemfile.lock
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
usamin (7.7.
|
4
|
+
usamin (7.7.2)
|
5
5
|
|
6
6
|
GEM
|
7
7
|
remote: https://rubygems.org/
|
@@ -11,7 +11,7 @@ GEM
|
|
11
11
|
pry (0.11.3)
|
12
12
|
coderay (~> 1.1.0)
|
13
13
|
method_source (~> 0.9.0)
|
14
|
-
rake (12.3.
|
14
|
+
rake (12.3.1)
|
15
15
|
rake-compiler (1.0.4)
|
16
16
|
rake
|
17
17
|
|
@@ -26,4 +26,4 @@ DEPENDENCIES
|
|
26
26
|
usamin!
|
27
27
|
|
28
28
|
BUNDLED WITH
|
29
|
-
1.16.
|
29
|
+
1.16.2
|
data/README.md
CHANGED
@@ -4,6 +4,8 @@ A fast JSON serializer / deserializer for Ruby with [RapidJSON](http://rapidjson
|
|
4
4
|
|
5
5
|
The name of "Usamin" is derived from [Nana Abe](https://www.project-imas.com/wiki/Nana_Abe).
|
6
6
|
|
7
|
+
I congratulate her on her election as the [7th Cinderella Girl](https://www.project-imas.com/wiki/THE_iDOLM@STER_Cinderella_Girls_General_Election#7th_Cinderella_Girl_General_Election).
|
8
|
+
|
7
9
|
## Installation
|
8
10
|
|
9
11
|
Install RapidJSON beforehand. Only header files are necessary, and no need to build.
|
data/ext/usamin/extconf.rb
CHANGED
@@ -1,6 +1,11 @@
|
|
1
1
|
require 'mkmf'
|
2
2
|
|
3
|
+
RbConfig::MAKEFILE_CONFIG['CXX'] = ENV['CXX'] if ENV['CXX']
|
3
4
|
have_library('stdc++')
|
4
5
|
dir_config('rapidjson')
|
5
|
-
|
6
|
+
append_cppflags('-O3')
|
7
|
+
append_cppflags('-Wall')
|
8
|
+
append_cppflags('-Wextra')
|
9
|
+
append_cppflags('-Wvla')
|
10
|
+
$CXXFLAGS << ' -std=c++11'
|
6
11
|
create_makefile('usamin/usamin')
|
data/ext/usamin/usamin.cpp
CHANGED
@@ -35,7 +35,7 @@ static inline VALUE get_utf8_str(VALUE str) {
|
|
35
35
|
Check_Type(str, T_STRING);
|
36
36
|
int encoding = rb_enc_get_index(str);
|
37
37
|
if (encoding == utf8index || rb_enc_compatible(str, utf8value) == utf8)
|
38
|
-
return str;
|
38
|
+
return rb_str_dup(str);
|
39
39
|
else
|
40
40
|
return rb_str_conv_enc(str, rb_enc_from_index(encoding), utf8);
|
41
41
|
}
|
@@ -52,6 +52,25 @@ static inline bool str_compare(const char* str1, const long len1, const char* st
|
|
52
52
|
return memcmp(str1, str2, len1) == 0;
|
53
53
|
}
|
54
54
|
|
55
|
+
static inline bool str_compare_xx(VALUE &str1, const rapidjson::Value &str2) {
|
56
|
+
bool free_flag = true;
|
57
|
+
if (RB_TYPE_P(str1, T_STRING)) {
|
58
|
+
int encoding = rb_enc_get_index(str1);
|
59
|
+
if (encoding == utf8index || rb_enc_compatible(str1, utf8value) == utf8)
|
60
|
+
free_flag = false;
|
61
|
+
else
|
62
|
+
str1 = rb_str_conv_enc(str1, rb_enc_from_index(encoding), utf8);
|
63
|
+
} else if (SYMBOL_P(str1)) {
|
64
|
+
str1 = rb_sym_to_s(str1);
|
65
|
+
} else {
|
66
|
+
StringValue(str1);
|
67
|
+
}
|
68
|
+
bool ret = str_compare(RSTRING_PTR(str1), RSTRING_LEN(str1), str2.GetString(), str2.GetStringLength());
|
69
|
+
if (free_flag)
|
70
|
+
rb_str_free(str1);
|
71
|
+
return ret;
|
72
|
+
}
|
73
|
+
|
55
74
|
static inline void check_value(UsaminValue *ptr) {
|
56
75
|
if (!ptr || !ptr->value)
|
57
76
|
rb_raise(rb_eUsaminError, "Null Reference.");
|
@@ -110,7 +129,9 @@ static inline VALUE make_array(UsaminValue *value) {
|
|
110
129
|
|
111
130
|
static inline rapidjson::ParseResult parse(rapidjson::Document &doc, const VALUE str, bool fast = false) {
|
112
131
|
VALUE v = get_utf8_str(str);
|
113
|
-
|
132
|
+
rapidjson::ParseResult ret = fast ? doc.Parse<kParseFastFlags>(RSTRING_PTR(v), RSTRING_LEN(v)) : doc.Parse(RSTRING_PTR(v), RSTRING_LEN(v));
|
133
|
+
rb_str_free(v);
|
134
|
+
return ret;
|
114
135
|
}
|
115
136
|
|
116
137
|
|
@@ -214,59 +235,67 @@ static inline VALUE eval_array_r(rapidjson::Value &value) {
|
|
214
235
|
template <class Writer> static inline void write_str(Writer&, const VALUE);
|
215
236
|
template <class Writer> static inline void write_hash(Writer&, const VALUE);
|
216
237
|
template <class Writer> static inline void write_array(Writer&, const VALUE);
|
217
|
-
template <class Writer> static inline void write_bignum(Writer&, const VALUE);
|
218
238
|
template <class Writer> static inline void write_struct(Writer&, const VALUE);
|
219
239
|
template <class Writer> static inline void write_usamin(Writer&, const VALUE);
|
220
240
|
template <class Writer> static inline void write_to_s(Writer&, const VALUE);
|
221
241
|
|
222
242
|
template <class Writer> static void write(Writer &writer, const VALUE value) {
|
223
|
-
|
224
|
-
|
225
|
-
|
226
|
-
|
227
|
-
|
228
|
-
|
229
|
-
|
230
|
-
|
231
|
-
|
232
|
-
|
233
|
-
|
234
|
-
|
235
|
-
|
236
|
-
|
237
|
-
|
238
|
-
|
239
|
-
|
240
|
-
|
241
|
-
|
242
|
-
|
243
|
-
|
244
|
-
|
245
|
-
|
246
|
-
|
247
|
-
|
248
|
-
|
249
|
-
|
250
|
-
|
251
|
-
|
252
|
-
|
253
|
-
|
254
|
-
|
255
|
-
|
256
|
-
|
257
|
-
|
258
|
-
|
243
|
+
switch (TYPE(value)) {
|
244
|
+
case RUBY_T_NONE:
|
245
|
+
case RUBY_T_NIL:
|
246
|
+
case RUBY_T_UNDEF:
|
247
|
+
writer.Null();
|
248
|
+
break;
|
249
|
+
case RUBY_T_TRUE:
|
250
|
+
writer.Bool(true);
|
251
|
+
case RUBY_T_FALSE:
|
252
|
+
writer.Bool(false);
|
253
|
+
break;
|
254
|
+
case RUBY_T_FIXNUM:
|
255
|
+
writer.Int64(FIX2LONG(value));
|
256
|
+
break;
|
257
|
+
case RUBY_T_FLOAT:
|
258
|
+
case RUBY_T_RATIONAL:
|
259
|
+
writer.Double(NUM2DBL(value));
|
260
|
+
break;
|
261
|
+
case RUBY_T_STRING:
|
262
|
+
write_str(writer, value);
|
263
|
+
break;
|
264
|
+
case RUBY_T_ARRAY:
|
265
|
+
write_array(writer, value);
|
266
|
+
break;
|
267
|
+
case RUBY_T_HASH:
|
268
|
+
write_hash(writer, value);
|
269
|
+
break;
|
270
|
+
case RUBY_T_STRUCT:
|
271
|
+
write_struct(writer, value);
|
272
|
+
break;
|
273
|
+
case RUBY_T_BIGNUM:
|
274
|
+
{
|
275
|
+
VALUE v = rb_big2str(value, 10);
|
276
|
+
writer.RawValue(RSTRING_PTR(v), static_cast<unsigned int>(RSTRING_LEN(v)), rapidjson::kNumberType);
|
277
|
+
rb_str_free(v);
|
278
|
+
}
|
279
|
+
break;
|
280
|
+
default:
|
281
|
+
if (rb_obj_is_kind_of(value, rb_cUsaminValue))
|
282
|
+
write_usamin(writer, value);
|
283
|
+
else
|
284
|
+
write_to_s(writer, value);
|
285
|
+
break;
|
259
286
|
}
|
260
287
|
}
|
261
288
|
|
262
289
|
template <class Writer> static inline void write_str(Writer &writer, const VALUE value) {
|
263
290
|
VALUE v = get_utf8_str(value);
|
264
291
|
writer.String(RSTRING_PTR(v), static_cast<unsigned int>(RSTRING_LEN(v)));
|
292
|
+
rb_str_free(v);
|
265
293
|
}
|
266
294
|
|
267
295
|
template <class Writer> static inline void write_key_str(Writer &writer, const VALUE value) {
|
268
296
|
VALUE v = get_utf8_str(value);
|
269
297
|
writer.Key(RSTRING_PTR(v), static_cast<unsigned int>(RSTRING_LEN(v)));
|
298
|
+
rb_str_free(v);
|
270
299
|
}
|
271
300
|
|
272
301
|
template <class Writer> static inline void write_key_to_s(Writer &writer, const VALUE value) {
|
@@ -298,11 +327,6 @@ template <class Writer> static inline void write_array(Writer &writer, const VAL
|
|
298
327
|
writer.EndArray();
|
299
328
|
}
|
300
329
|
|
301
|
-
template <class Writer> static inline void write_bignum(Writer &writer, const VALUE value) {
|
302
|
-
VALUE v = rb_big2str(value, 10);
|
303
|
-
writer.RawValue(RSTRING_PTR(v), static_cast<unsigned int>(RSTRING_LEN(v)), rapidjson::kNumberType);
|
304
|
-
}
|
305
|
-
|
306
330
|
template <class Writer> static inline void write_struct(Writer &writer, const VALUE value) {
|
307
331
|
writer.StartObject();
|
308
332
|
VALUE members = rb_struct_members(value);
|
@@ -551,13 +575,39 @@ static VALUE w_value_marshal_load(const VALUE self, VALUE source) {
|
|
551
575
|
static VALUE w_hash_operator_indexer(const VALUE self, VALUE key) {
|
552
576
|
UsaminValue *value = get_value(self);
|
553
577
|
check_object(value);
|
554
|
-
VALUE kvalue = get_utf8_str(key);
|
555
578
|
for (auto &m : value->value->GetObject())
|
556
|
-
if (
|
579
|
+
if (str_compare_xx(key, m.name))
|
557
580
|
return eval(m.value);
|
558
581
|
return Qnil;
|
559
582
|
}
|
560
583
|
|
584
|
+
/*
|
585
|
+
* @return [::Array | nil]
|
586
|
+
*
|
587
|
+
* @note This method has linear time complexity.
|
588
|
+
*/
|
589
|
+
static VALUE w_hash_assoc(const VALUE self, VALUE key) {
|
590
|
+
UsaminValue *value = get_value(self);
|
591
|
+
check_object(value);
|
592
|
+
for (auto &m : value->value->GetObject())
|
593
|
+
if (str_compare_xx(key, m.name))
|
594
|
+
return rb_assoc_new(eval_str(m.name), eval(m.value));
|
595
|
+
return Qnil;
|
596
|
+
}
|
597
|
+
|
598
|
+
/*
|
599
|
+
* @return [::Hash]
|
600
|
+
*/
|
601
|
+
static VALUE w_hash_compact(const VALUE self) {
|
602
|
+
UsaminValue *value = get_value(self);
|
603
|
+
check_object(value);
|
604
|
+
VALUE hash = rb_hash_new();
|
605
|
+
for (auto &m : value->value->GetObject())
|
606
|
+
if (!m.value.IsNull())
|
607
|
+
rb_hash_aset(hash, eval(m.name), eval(m.value));
|
608
|
+
return hash;
|
609
|
+
}
|
610
|
+
|
561
611
|
static VALUE hash_enum_size(const VALUE self, VALUE args, VALUE eobj) {
|
562
612
|
return UINT2NUM(get_value(self)->value->MemberCount());
|
563
613
|
}
|
@@ -632,26 +682,75 @@ static VALUE w_hash_fetch(const int argc, VALUE* argv, const VALUE self) {
|
|
632
682
|
rb_check_arity(argc, 1, 2);
|
633
683
|
UsaminValue *value = get_value(self);
|
634
684
|
check_object(value);
|
635
|
-
VALUE kvalue = get_utf8_str(argv[0]);
|
636
685
|
for (auto &m : value->value->GetObject())
|
637
|
-
if (
|
686
|
+
if (str_compare_xx(argv[0], m.name))
|
638
687
|
return eval(m.value);
|
639
688
|
return argc == 2 ? argv[1] : rb_block_given_p() ? rb_yield(argv[0]) : Qnil;
|
640
689
|
}
|
641
690
|
|
691
|
+
/*
|
692
|
+
* @param [String] key
|
693
|
+
* @return [::Array<Object>]
|
694
|
+
*/
|
695
|
+
static VALUE w_hash_fetch_values(const int argc, VALUE *argv, const VALUE self) {
|
696
|
+
UsaminValue *value = get_value(self);
|
697
|
+
check_object(value);
|
698
|
+
VALUE ret = rb_ary_new2(argc);
|
699
|
+
for (int i = 0; i < argc; i++) {
|
700
|
+
bool found = false;
|
701
|
+
for (auto &m : value->value->GetObject()) {
|
702
|
+
if (str_compare_xx(argv[i], m.name)) {
|
703
|
+
rb_ary_push(ret, eval(m.value));
|
704
|
+
found = true;
|
705
|
+
break;
|
706
|
+
}
|
707
|
+
}
|
708
|
+
if (!found) {
|
709
|
+
if (rb_block_given_p()) {
|
710
|
+
rb_ary_push(ret, rb_yield(argv[i]));
|
711
|
+
} else {
|
712
|
+
rb_ary_free(ret);
|
713
|
+
rb_raise(rb_eKeyError, "key not found: \"%s\"", StringValueCStr(argv[i]));
|
714
|
+
return Qnil;
|
715
|
+
}
|
716
|
+
}
|
717
|
+
}
|
718
|
+
return ret;
|
719
|
+
}
|
720
|
+
|
642
721
|
/*
|
643
722
|
* @note This method has linear time complexity.
|
644
723
|
*/
|
645
|
-
static VALUE w_hash_haskey(const VALUE self, VALUE
|
724
|
+
static VALUE w_hash_haskey(const VALUE self, VALUE key) {
|
646
725
|
UsaminValue *value = get_value(self);
|
647
726
|
check_object(value);
|
648
|
-
VALUE key = get_utf8_str(name);
|
649
727
|
for (auto &m : value->value->GetObject())
|
650
|
-
if (
|
728
|
+
if (str_compare_xx(key, m.name))
|
651
729
|
return Qtrue;
|
652
730
|
return Qfalse;
|
653
731
|
}
|
654
732
|
|
733
|
+
static VALUE w_hash_hasvalue(const VALUE self, VALUE val) {
|
734
|
+
UsaminValue *value = get_value(self);
|
735
|
+
check_object(value);
|
736
|
+
for (auto &m : value->value->GetObject())
|
737
|
+
if (rb_equal(val, eval_r(m.value)))
|
738
|
+
return Qtrue;
|
739
|
+
return Qfalse;
|
740
|
+
}
|
741
|
+
|
742
|
+
/*
|
743
|
+
* @return [String | nil]
|
744
|
+
*/
|
745
|
+
static VALUE w_hash_key(const VALUE self, VALUE val) {
|
746
|
+
UsaminValue *value = get_value(self);
|
747
|
+
check_object(value);
|
748
|
+
for (auto &m : value->value->GetObject())
|
749
|
+
if (rb_equal(val, eval_r(m.value)))
|
750
|
+
return eval_str(m.name);
|
751
|
+
return Qnil;
|
752
|
+
}
|
753
|
+
|
655
754
|
/*
|
656
755
|
* @return [::Array<String>]
|
657
756
|
*/
|
@@ -673,6 +772,18 @@ static VALUE w_hash_length(const VALUE self) {
|
|
673
772
|
return UINT2NUM(value->value->MemberCount());
|
674
773
|
}
|
675
774
|
|
775
|
+
/*
|
776
|
+
* @return [::Array | nil]
|
777
|
+
*/
|
778
|
+
static VALUE w_hash_rassoc(const VALUE self, VALUE val) {
|
779
|
+
UsaminValue *value = get_value(self);
|
780
|
+
check_object(value);
|
781
|
+
for (auto &m : value->value->GetObject())
|
782
|
+
if (rb_funcall(val, rb_intern("=="), 1, eval_r(m.value)))
|
783
|
+
return rb_assoc_new(eval(m.name), eval(m.value));
|
784
|
+
return Qnil;
|
785
|
+
}
|
786
|
+
|
676
787
|
/*
|
677
788
|
* @yield [key, value]
|
678
789
|
* @yieldparam key [String]
|
@@ -701,6 +812,51 @@ static VALUE w_hash_select(const VALUE self) {
|
|
701
812
|
return hash;
|
702
813
|
}
|
703
814
|
|
815
|
+
/*
|
816
|
+
* @yield [key, value]
|
817
|
+
* @yieldparam key [String]
|
818
|
+
* @yieldparam value [Object]
|
819
|
+
* @return [Enumerator | ::Hash]
|
820
|
+
*/
|
821
|
+
static VALUE w_hash_reject(const VALUE self) {
|
822
|
+
UsaminValue *value = get_value(self);
|
823
|
+
check_object(value);
|
824
|
+
RETURN_SIZED_ENUMERATOR(self, 0, nullptr, hash_enum_size);
|
825
|
+
VALUE hash = rb_hash_new();
|
826
|
+
if (rb_proc_arity(rb_block_proc()) > 1) {
|
827
|
+
for (auto &m : value->value->GetObject()) {
|
828
|
+
VALUE args[] = { eval_str(m.name), eval(m.value) };
|
829
|
+
if (!RTEST(rb_yield_values2(2, args)))
|
830
|
+
rb_hash_aset(hash, args[0], args[1]);
|
831
|
+
}
|
832
|
+
} else {
|
833
|
+
for (auto &m : value->value->GetObject()) {
|
834
|
+
VALUE key = eval_str(m.name);
|
835
|
+
VALUE val = eval(m.value);
|
836
|
+
if (!RTEST(rb_yield(rb_assoc_new(key, val))))
|
837
|
+
rb_hash_aset(hash, key, val);
|
838
|
+
}
|
839
|
+
}
|
840
|
+
return hash;
|
841
|
+
}
|
842
|
+
|
843
|
+
/*
|
844
|
+
* @yield [key, value]
|
845
|
+
* @yieldparam key [String]
|
846
|
+
* @yieldparam value [Object]
|
847
|
+
* @return [Enumerator | ::Hash]
|
848
|
+
*/
|
849
|
+
static VALUE w_hash_slice(const int argc, VALUE* argv, const VALUE self) {
|
850
|
+
UsaminValue *value = get_value(self);
|
851
|
+
check_object(value);
|
852
|
+
VALUE hash = rb_hash_new();
|
853
|
+
for (int i = 0; i < argc; i++)
|
854
|
+
for (auto &m : value->value->GetObject())
|
855
|
+
if (str_compare_xx(argv[i], m.name))
|
856
|
+
rb_hash_aset(hash, eval_str(m.name), eval(m.value));
|
857
|
+
return hash;
|
858
|
+
}
|
859
|
+
|
704
860
|
/*
|
705
861
|
* Convert to Ruby Hash. Same as {Value#eval}.
|
706
862
|
*
|
@@ -712,6 +868,18 @@ static VALUE w_hash_eval(const VALUE self) {
|
|
712
868
|
return eval_object(*(value->value));
|
713
869
|
}
|
714
870
|
|
871
|
+
/*
|
872
|
+
* @return [::Array<Object>]
|
873
|
+
*/
|
874
|
+
static VALUE w_hash_to_a(const VALUE self) {
|
875
|
+
UsaminValue *value = get_value(self);
|
876
|
+
check_object(value);
|
877
|
+
VALUE ret = rb_ary_new2(value->value->MemberCount());
|
878
|
+
for (auto &m : value->value->GetObject())
|
879
|
+
rb_ary_push(ret, rb_assoc_new(eval_str(m.name), eval(m.value)));
|
880
|
+
return ret;
|
881
|
+
}
|
882
|
+
|
715
883
|
/*
|
716
884
|
* @return [::Array<Object>]
|
717
885
|
*/
|
@@ -724,6 +892,56 @@ static VALUE w_hash_values(const VALUE self) {
|
|
724
892
|
return ret;
|
725
893
|
}
|
726
894
|
|
895
|
+
/*
|
896
|
+
* @yield [key]
|
897
|
+
* @yieldparam key [String]
|
898
|
+
* @return [Enumerator | ::Hash]
|
899
|
+
*/
|
900
|
+
static VALUE w_hash_transform_keys(const VALUE self) {
|
901
|
+
UsaminValue *value = get_value(self);
|
902
|
+
check_object(value);
|
903
|
+
RETURN_SIZED_ENUMERATOR(self, 0, nullptr, hash_enum_size);
|
904
|
+
VALUE hash = rb_hash_new();
|
905
|
+
for (auto &m : value->value->GetObject())
|
906
|
+
rb_hash_aset(hash, rb_yield(eval_str(m.name)), eval(m.value));
|
907
|
+
return hash;
|
908
|
+
}
|
909
|
+
|
910
|
+
/*
|
911
|
+
* @yield [value]
|
912
|
+
* @yieldparam value [Object]
|
913
|
+
* @return [Enumerator | ::Hash]
|
914
|
+
*/
|
915
|
+
static VALUE w_hash_transform_values(const VALUE self) {
|
916
|
+
UsaminValue *value = get_value(self);
|
917
|
+
check_object(value);
|
918
|
+
RETURN_SIZED_ENUMERATOR(self, 0, nullptr, hash_enum_size);
|
919
|
+
VALUE hash = rb_hash_new();
|
920
|
+
for (auto &m : value->value->GetObject())
|
921
|
+
rb_hash_aset(hash, eval_str(m.name), rb_yield(eval(m.value)));
|
922
|
+
return hash;
|
923
|
+
}
|
924
|
+
|
925
|
+
/*
|
926
|
+
* @param [String] keys
|
927
|
+
* @return [::Array<Object>]
|
928
|
+
*/
|
929
|
+
static VALUE w_hash_values_at(const int argc, VALUE *argv, const VALUE self) {
|
930
|
+
UsaminValue *value = get_value(self);
|
931
|
+
check_object(value);
|
932
|
+
VALUE ret = rb_ary_new2(argc);
|
933
|
+
for (int i = 0; i < argc; i++) {
|
934
|
+
VALUE data = Qnil;
|
935
|
+
for (auto &m : value->value->GetObject()) {
|
936
|
+
if (str_compare_xx(argv[i], m.name)) {
|
937
|
+
data = eval(m.value);
|
938
|
+
break;
|
939
|
+
}
|
940
|
+
}
|
941
|
+
rb_ary_push(ret, data);
|
942
|
+
}
|
943
|
+
return ret;
|
944
|
+
}
|
727
945
|
|
728
946
|
/*
|
729
947
|
* @overload [](nth)
|
@@ -792,6 +1010,19 @@ static VALUE w_array_at(const VALUE self, VALUE nth) {
|
|
792
1010
|
return Qnil;
|
793
1011
|
}
|
794
1012
|
|
1013
|
+
/*
|
1014
|
+
* @return [::Array]
|
1015
|
+
*/
|
1016
|
+
static VALUE w_array_compact(const VALUE self, VALUE nth) {
|
1017
|
+
UsaminValue *value = get_value(self);
|
1018
|
+
check_array(value);
|
1019
|
+
VALUE ret = rb_ary_new2(value->value->Size());
|
1020
|
+
for (auto &v : value->value->GetArray())
|
1021
|
+
if (!v.IsNull())
|
1022
|
+
rb_ary_push(ret, eval(v));
|
1023
|
+
return ret;
|
1024
|
+
}
|
1025
|
+
|
795
1026
|
static VALUE array_enum_size(const VALUE self, VALUE args, VALUE eobj) {
|
796
1027
|
return UINT2NUM(get_value(self)->value->Size());
|
797
1028
|
}
|
@@ -883,7 +1114,7 @@ static VALUE w_array_find_index(int argc, VALUE* argv, const VALUE self) {
|
|
883
1114
|
|
884
1115
|
if (argc == 1) {
|
885
1116
|
for (rapidjson::SizeType i = 0; i < value->value->Size(); i++) {
|
886
|
-
if (rb_equal(argv[0],
|
1117
|
+
if (rb_equal(argv[0], eval_r((*value->value)[i])) == Qtrue)
|
887
1118
|
return UINT2NUM(i);
|
888
1119
|
}
|
889
1120
|
return Qnil;
|
@@ -939,6 +1170,18 @@ static VALUE w_array_first(const int argc, VALUE* argv, const VALUE self) {
|
|
939
1170
|
}
|
940
1171
|
}
|
941
1172
|
|
1173
|
+
/*
|
1174
|
+
* @return [Boolean]
|
1175
|
+
*/
|
1176
|
+
static VALUE w_array_include(const VALUE self, VALUE val) {
|
1177
|
+
UsaminValue *value = get_value(self);
|
1178
|
+
check_array(value);
|
1179
|
+
for (auto &v : value->value->GetArray())
|
1180
|
+
if (rb_equal(val, eval_r(v)))
|
1181
|
+
return Qtrue;
|
1182
|
+
return Qfalse;
|
1183
|
+
}
|
1184
|
+
|
942
1185
|
/*
|
943
1186
|
* @overload last
|
944
1187
|
* @return [Object | nil]
|
@@ -1043,12 +1286,11 @@ static VALUE w_pretty_generate(const int argc, VALUE *argv, const VALUE self) {
|
|
1043
1286
|
long l = FIX2LONG(v_indent);
|
1044
1287
|
indent_count = l > 0 ? static_cast<unsigned int>(l) : 0;
|
1045
1288
|
} else {
|
1046
|
-
|
1047
|
-
long vlen = RSTRING_LEN(v);
|
1289
|
+
long vlen = RSTRING_LEN(v_indent);
|
1048
1290
|
if (vlen == 0) {
|
1049
1291
|
indent_count = 0;
|
1050
1292
|
} else {
|
1051
|
-
const char *indent_str = RSTRING_PTR(
|
1293
|
+
const char *indent_str = RSTRING_PTR(v_indent);
|
1052
1294
|
switch (indent_str[0]) {
|
1053
1295
|
case ' ':
|
1054
1296
|
case '\t':
|
@@ -1109,24 +1351,37 @@ extern "C" void Init_usamin(void) {
|
|
1109
1351
|
rb_define_alloc_func(rb_cUsaminHash, usamin_alloc);
|
1110
1352
|
rb_undef_method(rb_cUsaminHash, "initialize");
|
1111
1353
|
rb_define_method(rb_cUsaminHash, "[]", RUBY_METHOD_FUNC(w_hash_operator_indexer), 1);
|
1112
|
-
rb_define_method(rb_cUsaminHash, "assoc", RUBY_METHOD_FUNC(
|
1354
|
+
rb_define_method(rb_cUsaminHash, "assoc", RUBY_METHOD_FUNC(w_hash_assoc), 1);
|
1355
|
+
rb_define_method(rb_cUsaminHash, "compact", RUBY_METHOD_FUNC(w_hash_compact), 0);
|
1113
1356
|
rb_define_method(rb_cUsaminHash, "each", RUBY_METHOD_FUNC(w_hash_each), 0);
|
1114
1357
|
rb_define_method(rb_cUsaminHash, "each_pair", RUBY_METHOD_FUNC(w_hash_each), 0);
|
1115
1358
|
rb_define_method(rb_cUsaminHash, "each_key", RUBY_METHOD_FUNC(w_hash_each_key), 0);
|
1116
1359
|
rb_define_method(rb_cUsaminHash, "each_value", RUBY_METHOD_FUNC(w_hash_each_value), 0);
|
1117
1360
|
rb_define_method(rb_cUsaminHash, "empty?", RUBY_METHOD_FUNC(w_hash_isempty), 0);
|
1118
1361
|
rb_define_method(rb_cUsaminHash, "fetch", RUBY_METHOD_FUNC(w_hash_fetch), -1);
|
1362
|
+
rb_define_method(rb_cUsaminHash, "fetch_values", RUBY_METHOD_FUNC(w_hash_fetch_values), -1);
|
1119
1363
|
rb_define_method(rb_cUsaminHash, "has_key?", RUBY_METHOD_FUNC(w_hash_haskey), 1);
|
1120
1364
|
rb_define_method(rb_cUsaminHash, "include?", RUBY_METHOD_FUNC(w_hash_haskey), 1);
|
1121
1365
|
rb_define_method(rb_cUsaminHash, "key?", RUBY_METHOD_FUNC(w_hash_haskey), 1);
|
1122
1366
|
rb_define_method(rb_cUsaminHash, "member?", RUBY_METHOD_FUNC(w_hash_haskey), 1);
|
1367
|
+
rb_define_method(rb_cUsaminHash, "has_value?", RUBY_METHOD_FUNC(w_hash_hasvalue), 1);
|
1368
|
+
rb_define_method(rb_cUsaminHash, "value?", RUBY_METHOD_FUNC(w_hash_hasvalue), 1);
|
1369
|
+
rb_define_method(rb_cUsaminHash, "key", RUBY_METHOD_FUNC(w_hash_key), 1);
|
1370
|
+
rb_define_method(rb_cUsaminHash, "index", RUBY_METHOD_FUNC(w_hash_key), 1);
|
1123
1371
|
rb_define_method(rb_cUsaminHash, "keys", RUBY_METHOD_FUNC(w_hash_keys), 0);
|
1124
1372
|
rb_define_method(rb_cUsaminHash, "length", RUBY_METHOD_FUNC(w_hash_length), 0);
|
1125
1373
|
rb_define_method(rb_cUsaminHash, "size", RUBY_METHOD_FUNC(w_hash_length), 0);
|
1374
|
+
rb_define_method(rb_cUsaminHash, "rassoc", RUBY_METHOD_FUNC(w_hash_rassoc), 1);
|
1375
|
+
rb_define_method(rb_cUsaminHash, "reject", RUBY_METHOD_FUNC(w_hash_reject), 0);
|
1126
1376
|
rb_define_method(rb_cUsaminHash, "select", RUBY_METHOD_FUNC(w_hash_select), 0);
|
1377
|
+
rb_define_method(rb_cUsaminHash, "slice", RUBY_METHOD_FUNC(w_hash_slice), -1);
|
1378
|
+
rb_define_method(rb_cUsaminHash, "to_a", RUBY_METHOD_FUNC(w_hash_to_a), 0);
|
1127
1379
|
rb_define_method(rb_cUsaminHash, "to_h", RUBY_METHOD_FUNC(w_hash_eval), 0);
|
1128
1380
|
rb_define_method(rb_cUsaminHash, "to_hash", RUBY_METHOD_FUNC(w_hash_eval), 0);
|
1381
|
+
rb_define_method(rb_cUsaminHash, "transform_keys", RUBY_METHOD_FUNC(w_hash_transform_keys), 0);
|
1382
|
+
rb_define_method(rb_cUsaminHash, "transform_values", RUBY_METHOD_FUNC(w_hash_transform_values), 0);
|
1129
1383
|
rb_define_method(rb_cUsaminHash, "values", RUBY_METHOD_FUNC(w_hash_values), 0);
|
1384
|
+
rb_define_method(rb_cUsaminHash, "values_at", RUBY_METHOD_FUNC(w_hash_values_at), -1);
|
1130
1385
|
|
1131
1386
|
rb_cUsaminArray = rb_define_class_under(rb_mUsamin, "Array", rb_cUsaminValue);
|
1132
1387
|
rb_include_module(rb_cUsaminArray, rb_mEnumerable);
|
@@ -1134,6 +1389,7 @@ extern "C" void Init_usamin(void) {
|
|
1134
1389
|
rb_undef_method(rb_cUsaminArray, "initialize");
|
1135
1390
|
rb_define_method(rb_cUsaminArray, "[]", RUBY_METHOD_FUNC(w_array_operator_indexer), -1);
|
1136
1391
|
rb_define_method(rb_cUsaminArray, "at", RUBY_METHOD_FUNC(w_array_at), 1);
|
1392
|
+
rb_define_method(rb_cUsaminArray, "compact", RUBY_METHOD_FUNC(w_array_compact), 0);
|
1137
1393
|
rb_define_method(rb_cUsaminArray, "each", RUBY_METHOD_FUNC(w_array_each), 0);
|
1138
1394
|
rb_define_method(rb_cUsaminArray, "each_index", RUBY_METHOD_FUNC(w_array_each_index), 0);
|
1139
1395
|
rb_define_method(rb_cUsaminArray, "empty?", RUBY_METHOD_FUNC(w_array_isempty), 0);
|
@@ -1141,6 +1397,7 @@ extern "C" void Init_usamin(void) {
|
|
1141
1397
|
rb_define_method(rb_cUsaminArray, "find_index", RUBY_METHOD_FUNC(w_array_find_index), -1);
|
1142
1398
|
rb_define_method(rb_cUsaminArray, "index", RUBY_METHOD_FUNC(w_array_index), -1);
|
1143
1399
|
rb_define_method(rb_cUsaminArray, "first", RUBY_METHOD_FUNC(w_array_first), -1);
|
1400
|
+
rb_define_method(rb_cUsaminArray, "include?", RUBY_METHOD_FUNC(w_array_include), 1);
|
1144
1401
|
rb_define_method(rb_cUsaminArray, "last", RUBY_METHOD_FUNC(w_array_last), -1);
|
1145
1402
|
rb_define_method(rb_cUsaminArray, "length", RUBY_METHOD_FUNC(w_array_length), 0);
|
1146
1403
|
rb_define_method(rb_cUsaminArray, "size", RUBY_METHOD_FUNC(w_array_length), 0);
|
data/lib/usamin/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: usamin
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 7.7.
|
4
|
+
version: 7.7.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ishotihadus
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-
|
11
|
+
date: 2018-06-03 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|