ByteTreeNode

This commit is contained in:
redkale
2024-10-05 15:30:16 +08:00
parent 2f5f96290f
commit 04e539ab0f
5 changed files with 82 additions and 71 deletions

View File

@@ -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);
}
}
} }

View File

@@ -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;
}
}

View File

@@ -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;

View File

@@ -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;

View 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;
}
}