package com.mozz.htmlnative; import com.mozz.htmlnative.css.Styles; import java.util.Arrays; import java.util.Iterator; /** * @author Yang Tao, 17/4/25. */ public final class InheritStyleStack implements Iterable<Styles.StyleEntry> { private int level = 0; private int index = 0; private int[] cssCount; private Object[] values; private String[] params; private static final int MAX_DEPTH = 20; InheritStyleStack() { cssCount = new int[MAX_DEPTH]; values = new Object[MAX_DEPTH * 4]; params = new String[MAX_DEPTH * 4]; reset(); } public void push() { level++; } public void newStyle(String param, Object value) { values[index] = value; params[index] = param; index++; cssCount[level]++; } public void pop() { this.index -= cssCount[level]; cssCount[level] = 0; level--; } public void reset() { level = -1; index = 0; Arrays.fill(values, null); Arrays.fill(params, null); } public int size() { return index; } @Override public String toString() { StringBuilder sb = new StringBuilder(); for (int i = 0; i < index; i++) { sb.append(params[i]).append("=").append(values[i]); sb.append(","); } return sb.toString(); } @Override public Iterator<Styles.StyleEntry> iterator() { return new InheritStyleIterator(); } private class InheritStyleIterator implements Iterator<Styles.StyleEntry> { private int index = 0; private int size = InheritStyleStack.this.index; @Override public boolean hasNext() { return index < size; } @Override public Styles.StyleEntry next() { if (index > size) { return null; } Styles.StyleEntry entry = new Styles.StyleEntry(InheritStyleStack.this.params[index], InheritStyleStack.this.values[index]); index++; return entry; } } }