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
52namespace clipper
53{
54
55
57
69 {
70 public:
72 Container( const String name = "" );
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;
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();
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
Definition for a generic container Object.
Definition container.h:69
void set_destroyed_with_parent(const bool d=true)
set this object to be destroyed when parent is destroyed
Definition container.cpp:136
bool is_destroyed_with_parent() const
is this object to be destroyed when parent is destroyed?
Definition container.cpp:133
virtual ~Container()
destructor: virtual
Definition container.cpp:108
const Container & parent() const
get the parent of this object
Definition container.cpp:142
const Container & ultimate_parent() const
get the ultimate parent of this object - the top of the tree
Definition container.cpp:171
bool has_parent() const
test if this object has a parent
Definition container.cpp:139
Container * parent_ptr()
get the parent of this object (NULL on fail)
Definition container.cpp:183
String path() const
get the path of this tree object
Definition container.cpp:120
void move(const String &path)
'move' method moves this object to somewhere else in the hierarchy
Definition container.cpp:216
const Container & child(const int &i) const
get the i'th child of this object
Definition container.cpp:157
T * parent_of_type_ptr()
search up the tree for a parent of the specified type (NULL on fail)
Definition container.h:143
Container * find_path_ptr(const String &path)
find an object using a directory-like path (NULL on fail)
Definition container.cpp:188
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
String name() const
get the name of this tree object
Definition container.cpp:127
virtual void update()
update: hierarchical content update function
Definition container.cpp:65
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:65