VR-Forces 4.7 Class Documentation
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Groups Pages
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 #include <boost/cast.hpp>
17 
18 #include <iosfwd>
19 
20 namespace MAKVRinTerra
21 {
22  class DtTrueQuery;
23  class DtFalseQuery;
24  class DtAndQuery;
25  class DtOrQuery;
26 
39  {
40  public:
42  enum Type
43  {
48  EOr
49  };
50 
53  typedef DtTrueQuery True;
55  typedef DtAndQuery And;
56  typedef DtOrQuery Or;
58 
59  template <typename Result = void>
60  class Visitor;
61 
63  : public boost::enable_shared_from_this<Implementation>
64  , private boost::noncopyable
65  {
66  public:
67  typedef boost::shared_ptr<Implementation> Ptr;
68  typedef boost::shared_ptr<const Implementation> CPtr;
69 
71 
72  virtual ~Implementation();
73 
74  virtual Type type() const;
75 
76  virtual bool matches(const DtFeature&) const = 0;
77 
78  virtual void print(std::ostream&) const = 0;
79  virtual void pprint(std::ostream&, unsigned indent) const;
80  };
81 
82  DtQuery();
83  DtQuery(bool val);
84  DtQuery(const Implementation& i) : myImpl(i.shared_from_this()) { }
85  DtQuery(Implementation* i) : myImpl(i) { }
86  DtQuery(Implementation::CPtr p) : myImpl(p) { }
87 
88  const Implementation& impl() const
89  {
90  return *myImpl;
91  }
92 
93  template <typename T>
94  const T& cast() const
95  {
96  return *boost::polymorphic_downcast<const T*>(myImpl.get());
97  }
98 
99  template <typename T>
100  const T* trycast() const
101  {
102  return dynamic_cast<const T*>(myImpl.get());
103  }
104 
112  Type type() const { return myImpl->type(); }
113 
114  bool isTrue() const { return type() == ETrue; }
115  bool isFalse() const { return type() == EFalse; }
116 
118  bool matches(const DtFeature& feature) const;
119 
123  boost::optional<DtQuery> remove(boost::function<bool (const DtQuery&)>) const;
124 
126  void print(std::ostream& stream) const;
127 
128  void pprint(std::ostream& stream, unsigned indent = 0) const;
129  std::string pprint(unsigned indent = 0) const;
130 
131  protected:
133  };
134 
142 
144  DT_DLL_features std::ostream& operator<< (std::ostream&, const DtQuery&);
146  DT_DLL_features std::istream& operator>> (std::istream&, DtQuery&);
147 
148  template <typename Result>
150  {
151  public:
152  virtual ~Visitor() { }
153 
154  virtual Result apply(const DtQuery& query)
155  {
156  switch (query.type())
157  {
158  case ETrue: return visit(query.cast<True>());
159  case EFalse: return visit(query.cast<False>());
160  case EAnd: return visit(query.cast<And>());
161  case EOr: return visit(query.cast<Or>());
162  case EOther: return visit(query);
163 
164  default:
165  assert(false);
166  DtTHROW_NEW(DtException, "logic error");
167  }
168  }
169 
170  virtual Result visit(const DtQuery&) = 0;
171  virtual Result visit(const True&) = 0;
172  virtual Result visit(const False&) = 0;
173  virtual Result visit(const And&) = 0;
174  virtual Result visit(const Or&) = 0;
175  };
176 
177  template <>
178  class DT_DLL_features DtQuery::Visitor<DtQuery>
179  {
180  public:
181  virtual ~Visitor();
182 
183  virtual DtQuery apply(const DtQuery&);
184 
185  virtual DtQuery visit(const DtQuery&) = 0;
186  virtual DtQuery visit(const True&);
187  virtual DtQuery visit(const False&);
188  virtual DtQuery visit(const And&);
189  virtual DtQuery visit(const Or&);
190  };
191 
192  template <>
193  class DT_DLL_features DtQuery::Visitor<void>
194  {
195  public:
196  virtual ~Visitor();
197 
198  virtual void apply(const DtQuery&);
199 
200  virtual void visit(const DtQuery&) = 0;
201  virtual void visit(const True&);
202  virtual void visit(const False&);
203  virtual void visit(const And&);
204  virtual void visit(const Or&);
205  };
206 
209  {
210  public:
211  static DtQuery Create();
212 
213  Type type() const;
214  bool matches(const DtFeature& feature) const;
215  void print(std::ostream&) const;
216  };
217 
220  {
221  public:
222  static DtQuery Create();
223 
224  Type type() const;
225  bool matches(const DtFeature& feature) const;
226  void print(std::ostream&) const;
227  };
228 
231  {
232  public:
233  friend class DtQuery;
234 
235  static DtQuery Create(const DtQuery&, const DtQuery&);
236 
237  Type type() const;
238  bool matches(const DtFeature& feature) const;
239  void print(std::ostream&) const;
240  void pprint(std::ostream&, unsigned indent) const;
241 
242  const DtQuery& left() const;
243  const DtQuery& right() const;
244 
245  protected:
246  DtAndQuery(const DtQuery& left, const DtQuery& right);
247 
248  private:
251  };
252 
255  {
256  public:
257  friend class DtQuery;
258 
259  static DtQuery Create(const DtQuery&, const DtQuery&);
260 
261  Type type() const;
262  bool matches(const DtFeature& feature) const;
263  void print(std::ostream&) const;
264  void pprint(std::ostream&, unsigned indent) const;
265 
266  const DtQuery& left() const;
267  const DtQuery& right() const;
268 
269  protected:
270  DtOrQuery(const DtQuery& left, const DtQuery& right);
271 
272  private:
275  };
276 
278  {
279  public:
280  static DtQuery Create(DtFeatureGeometry::Type);
281 
282  bool matches(const DtFeature&) const;
283  void print(std::ostream&) const;
284 
285  DtFeatureGeometry::Type geometryType() const;
286 
287  protected:
289 
290  private:
292  };
293 
296  {
297  public:
298  static DtQuery Create(DtFeature::Key);
299  static DtQuery Create(std::string);
300  static DtQuery Create(const char*);
301 
302  bool matches(const DtFeature&) const;
303  void print(std::ostream&) const;
304 
305  const DtFeature::Key& key() const;
306 
308  DtQuery operator < (const DtFeature::Attribute&) const;
310  DtQuery operator <= (const DtFeature::Attribute&) const;
311  DtQuery operator >= (const DtFeature::Attribute&) const;
312 
313  protected:
314  explicit DtHasAttribute(const DtFeature::Key&);
315 
316  private:
318  };
319 
321  {
323 
324  public:
326  {
332  Regex
333  };
334 
335  static bool Matches(
336  Comparison, const DtFeature::Attribute&, const DtFeature::Attribute&);
337 
338  static bool Matches(
339  Comparison,
340  const boost::optional<DtFeature::Attribute>&,
341  const boost::optional<DtFeature::Attribute>&);
342 
343  static DtQuery Merge(const DtHasAttributeValue&, const DtHasAttributeValue&);
344 
345  static DtQuery Create(DtFeature::Key, DtFeature::Attribute, Comparison);
346  static DtQuery Create(std::string, DtFeature::Attribute, Comparison);
347  static DtQuery Create(const char*, DtFeature::Attribute, Comparison);
348 
349  bool matches(const DtFeature& feature) const;
350  void print(std::ostream& stream) const;
351 
352  const DtFeature::Attribute& value() const;
353  Comparison comparison() const;
354 
355  protected:
356  explicit DtHasAttributeValue(DtFeature::Key key, DtFeature::Attribute, Comparison);
357 
358  private:
361  };
362 
364  {
366 
367  public:
369 
371  static DtQuery Create(std::string, DtFeature::Key, Comparison);
372  static DtQuery Create(const char*, DtFeature::Key, Comparison);
373 
374  bool matches(const DtFeature& feature) const;
375  void print(std::ostream& stream) const;
376 
377  const DtFeature::Key& value() const;
378  Comparison comparison() const;
379 
380  protected:
382 
383  private:
386  };
387 }

Document ID: Generated on Fri Apr 26 21:53:14 EDT 2019 from SVN revision 197883
Copyright © 2005-2019 VT MAK. All Rights Reserved (www.mak.com)