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