VR-Forces 4.2 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  template <typename Result = void>
59  class Visitor;
60 
62  : public boost::enable_shared_from_this<Implementation>
63  , private boost::noncopyable
64  {
65  public:
66  typedef boost::shared_ptr<Implementation> Ptr;
67  typedef boost::shared_ptr<const Implementation> CPtr;
68 
70 
71  virtual ~Implementation();
72 
73  virtual Type type() const;
74 
75  virtual bool matches(const DtFeature&) const = 0;
76 
77  virtual void print(std::ostream&) const = 0;
78  virtual void pprint(std::ostream&, unsigned indent) const;
79  };
80 
81  DtQuery();
82  DtQuery(bool val);
83  DtQuery(const Implementation& i) : myImpl(i.shared_from_this()) { }
84  DtQuery(Implementation* i) : myImpl(i) { }
85  DtQuery(Implementation::CPtr p) : myImpl(p) { }
86 
87  const Implementation& impl() const
88  {
89  return *myImpl;
90  }
91 
92  template <typename T>
93  const T& cast() const
94  {
95  return *boost::polymorphic_downcast<const T*>(myImpl.get());
96  }
97 
98  template <typename T>
99  const T* trycast() const
100  {
101  return dynamic_cast<const T*>(myImpl.get());
102  }
103 
111  Type type() const { return myImpl->type(); }
112 
113  bool isTrue() const { return type() == ETrue; }
114  bool isFalse() const { return type() == EFalse; }
115 
117  bool matches(const DtFeature& feature) const;
118 
122  boost::optional<DtQuery> remove(boost::function<bool (const DtQuery&)>) const;
123 
124  boost::optional<DtFeatureGeometry> findEnclosingGeometry() const;
125 
127  void print(std::ostream& stream) const;
128 
129  void pprint(std::ostream& stream, unsigned indent = 0) const;
130  std::string pprint(unsigned indent = 0) const;
131 
132  protected:
134  };
135 
143 
145  DT_DLL_features std::ostream& operator<< (std::ostream&, const DtQuery&);
147  DT_DLL_features std::istream& operator>> (std::istream&, DtQuery&);
148 
149  template <typename Result>
151  {
152  public:
153  virtual ~Visitor() { }
154 
155  virtual Result apply(const DtQuery& query)
156  {
157  switch (query.type())
158  {
159  case ETrue: return visit(query.cast<True>());
160  case EFalse: return visit(query.cast<False>());
161  case EAnd: return visit(query.cast<And>());
162  case EOr: return visit(query.cast<Or>());
163  case EOther: return visit(query);
164 
165  default:
166  assert(false);
167  DtTHROW_NEW(DtException, "logic error");
168  }
169  }
170 
171  virtual Result visit(const DtQuery&) = 0;
172  virtual Result visit(const True&) = 0;
173  virtual Result visit(const False&) = 0;
174  virtual Result visit(const And&) = 0;
175  virtual Result visit(const Or&) = 0;
176  };
177 
178  template <>
179  class DT_DLL_features DtQuery::Visitor<DtQuery>
180  {
181  public:
182  virtual ~Visitor();
183 
184  virtual DtQuery apply(const DtQuery&);
185 
186  virtual DtQuery visit(const DtQuery&) = 0;
187  virtual DtQuery visit(const True&);
188  virtual DtQuery visit(const False&);
189  virtual DtQuery visit(const And&);
190  virtual DtQuery visit(const Or&);
191  };
192 
193  template <>
194  class DT_DLL_features DtQuery::Visitor<void>
195  {
196  public:
197  virtual ~Visitor();
198 
199  virtual void apply(const DtQuery&);
200 
201  virtual void visit(const DtQuery&) = 0;
202  virtual void visit(const True&);
203  virtual void visit(const False&);
204  virtual void visit(const And&);
205  virtual void visit(const Or&);
206  };
207 
210  {
211  public:
212  static DtQuery Create();
213 
214  Type type() const;
215  bool matches(const DtFeature& feature) const;
216  void print(std::ostream&) const;
217  };
218 
221  {
222  public:
223  static DtQuery Create();
224 
225  Type type() const;
226  bool matches(const DtFeature& feature) const;
227  void print(std::ostream&) const;
228  };
229 
232  {
233  public:
234  friend class DtQuery;
235 
236  static DtQuery Create(const DtQuery&, const DtQuery&);
237 
238  Type type() const;
239  bool matches(const DtFeature& feature) const;
240  void print(std::ostream&) const;
241  void pprint(std::ostream&, unsigned indent) const;
242 
243  const DtQuery& left() const;
244  const DtQuery& right() const;
245 
246  protected:
247  DtAndQuery(const DtQuery& left, const DtQuery& right);
248 
249  private:
252  };
253 
256  {
257  public:
258  friend class DtQuery;
259 
260  static DtQuery Create(const DtQuery&, const DtQuery&);
261 
262  Type type() const;
263  bool matches(const DtFeature& feature) const;
264  void print(std::ostream&) const;
265  void pprint(std::ostream&, unsigned indent) const;
266 
267  const DtQuery& left() const;
268  const DtQuery& right() const;
269 
270  protected:
271  DtOrQuery(const DtQuery& left, const DtQuery& right);
272 
273  private:
276  };
277 
280  {
281  public:
282  static DtQuery Create(DtFeatureGeometry);
283 
284  Type type() const;
285  bool matches(const DtFeature&) const;
286  void print(std::ostream&) const;
287 
288  DtFeatureGeometry geometry() const;
289 
290  protected:
291  explicit DtGeometryIntersects(DtFeatureGeometry geometry);
292 
293  private:
295  };
296 
298  {
299  public:
300  static DtQuery Create(DtFeatureGeometry::Type);
301 
302  bool matches(const DtFeature&) const;
303  void print(std::ostream&) const;
304 
305  DtFeatureGeometry::Type geometryType() const;
306 
307  protected:
309 
310  private:
312  };
313 
316  {
317  public:
318  static DtQuery Create(DtFeature::Key);
319  static DtQuery Create(std::string);
320  static DtQuery Create(const char*);
321 
322  bool matches(const DtFeature&) const;
323  void print(std::ostream&) const;
324 
325  const DtFeature::Key& key() const;
326 
327  protected:
328  explicit DtHasAttribute(const DtFeature::Key&);
329 
330  private:
332  };
333 
335  {
337 
338  public:
340  {
345  GreaterEqual
346  };
347 
348  static DtQuery Create(DtFeature::Key, DtFeature::Attribute, Comparison);
349  static DtQuery Create(std::string, DtFeature::Attribute, Comparison);
350  static DtQuery Create(const char*, DtFeature::Attribute, Comparison);
351 
352  bool matches(const DtFeature& feature) const;
353  void print(std::ostream& stream) const;
354 
355  const DtFeature::Attribute& value() const;
356  Comparison comparison() const;
357 
358  protected:
359  explicit DtHasAttributeValue(DtFeature::Key key, DtFeature::Attribute, Comparison);
360 
361  private:
364  };
365 }

Document ID: Generated on Sun Nov 24 19:49:21 EST 2013 from SVN revision 133924
Copyright © 2005-2013 VT MÄK. All Rights Reserved (www.mak.com)