00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #ifndef OST_QUERY_AST_HH
00020 #define OST_QUERY_AST_HH
00021
00022 #include <boost/regex.hpp>
00023
00024 #include <ost/mol/module_config.hh>
00025 #include <boost/variant.hpp>
00026 #include <ost/geom/vec3.hh>
00027 #include <ost/mol/view_type_fw.hh>
00028 #include <ost/mol/property_id.hh>
00029
00030 #include "query_ast_fw.hh"
00031
00032 namespace ost { namespace mol { namespace impl {
00033
00038 class DLLEXPORT_OST_MOL WithinParam {
00039 public:
00040 WithinParam(const geom::Vec3& center, float radius);
00041 WithinParam(int ref, float radius);
00042 WithinParam();
00043
00044 float GetRadiusSquare() const;
00045
00046 bool operator==(const WithinParam& p) const;
00047
00048 const geom::Vec3& GetCenter() const;
00049 int GetRef() const;
00050 bool HasValidRef() const;
00051 private:
00052 geom::Vec3 center_;
00053 float radius_;
00054 int lazily_bound_ref_;
00055 };
00056
00057
00058 class DLLEXPORT_OST_MOL StringOrRegexParam {
00059 public:
00060 StringOrRegexParam();
00061 explicit StringOrRegexParam(const String& s);
00062 bool Match(const String& s) const;
00063 bool operator==(const StringOrRegexParam&) const;
00064 const String& str() const {return s_;}
00065 private:
00066 bool is_regex_;
00067 boost::regex r_;
00068 String s_;
00069 };
00070
00071 typedef boost::variant<int, Real, WithinParam, StringOrRegexParam> ParamType;
00072
00073
00074 class DLLEXPORT_OST_MOL Node {
00075 public:
00076 Node(): parent_(NULL) { }
00077 virtual ~Node() { }
00078 virtual void Dump(int level=0) const = 0;
00079
00080 Node* GetParent();
00081
00082 void SetParent(Node* parent);
00083 private:
00084 Node* parent_;
00085 };
00086
00087
00088
00089 class DLLEXPORT_OST_MOL LogicOPNode : public Node {
00090 public:
00091 LogicOPNode(LogicOP op);
00092
00093 ~LogicOPNode();
00094
00096 void SetRHS(Node* rhs);
00097
00099 void SetLHS(Node* lhs);
00100
00102 const Node* GetRHS() const;
00103
00105 const Node* GetLHS() const;
00106
00107
00109 LogicOP GetOP() const;
00110
00111 void SetOP(LogicOP op);
00112
00113 virtual void Dump(int level=0) const;
00114
00115 private:
00116 Node* lhs_;
00117 Node* rhs_;
00118 LogicOP op_;
00119 };
00120
00121
00122 class DLLEXPORT_OST_MOL SelNode : public Node {
00123 public:
00124 SelNode(const Prop& sel, CompOP op, const ParamType& value)
00125 : sel_(sel), op_(op), param_(value)
00126 { }
00127
00128 SelNode(const SelNode& rhs)
00129 : sel_(rhs.sel_), op_(rhs.op_),param_(rhs.param_)
00130 { }
00131
00132 virtual void Dump(int level=0) const;
00133
00134 const Prop& GetAtomProps() const {
00135 return sel_;
00136 }
00137 CompOP GetCompOP() const {
00138 return op_;
00139 }
00140 const ParamType& GetParm() const {
00141 return param_;
00142 }
00143 private:
00144 Prop sel_;
00145 CompOP op_;
00146 ParamType param_;
00147
00148 };
00149
00150 }}}
00151
00152 #endif