Skip to content

Commit

Permalink
make container visible
Browse files Browse the repository at this point in the history
  • Loading branch information
Salpadding committed Dec 14, 2019
1 parent 9e67f15 commit 1c6b0a3
Show file tree
Hide file tree
Showing 7 changed files with 77 additions and 14 deletions.
29 changes: 29 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -277,6 +277,35 @@ public class Main{

```

- decode use Container

```java

public class Main{

public static void main(String[] args){
List<Set<byte[]>> list = new ArrayList<>();
list.add(new ByteArraySet());
list.get(0).add("1".getBytes());
Container container = CollectionContainer.builder()
.collectionType(ArrayList.class)
.contentType(
CollectionContainer.builder()
.collectionType(ByteArraySet.class)
.contentType(new Raw(byte[].class))
.build()
)
.build();
List<Set<byte[]>> decoded = (List<Set<byte[]>>) RLPCodec.decodeContainer(
RLPCodec.encode(list),
container
);
assert decoded.get(0).contains("1".getBytes());
}
}

```

Benchmark compare to EthereumJ:

decoding list 10000000 times:
Expand Down
2 changes: 1 addition & 1 deletion build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ plugins {
}

group 'org.tdf'
version '1.1.8'
version '1.1.9'

sourceCompatibility = 1.8

Expand Down
8 changes: 5 additions & 3 deletions src/main/java/org/tdf/rlp/CollectionContainer.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,21 +2,23 @@

import lombok.AccessLevel;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.NoArgsConstructor;

import java.util.Collection;
import java.util.Map;

@NoArgsConstructor(access = AccessLevel.PACKAGE)
@AllArgsConstructor(access = AccessLevel.PACKAGE)
class CollectionContainer<C extends Collection<T>, T> implements Container<T> {
Class<C> collectionType;
@Builder
public class CollectionContainer<C extends Collection<T>, T> implements Container<T> {
Class collectionType;

public ContainerType getType() {
return ContainerType.COLLECTION;
}

Container<T> contentType;
Container contentType;

@Override
public Class<T> asRaw() {
Expand Down
10 changes: 6 additions & 4 deletions src/main/java/org/tdf/rlp/MapContainer.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,22 +2,24 @@

import lombok.AccessLevel;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.NoArgsConstructor;

import java.util.Collection;
import java.util.Map;

@NoArgsConstructor(access = AccessLevel.PACKAGE)
@AllArgsConstructor(access = AccessLevel.PACKAGE)
class MapContainer<M extends Map<K, V>, K, V> implements Container<V> {
Class<M> mapType;
@Builder
public class MapContainer<M extends Map<K, V>, K, V> implements Container<V> {
Class mapType;

public ContainerType getType() {
return ContainerType.MAP;
}

Container<K> keyType;
Container<V> valueType;
Container keyType;
Container valueType;

@Override
public Class<V> asRaw() {
Expand Down
6 changes: 5 additions & 1 deletion src/main/java/org/tdf/rlp/RLPCodec.java
Original file line number Diff line number Diff line change
Expand Up @@ -294,7 +294,11 @@ static RLPElement encodeMap(Map m, Comparator keyOrdering) {
CollectionContainer.fromTypes(collectionType, elementType));
}

static Object decodeContainer(RLPElement element, Container container) {
public static Object decodeContainer(byte[] encoded, Container container){
return decodeContainer(RLPElement.fromEncoded(encoded), container);
}

public static Object decodeContainer(RLPElement element, Container container) {
switch (container.getType()) {
case RAW:
return decode(element, container.asRaw());
Expand Down
7 changes: 5 additions & 2 deletions src/main/java/org/tdf/rlp/Raw.java
Original file line number Diff line number Diff line change
@@ -1,9 +1,12 @@
package org.tdf.rlp;

import lombok.Builder;

import java.util.Collection;
import java.util.Map;

class Raw<V> implements Container<V> {
@Builder
public class Raw<V> implements Container<V> {
Class<V> rawType;

public ContainerType getType() {
Expand All @@ -28,7 +31,7 @@ public CollectionContainer<? extends Collection<V>, V> asCollection() {
Raw() {
}

Raw(Class<V> rawType) {
public Raw(Class<V> rawType) {
this.rawType = rawType;
}
}
29 changes: 26 additions & 3 deletions src/test/java/org/tdf/rlp/RLPTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -1492,17 +1492,17 @@ public void testByteArraySet() {
}

@Test
public void testMapContainer(){
public void testMapContainer() {
Map<String, String> map = new HashMap<>();
map.put("key", "value");
byte[] encoded = RLPCodec.encode(map);
TreeMap<String, String> m2 = RLPCodec.decodeMap(encoded,
TreeMap.class, String.class, String.class);
TreeMap.class, String.class, String.class);
assert m2.get("key").equals("value");
}

@Test
public void testCollectionContainer(){
public void testCollectionContainer() {
Set<byte[]> set = new HashSet<>();
set.add("1".getBytes());
set.add("2".getBytes());
Expand All @@ -1513,4 +1513,27 @@ public void testCollectionContainer(){
assert set.contains("1".getBytes());
assert set.contains("2".getBytes());
}

@Test
public void test3() {
List<Set<byte[]>> list = new ArrayList<>();
list.add(new ByteArraySet());
list.get(0).add("1".getBytes());
Container container = CollectionContainer.builder()
.collectionType(ArrayList.class)
.contentType(
CollectionContainer.builder()
.collectionType(ByteArraySet.class)
.contentType(new Raw(byte[].class))
.build()
)
.build();
List<Set<byte[]>> decoded = (List<Set<byte[]>>) RLPCodec.decodeContainer(
RLPCodec.encode(list),
container
);

assert decoded.get(0).contains("1".getBytes());
}

}

0 comments on commit 1c6b0a3

Please sign in to comment.