VR-Forces Developer's Guide
 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/logic/tribool.hpp>
15 #include <boost/cast.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 std::enable_shared_from_this<Implementation>
63  , private boost::noncopyable
64  {
65  public:
66  typedef std::shared_ptr<Implementation> Ptr;
67  typedef std::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 
125  void print(std::ostream& stream) const;
126 
127  void pprint(std::ostream& stream, unsigned indent = 0) const;
128  std::string pprint(unsigned indent = 0) const;
129 
130  protected:
132  };
133 
141 
143  DT_DLL_features std::ostream& operator<< (std::ostream&, const DtQuery&);
145  DT_DLL_features std::istream& operator>> (std::istream&, DtQuery&);
146 
147  template <typename Result>
149  {
150  public:
151  virtual ~Visitor() { }
152 
153  virtual Result apply(const DtQuery& query)
154  {
155  switch (query.type())
156  {
157  case ETrue: return visit(query.cast<True>());
158  case EFalse: return visit(query.cast<False>());
159  case EAnd: return visit(query.cast<And>());
160  case EOr: return visit(query.cast<Or>());
161  case EOther: return visit(query);
162 
163  default:
164  assert(false);
165  DtTHROW_NEW(DtException, "logic error");
166  }
167  }
168 
169  virtual Result visit(const DtQuery&) = 0;
170  virtual Result visit(const True&) = 0;
171  virtual Result visit(const False&) = 0;
172  virtual Result visit(const And&) = 0;
173  virtual Result visit(const Or&) = 0;
174  };
175 
176  template <>
177  class DT_DLL_features DtQuery::Visitor<DtQuery>
178  {
179  public:
180  virtual ~Visitor();
181 
182  virtual DtQuery apply(const DtQuery&);
183 
184  virtual DtQuery visit(const DtQuery&) = 0;
185  virtual DtQuery visit(const True&);
186  virtual DtQuery visit(const False&);
187  virtual DtQuery visit(const And&);
188  virtual DtQuery visit(const Or&);
189  };
190 
191  template <>
192  class DT_DLL_features DtQuery::Visitor<void>
193  {
194  public:
195  virtual ~Visitor();
196 
197  virtual void apply(const DtQuery&);
198 
199  virtual void visit(const DtQuery&) = 0;
200  virtual void visit(const True&);
201  virtual void visit(const False&);
202  virtual void visit(const And&);
203  virtual void visit(const Or&);
204  };
205 
208  {
209  public:
210  static DtQuery Create();
211 
212  virtual Type type() const override;
213  virtual bool matches(const DtFeature& feature) const override;
214  virtual void print(std::ostream&) const override;
215  };
216 
219  {
220  public:
221  static DtQuery Create();
222 
223  virtual Type type() const override;
224  virtual bool matches(const DtFeature& feature) const override;
225  virtual void print(std::ostream&) const override;
226  };
227 
230  {
231  public:
232  friend class DtQuery;
233 
234  static DtQuery Create(const DtQuery&, const DtQuery&);
235 
236  virtual Type type() const override;
237  virtual bool matches(const DtFeature& feature) const override;
238  virtual void print(std::ostream&) const override;
239  virtual void pprint(std::ostream&, unsigned indent) const override;
240 
241  const DtQuery& left() const;
242  const DtQuery& right() const;
243 
244  protected:
245  DtAndQuery(const DtQuery& left, const DtQuery& right);
246 
247  private:
250  };
251 
254  {
255  public:
256  friend class DtQuery;
257 
258  static DtQuery Create(const DtQuery&, const DtQuery&);
259 
260  virtual Type type() const override;
261  virtual bool matches(const DtFeature& feature) const override;
262  virtual void print(std::ostream&) const override;
263  virtual void pprint(std::ostream&, unsigned indent) const override;
264 
265  const DtQuery& left() const;
266  const DtQuery& right() const;
267 
268  protected:
269  DtOrQuery(const DtQuery& left, const DtQuery& right);
270 
271  private:
274  };
275 
277  {
278  public:
279  static DtQuery Create(DtFeatureGeometry::Type);
280 
281  virtual bool matches(const DtFeature&) const override;
282  virtual void print(std::ostream&) const override;
283 
284  DtFeatureGeometry::Type geometryType() const;
285 
286  protected:
288 
289  private:
291  };
292 
295  {
296  public:
297  static DtQuery Create(DtFeature::Key);
298  static DtQuery Create(std::string);
299  static DtQuery Create(const char*);
300 
301  virtual bool matches(const DtFeature&) const override;
302  virtual void print(std::ostream&) const override;
303 
304  const DtFeature::Key& key() const;
305 
307  DtQuery operator < (const DtFeature::Attribute&) const;
309  DtQuery operator <= (const DtFeature::Attribute&) const;
310  DtQuery operator >= (const DtFeature::Attribute&) const;
311 
312  protected:
313  explicit DtHasAttribute(const DtFeature::Key&);
314 
315  private:
317  };
318 
320  {
322 
323  public:
325  {
331  Regex
332  };
333 
334  static bool Matches(
335  Comparison, const DtFeature::Attribute&, const DtFeature::Attribute&);
336 
337  static bool Matches(
338  Comparison,
339  const boost::optional<DtFeature::Attribute>&,
340  const boost::optional<DtFeature::Attribute>&);
341 
342  static DtQuery Merge(const DtHasAttributeValue&, const DtHasAttributeValue&);
343 
344  static DtQuery Create(DtFeature::Key, DtFeature::Attribute, Comparison);
345  static DtQuery Create(std::string, DtFeature::Attribute, Comparison);
346  static DtQuery Create(const char*, DtFeature::Attribute, Comparison);
347 
348  virtual bool matches(const DtFeature& feature) const override;
349  virtual void print(std::ostream& stream) const override;
350 
351  const DtFeature::Attribute& value() const;
352  Comparison comparison() const;
353 
354  protected:
355  explicit DtHasAttributeValue(DtFeature::Key key, DtFeature::Attribute, Comparison);
356 
357  private:
360  };
361 
363  {
365 
366  public:
368 
370  static DtQuery Create(std::string, DtFeature::Key, Comparison);
371  static DtQuery Create(const char*, DtFeature::Key, Comparison);
372 
373  virtual bool matches(const DtFeature& feature) const override;
374  virtual void print(std::ostream& stream) const override;
375 
376  const DtFeature::Key& value() const;
377  Comparison comparison() const;
378 
379  protected:
381 
382  private:
385  };
386 }
#define DT_DLL_features
stop complaining about multiple independent base classes for boost::noncopyable this should probably ...
Definition: featuresDefines.h:41
Type
Enumeration which allows algorithms easier access to the special query types.
Definition: query.h:41
DtFeature::Key myKey
Definition: query.h:316
Matches features which match two other DtQuery objects.
Definition: query.h:229
DtFeature::Attribute myValue
Definition: query.h:358
Key used to lookup attributes. The DtFeature interface is a dictionary that maps Key objects to attri...
Definition: feature.h:67
Implementation::CPtr myImpl
Definition: query.h:131
Definition: query.h:44
DtQuery myLeftQuery
Definition: query.h:248
bool isTrue() const
Definition: query.h:113
DtFeatureGeometry::Type myType
Definition: query.h:290
Matches no features.
Definition: query.h:218
bool operator>(const DtTemporaryAgentManager::AgentParameters &lhs, const DtTemporaryAgentManager::AgentParameters &rhs)
Definition: DtTemporaryAgentManager.h:76
DtFeature::Key myAttributeKey
Definition: query.h:383
Definition: query.h:59
DT_DLL_terrainCS bool operator==(const DtDegMinSec &lhs, const DtDegMinSec &rhs)
Definition: query.h:43
Comparison myComparison
Definition: query.h:359
DT_DLL_features std::ostream & operator<<(std::ostream &, const DtFeatureTransform &)
std::ostream output.
DtQuery(Implementation::CPtr p)
Definition: query.h:85
std::shared_ptr< Implementation > Ptr
Definition: query.h:66
Type type() const
Returns the type of the query. The query framework uses the return value of this function to optimize...
Definition: query.h:111
DtQuery myRightQuery
Definition: query.h:273
Matches features that have an attribute with a certain key.
Definition: query.h:294
const Implementation & impl() const
Definition: query.h:87
bool isFalse() const
Definition: query.h:114
DtQuery myLeftQuery
Definition: query.h:272
DtAndQuery And
Definition: query.h:54
void print(double **a, int r, int c, const char *str)
Comparison myComparison
Definition: query.h:384
DtQuery myRightQuery
Definition: query.h:249
Represents a set of characeters a DtFeature object can have. DtQuery objects are the way to communica...
Definition: query.h:37
Matches features which match either of two other DtQuery objects.
Definition: query.h:253
DtHasAttribute Base
Definition: query.h:321
DtHasAttributeValue::Comparison Comparison
Definition: query.h:367
DtHasAttribute Base
Definition: query.h:364
Definition: query.h:45
DtOrQuery Or
Definition: query.h:55
DT_DLL_features DtQuery operator||(const DtQuery &, const DtQuery &)
Matches any feature.
Definition: query.h:207
const T & cast() const
Definition: query.h:93
voidpf stream
Definition: ioapi.h:39
DT_DLL_features DtQuery operator&&(const DtQuery &, const DtQuery &)
DtFalseQuery False
Definition: query.h:53
DtTrueQuery True
Definition: query.h:52
virtual ~Visitor()
Definition: query.h:151
DtQuery(Implementation *i)
Definition: query.h:84
Definition: query.h:319
DtQuery(const Implementation &i)
Definition: query.h:83
Definition: query.h:46
Definition: query.h:276
std::shared_ptr< const Implementation > CPtr
Definition: query.h:67
virtual Result apply(const DtQuery &query)
Definition: query.h:153
Represents a GIS feature. Features consist of a DtFeatureGeometry (2.5D geometric vector data) and a ...
Definition: feature.h:36
DT_DLL_features std::istream & operator>>(std::istream &, DtQuery &)
iostream input iteration
DtQuery::Type Type
Definition: query.h:69
Comparison
Definition: query.h:324
const T * trycast() const
Definition: query.h:99
boost::variant< std::string, long long, bool, double > Attribute
boost::variant type for accessing attributes.
Definition: feature.h:47

Document ID: Generated on Thu Oct 23 22:29:17 EDT 2025 from SVN revision 280951
Copyright © 2005-2024 MAK Technologies. All Rights Reserved (www.mak.com)