OSG  3.4.0
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
UIObjectParent.h
Go to the documentation of this file.
1 /* -*-c++-*- OpenSceneGraph - Copyright (C) 1998-2008 Robert Osfield
2  *
3  * This library is open source and may be redistributed and/or modified under
4  * the terms of the OpenSceneGraph Public License (OSGPL) version 0.0 or
5  * (at your option) any later version. The full license is in LICENSE file
6  * included with this distribution, and on the openscenegraph.org website.
7  *
8  * This library is distributed in the hope that it will be useful,
9  * but WITHOUT ANY WARRANTY; without even the implied warranty of
10  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11  * OpenSceneGraph Public License for more details.
12 */
13 
14 // Code by: Jeremy Moles (cubicool) 2007-2008
15 
16 #ifndef OSGWIDGET_UI_OBJECT_PARENT
17 #define OSGWIDGET_UI_OBJECT_PARENT
18 
19 #include <osg/Object>
20 #include <osg/observer_ptr>
21 
22 namespace osgWidget {
23 
24 template <typename T>
26 {
27  public:
28 
29  typedef T object_type;
31  typedef std::vector<ptr_type> Vector;
32  typedef typename Vector::iterator Iterator;
33  typedef typename Vector::const_iterator ConstIterator;
34 
35  Iterator begin() {
36  return _objects.begin();
37  }
38 
39  ConstIterator begin() const {
40  return _objects.begin();
41  }
42 
43  Iterator end() {
44  return _objects.end();
45  }
46 
47  ConstIterator end() const {
48  return _objects.end();
49  }
50 
51  typename Vector::size_type size() const {
52  return _objects.size();
53  }
54 
55  object_type* getByName(const std::string& name) {
56  return _getByName(name);
57  }
58 
59  const object_type* getByName(const std::string& name) const {
60  return _getByName(name);
61  }
62 
63  object_type* getByIndex(unsigned int index) {
64  return _getByIndex(index);
65  }
66 
67  const object_type* getByIndex(unsigned int index) const {
68  return _getByIndex(index);
69  }
70 
71  unsigned int getNumObjects() const {
72  return _objects.size();
73  }
74 
75  Vector& getObjects() {
76  return _objects;
77  }
78 
79  const Vector& getObjects() const {
80  return _objects;
81  }
82 
83  protected:
84 
85  bool _remove(object_type* obj) {
86  Iterator i = std::find(begin(), end(), obj);
87 
88  if(i == end()) return false;
89 
90  _objects.erase(i);
91 
92  return true;
93  }
94 
95  bool _removeByName(const std::string& name) {
96  for(Iterator i = begin(); i != end(); i++) if(i->get()->getName() == name) {
97  _objects.erase(i);
98 
99  return true;
100  }
101 
102  return false;
103  }
104 
105  Vector _objects;
106 
107  private:
108 
109  // I had to add this to avoid ambiguity errors with MSVC. Garbage.
110  object_type* _getByName(const std::string& name) const {
111  for(ConstIterator i = begin(); i != end(); i++) {
112  if(i->valid() && i->get()->getName() == name) return i->get();
113  }
114 
115  return 0;
116  }
117 
118  object_type* _getByIndex(unsigned int index) const {
119  for(ConstIterator i = begin(); i != end(); i++) {
120  if(i->valid() && i->get()->getIndex() == index) return i->get();
121  }
122 
123  return 0;
124  }
125 
126 };
127 
128 }
129 
130 #endif
bool _remove(object_type *obj)
const object_type * getByIndex(unsigned int index) const
ConstIterator end() const
unsigned int getNumObjects() const
Vector::const_iterator ConstIterator
Definition: Box.h:21
osg::observer_ptr< object_type > ptr_type
const Vector & getObjects() const
object_type * getByName(const std::string &name)
bool _removeByName(const std::string &name)
std::vector< ptr_type > Vector
object_type * getByIndex(unsigned int index)
Vector::iterator Iterator
ConstIterator begin() const
const object_type * getByName(const std::string &name) const
Vector::size_type size() const