VR-Forces 4.1 Class Documentation
query.h
Go to the documentation of this file.
1 
2 
3 
4 
5 #pragma once
6 
7 #include <features/feature.h>
8 
9 #include <boost/scoped_ptr.hpp>
10 #include <boost/logic/tribool.hpp>
11 
12 #include <iosfwd>
13 
14 namespace MAKVRinTerra
15 {
16  class DtTrueQuery;
17  class DtFalseQuery;
18  class DtAndQuery;
19  class DtOrQuery;
20 
33  {
34  public:
36  enum Type
37  {
42  EOr
43  };
44 
47  typedef DtTrueQuery True;
49  typedef DtAndQuery And;
50  typedef DtOrQuery Or;
52 
53  static void SetDebugOutput(std::ostream&);
54  static void DisableDebugOutput();
55 
56  template <typename Result = void>
57  class Visitor;
58 
60  : public boost::enable_shared_from_this<Implementation>
61  , private boost::noncopyable
62  {
63  public:
64  typedef boost::shared_ptr<Implementation> Ptr;
65  typedef boost::shared_ptr<const Implementation> CPtr;
66 
68 
69  virtual ~Implementation();
70 
71  virtual Type type() const;
72 
73  virtual bool matches(const DtFeature&) const = 0;
74 
75  virtual void print(std::ostream&) const = 0;
76  virtual void pprint(std::ostream&, unsigned indent) const;
77  };
78 
79  DtQuery();
80  DtQuery(bool val);
81  DtQuery(const Implementation& i) : myImpl(i.shared_from_this()) { }
82  DtQuery(Implementation* i) : myImpl(i) { }
83  DtQuery(Implementation::CPtr p) : myImpl(p) { }
84 
85  DtQuery& operator=(const DtQuery& q)
86  {
87  myImpl = q.myImpl;
88  return *this;
89  }
90 
91  const Implementation& impl() const
92  {
93  return *myImpl;
94  }
95 
96  template <typename T>
97  const T& cast() const
98  {
99  return *boost::polymorphic_downcast<const T*>(myImpl.get());
100  }
101 
102  template <typename T>
103  const T* trycast() const
104  {
105  return dynamic_cast<const T*>(myImpl.get());
106  }
107 
115  Type type() const { return myImpl->type(); }
116 
117  bool isTrue() const { return type() == ETrue; }
118  bool isFalse() const { return type() == EFalse; }
119 
121  bool matches(const DtFeature& feature) const { return myImpl->matches(feature); }
122 
126  boost::optional<DtQuery> remove(boost::function<bool (const DtQuery&)>) const;
127 
128  boost::optional<DtFeatureGeometry> findEnclosingGeometry() const;
129 
131  void print(std::ostream& stream) const { myImpl->print(stream); }
132 
133  void pprint(std::ostream& stream, unsigned indent = 0) const { myImpl->pprint(stream,indent); }
134  std::string pprint(unsigned indent = 0) const;
135 
136  protected:
138  };
139 
147 
149  DT_DLL_features std::ostream& operator<< (std::ostream&, const DtQuery&);
150 
151  template <typename Result>
153  {
154  public:
155  virtual ~Visitor() { }
156 
157  virtual Result apply(const DtQuery& query)
158  {
159  switch (query.type())
160  {
161  case ETrue: return visit(query.cast<True>());
162  case EFalse: return visit(query.cast<False>());
163  case EAnd: return visit(query.cast<And>());
164  case EOr: return visit(query.cast<Or>());
165  case EOther: return visit(query);
166 
167  default:
168  assert(false);
169  DtTHROW_NEW(DtException, "logic error");
170  }
171  }
172 
173  virtual Result visit(const DtQuery&) = 0;
174  virtual Result visit(const True&) = 0;
175  virtual Result visit(const False&) = 0;
176  virtual Result visit(const And&) = 0;
177  virtual Result visit(const Or&) = 0;
178  };
179 
180  template <>
181  class DT_DLL_features DtQuery::Visitor<DtQuery>
182  {
183  public:
184  virtual ~Visitor();
185 
186  virtual DtQuery apply(const DtQuery&);
187 
188  virtual DtQuery visit(const DtQuery&) = 0;
189  virtual DtQuery visit(const True&);
190  virtual DtQuery visit(const False&);
191  virtual DtQuery visit(const And&);
192  virtual DtQuery visit(const Or&);
193  };
194 
195  template <>
196  class DT_DLL_features DtQuery::Visitor<void>
197  {
198  public:
199  virtual ~Visitor();
200 
201  virtual void apply(const DtQuery&);
202 
203  virtual void visit(const DtQuery&) = 0;
204  virtual void visit(const True&);
205  virtual void visit(const False&);
206  virtual void visit(const And&);
207  virtual void visit(const Or&);
208  };
209 
212  {
213  public:
214  static DtQuery Create();
215 
216  Type type() const;
217  bool matches(const DtFeature& feature) const;
218  void print(std::ostream&) const;
219  };
220 
223  {
224  public:
225  static DtQuery Create();
226 
227  Type type() const;
228  bool matches(const DtFeature& feature) const;
229  void print(std::ostream&) const;
230  };
231 
234  {
235  public:
236  friend class DtQuery;
237 
238  static DtQuery Create(const DtQuery&, const DtQuery&);
239 
240  Type type() const;
241  bool matches(const DtFeature& feature) const;
242  void print(std::ostream&) const;
243  void pprint(std::ostream&, unsigned indent) const;
244 
245  const DtQuery& left() const;
246  const DtQuery& right() const;
247 
248  protected:
249  DtAndQuery(const DtQuery& left, const DtQuery& right);
250 
251  private:
254  };
255 
258  {
259  public:
260  friend class DtQuery;
261 
262  static DtQuery Create(const DtQuery&, const DtQuery&);
263 
264  Type type() const;
265  bool matches(const DtFeature& feature) const;
266  void print(std::ostream&) const;
267  void pprint(std::ostream&, unsigned indent) const;
268 
269  const DtQuery& left() const;
270  const DtQuery& right() const;
271 
272  protected:
273  DtOrQuery(const DtQuery& left, const DtQuery& right);
274 
275  private:
278  };
279 
282  {
283  public:
284  static DtQuery Create(DtFeatureGeometry);
285 
286  bool matches(const DtFeature&) const;
287  void print(std::ostream&) const;
288 
289  DtFeatureGeometry geometry() const;
290 
291  protected:
292  explicit DtGeometryIntersects(DtFeatureGeometry geometry);
293 
294  private:
296  };
297 
299  {
300  public:
301  static DtQuery Create(DtFeatureGeometry::Type);
302 
303  bool matches(const DtFeature&) const;
304  void print(std::ostream&) const;
305 
306  DtFeatureGeometry::Type geometryType() const;
307 
308  protected:
310 
311  private:
313  };
314 
317  {
318  public:
319  static DtQuery Create(DtFeature::Key);
320  static DtQuery Create(std::string);
321  static DtQuery Create(const char*);
322 
323  bool matches(const DtFeature&) const;
324  void print(std::ostream&) const;
325 
326  const DtFeature::Key& key() const;
327 
328  protected:
329  explicit DtHasAttribute(const DtFeature::Key&);
330 
331  private:
333  };
334 
336  {
338 
339  public:
341  {
346  GreaterEqual
347  };
348 
349  static DtQuery Create(DtFeature::Key, DtFeature::Attribute, Comparison);
350  static DtQuery Create(std::string, DtFeature::Attribute, Comparison);
351  static DtQuery Create(const char*, DtFeature::Attribute, Comparison);
352 
353  bool matches(const DtFeature& feature) const;
354  void print(std::ostream& stream) const;
355 
356  const DtFeature::Attribute& value() const;
357  Comparison comparison() const;
358 
359  protected:
360  explicit DtHasAttributeValue(DtFeature::Key key, DtFeature::Attribute, Comparison);
361 
362  private:
365  };
366 }

Document ID: Generated on Tue Jan 29 18:21:16 EST 2013 from SVN revision 123193
Copyright © 2005-2013 VT MÄK Inc. All Rights Reserved (www.mak.com)