Skip to content

Commit 52342fe

Browse files
committed
Make Map/ArrayCursorImpl implement Value interface
1 parent 84ac459 commit 52342fe

File tree

4 files changed

+70
-22
lines changed

4 files changed

+70
-22
lines changed

msgpack-core/src/main/java/org/msgpack/value/holder/ValueHolder.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -36,11 +36,11 @@ public Value get() {
3636
case ARRAY:
3737
case MAP:
3838
case EXTENDED:
39-
return current.toImmutable();
4039
case STRING:
41-
return ValueFactory.newRawString(cloneBuffer(rawHolder.getBuffer()));
4240
case BINARY:
43-
return ValueFactory.newBinary(cloneBuffer(rawHolder.getBuffer()));
41+
return current;
42+
// return ValueFactory.newRawString(cloneBuffer(rawHolder.getBuffer()));
43+
// return ValueFactory.newBinary(cloneBuffer(rawHolder.getBuffer()));
4444
default:
4545
throw UNREACHABLE;
4646
}

msgpack-core/src/main/java/org/msgpack/value/impl/ArrayCursorImpl.java

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
/**
1212
* ArrayCursor implementation
1313
*/
14-
public class ArrayCursorImpl extends AbstractValue implements ArrayCursor {
14+
public class ArrayCursorImpl extends AbstractValue implements ArrayValue {
1515

1616
private final ValueHolder valueHolder;
1717
private MessageUnpacker unpacker;
@@ -110,14 +110,29 @@ public void accept(ValueVisitor visitor) {
110110
}
111111

112112
@Override
113-
public ArrayValue toImmutable() {
113+
public Value[] toArray() {
114114
ensureNotTraversed();
115115
Value[] arr = new Value[arraySize];
116116
int i = 0;
117117
for(Value v : this) {
118118
arr[i++] = v.toImmutable();
119119
}
120-
return ValueFactory.newArray(arr);
120+
return arr;
121+
}
122+
123+
@Override
124+
public Value get(int index) {
125+
throw UNSUPPORTED("get(index) on ArrayCursor is not supported. Use ArrayCursor.toImmutable().");
126+
}
127+
128+
@Override
129+
public Value apply(int index) {
130+
throw UNSUPPORTED("apply(index) on ArrayCursor is not supported. Use ArrayCursor.toImmutable().");
131+
}
132+
133+
@Override
134+
public ArrayValue toImmutable() {
135+
return ValueFactory.newArray(toArray());
121136

122137
}
123138

msgpack-core/src/main/java/org/msgpack/value/impl/MapCursorImpl.java

Lines changed: 36 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44
import org.msgpack.core.MessagePacker;
55
import org.msgpack.core.MessageUnpacker;
66
import org.msgpack.value.KeyValuePair;
7-
import org.msgpack.value.MapCursor;
87
import org.msgpack.value.MapValue;
98
import org.msgpack.value.Value;
109
import org.msgpack.value.ValueFactory;
@@ -13,13 +12,15 @@
1312
import org.msgpack.value.holder.ValueHolder;
1413

1514
import java.io.IOException;
15+
import java.util.HashMap;
16+
import java.util.Map;
1617

1718
import static org.msgpack.core.MessagePackException.UNSUPPORTED;
1819

1920
/**
2021
* MapCursor implementation
2122
*/
22-
public class MapCursorImpl extends AbstractValue implements MapCursor {
23+
public class MapCursorImpl extends AbstractValue implements MapValue {
2324

2425
private final ValueHolder valueHolder;
2526
private MessageUnpacker unpacker;
@@ -54,11 +55,11 @@ public boolean hasNext() {
5455
public KeyValuePair next() {
5556
try {
5657
unpacker.unpackValue(valueHolder);
57-
Value key = valueHolder.get();
58+
Value key = valueHolder.get().toImmutable();
5859
cursor++;
5960

6061
unpacker.unpackValue(valueHolder);
61-
Value value = valueHolder.get();
62+
Value value = valueHolder.get().toImmutable();
6263
cursor++;
6364
return new KeyValuePair(key, value);
6465
}
@@ -72,6 +73,7 @@ public void skip() {
7273
try {
7374
unpacker.skipValue();
7475
unpacker.skipValue();
76+
cursor += 2;
7577
}
7678
catch(IOException e) {
7779
throw new MessageFormatException(e);
@@ -113,16 +115,42 @@ public void accept(ValueVisitor visitor) {
113115
}
114116

115117
@Override
116-
public MapValue toImmutable() {
118+
public Value[] toKeyValueArray() {
117119
ensureNotTraversed();
118120
Value[] keyValueArray = new Value[mapSize * 2];
119121
int i = 0;
120122
while(hasNext()) {
121123
KeyValuePair pair = next();
122-
keyValueArray[i++] = pair.key.toImmutable();
123-
keyValueArray[i++] = pair.value.toImmutable();
124+
keyValueArray[i++] = pair.key;
125+
keyValueArray[i++] = pair.value;
126+
}
127+
return keyValueArray;
128+
}
129+
130+
@Override
131+
public KeyValuePair[] toArray() {
132+
ensureNotTraversed();
133+
KeyValuePair[] result = new KeyValuePair[mapSize];
134+
int i = 0;
135+
while(hasNext()) {
136+
KeyValuePair pair = next();
137+
result[i++] = pair;
124138
}
125-
return ValueFactory.newMap(keyValueArray);
139+
return result;
140+
}
141+
142+
@Override
143+
public Map<Value, Value> toMap() {
144+
Map<Value, Value> map = new HashMap<Value, Value>();
145+
for(KeyValuePair kv : toArray()) {
146+
map.put(kv.key, kv.value);
147+
}
148+
return map;
149+
}
150+
151+
@Override
152+
public MapValue toImmutable() {
153+
return ValueFactory.newMap(toKeyValueArray());
126154
}
127155

128156
@Override

msgpack-core/src/test/scala/org/msgpack/value/CursorTest.scala

Lines changed: 13 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -87,19 +87,19 @@ class CursorTest extends MessagePackSpec {
8787
data(1).asStringValue().toString shouldBe "x"
8888
}
8989

90-
"traverse ValueRef faster than traversing Value" taggedAs("ref") in {
90+
"traverse faster than extracting immutable values" taggedAs("ref") in {
9191
val N = 10000
9292
val data = binSeq(N)
9393

9494
time("traversal", repeat=100) {
95-
block("value") {
95+
block("immutable") {
9696
val cursor = msgpack.newUnpacker(data).getCursor
9797
while(cursor.hasNext) {
98-
cursor.next()
98+
cursor.next().toImmutable
9999
}
100100
cursor.close()
101101
}
102-
block("value-ref") {
102+
block("cursor") {
103103
val cursor = msgpack.newUnpacker(data).getCursor
104104
while(cursor.hasNext) {
105105
cursor.next()
@@ -121,7 +121,7 @@ class CursorTest extends MessagePackSpec {
121121
while(unpacker.hasNext) {
122122
val vt = unpacker.getNextFormat.getValueType
123123
if(vt.isIntegerType) {
124-
unpacker.unpackInteger(intHolder);
124+
unpacker.unpackInteger(intHolder)
125125
count += 1
126126
}
127127
else {
@@ -179,19 +179,24 @@ class CursorTest extends MessagePackSpec {
179179
val unpacker = msgpack.newUnpacker(m)
180180
val vh = new ValueHolder
181181
unpacker.unpackValue(vh)
182-
val mapValue = vh.get().asMapValue()
182+
val mapValue = vh.get().asMapValue().toImmutable
183+
info(mapValue)
183184

184185
val map = mapValue.toMap
185186
map.size shouldBe 3
186187

187-
val arr = map.get(ValueFactory.newString("A")).asArrayValue()
188+
//import scala.collection.JavaConversions._
189+
//info(map.map(p => s"${p._1}->${p._2}").mkString(", "))
190+
191+
val k = map.get(ValueFactory.newString("A"))
192+
val arr = k.asArrayValue()
188193
arr.size shouldBe 2
189194

190195
val cmap = map.get(ValueFactory.newString("C")).asMapValue()
191196
cmap.size shouldBe 3
192197
cmap.toMap.get(ValueFactory.newString("c")).asMapValue().size() shouldBe 1
193198

194-
info(mapValue)
199+
195200
}
196201

197202

0 commit comments

Comments
 (0)