package net.contrapunctus.rngzip; import java.io.IOException; import java.io.PrintWriter; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Vector; class ParallelStates extends CompositeState { private Vector<SequentialStates> vec; private IllegalStateException exn; ParallelStates(SequentialStates s1, SequentialStates s2) { vec = new Vector<SequentialStates>(5); vec.add(s1); vec.add(s2); } public CompositeState next() throws IOException { switch(vec.size()) { case 0: throw exn; case 1: SequentialStates q = vec.get(0); q.out.commit(); q.para = null; return q; default: return this; } } public CompositeState initialize(SingletonState s0) { if(vec.size() == 0) throw exn; return vec.get(0).initialize(s0); } public CompositeState start(int elt, Map<Integer,String> att) throws IOException { for(Iterator<SequentialStates> i = vec.iterator(); i.hasNext(); ) { try { i.next().start(elt, att); } catch(IllegalStateException x) { exn = x; i.remove(); } } return next(); } public CompositeState attrs(Map<Integer,String> att) throws IOException { for(Iterator<SequentialStates> i = vec.iterator(); i.hasNext(); ) { try { i.next().attrs(att); } catch(IllegalStateException x) { exn = x; i.remove(); } } return next(); } public CompositeState chars(char[] buf, int start, int length) throws IOException { for(Iterator<SequentialStates> i = vec.iterator(); i.hasNext(); ) { try { i.next().chars(buf, start, length); } catch(IllegalStateException x) { exn = x; i.remove(); } } return next(); } public CompositeState end(Map<Integer,String> att) throws IOException { for(Iterator<SequentialStates> i = vec.iterator(); i.hasNext(); ) { try { i.next().end(att); } catch(IllegalStateException x) { exn = x; i.remove(); } } return next(); } public void add(SequentialStates st) { vec.add(st); } public void show(PrintWriter pw) { assert vec.size() > 1; pw.print('('); boolean first = true; for(SequentialStates i : vec) { if(first) first = false; else pw.print(" | "); pw.print(i); } pw.print(')'); } }