14 #include <boost/scoped_ptr.hpp>
15 #include <boost/logic/tribool.hpp>
16 #include <boost/cast.hpp>
20 namespace MAKVRinTerra
59 template <
typename Result =
void>
63 :
public boost::enable_shared_from_this<Implementation>
64 ,
private boost::noncopyable
67 typedef boost::shared_ptr<Implementation>
Ptr;
68 typedef boost::shared_ptr<const Implementation>
CPtr;
74 virtual Type type()
const;
76 virtual bool matches(
const DtFeature&)
const = 0;
78 virtual void print(std::ostream&)
const = 0;
79 virtual void pprint(std::ostream&,
unsigned indent)
const;
96 return *boost::polymorphic_downcast<const T*>(myImpl.get());
100 const T* trycast()
const
102 return dynamic_cast<const T*
>(myImpl.get());
114 bool isTrue()
const {
return type() == ETrue; }
115 bool isFalse()
const {
return type() == EFalse; }
118 bool matches(
const DtFeature& feature)
const;
123 boost::optional<DtQuery>
remove(boost::function<bool (const DtQuery&)>)
const;
128 void pprint(std::ostream&
stream,
unsigned indent = 0)
const;
129 std::string pprint(
unsigned indent = 0)
const;
148 template <
typename Result>
156 switch (query.
type())
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);
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;
183 virtual DtQuery apply(
const DtQuery&);
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&);
198 virtual void apply(
const DtQuery&);
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&);
214 bool matches(
const DtFeature& feature)
const;
215 void print(std::ostream&)
const;
225 bool matches(
const DtFeature& feature)
const;
226 void print(std::ostream&)
const;
238 bool matches(
const DtFeature& feature)
const;
239 void print(std::ostream&)
const;
240 void pprint(std::ostream&,
unsigned indent)
const;
262 bool matches(
const DtFeature& feature)
const;
263 void print(std::ostream&)
const;
264 void pprint(std::ostream&,
unsigned indent)
const;
283 void print(std::ostream&)
const;
299 static DtQuery Create(std::string);
300 static DtQuery Create(
const char*);
303 void print(std::ostream&)
const;
340 const boost::optional<DtFeature::Attribute>&,
341 const boost::optional<DtFeature::Attribute>&);
349 bool matches(
const DtFeature& feature)
const;
353 Comparison comparison()
const;
374 bool matches(
const DtFeature& feature)
const;