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