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/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 }
#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:42
DtFeature::Key myKey
Definition: query.h:317
Matches features which match two other DtQuery objects.
Definition: query.h:230
DtFeature::Attribute myValue
Definition: query.h:359
Key used to lookup attributes. The DtFeature interface is a dictionary that maps Key objects to attri...
Definition: feature.h:68
Implementation::CPtr myImpl
Definition: query.h:132
Definition: query.h:45
DtQuery myLeftQuery
Definition: query.h:249
bool isTrue() const
Definition: query.h:114
DtFeatureGeometry::Type myType
Definition: query.h:291
Matches no features.
Definition: query.h:219
DtFeature::Key myAttributeKey
Definition: query.h:384
Definition: query.h:60
DT_DLL_terrainCS bool operator==(const DtDegMinSec &lhs, const DtDegMinSec &rhs)
Definition: query.h:44
Comparison myComparison
Definition: query.h:360
DT_DLL_features std::ostream & operator<<(std::ostream &, const DtFeatureTransform &)
std::ostream output.
DtQuery(Implementation::CPtr p)
Definition: query.h:86
Type type() const
Returns the type of the query. The query framework uses the return value of this function to optimize...
Definition: query.h:112
DtQuery myRightQuery
Definition: query.h:274
Matches features that have an attribute with a certain key.
Definition: query.h:295
const Implementation & impl() const
Definition: query.h:88
bool isFalse() const
Definition: query.h:115
DtQuery myLeftQuery
Definition: query.h:273
DtAndQuery And
Definition: query.h:55
void print(double **a, int r, int c, const char *str)
boost::shared_ptr< const Implementation > CPtr
Definition: query.h:68
Comparison myComparison
Definition: query.h:385
DtQuery myRightQuery
Definition: query.h:250
Represents a set of characeters a DtFeature object can have. DtQuery objects are the way to communica...
Definition: query.h:38
Matches features which match either of two other DtQuery objects.
Definition: query.h:254
DtHasAttribute Base
Definition: query.h:322
DtHasAttributeValue::Comparison Comparison
Definition: query.h:368
DtHasAttribute Base
Definition: query.h:365
Definition: query.h:46
DtOrQuery Or
Definition: query.h:56
DT_DLL_features DtQuery operator||(const DtQuery &, const DtQuery &)
bool operator>(const DtObjectType &lhs, const DtSimulationModelSetLoader::EntityData &rhs)
Definition: simulationModelSetLoader.h:1393
Matches any feature.
Definition: query.h:208
const T & cast() const
Definition: query.h:94
voidpf stream
Definition: ioapi.h:39
DT_DLL_features DtQuery operator&&(const DtQuery &, const DtQuery &)
DtFalseQuery False
Definition: query.h:54
DtTrueQuery True
Definition: query.h:53
virtual ~Visitor()
Definition: query.h:152
DtQuery(Implementation *i)
Definition: query.h:85
boost::shared_ptr< Implementation > Ptr
Definition: query.h:67
Definition: query.h:320
DtQuery(const Implementation &i)
Definition: query.h:84
Definition: query.h:47
Definition: query.h:277
virtual Result apply(const DtQuery &query)
Definition: query.h:154
Represents a GIS feature. Features consist of a DtFeatureGeometry (2.5D geometric vector data) and a ...
Definition: feature.h:37
DT_DLL_features std::istream & operator>>(std::istream &, DtQuery &)
iostream input iteration
DtQuery::Type Type
Definition: query.h:70
Comparison
Definition: query.h:325
const T * trycast() const
Definition: query.h:100
boost::variant< std::string, long long, bool, double > Attribute
boost::variant type for accessing attributes.
Definition: feature.h:48

Document ID: Generated on Tue Sep 24 19:28:17 EDT 2024 from SVN revision 269799
Copyright © 2005-2024 MAK Technologies. All Rights Reserved (www.mak.com)