14 #include <boost/scoped_ptr.hpp>
15 #include <boost/logic/tribool.hpp>
19 namespace MAKVRinTerra
58 template <
typename Result =
void>
62 :
public boost::enable_shared_from_this<Implementation>
63 ,
private boost::noncopyable
66 typedef boost::shared_ptr<Implementation>
Ptr;
67 typedef boost::shared_ptr<const Implementation>
CPtr;
73 virtual Type type()
const;
75 virtual bool matches(
const DtFeature&)
const = 0;
77 virtual void print(std::ostream&)
const = 0;
78 virtual void pprint(std::ostream&,
unsigned indent)
const;
95 return *boost::polymorphic_downcast<const T*>(myImpl.get());
99 const T* trycast()
const
101 return dynamic_cast<const T*
>(myImpl.get());
113 bool isTrue()
const {
return type() == ETrue; }
114 bool isFalse()
const {
return type() == EFalse; }
117 bool matches(
const DtFeature& feature)
const;
122 boost::optional<DtQuery>
remove(boost::function<bool (const DtQuery&)>)
const;
124 boost::optional<DtFeatureGeometry> findEnclosingGeometry()
const;
127 void print(std::ostream& stream)
const;
129 void pprint(std::ostream& stream,
unsigned indent = 0)
const;
130 std::string pprint(
unsigned indent = 0)
const;
149 template <
typename Result>
157 switch (query.
type())
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);
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;
184 virtual DtQuery apply(
const DtQuery&);
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&);
199 virtual void apply(
const DtQuery&);
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&);
215 bool matches(
const DtFeature& feature)
const;
216 void print(std::ostream&)
const;
226 bool matches(
const DtFeature& feature)
const;
227 void print(std::ostream&)
const;
239 bool matches(
const DtFeature& feature)
const;
240 void print(std::ostream&)
const;
241 void pprint(std::ostream&,
unsigned indent)
const;
263 bool matches(
const DtFeature& feature)
const;
264 void print(std::ostream&)
const;
265 void pprint(std::ostream&,
unsigned indent)
const;
286 void print(std::ostream&)
const;
303 void print(std::ostream&)
const;
319 static DtQuery Create(std::string);
320 static DtQuery Create(
const char*);
323 void print(std::ostream&)
const;
352 bool matches(
const DtFeature& feature)
const;
353 void print(std::ostream& stream)
const;
356 Comparison comparison()
const;