VR-Forces 4.1.1 Class Documentation
query.h
Go to the documentation of this file.
1 /*******************************************************************************
2 ** Copyright (c) 2013 MAK Technologies, Inc.
3 ** All rights reserved.
4 *******************************************************************************/
5 
9 
10 #pragma once
11 
12 #include <features/feature.h>
13 
14 #include <boost/scoped_ptr.hpp>
15 #include <boost/logic/tribool.hpp>
16 
17 #include <iosfwd>
18 
19 namespace MAKVRinTerra
20 {
21  class DtTrueQuery;
22  class DtFalseQuery;
23  class DtAndQuery;
24  class DtOrQuery;
25 
38  {
39  public:
41  enum Type
42  {
47  EOr
48  };
49 
52  typedef DtTrueQuery True;
54  typedef DtAndQuery And;
55  typedef DtOrQuery Or;
57 
58  static void SetDebugOutput(std::ostream&);
59  static void DisableDebugOutput();
60 
61  template <typename Result = void>
62  class Visitor;
63 
65  : public boost::enable_shared_from_this<Implementation>
66  , private boost::noncopyable
67  {
68  public:
69  typedef boost::shared_ptr<Implementation> Ptr;
70  typedef boost::shared_ptr<const Implementation> CPtr;
71 
73 
74  virtual ~Implementation();
75 
76  virtual Type type() const;
77 
78  virtual bool matches(const DtFeature&) const = 0;
79 
80  virtual void print(std::ostream&) const = 0;
81  virtual void pprint(std::ostream&, unsigned indent) const;
82  };
83 
84  DtQuery();
85  DtQuery(bool val);
86  DtQuery(const Implementation& i) : myImpl(i.shared_from_this()) { }
87  DtQuery(Implementation* i) : myImpl(i) { }
88  DtQuery(Implementation::CPtr p) : myImpl(p) { }
89 
90  DtQuery& operator=(const DtQuery& q)
91  {
92  myImpl = q.myImpl;
93  return *this;
94  }
95 
96  const Implementation& impl() const
97  {
98  return *myImpl;
99  }
100 
101  template <typename T>
102  const T& cast() const
103  {
104  return *boost::polymorphic_downcast<const T*>(myImpl.get());
105  }
106 
107  template <typename T>
108  const T* trycast() const
109  {
110  return dynamic_cast<const T*>(myImpl.get());
111  }
112 
120  Type type() const { return myImpl->type(); }
121 
122  bool isTrue() const { return type() == ETrue; }
123  bool isFalse() const { return type() == EFalse; }
124 
126  bool matches(const DtFeature& feature) const { return myImpl->matches(feature); }
127 
131  boost::optional<DtQuery> remove(boost::function<bool (const DtQuery&)>) const;
132 
133  boost::optional<DtFeatureGeometry> findEnclosingGeometry() const;
134 
136  void print(std::ostream& stream) const { myImpl->print(stream); }
137 
138  void pprint(std::ostream& stream, unsigned indent = 0) const { myImpl->pprint(stream,indent); }
139  std::string pprint(unsigned indent = 0) const;
140 
141  protected:
143  };
144 
152 
154  DT_DLL_features std::ostream& operator<< (std::ostream&, const DtQuery&);
155 
156  template <typename Result>
158  {
159  public:
160  virtual ~Visitor() { }
161 
162  virtual Result apply(const DtQuery& query)
163  {
164  switch (query.type())
165  {
166  case ETrue: return visit(query.cast<True>());
167  case EFalse: return visit(query.cast<False>());
168  case EAnd: return visit(query.cast<And>());
169  case EOr: return visit(query.cast<Or>());
170  case EOther: return visit(query);
171 
172  default:
173  assert(false);
174  DtTHROW_NEW(DtException, "logic error");
175  }
176  }
177 
178  virtual Result visit(const DtQuery&) = 0;
179  virtual Result visit(const True&) = 0;
180  virtual Result visit(const False&) = 0;
181  virtual Result visit(const And&) = 0;
182  virtual Result visit(const Or&) = 0;
183  };
184 
185  template <>
186  class DT_DLL_features DtQuery::Visitor<DtQuery>
187  {
188  public:
189  virtual ~Visitor();
190 
191  virtual DtQuery apply(const DtQuery&);
192 
193  virtual DtQuery visit(const DtQuery&) = 0;
194  virtual DtQuery visit(const True&);
195  virtual DtQuery visit(const False&);
196  virtual DtQuery visit(const And&);
197  virtual DtQuery visit(const Or&);
198  };
199 
200  template <>
201  class DT_DLL_features DtQuery::Visitor<void>
202  {
203  public:
204  virtual ~Visitor();
205 
206  virtual void apply(const DtQuery&);
207 
208  virtual void visit(const DtQuery&) = 0;
209  virtual void visit(const True&);
210  virtual void visit(const False&);
211  virtual void visit(const And&);
212  virtual void visit(const Or&);
213  };
214 
217  {
218  public:
219  static DtQuery Create();
220 
221  Type type() const;
222  bool matches(const DtFeature& feature) const;
223  void print(std::ostream&) const;
224  };
225 
228  {
229  public:
230  static DtQuery Create();
231 
232  Type type() const;
233  bool matches(const DtFeature& feature) const;
234  void print(std::ostream&) const;
235  };
236 
239  {
240  public:
241  friend class DtQuery;
242 
243  static DtQuery Create(const DtQuery&, const DtQuery&);
244 
245  Type type() const;
246  bool matches(const DtFeature& feature) const;
247  void print(std::ostream&) const;
248  void pprint(std::ostream&, unsigned indent) const;
249 
250  const DtQuery& left() const;
251  const DtQuery& right() const;
252 
253  protected:
254  DtAndQuery(const DtQuery& left, const DtQuery& right);
255 
256  private:
259  };
260 
263  {
264  public:
265  friend class DtQuery;
266 
267  static DtQuery Create(const DtQuery&, const DtQuery&);
268 
269  Type type() const;
270  bool matches(const DtFeature& feature) const;
271  void print(std::ostream&) const;
272  void pprint(std::ostream&, unsigned indent) const;
273 
274  const DtQuery& left() const;
275  const DtQuery& right() const;
276 
277  protected:
278  DtOrQuery(const DtQuery& left, const DtQuery& right);
279 
280  private:
283  };
284 
287  {
288  public:
289  static DtQuery Create(DtFeatureGeometry);
290 
291  bool matches(const DtFeature&) const;
292  void print(std::ostream&) const;
293 
294  DtFeatureGeometry geometry() const;
295 
296  protected:
297  explicit DtGeometryIntersects(DtFeatureGeometry geometry);
298 
299  private:
301  };
302 
304  {
305  public:
306  static DtQuery Create(DtFeatureGeometry::Type);
307 
308  bool matches(const DtFeature&) const;
309  void print(std::ostream&) const;
310 
311  DtFeatureGeometry::Type geometryType() const;
312 
313  protected:
315 
316  private:
318  };
319 
322  {
323  public:
324  static DtQuery Create(DtFeature::Key);
325  static DtQuery Create(std::string);
326  static DtQuery Create(const char*);
327 
328  bool matches(const DtFeature&) const;
329  void print(std::ostream&) const;
330 
331  const DtFeature::Key& key() const;
332 
333  protected:
334  explicit DtHasAttribute(const DtFeature::Key&);
335 
336  private:
338  };
339 
341  {
343 
344  public:
346  {
351  GreaterEqual
352  };
353 
354  static DtQuery Create(DtFeature::Key, DtFeature::Attribute, Comparison);
355  static DtQuery Create(std::string, DtFeature::Attribute, Comparison);
356  static DtQuery Create(const char*, DtFeature::Attribute, Comparison);
357 
358  bool matches(const DtFeature& feature) const;
359  void print(std::ostream& stream) const;
360 
361  const DtFeature::Attribute& value() const;
362  Comparison comparison() const;
363 
364  protected:
365  explicit DtHasAttributeValue(DtFeature::Key key, DtFeature::Attribute, Comparison);
366 
367  private:
370  };
371 }

Document ID: Generated on Mon Apr 8 19:24:01 EDT 2013 from SVN revision 125877
Copyright © 2005-2013 VT MÄK. All Rights Reserved (www.mak.com)