view src/main/java/jp/ac/u_ryukyu/ie/cr/tatsuki/jungle/query/PathNodeIterator.java @ 99:92d0c6e4655c

refactoring to IteratorPathNode
author one
date Wed, 10 Sep 2014 18:54:52 +0900
parents src/main/java/jp/ac/u_ryukyu/ie/cr/tatsuki/jungle/query/IteratorPathNodeImpl.java@95000ff9064d
children c297f0015d9e
line wrap: on
line source

package jp.ac.u_ryukyu.ie.cr.tatsuki.jungle.query;

import java.util.Iterator;
import java.util.Stack;

import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.NodePath;
import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.DefaultNodePath;
import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.TreeNode;
import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.TreeNodeChildren;
import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Pair;

public class PathNodeIterator implements Iterator<Pair<TreeNode,NodePath>> {

    NodePath path;
	TreeNode root;
	TreeNode node;
	int childNumber;
    private TreeNodeChildren children;
    private Stack<TreeNode> nodeStack = new Stack<TreeNode>();
    
	public PathNodeIterator(TreeNode root) {
	    this.root = root;
	    path = new DefaultNodePath();
	    node = root;
	}


	@Override
	public boolean hasNext() {
	    return node != null;
	}

	@Override
	public Pair<TreeNode, NodePath> next() {
	    TreeNode now = node;
	    NodePath currentPath = path;
	    if (node.getChildren().size() > 0) {
	        nodeStack.push(node);
	        currentPath = path.add(0);
	        children = node.getChildren();
	        node = children.at(0).b();
	        childNumber = 1;
	    } else if (node == root) {
            node = null; // no more node
            children = null;
        } else if (children != null && children.size() > childNumber) {
	        childNumber++;
	        node = children.at(childNumber).b();
	        currentPath = path.add(childNumber);
	    } else {
	        path = path.tail();
	        node = nodeStack.pop();
	        children = node.getChildren();
	    }
	    return new Pair<TreeNode,NodePath>(now,currentPath);
	}


    @Override
    public void remove() {
        // TODO Auto-generated method stub
        
    }
	
}