00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00024 #ifndef SPOT_LTLAST_MULTOP_HH
00025 # define SPOT_LTLAST_MULTOP_HH
00026
00027 #include <vector>
00028 #include <map>
00029 #include "refformula.hh"
00030
00031 namespace spot
00032 {
00033 namespace ltl
00034 {
00035
00040 class multop : public ref_formula
00041 {
00042 public:
00043 enum type { Or, And };
00044
00046 typedef std::vector<formula*> vec;
00047
00060 static formula* instance(type op, formula* first, formula* second);
00061
00074 static formula* instance(type op, vec* v);
00075
00076 virtual void accept(visitor& v);
00077 virtual void accept(const_visitor& v) const;
00078
00080 unsigned size() const;
00084 const formula* nth(unsigned n) const;
00088 formula* nth(unsigned n);
00089
00091 type op() const;
00093 const char* op_name() const;
00094
00096 static unsigned instance_count();
00097
00098 protected:
00099 typedef std::pair<type, vec*> pair;
00101 struct paircmp
00102 {
00103 bool
00104 operator () (const pair& p1, const pair& p2) const
00105 {
00106 if (p1.first != p2.first)
00107 return p1.first < p2.first;
00108 return *p1.second < *p2.second;
00109 }
00110 };
00111 typedef std::map<pair, formula*, paircmp> map;
00112 static map instances;
00113
00114 multop(type op, vec* v);
00115 virtual ~multop();
00116
00117 private:
00118 type op_;
00119 vec* children_;
00120 };
00121
00122 }
00123 }
00124
00125 #endif // SPOT_LTLAST_MULTOP_HH