Mercurial > hg > Members > shoshi > TreeCMSv2
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 } |