14 #include <boost/scoped_ptr.hpp>
15 #include <boost/logic/tribool.hpp>
19 namespace MAKVRinTerra
58 static void SetDebugOutput(std::ostream&);
59 static void DisableDebugOutput();
61 template <
typename Result =
void>
65 :
public boost::enable_shared_from_this<Implementation>
66 ,
private boost::noncopyable
69 typedef boost::shared_ptr<Implementation>
Ptr;
70 typedef boost::shared_ptr<const Implementation>
CPtr;
76 virtual Type type()
const;
78 virtual bool matches(
const DtFeature&)
const = 0;
80 virtual void print(std::ostream&)
const = 0;
81 virtual void pprint(std::ostream&,
unsigned indent)
const;
101 template <
typename T>
102 const T& cast()
const
104 return *boost::polymorphic_downcast<const T*>(myImpl.get());
107 template <
typename T>
108 const T* trycast()
const
110 return dynamic_cast<const T*
>(myImpl.get());
122 bool isTrue()
const {
return type() == ETrue; }
123 bool isFalse()
const {
return type() == EFalse; }
131 boost::optional<DtQuery>
remove(boost::function<bool (const DtQuery&)>)
const;
133 boost::optional<DtFeatureGeometry> findEnclosingGeometry()
const;
136 void print(std::ostream& stream)
const { myImpl->print(stream); }
138 void pprint(std::ostream& stream,
unsigned indent = 0)
const { myImpl->pprint(stream,indent); }
139 std::string pprint(
unsigned indent = 0)
const;
156 template <
typename Result>
164 switch (query.
type())
166 case ETrue:
return visit(query.
cast<
True>());
167 case EFalse:
return visit(query.
cast<
False>());
168 case EAnd:
return visit(query.
cast<
And>());
169 case EOr:
return visit(query.
cast<
Or>());
170 case EOther:
return visit(query);
178 virtual Result visit(
const DtQuery&) = 0;
179 virtual Result visit(
const True&) = 0;
180 virtual Result visit(
const False&) = 0;
181 virtual Result visit(
const And&) = 0;
182 virtual Result visit(
const Or&) = 0;
191 virtual DtQuery apply(
const DtQuery&);
193 virtual DtQuery visit(
const DtQuery&) = 0;
194 virtual DtQuery visit(
const True&);
195 virtual DtQuery visit(
const False&);
196 virtual DtQuery visit(
const And&);
197 virtual DtQuery visit(
const Or&);
206 virtual void apply(
const DtQuery&);
208 virtual void visit(
const DtQuery&) = 0;
209 virtual void visit(
const True&);
210 virtual void visit(
const False&);
211 virtual void visit(
const And&);
212 virtual void visit(
const Or&);
222 bool matches(
const DtFeature& feature)
const;
223 void print(std::ostream&)
const;
233 bool matches(
const DtFeature& feature)
const;
234 void print(std::ostream&)
const;
246 bool matches(
const DtFeature& feature)
const;
247 void print(std::ostream&)
const;
248 void pprint(std::ostream&,
unsigned indent)
const;
270 bool matches(
const DtFeature& feature)
const;
271 void print(std::ostream&)
const;
272 void pprint(std::ostream&,
unsigned indent)
const;
292 void print(std::ostream&)
const;
309 void print(std::ostream&)
const;
325 static DtQuery Create(std::string);
326 static DtQuery Create(
const char*);
329 void print(std::ostream&)
const;
358 bool matches(
const DtFeature& feature)
const;
359 void print(std::ostream& stream)
const;
362 Comparison comparison()
const;