view src/treecms/memory/OnMemoryTree.java @ 11:85061e874775

commit
author shoshi
date Fri, 06 May 2011 00:42:57 +0900
parents 17ed97ca9960
children fbbb7e414346
line wrap: on
line source

package treecms.memory;

import java.nio.ByteBuffer;
import java.util.List;
import java.util.Map;
import java.util.concurrent.atomic.AtomicReference;
import java.util.concurrent.atomic.AtomicReferenceFieldUpdater;

import treecms.api.Forest;
import treecms.api.Node;
import treecms.api.NodeData;
import treecms.api.NodeID;
import treecms.api.Tree;
import treecms.api.TreeNode;

/**
 * オンメモリのTree実装です。
 * 木構造のルートとなるNodeをメンバーとして持ち、操作はすべて転送します。
 * @author shoshi
 */
final class OnMemoryTree implements Tree
{
	private static final AtomicReferenceFieldUpdater<OnMemoryTree,OnMemoryNode> m_refUpdater = AtomicReferenceFieldUpdater.newUpdater(OnMemoryTree.class,OnMemoryNode.class,"m_root");
	private volatile OnMemoryNode m_root;
	
	/**
	 * コンストラクタです。
	 * @param _newRoot 木構造のルートノードです。
	 */
	public OnMemoryTree(OnMemoryNode _newRoot)
	{
		m_root = _newRoot;
	}
	
	/**
	 * この木構造のルートNodeを取得します.
	 * @return ルートNode
	 */	
	@Override
	public TreeNode getRoot()
	{
		return new OnMemoryTreeNode(m_root,null);
	}
	
	/**
	 * ルートNodeを比較して置き換えます.
	 * @param _except 比較する対象 
	 * @param _newRoot 一致した場合置き換える対象
	 */
	public boolean compareAndSwapRootNode(OnMemoryNode _expect,OnMemoryNode _newRoot,boolean _force)
	{
		if(_force){
			m_root = _newRoot;
		}
		
		m_refUpdater.compareAndSet(this,_expect,_newRoot);
		return true;
	}

}