Clipper
container.h
1 
4 //C Copyright (C) 2000-2006 Kevin Cowtan and University of York
5 //L
6 //L This library is free software and is distributed under the terms
7 //L and conditions of version 2.1 of the GNU Lesser General Public
8 //L Licence (LGPL) with the following additional clause:
9 //L
10 //L `You may also combine or link a "work that uses the Library" to
11 //L produce a work containing portions of the Library, and distribute
12 //L that work under terms of your choice, provided that you give
13 //L prominent notice with each copy of the work that the specified
14 //L version of the Library is used in it, and that you include or
15 //L provide public access to the complete corresponding
16 //L machine-readable source code for the Library including whatever
17 //L changes were used in the work. (i.e. If you make changes to the
18 //L Library you must distribute those, but you do not need to
19 //L distribute source or object code to those portions of the work
20 //L not covered by this licence.)'
21 //L
22 //L Note that this clause grants an additional right and does not impose
23 //L any additional restriction, and so does not affect compatibility
24 //L with the GNU General Public Licence (GPL). If you wish to negotiate
25 //L other terms, please contact the maintainer.
26 //L
27 //L You can redistribute it and/or modify the library under the terms of
28 //L the GNU Lesser General Public License as published by the Free Software
29 //L Foundation; either version 2.1 of the License, or (at your option) any
30 //L later version.
31 //L
32 //L This library is distributed in the hope that it will be useful, but
33 //L WITHOUT ANY WARRANTY; without even the implied warranty of
34 //L MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
35 //L Lesser General Public License for more details.
36 //L
37 //L You should have received a copy of the CCP4 licence and/or GNU
38 //L Lesser General Public License along with this library; if not, write
39 //L to the CCP4 Secretary, Daresbury Laboratory, Warrington WA4 4AD, UK.
40 //L The GNU Lesser General Public can also be obtained by writing to the
41 //L Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston,
42 //L MA 02111-1307 USA
43 
44 
45 #ifndef CLIPPER_CONTAINER
46 #define CLIPPER_CONTAINER
47 
48 
49 #include "coords.h"
50 
51 
52 namespace clipper
53 {
54 
55 
57 
68  class Container
69  {
70  public:
72  Container( const String name = "" );
74  Container( Container& parent, const String& path );
75 
77  virtual void update();
78 
80  String path() const;
82  String name() const;
84  void set_name( const String& name );
86  bool is_destroyed_with_parent() const;
88  void set_destroyed_with_parent( const bool d=true );
90  void move( const String& path );
91 
93  bool has_parent() const;
95  const Container& parent() const;
97  Container& parent();
98 
100  int num_children() const;
102  const Container& child( const int& i ) const;
104  Container& child( const int& i );
105 
107  const Container& ultimate_parent() const;
110 
114  template<class T> T* parent_of_type_ptr();
116  Container* find_path_ptr( const String& path );
117 
119  virtual ~Container();
120 
121  void debug();
122 
123  private:
124  // members
125  String name_;
126  Container* parent_;
127  std::vector<Container*> children;
128  bool destroyed_with_parent;
129 
131  void add_child( Container& c );
133  void del_child( Container& c );
134 
136  Container( const Container& ) {}
137  };
138 
139 
140 
141  // template function definitions
142 
143  template<class T> T* Container::parent_of_type_ptr()
144  {
145  // this can be done recursively with references, but gcc won't compile it.
146  Container* p = this;
147  while ( p->has_parent() ) {
148  p = &(p->parent());
149  T* pt = dynamic_cast<T*>(p);
150  if ( pt != NULL ) return pt;
151  }
152  return NULL;
153  }
154 
155 
156 } // namespace clipper
157 
158 #endif
const Container & parent() const
get the parent of this object
Definition: container.cpp:142
void move(const String &path)
'move' method moves this object to somewhere else in the hierarchy
Definition: container.cpp:216
virtual ~Container()
destructor: virtual
Definition: container.cpp:108
String path() const
get the path of this tree object
Definition: container.cpp:120
T * parent_of_type_ptr()
search up the tree for a parent of the specified type (NULL on fail)
Definition: container.h:143
bool is_destroyed_with_parent() const
is this object to be destroyed when parent is destroyed?
Definition: container.cpp:133
virtual void update()
update: hierarchical content update function
Definition: container.cpp:65
const Container & child(const int &i) const
get the i'th child of this object
Definition: container.cpp:157
const Container & ultimate_parent() const
get the ultimate parent of this object - the top of the tree
Definition: container.cpp:171
String name() const
get the name of this tree object
Definition: container.cpp:127
bool has_parent() const
test if this object has a parent
Definition: container.cpp:139
void set_name(const String &name)
set the name of this tree object
Definition: container.cpp:130
String extension with simple parsing methods.
Definition: clipper_types.h:64
Container(const String name="")
constructor: make null object or top object in a tree
Definition: container.cpp:71
int num_children() const
return number of children
Definition: container.cpp:154
void set_destroyed_with_parent(const bool d=true)
set this object to be destroyed when parent is destroyed
Definition: container.cpp:136
Container * parent_ptr()
get the parent of this object (NULL on fail)
Definition: container.cpp:183
Container * find_path_ptr(const String &path)
find an object using a directory-like path (NULL on fail)
Definition: container.cpp:188
Definition for a generic container Object.
Definition: container.h:68