7 CompoundCondition::~CompoundCondition()
9 for(vector<Condition *>::const_iterator i=conditions.begin(); i!=conditions.end(); ++i)
13 void CompoundCondition::clone_to(CompoundCondition &other) const
15 for(vector<Condition *>::const_iterator i=conditions.begin(); i!=conditions.end(); ++i)
16 other.add((*i)->clone());
19 void CompoundCondition::add(Condition *cond)
21 conditions.push_back(cond);
24 const Condition *CompoundCondition::get(unsigned i) const
26 if(i>=conditions.size())
27 throw out_of_range("CompoundCondition::get");
31 Condition *CompoundCondition::flatten() const
33 if(conditions.empty())
35 else if(conditions.size()==1)
36 return conditions.front()->clone();
39 for(vector<Condition *>::const_iterator i=conditions.begin(); (merge && ++i!=conditions.end()); )
40 merge = conditions.front()->can_merge(**i, *this);
43 return conditions.front()->merge(conditions, *this);
46 Condition *result = 0;
47 for(vector<Condition *>::const_iterator i=conditions.begin(); i!=conditions.end(); ++i)
49 Condition *sub = (*i)->flatten();
53 result = dispatch_flatten(result, sub);
60 Condition *CompoundCondition::dispatch_flatten(Condition *cond1, Condition *cond2) const
62 OrCondition *or1 = dynamic_cast<OrCondition *>(cond1);
63 AndCondition *and1 = dynamic_cast<AndCondition *>(cond1);
64 OrCondition *or2 = dynamic_cast<OrCondition *>(cond2);
65 AndCondition *and2 = dynamic_cast<AndCondition *>(cond2);
69 return flatten(or1, or2);
71 return flatten(or1, and2);
73 return flatten(or2, and1);
75 return flatten(or1, cond2);
77 return flatten(or2, cond1);
82 return flatten(and1, and2);
84 return flatten(and1, cond2);
86 return flatten(and2, cond1);
89 return flatten(cond1, cond2);
91 throw logic_error("CompoundCondition::dispatch_flatten");
95 AndCondition *AndCondition::clone() const
97 AndCondition *result = new AndCondition;
102 Condition *AndCondition::flatten(Condition *cond1, Condition *cond2) const
104 AndCondition *result = new AndCondition;
110 Condition *AndCondition::flatten(AndCondition *cond1, Condition *cond2) const
116 Condition *AndCondition::flatten(AndCondition *cond1, AndCondition *cond2) const
118 unsigned count2 = cond2->count();
119 for(unsigned i=0; i<count2; ++i)
120 cond1->add(cond2->get(i)->clone());
125 Condition *AndCondition::flatten(OrCondition *cond1, Condition *cond2) const
127 OrCondition *result = new OrCondition;
128 unsigned count = cond1->count();
129 for(unsigned i=0; i<count; ++i)
130 result->add(dispatch_flatten(cond1->get(i)->clone(), (i+1<count ? cond2->clone() : cond2)));
135 Condition *AndCondition::flatten(OrCondition *cond1, AndCondition *cond2) const
137 return flatten(cond1, static_cast<Condition *>(cond2));
140 Condition *AndCondition::flatten(OrCondition *cond1, OrCondition *cond2) const
142 unsigned count1 = cond1->count();
143 unsigned count2 = cond2->count();
144 OrCondition *result = new OrCondition;
145 for(unsigned i=0; i<count1; ++i)
146 for(unsigned j=0; j<count2; ++j)
147 result->add(dispatch_flatten(cond1->get(i)->clone(), cond2->get(j)->clone()));
153 void AndCondition::add_lines(list<FilterStatement> &st) const
155 for(vector<Condition *>::const_iterator i=conditions.begin(); i!=conditions.end(); ++i)
160 OrCondition *OrCondition::clone() const
162 OrCondition *result = new OrCondition;
167 Condition *OrCondition::flatten(Condition *cond1, Condition *cond2) const
169 OrCondition *result = new OrCondition;
175 Condition *OrCondition::flatten(AndCondition *cond1, Condition *cond2) const
177 return flatten(static_cast<Condition *>(cond1), cond2);
180 Condition *OrCondition::flatten(AndCondition *cond1, AndCondition *cond2) const
182 return flatten(static_cast<Condition *>(cond1), static_cast<Condition *>(cond2));
185 Condition *OrCondition::flatten(OrCondition *cond1, Condition *cond2) const
191 Condition *OrCondition::flatten(OrCondition *cond1, AndCondition *cond2) const
193 return flatten(cond1, static_cast<Condition *>(cond2));
196 Condition *OrCondition::flatten(OrCondition *cond1, OrCondition *cond2) const
198 unsigned count2 = cond2->count();
199 for(unsigned i=0; i<count2; ++i)
200 cond1->add(cond2->get(i)->clone());
205 void OrCondition::add_lines(list<FilterStatement> &st) const
207 list<FilterStatement> result;
208 for(vector<Condition *>::const_iterator i=conditions.begin(); i!=conditions.end(); ++i)
210 list<FilterStatement> sub_result = st;
211 (*i)->add_lines(sub_result);
212 result.splice(result.end(), sub_result);
218 LinkedColorsCondition::LinkedColorsCondition(const Colors &c):
222 LinkedColorsCondition *LinkedColorsCondition::clone() const
224 return new LinkedColorsCondition(colors);
227 void LinkedColorsCondition::add_lines(list<FilterStatement> &st) const
229 FilterStatement::add_line(st, format("SocketGroup %s", colors.colors));
233 void operator>>(const LexicalConverter &conv, LinkedColorsCondition::Colors &colors)
235 const string &str = conv.get();
237 for(string::const_iterator i=str.begin(); (rgb && i!=str.end()); ++i)
238 rgb = (*i=='R' || *i=='G' || *i=='B');
239 if(str.size()>6 || !rgb)
240 throw lexical_error(format("conversion of '%s' to LinkedColorsCondition::Colors", str));
242 fill(colors.colors, colors.colors+7, '\0');
243 copy(str.begin(), str.end(), colors.colors);