view src/treecms/memory/OnMemoryMonotonicTree.java @ 17:168deb591f21

commit
author shoshi
date Tue, 24 May 2011 00:33:12 +0900
parents bb9760760744
children f3150b37f9be
line wrap: on
line source

package treecms.memory;

import treecms.api.MonotonicTree;

import treecms.api.MonotonicTreeNode;
import treecms.api.SingleNode;
import treecms.api.Tree;
import treecms.merger.Merger;
import treecms.merger.ReplaceMerger;

public class OnMemoryMonotonicTree implements MonotonicTree
{
	private volatile OnMemoryTree m_tree;
	private OnMemoryNode m_old;
	private OnMemoryMonotonicTreeNode m_root;
	private static final Merger<SingleNode> m_merger = new ReplaceMerger<SingleNode>();
	
	public OnMemoryMonotonicTree(OnMemoryTree _tree)
	{
		m_tree = _tree;
		m_old = (OnMemoryNode)m_tree.getRoot().getNode();
		m_root = new OnMemoryMonotonicTreeNode((OnMemoryNode)m_old,null);
	}

	@Override
	public boolean commit(boolean _force)
	{
		return m_tree.compareAndSwapRootNode(m_old,(OnMemoryNode)m_root.getNode(),_force);
	}

	@Override
	public boolean pull()
	{
		m_old = (OnMemoryNode)m_tree.getRoot().getNode();
		return true;
	}

	@Override
	public boolean check()
	{
		return m_tree.compareAndSwapRootNode(m_old,m_old,false);
	}

	@Override
	public void merge()
	{
		//merge here
		m_old = (OnMemoryNode)m_merger.merge(m_tree.getRoot().getNode(),m_root.getNode());
	}

	@Override
	public MonotonicTreeNode getRoot()
	{
		return this.m_root;
	}

	@Override
	public Tree getTree()
	{
		return (Tree)m_tree;
	}
}