protobuf_java_helpers 0.1.1-java → 0.2.0-java

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: a3f9b31577a8febb01cea661b249658bd7687ae2
4
- data.tar.gz: 900ded1d519d468307eb34efc4bb313731fec93b
3
+ metadata.gz: 5dbe390930dc3f5880b318fae77f1d18783b875e
4
+ data.tar.gz: d67af2c6dfba079537fbecba804268f57ff7a8ae
5
5
  SHA512:
6
- metadata.gz: 99ab497203ad7e98a8cc4a3fe63dbcc7098e8f4dc749a777748d8a476d073724a4062c41b8df4932da68aba0f87460292e0a8bd0456ce3c519d8413a630343fb
7
- data.tar.gz: 56ba95bebf58a01272beaf2665d8ad3fd1466d52aa83d459f41e534ad383f622d0a8870188e11000b6b88ab96637b54e2ebf85fe3563f0af94d9af27d87ac109
6
+ metadata.gz: 65fe02b012cdaf484e043e0e282eb9d886e14b8468efbd3a0eb5cac1e84e77b6696d1e6894f26027ea0b2ac0d26345eed3b1f3f7cefe216172c576dfa93c6ccc
7
+ data.tar.gz: 06cda872d96c48edc94d7809dc2e34beda699adcf4b2c07973375ef987d2e43847d32ab07748880d2b66c5c1926f98ced0dadddeb90094c2ea1102c1cefa2833
@@ -15,7 +15,7 @@ import org.jruby.runtime.ThreadContext;
15
15
  import org.jruby.runtime.builtin.IRubyObject;
16
16
 
17
17
  public class Int32ProtobufField {
18
- private static final long MIN = 0L;
18
+ private static final long MIN = (long)java.lang.Math.pow(-2, 31);
19
19
  private static final long MAX = ((long)java.lang.Math.pow(2, 31) - 1);
20
20
  private static String TYPE = "Int32";
21
21
 
@@ -17,12 +17,15 @@ import org.jruby.runtime.builtin.IRubyObject;
17
17
  public class Int64ProtobufField {
18
18
  private static final long MIN = ((long)java.lang.Math.pow(-2, 63));
19
19
  private static final long MAX = ((long)java.lang.Math.pow(2, 63) - 1);
20
- private static String TYPE = "Int32";
20
+ private static String TYPE = "Int64";
21
+
22
+ private static boolean internal_acceptable(long value) {
23
+ return value >= MIN && value <= MAX;
24
+ }
21
25
 
22
26
  private static boolean internal_acceptable(IRubyObject recv) {
23
- if (recv instanceof RubyInteger || recv instanceof RubyFixnum) {
24
- long value = ((RubyFixnum) recv).getLongValue();
25
- return value >= MIN && value <= MAX;
27
+ if (recv instanceof RubyInteger || recv instanceof RubyFixnum || recv instanceof RubyNumeric || recv instanceof RubyFloat) {
28
+ return internal_acceptable(((RubyNumeric) recv).getLongValue());
26
29
  }
27
30
 
28
31
  return false;
@@ -46,15 +49,7 @@ public class Int64ProtobufField {
46
49
  if (!internal_acceptable(recv)) {
47
50
  throw runtime.newTypeError("can't convert " + recv.getMetaClass() + " into " + TYPE);
48
51
  }
49
-
50
- if (recv instanceof RubyInteger) {
51
- return ((RubyInteger)recv).to_i();
52
- }
53
-
54
- if (recv instanceof RubyFixnum) {
55
- return ((RubyFixnum)recv).to_i();
56
- }
57
-
58
- return org.jruby.util.TypeConverter.convertToInteger(context, recv, 10);
52
+
53
+ return context.getRuntime().newFixnum(((RubyNumeric) recv).getLongValue());
59
54
  }
60
55
  }
@@ -0,0 +1,90 @@
1
+ package com.abrandoned.protobuf_java_helpers;
2
+
3
+ import java.lang.Math;
4
+ import org.jruby.Ruby;
5
+ import org.jruby.RubyBignum;
6
+ import org.jruby.RubyComplex;
7
+ import org.jruby.RubyFixnum;
8
+ import org.jruby.RubyFloat;
9
+ import org.jruby.RubyInteger;
10
+ import org.jruby.RubyNumeric;
11
+ import org.jruby.RubyString;
12
+ import java.math.BigInteger;
13
+ import org.jruby.util.TypeConverter;
14
+ import org.jruby.anno.JRubyMethod;
15
+ import org.jruby.runtime.ThreadContext;
16
+ import org.jruby.runtime.builtin.IRubyObject;
17
+
18
+ public class IntegerProtobufField {
19
+ private static final long MIN = ((long)java.lang.Math.pow(-2, 63));
20
+ private static final long MAX = ((long)java.lang.Math.pow(2, 63) - 1);
21
+ private static String TYPE = "Integer";
22
+
23
+ private static boolean internal_acceptable(long value) {
24
+ return value >= MIN && value <= MAX;
25
+ }
26
+
27
+ private static boolean internal_acceptable(IRubyObject recv) {
28
+ if (recv instanceof RubyInteger || recv instanceof RubyFixnum || recv instanceof RubyNumeric || recv instanceof RubyFloat) {
29
+ return internal_acceptable(((RubyFixnum) recv).getLongValue());
30
+ }
31
+
32
+ return false;
33
+ }
34
+
35
+ @JRubyMethod(name = "acceptable?")
36
+ public static IRubyObject acceptable_p( ThreadContext context, IRubyObject self, IRubyObject recv ) {
37
+ org.jruby.Ruby runtime = context.getRuntime();
38
+
39
+ if (internal_acceptable(recv)) {
40
+ return runtime.getTrue();
41
+ }
42
+
43
+ return runtime.getFalse();
44
+ }
45
+
46
+ @JRubyMethod(name = "coerce!")
47
+ public static IRubyObject coerce_bang( ThreadContext context, IRubyObject self, IRubyObject recv ) {
48
+ org.jruby.Ruby runtime = context.getRuntime();
49
+
50
+ if (!internal_acceptable(recv)) {
51
+ throw runtime.newTypeError("can't convert " + recv.getMetaClass() + " into " + TYPE);
52
+ }
53
+
54
+ if (recv instanceof RubyInteger) {
55
+ return ((RubyInteger)recv).to_i();
56
+ }
57
+
58
+ if (recv instanceof RubyFixnum) {
59
+ return ((RubyFixnum)recv).to_i();
60
+ }
61
+
62
+ return org.jruby.util.TypeConverter.convertToInteger(context, recv, 10);
63
+ }
64
+
65
+ @JRubyMethod
66
+ public static IRubyObject decode_varint_64( ThreadContext context, IRubyObject self, IRubyObject recv ) {
67
+ if (!(recv instanceof RubyInteger || recv instanceof RubyFixnum || recv instanceof RubyNumeric || recv instanceof RubyFloat)) {
68
+ System.out.println("DERP");
69
+ return context.nil;
70
+ }
71
+
72
+ long value = ((RubyNumeric) recv).getLongValue();
73
+ org.jruby.Ruby runtime = context.getRuntime();
74
+
75
+ if ((value & 0x8000000000000000L) != 0L) {
76
+ java.math.BigInteger big_value = java.math.BigInteger.valueOf(value);
77
+ java.math.BigInteger big_minus = java.math.BigInteger.ONE.shiftLeft(16);
78
+ big_value = big_value.subtract(big_minus);
79
+
80
+ value = big_value.longValue();
81
+ }
82
+
83
+ if (internal_acceptable(value)) {
84
+ return context.getRuntime().newFixnum(value);
85
+ } else {
86
+ System.out.println("DERP2");
87
+ return context.nil;
88
+ }
89
+ }
90
+ }
@@ -17,7 +17,7 @@ import org.jruby.runtime.builtin.IRubyObject;
17
17
  public class Sint64ProtobufField {
18
18
  private static final long MIN = ((long)java.lang.Math.pow(-2, 63));
19
19
  private static final long MAX = ((long)java.lang.Math.pow(2, 63) - 1);
20
- private static String TYPE = "Sint32";
20
+ private static String TYPE = "Sint64";
21
21
 
22
22
  private static boolean internal_acceptable(IRubyObject recv) {
23
23
  if (recv instanceof RubyInteger || recv instanceof RubyFixnum) {
@@ -16,7 +16,7 @@ import org.jruby.runtime.builtin.IRubyObject;
16
16
 
17
17
  public class Uint32ProtobufField {
18
18
  private static final long MIN = 0L;
19
- private static final long MAX = ((long)java.lang.Math.pow(2, 31) - 1);
19
+ private static final long MAX = ((long)java.lang.Math.pow(2, 32) - 1);
20
20
  private static String TYPE = "Uint32";
21
21
 
22
22
  private static boolean internal_acceptable(IRubyObject recv) {
@@ -17,7 +17,7 @@ import org.jruby.runtime.builtin.IRubyObject;
17
17
  public class Uint64ProtobufField {
18
18
  private static final long MIN = 0L;
19
19
  private static final long MAX = ((long)java.lang.Math.pow(2, 64) - 1);
20
- private static String TYPE = "Uint32";
20
+ private static String TYPE = "Uint64";
21
21
 
22
22
  private static boolean internal_acceptable(IRubyObject recv) {
23
23
  if (recv instanceof RubyInteger || recv instanceof RubyFixnum) {
@@ -0,0 +1,203 @@
1
+ package com.abrandoned.protobuf_java_helpers;
2
+
3
+ /**
4
+ * Licensed to the Apache Software Foundation (ASF) under one or more
5
+ * contributor license agreements. See the NOTICE file distributed with
6
+ * this work for additional information regarding copyright ownership.
7
+ * The ASF licenses this file to You under the Apache License, Version 2.0
8
+ * (the "License"); you may not use this file except in compliance with
9
+ * the License. You may obtain a copy of the License at
10
+ *
11
+ * http://www.apache.org/licenses/LICENSE-2.0
12
+ *
13
+ * Unless required by applicable law or agreed to in writing, software
14
+ * distributed under the License is distributed on an "AS IS" BASIS,
15
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16
+ * See the License for the specific language governing permissions and
17
+ * limitations under the License.
18
+ */
19
+ import java.io.DataInput;
20
+ import java.io.DataOutput;
21
+ import java.io.IOException;
22
+
23
+ /**
24
+ * <p>Encodes signed and unsigned values using a common variable-length
25
+ * scheme, found for example in
26
+ * <a href="http://code.google.com/apis/protocolbuffers/docs/encoding.html">
27
+ * Google's Protocol Buffers</a>. It uses fewer bytes to encode smaller values,
28
+ * but will use slightly more bytes to encode large values.</p>
29
+ * <p/>
30
+ * <p>Signed values are further encoded using so-called zig-zag encoding
31
+ * in order to make them "compatible" with variable-length encoding.</p>
32
+ */
33
+ public final class Varint {
34
+
35
+ private Varint() {
36
+ }
37
+
38
+ /**
39
+ * Encodes a value using the variable-length encoding from
40
+ * <a href="http://code.google.com/apis/protocolbuffers/docs/encoding.html">
41
+ * Google Protocol Buffers</a>. It uses zig-zag encoding to efficiently
42
+ * encode signed values. If values are known to be nonnegative,
43
+ * {@link #writeUnsignedVarLong(long, DataOutput)} should be used.
44
+ *
45
+ * @param value value to encode
46
+ * @param out to write bytes to
47
+ * @throws IOException if {@link DataOutput} throws {@link IOException}
48
+ */
49
+ public static void writeSignedVarLong(long value, DataOutput out) throws IOException {
50
+ // Great trick from http://code.google.com/apis/protocolbuffers/docs/encoding.html#types
51
+ writeUnsignedVarLong((value << 1) ^ (value >> 63), out);
52
+ }
53
+
54
+ /**
55
+ * Encodes a value using the variable-length encoding from
56
+ * <a href="http://code.google.com/apis/protocolbuffers/docs/encoding.html">
57
+ * Google Protocol Buffers</a>. Zig-zag is not used, so input must not be negative.
58
+ * If values can be negative, use {@link #writeSignedVarLong(long, DataOutput)}
59
+ * instead. This method treats negative input as like a large unsigned value.
60
+ *
61
+ * @param value value to encode
62
+ * @param out to write bytes to
63
+ * @throws IOException if {@link DataOutput} throws {@link IOException}
64
+ */
65
+ public static void writeUnsignedVarLong(long value, DataOutput out) throws IOException {
66
+ while ((value & 0xFFFFFFFFFFFFFF80L) != 0L) {
67
+ out.writeByte(((int) value & 0x7F) | 0x80);
68
+ value >>>= 7;
69
+ }
70
+ out.writeByte((int) value & 0x7F);
71
+ }
72
+
73
+ public static void writeUnsignedVarLong2(long value, DataOutput out) throws IOException {
74
+ if ((value & 0xFFFFFFFFFFFFFF80L) != 0L) {
75
+ out.writeByte(((int) value & 0x7F) | 0x80);
76
+ value >>>= 7;
77
+ if ((value & 0xFFFFFFFFFFFFFF80L) != 0L) {
78
+ out.writeByte(((int) value & 0x7F) | 0x80);
79
+ value >>>= 7;
80
+ if ((value & 0xFFFFFFFFFFFFFF80L) != 0L) {
81
+ out.writeByte(((int) value & 0x7F) | 0x80);
82
+ value >>>= 7;
83
+ if ((value & 0xFFFFFFFFFFFFFF80L) != 0L) {
84
+ out.writeByte(((int) value & 0x7F) | 0x80);
85
+ value >>>= 7;
86
+ if ((value & 0xFFFFFFFFFFFFFF80L) != 0L) {
87
+ out.writeByte(((int) value & 0x7F) | 0x80);
88
+ value >>>= 7;
89
+ if ((value & 0xFFFFFFFFFFFFFF80L) != 0L) {
90
+ out.writeByte(((int) value & 0x7F) | 0x80);
91
+ value >>>= 7;
92
+ if ((value & 0xFFFFFFFFFFFFFF80L) != 0L) {
93
+ out.writeByte(((int) value & 0x7F) | 0x80);
94
+ value >>>= 7;
95
+ if ((value & 0xFFFFFFFFFFFFFF80L) != 0L) {
96
+ out.writeByte(((int) value & 0x7F) | 0x80);
97
+ value >>>= 7;
98
+ if ((value & 0xFFFFFFFFFFFFFF80L) != 0L) {
99
+ out.writeByte(((int) value & 0x7F) | 0x80);
100
+ value >>>= 7;
101
+ }
102
+ }
103
+ }
104
+ }
105
+ }
106
+ }
107
+ }
108
+ }
109
+ }
110
+
111
+ out.writeByte((int) value & 0x7F);
112
+ }
113
+
114
+ /**
115
+ * @see #writeSignedVarLong(long, DataOutput)
116
+ */
117
+ public static void writeSignedVarInt(int value, DataOutput out) throws IOException {
118
+ // Great trick from http://code.google.com/apis/protocolbuffers/docs/encoding.html#types
119
+ writeUnsignedVarInt((value << 1) ^ (value >> 31), out);
120
+ }
121
+
122
+ /**
123
+ * @see #writeUnsignedVarLong(long, DataOutput)
124
+ */
125
+ public static void writeUnsignedVarInt(int value, DataOutput out) throws IOException {
126
+ while ((value & 0xFFFFFF80) != 0L) {
127
+ out.writeByte((value & 0x7F) | 0x80);
128
+ value >>>= 7;
129
+ }
130
+ out.writeByte(value & 0x7F);
131
+ }
132
+
133
+ /**
134
+ * @param in to read bytes from
135
+ * @return decode value
136
+ * @throws IOException if {@link DataInput} throws {@link IOException}
137
+ * @throws IllegalArgumentException if variable-length value does not terminate
138
+ * after 9 bytes have been read
139
+ * @see #writeSignedVarLong(long, DataOutput)
140
+ */
141
+ public static long readSignedVarLong(DataInput in) throws IOException {
142
+ long raw = readUnsignedVarLong(in);
143
+ // This undoes the trick in writeSignedVarLong()
144
+ long temp = (((raw << 63) >> 63) ^ raw) >> 1;
145
+ // This extra step lets us deal with the largest signed values by treating
146
+ // negative results from read unsigned methods as like unsigned values
147
+ // Must re-flip the top bit if the original read value had it set.
148
+ return temp ^ (raw & (1L << 63));
149
+ }
150
+
151
+ /**
152
+ * @param in to read bytes from
153
+ * @return decode value
154
+ * @throws IOException if {@link DataInput} throws {@link IOException}
155
+ * @throws IllegalArgumentException if variable-length value does not terminate
156
+ * after 9 bytes have been read
157
+ * @see #writeUnsignedVarLong(long, DataOutput)
158
+ */
159
+ public static long readUnsignedVarLong(DataInput in) throws IOException {
160
+ long value = 0L;
161
+ int i = 0;
162
+ long b;
163
+ while (((b = in.readByte()) & 0x80L) != 0) {
164
+ value |= (b & 0x7F) << i;
165
+ i += 7;
166
+ }
167
+ return value | (b << i);
168
+ }
169
+
170
+ /**
171
+ * @throws IllegalArgumentException if variable-length value does not terminate
172
+ * after 5 bytes have been read
173
+ * @throws IOException if {@link DataInput} throws {@link IOException}
174
+ * @see #readSignedVarLong(DataInput)
175
+ */
176
+ public static int readSignedVarInt(DataInput in) throws IOException {
177
+ int raw = readUnsignedVarInt(in);
178
+ // This undoes the trick in writeSignedVarInt()
179
+ int temp = (((raw << 31) >> 31) ^ raw) >> 1;
180
+ // This extra step lets us deal with the largest signed values by treating
181
+ // negative results from read unsigned methods as like unsigned values.
182
+ // Must re-flip the top bit if the original read value had it set.
183
+ return temp ^ (raw & (1 << 31));
184
+ }
185
+
186
+
187
+ /**
188
+ * @throws IllegalArgumentException if variable-length value does not terminate
189
+ * after 5 bytes have been read
190
+ * @throws IOException if {@link DataInput} throws {@link IOException}
191
+ * @see #readUnsignedVarLong(DataInput)
192
+ */
193
+ public static int readUnsignedVarInt(DataInput in) throws IOException {
194
+ int value = 0;
195
+ int i = 0;
196
+ int b;
197
+ while (((b = in.readByte()) & 0x80) != 0) {
198
+ value |= (b & 0x7F) << i;
199
+ i += 7;
200
+ }
201
+ return value | (b << i);
202
+ }
203
+ }
@@ -2,13 +2,17 @@ package com.abrandoned.protobuf_java_helpers;
2
2
 
3
3
  import java.io.IOException;
4
4
  import java.io.InputStream;
5
+ import java.io.OutputStream;;
6
+ import java.io.DataOutput;
7
+ import java.io.DataInput;
8
+ import java.io.DataInputStream;
9
+ import java.io.DataOutputStream;
5
10
  import java.io.ByteArrayOutputStream;
6
11
  import java.lang.Math;
7
- import java.util.concurrent.ConcurrentMap;
8
- import java.util.concurrent.ConcurrentHashMap;
9
- import java.util.function.Function;
12
+ import java.math.BigInteger;
10
13
  import org.jcodings.specific.ASCIIEncoding;
11
14
  import org.jruby.Ruby;
15
+ import org.jruby.RubyArray;
12
16
  import org.jruby.RubyBignum;
13
17
  import org.jruby.RubyComplex;
14
18
  import org.jruby.RubyFixnum;
@@ -17,104 +21,27 @@ import org.jruby.RubyInteger;
17
21
  import org.jruby.RubyNumeric;
18
22
  import org.jruby.RubyString;
19
23
  import org.jruby.RubyIO;
20
- import org.jruby.ext.stringio.StringIO;
24
+ import org.jruby.util.IOInputStream;
21
25
  import org.jruby.util.ByteList;
22
26
  import org.jruby.anno.JRubyMethod;
23
27
  import org.jruby.runtime.ThreadContext;
24
28
  import org.jruby.runtime.builtin.IRubyObject;
25
29
 
26
30
  public class Varinter {
27
- private static final long INT32_MAX = ((long)java.lang.Math.pow(2, 31) - 1);
28
-
29
- private static byte[] internal_to_varint(long value) {
30
- java.io.ByteArrayOutputStream bytes = new java.io.ByteArrayOutputStream();
31
-
32
- while (value > 0x7f) {
33
- bytes.write((byte) (0x80 | (value & 0x7f)));
34
- value >>= 7;
35
- }
36
-
37
- bytes.write((byte) value);
38
- return bytes.toByteArray();
39
- }
40
-
41
- @JRubyMethod(name = "acceptable?")
42
- public static IRubyObject acceptable_p( ThreadContext context, IRubyObject self, IRubyObject recv ) {
43
- org.jruby.Ruby runtime = context.getRuntime();
44
-
45
- if (recv instanceof RubyInteger || recv instanceof RubyFixnum) {
46
- long value = ((RubyFixnum) recv).getLongValue();
47
-
48
- if (value >= 0 && value <= INT32_MAX) {
49
- return runtime.getTrue();
50
- } else {
51
- return runtime.getFalse();
52
- }
53
- }
54
-
55
- return runtime.getFalse();
56
- }
57
-
58
31
  @JRubyMethod
59
- public static IRubyObject to_varint( ThreadContext context, IRubyObject self, IRubyObject recv ) {
60
- if (!(recv instanceof RubyInteger || recv instanceof RubyFixnum)) {
32
+ public static IRubyObject to_varint( ThreadContext context, IRubyObject self, IRubyObject recv ) throws IOException {
33
+ if (recv instanceof RubyBignum || !(recv instanceof RubyInteger || recv instanceof RubyFixnum || recv instanceof RubyNumeric || recv instanceof RubyFloat)) {
61
34
  return context.nil;
62
35
  }
63
36
 
64
- long value = ((RubyFixnum) recv).getLongValue();
37
+ long value = ((RubyNumeric) recv).getLongValue();
65
38
  org.jruby.Ruby runtime = context.getRuntime();
66
- RubyString bit_string = runtime.newString(new ByteList(internal_to_varint(value), true));
67
- bit_string.force_encoding(context, runtime.getEncodingService().getEncoding(org.jcodings.specific.ASCIIEncoding.INSTANCE));
68
- return bit_string;
69
- }
39
+ ByteArrayOutputStream backing = new ByteArrayOutputStream();
40
+ DataOutput data_output = new DataOutputStream(backing);
41
+ com.abrandoned.protobuf_java_helpers.Varint.writeUnsignedVarLong2(value, data_output);
70
42
 
71
- @JRubyMethod
72
- public static IRubyObject to_varint_64( ThreadContext context, IRubyObject self, IRubyObject recv ) {
73
- if (!(recv instanceof RubyInteger || recv instanceof RubyFixnum)) {
74
- return context.nil;
75
- }
76
-
77
- long value = ((RubyFixnum) recv).getLongValue();
78
- org.jruby.Ruby runtime = context.getRuntime();
79
- RubyString bit_string = runtime.newString(new ByteList(internal_to_varint(value & 0xffffffffffffffffL), true));
43
+ RubyString bit_string = runtime.newString(new ByteList(backing.toByteArray(), true));
80
44
  bit_string.force_encoding(context, runtime.getEncodingService().getEncoding(org.jcodings.specific.ASCIIEncoding.INSTANCE));
81
45
  return bit_string;
82
46
  }
83
-
84
- @JRubyMethod
85
- public static IRubyObject read_varint(ThreadContext context, IRubyObject self, IRubyObject recv ) throws IOException {
86
- long value = 0L;
87
- int index = 0;
88
- long current_byte;
89
-
90
- if (recv instanceof StringIO) {
91
- StringIO current_recv = ((StringIO)recv);
92
- RubyFixnum fixnum;
93
-
94
- do {
95
- fixnum = ((RubyFixnum)(current_recv.getbyte(context)));
96
- current_byte = fixnum.getLongValue();
97
- if (index == 0 && current_byte < 128) { return context.getRuntime().newFixnum(current_byte); }
98
- value = (value | ((current_byte & 0x7f) << (7 * index)));
99
- index++;
100
- } while ((current_byte & 0x80) != 0);
101
-
102
- return context.getRuntime().newFixnum(value);
103
- }
104
-
105
- if (recv instanceof RubyIO) {
106
- RubyIO current_recv = ((RubyIO)recv);
107
-
108
- do {
109
- current_byte = current_recv.getByte(context);
110
- if (index == 0 && current_byte < 128) { return context.getRuntime().newFixnum(current_byte); }
111
- value = (value | ((current_byte & 0x7f) << (7 * index)));
112
- index++;
113
- } while ((current_byte & 0x80) != 0);
114
-
115
- return context.getRuntime().newFixnum(value);
116
- }
117
-
118
- return context.nil;
119
- }
120
47
  }
@@ -15,6 +15,9 @@ public class VarinterService implements BasicLibraryService {
15
15
  RubyModule varinter = protobuf_java_helpers.defineModuleUnder(Varinter.class.getSimpleName());
16
16
  varinter.defineAnnotatedMethods(Varinter.class);
17
17
 
18
+ RubyModule integer_protobuf = protobuf_java_helpers.defineModuleUnder(IntegerProtobufField.class.getSimpleName());
19
+ integer_protobuf.defineAnnotatedMethods(IntegerProtobufField.class);
20
+
18
21
  RubyModule uint64_protobuf = protobuf_java_helpers.defineModuleUnder(Uint64ProtobufField.class.getSimpleName());
19
22
  uint64_protobuf.defineAnnotatedMethods(Uint64ProtobufField.class);
20
23
 
@@ -3,8 +3,36 @@ require "jruby"
3
3
  require "protobuf_java_helpers/version"
4
4
 
5
5
  module ProtobufJavaHelpers
6
- # Your code goes here...
7
6
  end
8
7
 
9
8
  require "jars/protobuf_java_helpers.jar"
10
9
  com.abrandoned.protobuf_java_helpers.VarinterService.new.basicLoad(::JRuby.runtime)
10
+
11
+ module ProtobufJavaHelpers
12
+ module EncodeDecode
13
+ include ::ProtobufJavaHelpers::Varinter
14
+
15
+ def pure_encode(value)
16
+ bytes = []
17
+ until value < 128
18
+ bytes << (0x80 | (value & 0x7f))
19
+ value >>= 7
20
+ end
21
+ (bytes << value).pack('C*')
22
+ end
23
+
24
+ def encode(value)
25
+ to_varint(value) || pure_encode(value)
26
+ end
27
+
28
+ def decode(stream)
29
+ value = index = 0
30
+ begin
31
+ byte = stream.readbyte
32
+ value |= (byte & 0x7f) << (7 * index)
33
+ index += 1
34
+ end while (byte & 0x80).nonzero?
35
+ value
36
+ end
37
+ end
38
+ end
@@ -1,3 +1,3 @@
1
1
  module ProtobufJavaHelpers
2
- VERSION = "0.1.1"
2
+ VERSION = "0.2.0"
3
3
  end
@@ -33,6 +33,7 @@ Gem::Specification.new do |spec|
33
33
  spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
34
34
  spec.require_paths = ["lib"]
35
35
 
36
+ spec.add_development_dependency "benchmark-ips"
36
37
  spec.add_development_dependency "bundler", "~> 1.16"
37
38
  spec.add_development_dependency "rake", "~> 10.0"
38
39
  spec.add_development_dependency "minitest", "~> 5.0"
metadata CHANGED
@@ -1,15 +1,29 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: protobuf_java_helpers
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.1
4
+ version: 0.2.0
5
5
  platform: java
6
6
  authors:
7
7
  - Brandon Dewitt
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2018-11-05 00:00:00.000000000 Z
11
+ date: 2019-01-15 00:00:00.000000000 Z
12
12
  dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ requirement: !ruby/object:Gem::Requirement
15
+ requirements:
16
+ - - ">="
17
+ - !ruby/object:Gem::Version
18
+ version: '0'
19
+ name: benchmark-ips
20
+ prerelease: false
21
+ type: :development
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
13
27
  - !ruby/object:Gem::Dependency
14
28
  requirement: !ruby/object:Gem::Requirement
15
29
  requirements:
@@ -84,10 +98,12 @@ files:
84
98
  - bin/setup
85
99
  - ext/ruby_protobuf/Int32ProtobufField.java
86
100
  - ext/ruby_protobuf/Int64ProtobufField.java
101
+ - ext/ruby_protobuf/IntegerProtobufField.java
87
102
  - ext/ruby_protobuf/Sint32ProtobufField.java
88
103
  - ext/ruby_protobuf/Sint64ProtobufField.java
89
104
  - ext/ruby_protobuf/Uint32ProtobufField.java
90
105
  - ext/ruby_protobuf/Uint64ProtobufField.java
106
+ - ext/ruby_protobuf/Varint.java
91
107
  - ext/ruby_protobuf/VarintProtobufField.java
92
108
  - ext/ruby_protobuf/Varinter.java
93
109
  - ext/ruby_protobuf/VarinterService.java