ninjudd-tuple 0.0.6 → 0.0.7
Sign up to get free protection for your applications and to get access to all the features.
- data/VERSION.yml +1 -1
- data/ext/tuple.c +37 -7
- data/test/tuple_test.rb +16 -1
- metadata +2 -2
data/VERSION.yml
CHANGED
data/ext/tuple.c
CHANGED
@@ -2,7 +2,8 @@
|
|
2
2
|
|
3
3
|
VALUE mTuple;
|
4
4
|
|
5
|
-
#define TRUE_SORT
|
5
|
+
#define TRUE_SORT 255 // TrueClass
|
6
|
+
#define TIME_SORT 128 // Time
|
6
7
|
#define SYM_SORT 64 // Symbol
|
7
8
|
#define STR_SORT 32 // String
|
8
9
|
#define INTP_SORT 16 // Integer (Positive)
|
@@ -14,6 +15,16 @@ VALUE mTuple;
|
|
14
15
|
|
15
16
|
#define BDIGITS(x) ((BDIGIT*)RBIGNUM(x)->digits)
|
16
17
|
|
18
|
+
static void null_pad(VALUE data, int len) {
|
19
|
+
static u_int8_t null = 0;
|
20
|
+
|
21
|
+
// Pad with null bytes so subsequent fields will be aligned.
|
22
|
+
while (len % 4 != 0) {
|
23
|
+
rb_str_cat(data, (char*)&null, 1);
|
24
|
+
len++;
|
25
|
+
}
|
26
|
+
}
|
27
|
+
|
17
28
|
/*
|
18
29
|
* call-seq:
|
19
30
|
* Tuple.dump(tuple) -> string
|
@@ -64,11 +75,17 @@ static VALUE tuple_dump(VALUE self, VALUE tuple) {
|
|
64
75
|
len = RSTRING_LEN(item);
|
65
76
|
rb_str_cat(data, RSTRING_PTR(item), len);
|
66
77
|
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
78
|
+
null_pad(data, len);
|
79
|
+
} else if (rb_obj_class(item) == rb_cTime) {
|
80
|
+
header[2] = TIME_SORT;
|
81
|
+
rb_str_cat(data, (char*)&header, sizeof(header));
|
82
|
+
|
83
|
+
item = rb_funcall(item, rb_intern("getgm"), 0);
|
84
|
+
item = rb_funcall(item, rb_intern("strftime"), 1, rb_str_new2("%Y/%m/%d %H:%M:%S +0000"));
|
85
|
+
len = RSTRING_LEN(item);
|
86
|
+
rb_str_cat(data, RSTRING_PTR(item), len);
|
87
|
+
|
88
|
+
null_pad(data, len);
|
72
89
|
} else {
|
73
90
|
if (item == Qnil) header[2] = NIL_SORT;
|
74
91
|
else if (item == Qtrue) header[2] = TRUE_SORT;
|
@@ -134,12 +151,23 @@ static VALUE tuple_load(VALUE self, VALUE data) {
|
|
134
151
|
case STR_SORT:
|
135
152
|
case SYM_SORT:
|
136
153
|
item = rb_str_new2(ptr);
|
137
|
-
len
|
154
|
+
len = RSTRING_LEN(item);
|
138
155
|
while (len % 4 != 0) len++;
|
139
156
|
ptr += len;
|
140
157
|
if (header[2] == SYM_SORT) item = rb_funcall(item, rb_intern("to_sym"), 0);
|
141
158
|
rb_ary_push(tuple, item);
|
142
159
|
break;
|
160
|
+
case TIME_SORT:
|
161
|
+
item = rb_str_new2(ptr);
|
162
|
+
len = RSTRING_LEN(item);
|
163
|
+
while (len % 4 != 0) len++;
|
164
|
+
ptr += len;
|
165
|
+
item = rb_funcall(rb_cTime, rb_intern("parse"), 1, item);
|
166
|
+
rb_ary_push(tuple, item);
|
167
|
+
break;
|
168
|
+
default:
|
169
|
+
rb_raise(rb_eTypeError, "invalid type code %d in tuple", header[2]);
|
170
|
+
break;
|
143
171
|
}
|
144
172
|
}
|
145
173
|
return tuple;
|
@@ -147,6 +175,8 @@ static VALUE tuple_load(VALUE self, VALUE data) {
|
|
147
175
|
|
148
176
|
VALUE mTuple;
|
149
177
|
void Init_tuple() {
|
178
|
+
rb_require("time");
|
179
|
+
|
150
180
|
mTuple = rb_define_module("Tuple");
|
151
181
|
rb_define_module_function(mTuple, "dump", tuple_dump, 1);
|
152
182
|
rb_define_module_function(mTuple, "load", tuple_load, 1);
|
data/test/tuple_test.rb
CHANGED
@@ -1,8 +1,15 @@
|
|
1
1
|
require File.dirname(__FILE__) + '/test_helper'
|
2
2
|
|
3
|
+
class Time
|
4
|
+
def ==(other)
|
5
|
+
# Ignore microseconds for testing.
|
6
|
+
to_i == other.to_i
|
7
|
+
end
|
8
|
+
end
|
9
|
+
|
3
10
|
class TupleTest < Test::Unit::TestCase
|
4
11
|
should "dump and load arrays of simple types" do
|
5
|
-
t = [1, true, :foo, "foo", -1001, false, nil]
|
12
|
+
t = [1, true, :foo, "foo", -1001, false, nil, Time.now]
|
6
13
|
assert_equal t, Tuple.load(Tuple.dump(t))
|
7
14
|
end
|
8
15
|
|
@@ -17,6 +24,8 @@ class TupleTest < Test::Unit::TestCase
|
|
17
24
|
end
|
18
25
|
|
19
26
|
should "sort tuples using binary" do
|
27
|
+
now = Time.now
|
28
|
+
|
20
29
|
tuples = [
|
21
30
|
[1, "foo"],
|
22
31
|
[1, true],
|
@@ -35,6 +44,9 @@ class TupleTest < Test::Unit::TestCase
|
|
35
44
|
["charles", "atlas jr."],
|
36
45
|
["charles", "atlas", "world's", "strongest", "man"],
|
37
46
|
["charles", "atlas", 5],
|
47
|
+
[now, "foo"],
|
48
|
+
[now, "bar"],
|
49
|
+
[now - 24 * 60 * 60],
|
38
50
|
]
|
39
51
|
|
40
52
|
expected = [
|
@@ -54,6 +66,9 @@ class TupleTest < Test::Unit::TestCase
|
|
54
66
|
[:foo, -18446744073709551616],
|
55
67
|
[:foo, -1],
|
56
68
|
[:foo, 18446744073709551616],
|
69
|
+
[now - 24 * 60 * 60],
|
70
|
+
[now, "bar"],
|
71
|
+
[now, "foo"],
|
57
72
|
[true]
|
58
73
|
]
|
59
74
|
assert_equal expected, tuples.sort_by {|t| Tuple.dump(t)}
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ninjudd-tuple
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.7
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Justin Balthrop
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2009-08-
|
12
|
+
date: 2009-08-22 00:00:00 -07:00
|
13
13
|
default_executable:
|
14
14
|
dependencies: []
|
15
15
|
|