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.Map;
import org.redkale.util.ByteTreeNode;
/**
* 字段的反序列化集合操作类
@@ -29,11 +30,12 @@ public class DeMemberInfo {
this.members = deMembers;
this.memberFieldMap = new HashMap<>(deMembers.length);
this.memberTagMap = new HashMap<>(deMembers.length);
this.memberNode = new DeMemberNode();
for (DeMember member : deMembers) {
this.memberFieldMap.put(member.getFieldName(), member);
this.memberTagMap.put(member.getTag(), member);
this.memberNode.put(member.getFieldName(), member);
}
this.memberNode = DeMemberNode.create(deMembers);
}
public static DeMemberInfo create(DeMember... deMembers) {
@@ -48,7 +50,7 @@ public class DeMemberInfo {
return members;
}
public DeMemberNode getMemberNode() {
public ByteTreeNode<DeMember> getMemberNode() {
return memberNode;
}
@@ -59,4 +61,12 @@ public class DeMemberInfo {
public DeMember getMemberByField(String 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 org.redkale.convert.*;
import static org.redkale.convert.Reader.*;
import org.redkale.util.ByteTreeNode;
/**
* 以ByteBuffer为数据载体的JsonReader <br>
@@ -595,7 +596,7 @@ public class JsonByteBufferReader extends JsonReader {
if (ch == 0) {
return null;
}
DeMemberNode node = memberInfo.getMemberNode();
ByteTreeNode<DeMember> node = memberInfo.getMemberNode();
CharArray tmp = array();
if (ch == '"' || ch == '\'') {
final char quote = ch;

View File

@@ -10,6 +10,7 @@ import java.util.*;
import org.redkale.convert.*;
import static org.redkale.convert.Reader.*;
import org.redkale.convert.Reader.ValueType;
import org.redkale.util.ByteTreeNode;
import org.redkale.util.Utility;
/**
@@ -672,7 +673,7 @@ public class JsonReader extends Reader {
if (this.position == eof) {
return null;
}
DeMemberNode node = memberInfo.getMemberNode();
ByteTreeNode<DeMember> node = memberInfo.getMemberNode();
char ch = nextGoodChar(true); // 需要跳过注释
final char[] text0 = this.text;
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;
}
}