ByteTreeNode
This commit is contained in:
@@ -6,6 +6,7 @@ package org.redkale.convert;
|
|||||||
|
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
import org.redkale.util.ByteTreeNode;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 字段的反序列化集合操作类
|
* 字段的反序列化集合操作类
|
||||||
@@ -29,11 +30,12 @@ public class DeMemberInfo {
|
|||||||
this.members = deMembers;
|
this.members = deMembers;
|
||||||
this.memberFieldMap = new HashMap<>(deMembers.length);
|
this.memberFieldMap = new HashMap<>(deMembers.length);
|
||||||
this.memberTagMap = new HashMap<>(deMembers.length);
|
this.memberTagMap = new HashMap<>(deMembers.length);
|
||||||
|
this.memberNode = new DeMemberNode();
|
||||||
for (DeMember member : deMembers) {
|
for (DeMember member : deMembers) {
|
||||||
this.memberFieldMap.put(member.getFieldName(), member);
|
this.memberFieldMap.put(member.getFieldName(), member);
|
||||||
this.memberTagMap.put(member.getTag(), member);
|
this.memberTagMap.put(member.getTag(), member);
|
||||||
|
this.memberNode.put(member.getFieldName(), member);
|
||||||
}
|
}
|
||||||
this.memberNode = DeMemberNode.create(deMembers);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static DeMemberInfo create(DeMember... deMembers) {
|
public static DeMemberInfo create(DeMember... deMembers) {
|
||||||
@@ -48,7 +50,7 @@ public class DeMemberInfo {
|
|||||||
return members;
|
return members;
|
||||||
}
|
}
|
||||||
|
|
||||||
public DeMemberNode getMemberNode() {
|
public ByteTreeNode<DeMember> getMemberNode() {
|
||||||
return memberNode;
|
return memberNode;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -59,4 +61,12 @@ public class DeMemberInfo {
|
|||||||
public DeMember getMemberByField(String field) {
|
public DeMember getMemberByField(String field) {
|
||||||
return memberFieldMap.get(field);
|
return memberFieldMap.get(field);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected static class DeMemberNode extends ByteTreeNode<DeMember> {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void put(String key, DeMember value) {
|
||||||
|
super.put(key, value);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,67 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 2016-2116 Redkale
|
|
||||||
* All rights reserved.
|
|
||||||
*/
|
|
||||||
package org.redkale.convert;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 字段的反序列化操作类
|
|
||||||
*
|
|
||||||
* <p>详情见: https://redkale.org
|
|
||||||
*
|
|
||||||
* @author zhangjx
|
|
||||||
* @since 2.8.0
|
|
||||||
*/
|
|
||||||
public class DeMemberNode {
|
|
||||||
|
|
||||||
protected static final int MIN_INDEX = 32;
|
|
||||||
|
|
||||||
protected DeMember value;
|
|
||||||
|
|
||||||
protected DeMemberNode[] nodes = new DeMemberNode[127 - MIN_INDEX];
|
|
||||||
|
|
||||||
public DeMemberNode getNode(char ch) {
|
|
||||||
if (ch <= MIN_INDEX || ch > 127) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
return nodes[ch - MIN_INDEX];
|
|
||||||
}
|
|
||||||
|
|
||||||
public DeMember getMember(String field) {
|
|
||||||
char[] chs = field.toCharArray();
|
|
||||||
DeMemberNode n = this;
|
|
||||||
for (int i = 0; i < chs.length; i++) {
|
|
||||||
n = n.nodes[chs[i] - MIN_INDEX];
|
|
||||||
if (n == null) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return n == null ? null : n.value;
|
|
||||||
}
|
|
||||||
|
|
||||||
public DeMember getValue() {
|
|
||||||
return value;
|
|
||||||
}
|
|
||||||
|
|
||||||
private void add(DeMember member) {
|
|
||||||
char[] chs = member.attribute.field().toCharArray();
|
|
||||||
DeMemberNode n = this;
|
|
||||||
for (int i = 0; i < chs.length; i++) {
|
|
||||||
DeMemberNode s = n.nodes[chs[i] - MIN_INDEX];
|
|
||||||
if (s == null) {
|
|
||||||
s = new DeMemberNode();
|
|
||||||
n.nodes[chs[i] - MIN_INDEX] = s;
|
|
||||||
}
|
|
||||||
n = s;
|
|
||||||
}
|
|
||||||
n.value = member;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static DeMemberNode create(DeMember... members) {
|
|
||||||
DeMemberNode root = new DeMemberNode();
|
|
||||||
for (DeMember member : members) {
|
|
||||||
root.add(member);
|
|
||||||
}
|
|
||||||
return root;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -9,6 +9,7 @@ import java.nio.ByteBuffer;
|
|||||||
import java.nio.charset.UnmappableCharacterException;
|
import java.nio.charset.UnmappableCharacterException;
|
||||||
import org.redkale.convert.*;
|
import org.redkale.convert.*;
|
||||||
import static org.redkale.convert.Reader.*;
|
import static org.redkale.convert.Reader.*;
|
||||||
|
import org.redkale.util.ByteTreeNode;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 以ByteBuffer为数据载体的JsonReader <br>
|
* 以ByteBuffer为数据载体的JsonReader <br>
|
||||||
@@ -595,7 +596,7 @@ public class JsonByteBufferReader extends JsonReader {
|
|||||||
if (ch == 0) {
|
if (ch == 0) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
DeMemberNode node = memberInfo.getMemberNode();
|
ByteTreeNode<DeMember> node = memberInfo.getMemberNode();
|
||||||
CharArray tmp = array();
|
CharArray tmp = array();
|
||||||
if (ch == '"' || ch == '\'') {
|
if (ch == '"' || ch == '\'') {
|
||||||
final char quote = ch;
|
final char quote = ch;
|
||||||
|
|||||||
@@ -10,6 +10,7 @@ import java.util.*;
|
|||||||
import org.redkale.convert.*;
|
import org.redkale.convert.*;
|
||||||
import static org.redkale.convert.Reader.*;
|
import static org.redkale.convert.Reader.*;
|
||||||
import org.redkale.convert.Reader.ValueType;
|
import org.redkale.convert.Reader.ValueType;
|
||||||
|
import org.redkale.util.ByteTreeNode;
|
||||||
import org.redkale.util.Utility;
|
import org.redkale.util.Utility;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -672,7 +673,7 @@ public class JsonReader extends Reader {
|
|||||||
if (this.position == eof) {
|
if (this.position == eof) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
DeMemberNode node = memberInfo.getMemberNode();
|
ByteTreeNode<DeMember> node = memberInfo.getMemberNode();
|
||||||
char ch = nextGoodChar(true); // 需要跳过注释
|
char ch = nextGoodChar(true); // 需要跳过注释
|
||||||
final char[] text0 = this.text;
|
final char[] text0 = this.text;
|
||||||
int curr = this.position;
|
int curr = this.position;
|
||||||
|
|||||||
66
src/main/java/org/redkale/util/ByteTreeNode.java
Normal file
66
src/main/java/org/redkale/util/ByteTreeNode.java
Normal file
@@ -0,0 +1,66 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2016-2116 Redkale
|
||||||
|
* All rights reserved.
|
||||||
|
*/
|
||||||
|
package org.redkale.util;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* byte树对象, key必须是latin1字符串
|
||||||
|
*
|
||||||
|
* <p>详情见: https://redkale.org
|
||||||
|
*
|
||||||
|
* @author zhangjx
|
||||||
|
* @param <T> T
|
||||||
|
* @since 2.8.0
|
||||||
|
*/
|
||||||
|
public class ByteTreeNode<T> {
|
||||||
|
|
||||||
|
protected T value;
|
||||||
|
|
||||||
|
protected ByteTreeNode<T>[] nodes = new ByteTreeNode[127];
|
||||||
|
|
||||||
|
protected ByteTreeNode() {}
|
||||||
|
|
||||||
|
public static <T> ByteTreeNode<T> create() {
|
||||||
|
return new ByteTreeNode();
|
||||||
|
}
|
||||||
|
|
||||||
|
public ByteTreeNode<T> getNode(byte b) {
|
||||||
|
return b < 0 ? null : nodes[b];
|
||||||
|
}
|
||||||
|
|
||||||
|
public ByteTreeNode<T> getNode(char ch) {
|
||||||
|
return ch >= nodes.length ? null : nodes[ch];
|
||||||
|
}
|
||||||
|
|
||||||
|
public T getValue() {
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
|
||||||
|
public T getValue(String key) {
|
||||||
|
ByteTreeNode<T> n = this;
|
||||||
|
for (char ch : key.toCharArray()) {
|
||||||
|
n = n.nodes[ch];
|
||||||
|
if (n == null) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return n.value;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void put(String key, T value) {
|
||||||
|
ByteTreeNode n = this;
|
||||||
|
for (char ch : key.toCharArray()) {
|
||||||
|
if (ch >= nodes.length) {
|
||||||
|
throw new RedkaleException(key + " contains illegal char: " + ch);
|
||||||
|
}
|
||||||
|
ByteTreeNode s = n.nodes[ch];
|
||||||
|
if (s == null) {
|
||||||
|
s = new ByteTreeNode();
|
||||||
|
n.nodes[ch] = s;
|
||||||
|
}
|
||||||
|
n = s;
|
||||||
|
}
|
||||||
|
n.value = value;
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user