Orfeo Toolbox  3.16
itkTreeIteratorBase.txx
Go to the documentation of this file.
1 /*=========================================================================
2 
3  Program: Insight Segmentation & Registration Toolkit
4  Module: $RCSfile: itkTreeIteratorBase.txx,v $
5  Language: C++
6  Date: $Date: 2009-06-14 11:55:05 $
7  Version: $Revision: 1.15 $
8 
9  Copyright (c) Insight Software Consortium. All rights reserved.
10  See ITKCopyright.txt or http://www.itk.org/HTML/Copyright.htm for details.
11 
12  This software is distributed WITHOUT ANY WARRANTY; without even
13  the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
14  PURPOSE. See the above copyright notices for more information.
15 
16 =========================================================================*/
17 #ifndef __itkTreeIteratorBase_txx
18 #define __itkTreeIteratorBase_txx
19 
20 #include <itkTreeIteratorBase.h>
21 #include "itkTreeChangeEvent.h"
22 
23 namespace itk
24 {
25 
27 template <class TTreeType>
29 {
30  if(start)
31  {
32  m_Root = start;
33  }
34  else
35  {
36  m_Root = dynamic_cast<const TreeNodeType*>(tree->GetRoot());
37  }
38 
39  m_Position = const_cast<TreeNodeType*>(m_Root);
40  m_Tree = tree;
41  m_Begin = m_Position;
42  m_End = NULL;
43 }
44 
46 template <class TTreeType>
47 TreeIteratorBase<TTreeType>::TreeIteratorBase( const TTreeType* tree, const TreeNodeType* start)
48 {
49  if(start)
50  {
51  m_Root = start;
52  }
53  else
54  {
55  m_Root = const_cast<TreeNodeType*>(dynamic_cast<const TreeNodeType*>(tree->GetRoot()));
56  }
57  m_Position = const_cast<TreeNodeType*>(m_Root);
58  m_Tree = const_cast<TTreeType*>(tree);
59  m_Begin = m_Position;
60  m_End = NULL;
61 }
62 
64 template <class TTreeType>
67 {
68  return m_Position->Get();
69 }
70 
72 template <class TTreeType>
73 void
75 {
76 // assert(m_Position);
77  m_Position->Set(element);
78  m_Tree->Modified();
79  m_Tree->InvokeEvent( TreeNodeChangeEvent<TTreeType>(*this) );
80 }
81 
83 template <class TTreeType>
84 bool
86 {
87  if ( m_Position == NULL && m_Root == NULL )
88  {
89  bool returnValue = false;
90  if ( m_Tree )
91  {
92  returnValue = const_cast<TTreeType*>(m_Tree)->SetRoot( element );
93  }
94  // signal AddEvent for self
95  m_Root = dynamic_cast<const TreeNodeType*>(const_cast<TTreeType*>(m_Tree)->GetRoot());
96  m_Position = const_cast<TreeNodeType*>(m_Root);
97  m_Tree->Modified();
98  m_Tree->InvokeEvent( TreeAddEvent<TTreeType>(*this) );
99  return returnValue;
100  }
101  else if ( m_Position == NULL )
102  {
103  return false;
104  }
105 
106  typename TreeNodeType::Pointer node = TreeNodeType::New();
107  node->Set(element);
108  m_Position->AddChild( node );
109  m_Tree->Modified();
110 
111  // signal AddEvent for new child
112  TreeIteratorBase<TTreeType>* childIterator = Clone();
113  childIterator->m_Position = dynamic_cast<TreeNodeType*>( m_Position->GetChild( m_Position->ChildPosition(node)) );
114  m_Tree->InvokeEvent( TreeAddEvent<TTreeType>(*childIterator) ); // signal "child has been added deleted"
115  delete childIterator;
116 
117  return true;
118 }
119 
121 template <class TTreeType>
122 bool
123 TreeIteratorBase<TTreeType>::Add( int itkNotUsed(childPosition), ValueType element )
124 {
125  if ( m_Position )
126  {
127  typename TreeNodeType::Pointer node = TreeNodeType::New();
128  node->Set(element);
129  m_Position->AddChild(node);
130  m_Tree->Modified();
131 
132  // signal AddEvent
133  TreeIteratorBase<TTreeType>* childIterator = Clone();
134  childIterator->m_Position = dynamic_cast<TreeNodeType*>( m_Position->GetChild( m_Position->ChildPosition(node)) );
135  m_Tree->InvokeEvent( TreeAddEvent<TTreeType>(*childIterator) ); // signal "child has been added deleted"
136  delete childIterator;
137 
138  return true;
139  }
140  return false;
141 }
142 
144 template <class TTreeType>
145 bool
147 {
148  return !(m_Position->HasChildren());
149 }
150 
152 template <class TTreeType>
153 bool
155 {
156  if ( m_Root == NULL )
157  {
158  return false;
159  }
160 
161  if ( m_Position == m_Root )
162  {
163  return true;
164  }
165  return false;
166 }
167 
169 template <class TTreeType>
170 bool
171 TreeIteratorBase<TTreeType>::Add( TTreeType& subTree )
172 {
173  if ( subTree.Count() == 0 )
174  {
175  return false;
176  }
177 
178  if(!subTree.GetRoot())
179  {
180  return false;
181  }
182 
183  if ( m_Root == NULL )
184  {
185  m_Root = static_cast<const TreeNodeType*>(subTree.GetRoot());
186  }
187  else
188  {
189  if ( m_Position == NULL )
190  {
191  return false;
192  }
193  m_Position->AddChild( const_cast<TreeNodeType*>(static_cast<const TreeNodeType*>(subTree.GetRoot())) );
194  }
195  return true;
196 }
197 
199 template <class TTreeType>
200 TTreeType*
202 {
203  typename TTreeType::Pointer tree = TTreeType::New();
204  tree->SetRoot(m_Position);
205  tree->SetSubtree(true);
206  return tree;
207 }
208 
210 template <class TTreeType>
211 bool
213 {
214  if ( m_Position == NULL )
215  {
216  return false;
217  }
218  if ( m_Position->GetChild( number ) != NULL )
219  {
220  return true;
221  }
222  return false;
223 }
224 
226 template <class TTreeType>
227 int
229 {
230  if ( !m_Position )
231  {
232  return -1;
233  }
234  return m_Position->ChildPosition( element );
235 }
236 
238 template <class TTreeType>
239 bool
241 {
242  if( !HasChild( number ) )
243  {
244  return false;
245  }
246  TreeNodeType* child = dynamic_cast<TreeNodeType*>(m_Position->GetChild( number ));
247 
248  if( child != NULL )
249  {
250  // signal PruneEvent (node plus all children are removed)
251  TreeIteratorBase<TTreeType>* childIterator = Clone();
252  childIterator->m_Position = child;
253  m_Tree->InvokeEvent( TreePruneEvent<TTreeType>(*childIterator) ); // signal "child has been added deleted"
254  delete childIterator;
255 
256  const_cast<TreeNodeType*>(m_Position)->Remove( child ); // and really remove child (and subitems)
257  m_Tree->Modified();
258  return true;
259  }
260  return false;
261 }
262 
264 template <class TTreeType>
265 int
267 {
268  if ( m_Position == NULL )
269  {
270  return -1;
271  }
272  return m_Position->CountChildren( );
273 }
274 
276 template <class TTreeType>
277 bool
279 {
280  return ( m_Position != NULL && m_Position->GetParent() != NULL);
281 }
282 
284 template <class TTreeType>
285 bool
287 {
288  if ( m_Position == NULL )
289  {
290  return false;
291  }
292 
293  if( m_Position->HasParent() == false )
294  {
295  return false;
296  }
297 
298  //keep node alive just a bit longer
299  typename TreeNodeType::Pointer position = m_Position;
300 
301  TreeNodeType* parent = dynamic_cast<TreeNodeType*>(m_Position->GetParent());
302  parent->Remove( const_cast<TreeNodeType*>(m_Position) );
303  m_Tree->Modified();
304 
305  while (m_Position->CountChildren() > 0)
306  {
307  TreeNodeType* child = dynamic_cast<TreeNodeType*>(m_Position->GetChild(0)); // always add first child in list, because AddChild() removes the added node from its former parent (== m_position)
308  parent->AddChild( child );
309  }
310 
311  m_Tree->InvokeEvent( TreeRemoveEvent<TTreeType>( *this ) );
312 
313  m_Position = NULL;
314  return true;
315 }
316 
318 template <class TTreeType>
321 {
322  itkGenericOutputMacro("Not implemented yet");
323  ::itk::ExceptionObject e_(__FILE__, __LINE__, "Not implemented yet", ITK_LOCATION);
324  throw e_; /* Explicit naming to work around Intel compiler bug. */
325  return 0;
326 }
327 
328 
330 template <class TTreeType>
333 {
334  if(m_Position == NULL)
335  {
336  return NULL;
337  }
338 
339  return m_Position->GetParent();
340 }
341 
343 template <class TTreeType>
345 {
346  itkGenericOutputMacro("Not implemented yet");
347  ::itk::ExceptionObject e_(__FILE__, __LINE__, "Not implemented yet",ITK_LOCATION);
348  throw e_; /* Explicit naming to work around Intel compiler bug. */
349  return 0;
350 }
351 
353 template <class TTreeType>
355 {
356  if ( m_Position == NULL )
357  {
358  return false;
359  }
360 
361  TreeNodeType* next = dynamic_cast<TreeNodeType*>(m_Position->GetChild( number ));
362 
363  if ( next == NULL )
364  {
365  return false;
366  }
367  m_Position = next;
368  return true;
369 }
370 
372 template <class TTreeType>
374 {
375  if ( m_Position == NULL )
376  {
377  return false;
378  }
379 
380  if( !m_Position->HasParent() )
381  {
382  return false;
383  }
384 
385  m_Position = dynamic_cast<TreeNodeType*>(m_Position->GetParent());
386  return true;
387 }
388 
390 template <class TTreeType>
392 {
393  if ( !m_Position )
394  {
395  return NULL;
396  }
397 
398  TreeNodeType* child = dynamic_cast<TreeNodeType*>(m_Position->GetChild( number ));
399 
400  if ( !child )
401  {
402  return NULL;
403  }
404 // return new WalkTreeIterator<ValueType,P>( child, m_Root, m_Tree, getType() );
405  return NULL;
406 }
407 
409 template <class TTreeType>
411 {
412  int size = 0;
413  this->GoToBegin();
414  if ( !m_Position->HasChildren() )
415  {
416  return 0;
417  }
418  while (this->Next() )
419  {
420  size++;
421  }
422  return size;
423 }
424 
426 template <class TTreeType>
429 {
430  return const_cast<TreeNodeType*>(m_Position);
431 }
432 
434 template <class TTreeType>
437 {
438  return m_Position;
439 }
440 
442 template <class TTreeType>
445 {
446  return const_cast<TreeNodeType*>(m_Root);
447 }
448 
450 template <class TTreeType>
453 {
454  return m_Root;
455 }
456 
458 template <class TTreeType>
459 bool
461 {
462  if ( m_Position == NULL )
463  {
464  return false;
465  }
466 
467  //keep node alive just a bit longer (for the notification)
468  typename TreeNodeType::Pointer position = m_Position;
469 
470  if ( m_Position->HasParent() )
471  {
472  TreeNodeType* parent = m_Position->GetParent();
473  parent->Remove( m_Position ); // removes this node (and implicitly all children, too)
474  }
475  else if (m_Root == m_Position)
476  {
477  m_Root = NULL;
478  m_Tree->SetRoot((TreeNodeType*)NULL); // this won't do anything if root is already != NULL ==> root cannot be removed
479  }
480 
481  m_Position->SetParent(NULL); // we don't have a parent anymore
482  m_Tree->InvokeEvent( TreePruneEvent<TTreeType>(*this) );
483  while (m_Position->CountChildren() > 0) // remove all children
484  {
485  //always remove first child (id 0)
486  TreeNodeType* child = dynamic_cast<TreeNodeType*>(m_Position->GetChild(0));
487  m_Position->Remove( child );
488  }
489 
490  position = NULL;
491  m_Position = NULL; // Smart pointer, deletes *m_Position
492 
493  m_Tree->Modified();
494 
495  return true;
496 }
497 
499 template <class TTreeType>
500 TTreeType*
502 {
503  return m_Tree;
504 }
505 
506 
507 } // namespace itk
508 
509 #endif

Generated at Sun Feb 3 2013 00:10:24 for Orfeo Toolbox with doxygen 1.8.1.1