Mercurial > hg > Members > shoshi > TreeCMSv2
comparison src/treecms/memory/OnMemoryMonotonicTreeNode.java @ 17:168deb591f21
commit
author | shoshi |
---|---|
date | Tue, 24 May 2011 00:33:12 +0900 |
parents | bb9760760744 |
children | 084de6909451 |
comparison
equal
deleted
inserted
replaced
16:bb9760760744 | 17:168deb591f21 |
---|---|
21 */ | 21 */ |
22 public class OnMemoryMonotonicTreeNode implements MonotonicTreeNode | 22 public class OnMemoryMonotonicTreeNode implements MonotonicTreeNode |
23 { | 23 { |
24 private OnMemoryNode m_node; | 24 private OnMemoryNode m_node; |
25 private OnMemoryMonotonicTreeNode m_parent; | 25 private OnMemoryMonotonicTreeNode m_parent; |
26 private OnMemoryMonotonicTree m_tree; | |
27 | 26 |
28 /** | 27 /** |
29 * コンストラクタです. | 28 * コンストラクタです. |
30 * @param _target 対象となるSingleLinked Node | 29 * @param _target 対象となるSingleLinked Node |
31 * @param _parent このDoubleLinked Nodeの親,RootNodeならnull | 30 * @param _parent このDoubleLinked Nodeの親,RootNodeならnull |
35 { | 34 { |
36 m_node = _target; | 35 m_node = _target; |
37 m_parent = _parent; | 36 m_parent = _parent; |
38 } | 37 } |
39 | 38 |
40 public OnMemoryMonotonicTreeNode(OnMemoryNode _root,OnMemoryMonotonicTree _tree) | |
41 { | |
42 m_node = _root; | |
43 m_tree = _tree; | |
44 m_parent = null; | |
45 } | |
46 | |
47 @Override | 39 @Override |
48 public NodeID getID() | 40 public NodeID getID() |
49 { | 41 { |
50 return m_node.getID(); | 42 return m_node.getID(); |
51 } | 43 } |
85 } | 77 } |
86 | 78 |
87 @Override | 79 @Override |
88 public void put(ByteBuffer _key, ByteBuffer _value) | 80 public void put(ByteBuffer _key, ByteBuffer _value) |
89 { | 81 { |
90 m_node.put(_key,_value); | 82 NodeData<SingleNode> d = new NodeData<SingleNode>(m_node); |
83 d.put(_key,_value); | |
84 | |
85 cloneAndTransmit(d); | |
91 } | 86 } |
92 | 87 |
93 @Override | 88 @Override |
94 public void putAll(NodeAttributes _map) | 89 public void putAll(NodeAttributes _map) |
95 { | 90 { |
96 m_node.putAll(_map); | 91 NodeData<SingleNode> d = new NodeData<SingleNode>(m_node); |
92 d.putAll(_map); | |
93 | |
94 cloneAndTransmit(d); | |
97 } | 95 } |
98 | 96 |
99 @Override | 97 @Override |
100 public void remove(ByteBuffer _key) | 98 public void remove(ByteBuffer _key) |
101 { | 99 { |
102 m_node.remove(_key); | 100 NodeData<SingleNode> d = new NodeData<SingleNode>(m_node); |
101 d.remove(_key); | |
102 | |
103 cloneAndTransmit(d); | |
103 } | 104 } |
104 | 105 |
105 @Override | 106 @Override |
106 public void removeAll(Set<ByteBuffer> _keys) | 107 public void removeAll(Set<ByteBuffer> _keys) |
107 { | 108 { |
123 public void cloneAndTransmit(NodeData<SingleNode> _d) | 124 public void cloneAndTransmit(NodeData<SingleNode> _d) |
124 { | 125 { |
125 OnMemoryForest f = (OnMemoryForest)m_node.getForest(); | 126 OnMemoryForest f = (OnMemoryForest)m_node.getForest(); |
126 OnMemoryNode clone = f.createNode(m_node.getID().update(),_d); | 127 OnMemoryNode clone = f.createNode(m_node.getID().update(),_d); |
127 transmit(m_node,clone); | 128 transmit(m_node,clone); |
129 | |
130 m_node = clone; | |
128 } | 131 } |
129 | 132 |
130 /** | 133 /** |
131 * このMonotonicNodeに変更が加えられたら,こちらのメソッドが呼び出されます. | 134 * このMonotonicNodeに変更が加えられたら,こちらのメソッドが呼び出されます. |
132 * 非破壊的に変更するために,SingleLinkedNodeのクローンを作成し,親にも複製を依頼します. | 135 * 非破壊的に変更するために,SingleLinkedNodeのクローンを作成し,親にも複製を依頼します. |
166 } | 169 } |
167 | 170 |
168 @Override | 171 @Override |
169 public boolean add(MonotonicTreeNode _n) | 172 public boolean add(MonotonicTreeNode _n) |
170 { | 173 { |
171 return m_node.add(_n.getNode()); | 174 NodeData<SingleNode> d = new NodeData<SingleNode>(m_node); |
175 boolean ret = d.add(_n.getNode()); | |
176 if(ret){ | |
177 cloneAndTransmit(d); | |
178 } | |
179 | |
180 return ret; | |
172 } | 181 } |
173 | 182 |
174 @Override | 183 @Override |
175 public boolean addAll(NodeChildren<MonotonicTreeNode> _list) | 184 public boolean addAll(NodeChildren<MonotonicTreeNode> _list) |
176 { | 185 { |
177 //MotonicTreeNodeのリストからNodeのリストを作成する. | 186 //MotonicTreeNodeのリストからNodeのリストを作成する. |
178 NodeChildren<SingleNode> res = new NodeChildrenImpl<SingleNode>(); | 187 NodeChildren<SingleNode> c = new NodeChildrenImpl<SingleNode>(); |
179 for(Iterator<MonotonicTreeNode> it = _list.getList().iterator();it.hasNext();){ | 188 for(Iterator<MonotonicTreeNode> it = _list.getList().iterator();it.hasNext();){ |
180 MonotonicTreeNode mono = (MonotonicTreeNode)it.next(); | 189 MonotonicTreeNode mono = (MonotonicTreeNode)it.next(); |
181 res.add(mono.getNode()); | 190 c.add(mono.getNode()); |
182 } | 191 } |
183 | 192 |
184 return m_node.addAll(res); | 193 NodeData<SingleNode> d = new NodeData<SingleNode>(m_node); |
194 boolean ret = d.addAll(c); | |
195 if(ret){ | |
196 cloneAndTransmit(d); | |
197 } | |
198 | |
199 return ret; | |
185 } | 200 } |
186 | 201 |
187 @Override | 202 @Override |
188 public MonotonicTreeNode remove(String _uuid) | 203 public MonotonicTreeNode remove(String _uuid) |
189 { | 204 { |
190 SingleNode n = m_node.remove(_uuid); | 205 NodeData<SingleNode> d = new NodeData<SingleNode>(m_node); |
191 return new OnMemoryMonotonicTreeNode((OnMemoryNode)n,this); | 206 SingleNode n = d.remove(_uuid); |
207 if(n != null){ | |
208 cloneAndTransmit(d); | |
209 return new OnMemoryMonotonicTreeNode((OnMemoryNode)n,null); | |
210 } | |
211 | |
212 return null; | |
192 } | 213 } |
193 | 214 |
194 @Override | 215 @Override |
195 public MonotonicTreeNode remove(int _index) | 216 public MonotonicTreeNode remove(int _index) |
196 { | 217 { |
197 SingleNode n = m_node.remove(_index); | 218 NodeData<SingleNode> d = new NodeData<SingleNode>(m_node); |
198 return new OnMemoryMonotonicTreeNode((OnMemoryNode)n,(OnMemoryMonotonicTreeNode)null); | 219 SingleNode n = d.remove(_index); |
220 if(n != null){ | |
221 cloneAndTransmit(d); | |
222 return new OnMemoryMonotonicTreeNode((OnMemoryNode)n,null); | |
223 } | |
224 | |
225 return null; | |
199 } | 226 } |
200 | 227 |
201 @Override | 228 @Override |
202 public void clearChildren() | 229 public void clearChildren() |
203 { | 230 { |
204 m_node.clearChildren(); | 231 NodeData<SingleNode> d = new NodeData<SingleNode>(m_node); |
232 d.clearChildren(); | |
233 cloneAndTransmit(d); | |
205 } | 234 } |
206 | 235 |
207 @Override | 236 @Override |
208 public Map<ByteBuffer, ByteBuffer> asMap() | 237 public Map<ByteBuffer, ByteBuffer> asMap() |
209 { | 238 { |
237 } | 266 } |
238 | 267 |
239 @Override | 268 @Override |
240 public MonotonicTreeNode replace(MonotonicTreeNode _newChild) | 269 public MonotonicTreeNode replace(MonotonicTreeNode _newChild) |
241 { | 270 { |
242 SingleNode n = m_node.replace(_newChild.getNode()); | 271 NodeData<SingleNode> d = new NodeData<SingleNode>(m_node); |
243 return new OnMemoryMonotonicTreeNode((OnMemoryNode)n,(OnMemoryMonotonicTreeNode)null); | 272 SingleNode n = d.replace(_newChild.getNode()); |
273 if(n != null){ | |
274 cloneAndTransmit(d); | |
275 return new OnMemoryMonotonicTreeNode((OnMemoryNode)n,(OnMemoryMonotonicTreeNode)null); | |
276 } | |
277 | |
278 return null; | |
244 } | 279 } |
245 | 280 |
246 @Override | 281 @Override |
247 public boolean contains(String _id) | 282 public boolean contains(String _id) |
248 { | 283 { |