comparison src/treecms/memory/OnMemoryTree.java @ 9:17ed97ca9960

commit
author shoshi
date Mon, 18 Apr 2011 01:07:27 +0900
parents f96193babac0
children 85061e874775
comparison
equal deleted inserted replaced
8:f96193babac0 9:17ed97ca9960
2 2
3 import java.nio.ByteBuffer; 3 import java.nio.ByteBuffer;
4 import java.util.List; 4 import java.util.List;
5 import java.util.Map; 5 import java.util.Map;
6 import java.util.concurrent.atomic.AtomicReference; 6 import java.util.concurrent.atomic.AtomicReference;
7 import java.util.concurrent.atomic.AtomicReferenceFieldUpdater;
7 8
8 import treecms.api.Forest; 9 import treecms.api.Forest;
9 import treecms.api.Node; 10 import treecms.api.Node;
10 import treecms.api.NodeData; 11 import treecms.api.NodeData;
11 import treecms.api.NodeID; 12 import treecms.api.NodeID;
16 * 木構造のルートとなるNodeをメンバーとして持ち、操作はすべて転送します。 17 * 木構造のルートとなるNodeをメンバーとして持ち、操作はすべて転送します。
17 * @author shoshi 18 * @author shoshi
18 */ 19 */
19 final class OnMemoryTree implements Tree 20 final class OnMemoryTree implements Tree
20 { 21 {
21 private AtomicReference<OnMemoryNode> m_ref; 22 private static final AtomicReferenceFieldUpdater<OnMemoryTree,OnMemoryNode> m_refUpdater = AtomicReferenceFieldUpdater.newUpdater(OnMemoryTree.class,OnMemoryNode.class,"m_root");
23 private volatile OnMemoryNode m_root;
22 24
23 /** 25 /**
24 * コンストラクタです。 26 * コンストラクタです。
25 * @param _newRoot 木構造のルートノードです。 27 * @param _newRoot 木構造のルートノードです。
26 */ 28 */
27 public OnMemoryTree(OnMemoryNode _newRoot) 29 public OnMemoryTree(OnMemoryNode _newRoot)
28 { 30 {
29 m_ref = new AtomicReference<OnMemoryNode>(_newRoot); 31 m_root = _newRoot;
30 } 32 }
31 33
32 /** 34 /**
33 * Nodeが属するForestを取得します. 35 * Nodeが属するForestを取得します.
34 * @return Nodeが属するForest 36 * @return Nodeが属するForest
35 */ 37 */
36 @Override 38 @Override
37 public Forest getForest() 39 public Forest getForest()
38 { 40 {
39 return m_ref.get().getForest(); 41 return m_root.getForest();
40 } 42 }
41 43
42 /** 44 /**
43 * Nodeに対応するNodeIDを取得します. 45 * Nodeに対応するNodeIDを取得します.
44 * @return Nodeに対応するNodeID 46 * @return Nodeに対応するNodeID
45 */ 47 */
46 @Override 48 @Override
47 public NodeID getID() 49 public NodeID getID()
48 { 50 {
49 return m_ref.get().getID(); 51 return m_root.getID();
50 } 52 }
51 53
52 /** 54 /**
53 * Nodeが保持するデータを取得します.クライアントはこのメソッドを用いて取得されるNodeDataを用いてNodeの内容を<b>変更できません</b>。 55 * Nodeが保持するデータを取得します.クライアントはこのメソッドを用いて取得されるNodeDataを用いてNodeの内容を<b>変更できません</b>。
54 * @return Nodeが保持するNodeData 56 * @return Nodeが保持するNodeData
55 */ 57 */
56 @Override 58 @Override
57 public NodeData getData() 59 public NodeData getData()
58 { 60 {
59 return m_ref.get().getData(); 61 return m_root.getData();
60 } 62 }
61 63
62 /** 64 /**
63 * この木構造のルートNodeを取得します. 65 * この木構造のルートNodeを取得します.
64 * @return ルートNode 66 * @return ルートNode
65 */ 67 */
66 @Override 68 @Override
67 public Node getRoot() 69 public Node getRoot()
68 { 70 {
69 return m_ref.get(); 71 return m_root;
70 } 72 }
71 73
72 /** 74 /**
73 * 指定されたNodeを子供Nodeとして追加します. 75 * 指定されたNodeを子供Nodeとして追加します.
74 * @param _child 76 * @param _child
75 */ 77 */
76 @Override 78 @Override
77 public void add(Node _child) 79 public void add(Node _child)
78 { 80 {
79 m_ref.get().add(_child); 81 m_root.add(_child);
80 } 82 }
81 83
82 /** 84 /**
83 * 指定されたリストに含まれるNodeを,すべて子供Nodeとして追加します. 85 * 指定されたリストに含まれるNodeを,すべて子供Nodeとして追加します.
84 * @param _children 追加される子供Nodeを保持するリスト 86 * @param _children 追加される子供Nodeを保持するリスト
85 */ 87 */
86 @Override 88 @Override
87 public void addAll(List<Node> _children) 89 public void addAll(List<Node> _children)
88 { 90 {
89 m_ref.get().addAll(_children); 91 m_root.addAll(_children);
90 } 92 }
91 93
92 /** 94 /**
93 * 子供Nodeのリストを取得します.. 95 * 子供Nodeのリストを取得します..
94 * @return 子供Nodeのリスト 96 * @return 子供Nodeのリスト
95 */ 97 */
96 @Override 98 @Override
97 public List<Node> children() 99 public List<Node> children()
98 { 100 {
99 return m_ref.get().children(); 101 return m_root.children();
100 } 102 }
101 103
102 /** 104 /**
103 * このNodeが保持する値の中で指定されたキーと対応する値を取得します. 105 * このNodeが保持する値の中で指定されたキーと対応する値を取得します.
104 * @param _key データに対応するキー 106 * @param _key データに対応するキー
105 * @return キーと対応する値,見つからない場合はnull 107 * @return キーと対応する値,見つからない場合はnull
106 */ 108 */
107 @Override 109 @Override
108 public ByteBuffer get(ByteBuffer _key) 110 public ByteBuffer get(ByteBuffer _key)
109 { 111 {
110 return m_ref.get().get(_key); 112 return m_root.get(_key);
111 } 113 }
112 114
113 /** 115 /**
114 * このNodeが保持するデータをマップとしてすべて取得します. 116 * このNodeが保持するデータをマップとしてすべて取得します.
115 * @return Nodeが保持するすべてのデータのマップ 117 * @return Nodeが保持するすべてのデータのマップ
116 */ 118 */
117 @Override 119 @Override
118 public Map<ByteBuffer,ByteBuffer> getAll() 120 public Map<ByteBuffer,ByteBuffer> getAll()
119 { 121 {
120 return m_ref.get().getAll(); 122 return m_root.getAll();
121 } 123 }
122 124
123 /** 125 /**
124 * キーとそれに対応する値を保存します.キーが重複した場合は上書きされます. 126 * キーとそれに対応する値を保存します.キーが重複した場合は上書きされます.
125 * @param _key キー 127 * @param _key キー
126 * @param _value 値 128 * @param _value 値
127 */ 129 */
128 @Override 130 @Override
129 public void put(ByteBuffer _key,ByteBuffer _value) 131 public void put(ByteBuffer _key,ByteBuffer _value)
130 { 132 {
131 m_ref.get().put(_key,_value); 133 m_root.put(_key,_value);
132 } 134 }
133 135
134 /** 136 /**
135 * キーとそれに対応する値を複数保持するマップを引数としてとり,マップが保持する値をすべて追加します. 137 * キーとそれに対応する値を複数保持するマップを引数としてとり,マップが保持する値をすべて追加します.
136 * @param _map 追加される値のマップ 138 * @param _map 追加される値のマップ
137 */ 139 */
138 @Override 140 @Override
139 public void putAll(Map<ByteBuffer, ByteBuffer> _map) 141 public void putAll(Map<ByteBuffer, ByteBuffer> _map)
140 { 142 {
141 m_ref.get().putAll(_map); 143 m_root.putAll(_map);
142 } 144 }
143 145
144 /** 146 /**
145 * キーとそれに対応する値を削除します。 147 * キーとそれに対応する値を削除します。
146 * @param _key キー 148 * @param _key キー
147 */ 149 */
148 @Override 150 @Override
149 public void remove(ByteBuffer _key) 151 public void remove(ByteBuffer _key)
150 { 152 {
151 m_ref.get().remove(_key); 153 m_root.remove(_key);
152 } 154 }
153 155
154 /** 156 /**
155 * 子供Nodeを削除します。 157 * 子供Nodeを削除します。
156 * @param _child 158 * @param _child
157 */ 159 */
158 @Override 160 @Override
159 public void remove(Node _child) 161 public void remove(Node _child)
160 { 162 {
161 m_ref.get().remove(_child); 163 m_root.remove(_child);
162 } 164 }
163 165
164 /** 166 /**
165 * ルートNodeを比較して置き換えます. 167 * ルートNodeを比較して置き換えます.
166 * @param _except 比較する対象 168 * @param _except 比較する対象
167 * @param _newRoot 一致した場合置き換える対象 169 * @param _newRoot 一致した場合置き換える対象
168 */ 170 */
169 public boolean compareAndSwapRootNode(OnMemoryNode _except,OnMemoryNode _newRoot,boolean _force) 171 public boolean compareAndSwapRootNode(OnMemoryNode _expect,OnMemoryNode _newRoot,boolean _force)
170 { 172 {
171 if(_force){ 173 if(_force){
172 return m_ref.compareAndSet(_except,_newRoot); 174 m_root = _newRoot;
173 } 175 }
174 176
175 m_ref.set(_newRoot); 177 m_refUpdater.compareAndSet(this,_expect,_newRoot);
176 return true; 178 return true;
177 } 179 }
178 180
179 } 181 }