9 #include <boost/scoped_ptr.hpp>
10 #include <boost/logic/tribool.hpp>
14 namespace MAKVRinTerra
53 static void SetDebugOutput(std::ostream&);
54 static void DisableDebugOutput();
56 template <
typename Result =
void>
60 :
public boost::enable_shared_from_this<Implementation>
61 ,
private boost::noncopyable
64 typedef boost::shared_ptr<Implementation>
Ptr;
65 typedef boost::shared_ptr<const Implementation>
CPtr;
71 virtual Type type()
const;
73 virtual bool matches(
const DtFeature&)
const = 0;
75 virtual void print(std::ostream&)
const = 0;
76 virtual void pprint(std::ostream&,
unsigned indent)
const;
99 return *boost::polymorphic_downcast<const T*>(myImpl.get());
102 template <
typename T>
103 const T* trycast()
const
105 return dynamic_cast<const T*
>(myImpl.get());
117 bool isTrue()
const {
return type() == ETrue; }
118 bool isFalse()
const {
return type() == EFalse; }
126 boost::optional<DtQuery>
remove(boost::function<bool (const DtQuery&)>)
const;
128 boost::optional<DtFeatureGeometry> findEnclosingGeometry()
const;
131 void print(std::ostream& stream)
const { myImpl->print(stream); }
133 void pprint(std::ostream& stream,
unsigned indent = 0)
const { myImpl->pprint(stream,indent); }
134 std::string pprint(
unsigned indent = 0)
const;
151 template <
typename Result>
159 switch (query.
type())
161 case ETrue:
return visit(query.
cast<
True>());
162 case EFalse:
return visit(query.
cast<
False>());
163 case EAnd:
return visit(query.
cast<
And>());
164 case EOr:
return visit(query.
cast<
Or>());
165 case EOther:
return visit(query);
173 virtual Result visit(
const DtQuery&) = 0;
174 virtual Result visit(
const True&) = 0;
175 virtual Result visit(
const False&) = 0;
176 virtual Result visit(
const And&) = 0;
177 virtual Result visit(
const Or&) = 0;
186 virtual DtQuery apply(
const DtQuery&);
188 virtual DtQuery visit(
const DtQuery&) = 0;
189 virtual DtQuery visit(
const True&);
190 virtual DtQuery visit(
const False&);
191 virtual DtQuery visit(
const And&);
192 virtual DtQuery visit(
const Or&);
201 virtual void apply(
const DtQuery&);
203 virtual void visit(
const DtQuery&) = 0;
204 virtual void visit(
const True&);
205 virtual void visit(
const False&);
206 virtual void visit(
const And&);
207 virtual void visit(
const Or&);
217 bool matches(
const DtFeature& feature)
const;
218 void print(std::ostream&)
const;
228 bool matches(
const DtFeature& feature)
const;
229 void print(std::ostream&)
const;
241 bool matches(
const DtFeature& feature)
const;
242 void print(std::ostream&)
const;
243 void pprint(std::ostream&,
unsigned indent)
const;
265 bool matches(
const DtFeature& feature)
const;
266 void print(std::ostream&)
const;
267 void pprint(std::ostream&,
unsigned indent)
const;
287 void print(std::ostream&)
const;
304 void print(std::ostream&)
const;
320 static DtQuery Create(std::string);
321 static DtQuery Create(
const char*);
324 void print(std::ostream&)
const;
353 bool matches(
const DtFeature& feature)
const;
354 void print(std::ostream& stream)
const;
357 Comparison comparison()
const;