ddc
ddcObject.h
Go to the documentation of this file.
1 //-*- Mode: C++ -*-
2 // DDC originally by Alexey Sokirko
3 // Changes and modifications 2011-2015 by Bryan Jurish
4 //
5 // This file is part of DDC.
6 //
7 // DDC is free software: you can redistribute it and/or modify
8 // it under the terms of the GNU Lesser General Public License as published by
9 // the Free Software Foundation, either version 3 of the License, or
10 // (at your option) any later version.
11 //
12 // DDC is distributed in the hope that it will be useful,
13 // but WITHOUT ANY WARRANTY; without even the implied warranty of
14 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 // GNU Lesser General Public License for more details.
16 //
17 // You should have received a copy of the GNU Lesser General Public License
18 // along with DDC. If not, see <http://www.gnu.org/licenses/>.
19 //
20 
21 #ifndef DDC_OBJECT_H
22 #define DDC_OBJECT_H
23 
24 #include "utilit.h"
25 #include "ddcString.h"
26 #include <list>
27 
28 class ddcObject; //-- forward decl
29 typedef list<ddcObject*> ddcObjectList; //-- for child- and descendant-lists
30 
31 //-- visitor struct for ddcObject::Descendants() method
33 {
35  inline bool operator()(const ddcObject *obj) {
36  m_Descendants.push_back((ddcObject*)obj);
37  return false;
38  };
39 };
40 
41 //======================================================================
42 // CQFilter
43 
45 class ddcObject {
46 public:
47  //------------------------------------------------------------
49 
50  void *m_User;
53 
54 public:
55  //------------------------------------------------------------
57 
58  ddcObject()
60  : m_User(NULL)
61  {};
62 
64  virtual ~ddcObject()
65  {};
67 
68  //------------------------------------------------------------
70 
71  virtual ddcObjectList Children() const
75  { return ddcObjectList(); };
76 
79  virtual void DisownChildren()
80  {};
81 
86  template<typename Visit>
87  ddcObject* Traverse(Visit& visit)
88  {
89  ddcObject* retval=NULL;
90  ddcObjectList stack(1,(ddcObject*)this);
91  while (!stack.empty()) {
92  ddcObject *optr = stack.front();
93  stack.pop_front();
94  if ( visit(optr) ) {
95  retval = optr;
96  break;
97  }
98  if (optr != NULL) {
99  ddcObjectList kids(optr->Children());
100  stack.splice(stack.begin(), kids);
101  }
102  }
103  return retval;
104  };
105 
108  template<typename Visit>
109  ddcObject* Traverse(Visit& visit) const
110  {
111  ddcObject* retval=NULL;
112  ddcObjectList stack(1,(ddcObject*)this);
113  while (!stack.empty()) {
114  ddcObject *optr = stack.front();
115  stack.pop_front();
116  if ( visit(optr) ) {
117  retval = optr;
118  break;
119  }
120  if (optr != NULL) {
121  ddcObjectList kids(optr->Children());
122  stack.splice(stack.begin(), kids);
123  }
124  }
125  return retval;
126  };
127 
130  template<typename Visit>
131  ddcObject* TraverseR(Visit& visit)
132  {
133  ddcObject* retval=NULL;
134  ddcObjectList stack(1,this);
135  while (!stack.empty()) {
136  ddcObject *optr = stack.front();
137  ddcObjectList kids;
138  if (optr != NULL)
139  kids = optr->Children();
140  stack.pop_front();
141  if ( visit(optr) ) {
142  retval = optr;
143  break;
144  }
145  stack.splice(stack.begin(), kids);
146  }
147  return retval;
148  };
149 
152  template<typename Visit>
153  ddcObject* TraverseR(Visit& visit) const
154  {
155  ddcObject* retval=NULL;
156  ddcObjectList stack(1,(ddcObject*)this);
157  while (!stack.empty()) {
158  ddcObject *optr = stack.front();
159  ddcObjectList kids;
160  if (optr != NULL)
161  kids = optr->Children();
162  stack.pop_front();
163  if ( visit(optr) ) {
164  retval = optr;
165  break;
166  }
167  stack.splice(stack.begin(), kids);
168  }
169  return retval;
170  };
171 
174  virtual ddcObjectList Descendants() const
175  {
177  this->Traverse(visitor);
178  return visitor.m_Descendants;
179  };
181 
182  //------------------------------------------------------------
184 
185  virtual string toString()
188  { return Format("%s=%p", typeid(*this).name(), this); };
189 
192  virtual string toJson()
193  { return string("{\"class\":")+jsonStr(this->jsonClass())+","+this->jsonData()+"}"; };
194 
197  virtual string jsonClass()
198  { string cls(typeid(*this).name()); return cls; };
199 
202  virtual string jsonData()
203  { return "\"NODATA\":1"; };
205 };
206 
208 inline string jsonStr(ddcObject *o)
209 { return o==NULL ? "null" : o->toJson(); };
210 
211 
212 #endif /* DDC_OBJECT_H */
213 
214 /*--- emacs style variables ---
215  * Local Variables:
216  * mode: C++
217  * c-file-style: "ellemtel"
218  * c-basic-offset: 4
219  * tab-width: 8
220  * indent-tabs-mode: nil
221  * End:
222  */
string Format(const char *format,...)
Definition: ddcString.cpp:393
bool operator()(const ddcObject *obj)
Definition: ddcObject.h:35
virtual string jsonData()
Definition: ddcObject.h:202
virtual ddcObjectList Descendants() const
Definition: ddcObject.h:174
virtual string jsonClass()
Definition: ddcObject.h:197
ddcObject * TraverseR(Visit &visit)
Definition: ddcObject.h:131
string jsonStr(ddcObject *o)
json strinfication wrapper
Definition: ddcObject.h:208
virtual ddcObjectList Children() const
Definition: ddcObject.h:74
virtual ~ddcObject()
virtual destructor does nothing
Definition: ddcObject.h:64
class for global query filters aka "query operators"
Definition: ddcObject.h:45
list< ddcObject * > ddcObjectList
Definition: ddcObject.h:28
virtual void DisownChildren()
Definition: ddcObject.h:79
ddcObject * Traverse(Visit &visit) const
Definition: ddcObject.h:109
ddcObjectList m_Descendants
Definition: ddcObject.h:34
ddcObject * Traverse(Visit &visit)
Definition: ddcObject.h:87
ddcObject * TraverseR(Visit &visit) const
Definition: ddcObject.h:153
virtual string toJson()
Definition: ddcObject.h:192
Definition: ddcObject.h:32