package com.mozz.htmlnative.css;
import android.support.annotation.NonNull;
import java.util.Arrays;
import java.util.Iterator;
/**
* @author YangTao7
* NOT THREAD SAFE
*/
public class AttrsSet {
private static final String TAG = AttrsSet.class.getSimpleName();
private Object[] mAttrs;
private int[] mLength;
private int mGrowLength;
private int mLastGrowLength = -1;
private int mCompacity;
private String mName;
public AttrsSet(String name) {
this(name, 10);
}
public AttrsSet(String name, int initCompacity) {
mAttrs = new Object[initCompacity << 1];
mLength = new int[initCompacity];
mGrowLength = 0;
mCompacity = initCompacity;
mName = name;
}
public void put(@NonNull AttrsOwner tree, String paramsKey, @NonNull Object value) {
int startPosition = tree.attrIndex();
putInternal(startPosition + mLength[startPosition], paramsKey, value);
mLength[startPosition]++;
}
private void putInternal(int position, String paramsKey, Object value) {
if (position >= mCompacity) {
grow(mCompacity);
}
mAttrs[position << 1] = paramsKey;
mAttrs[(position << 1) + 1] = value;
mGrowLength++;
}
private void grow(int growSize) {
if (growSize > 0) {
Object[] temp = mAttrs;
int[] tempL = mLength;
mAttrs = new Object[(mCompacity + growSize) << 1];
mLength = new int[mCompacity + growSize];
System.arraycopy(temp, 0, mAttrs, 0, mCompacity << 1);
System.arraycopy(tempL, 0, mLength, 0, mCompacity);
mCompacity += growSize;
}
}
public void register(@NonNull AttrsOwner tree) {
if (mLastGrowLength == mGrowLength) {
mGrowLength++;
}
if (mGrowLength >= mCompacity) {
grow(mCompacity);
}
tree.setAttrIndex(mGrowLength);
mLastGrowLength = mGrowLength;
}
@Override
public String toString() {
return Arrays.toString(mAttrs);
}
public String toString(@NonNull AttrsOwner tree) {
int startPos = tree.attrIndex();
int length = mLength[startPos];
Object[] objects = new Object[length << 1];
System.arraycopy(mAttrs, startPos << 1, objects, 0, length << 1);
return Arrays.toString(objects);
}
public final Iterator<Styles.StyleEntry> iterator(AttrsOwner owner) {
final int startPosition = owner.attrIndex();
final int length = mLength[startPosition];
return new Iterator<Styles.StyleEntry>() {
private int index = startPosition;
private int size = length + startPosition;
@Override
public boolean hasNext() {
return index < size;
}
@Override
public Styles.StyleEntry next() {
if (index > size) {
return null;
}
Styles.StyleEntry styleEntry = new Styles.StyleEntry(getStyleName(index),
getStyle(index));
index++;
return styleEntry;
}
};
}
public final Object getStyle(AttrsOwner owner, String styleName) {
if (owner == null) {
return null;
}
int startPosition = owner.attrIndex();
int treeAttrLength = mLength[startPosition];
for (int i = startPosition; i < startPosition + treeAttrLength; i++) {
String params = (String) mAttrs[i << 1];
final Object value = mAttrs[(i << 1) + 1];
if (params.equals(styleName)) {
return value;
}
}
return null;
}
protected final String getStyleName(int pos) {
return (String) mAttrs[pos << 1];
}
protected final Object getStyle(int pos) {
return mAttrs[(pos << 1) + 1];
}
public String getName() {
return mName;
}
/**
* @author Yang Tao, 17/3/27.
*/
public interface AttrsOwner {
int attrIndex();
void setAttrIndex(int newIndex);
}
}