7 CompoundCondition::~CompoundCondition()
9 for(list<Condition *>::const_iterator i=conditions.begin(); i!=conditions.end(); ++i)
13 void CompoundCondition::clone_to(CompoundCondition &other) const
15 for(list<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);
25 Condition *AndCondition::clone() const
27 AndCondition *result = new AndCondition;
32 void AndCondition::add_lines(list<FilterStatement> &st) const
34 for(list<Condition *>::const_iterator i=conditions.begin(); i!=conditions.end(); ++i)
39 Condition *OrCondition::clone() const
41 OrCondition *result = new OrCondition;
46 void OrCondition::add_lines(list<FilterStatement> &st) const
48 bool merge = conditions.size()>1;
49 for(list<Condition *>::const_iterator i=conditions.begin(); (merge && ++i!=conditions.end()); )
50 merge = conditions.front()->can_merge(**i, *this);
53 conditions.front()->add_merged_lines(conditions, *this, st);
56 list<FilterStatement> result;
57 for(list<Condition *>::const_iterator i=conditions.begin(); i!=conditions.end(); ++i)
59 list<FilterStatement> sub_result = st;
60 (*i)->add_lines(sub_result);
61 result.splice(result.end(), sub_result);
68 LinkedColorsCondition::LinkedColorsCondition(const Colors &c):
72 Condition *LinkedColorsCondition::clone() const
74 return new LinkedColorsCondition(colors);
77 void LinkedColorsCondition::add_lines(list<FilterStatement> &st) const
79 FilterStatement::add_line(st, format("SocketGroup %s", colors.colors));
83 void operator>>(const LexicalConverter &conv, LinkedColorsCondition::Colors &colors)
85 const string &str = conv.get();
87 for(string::const_iterator i=str.begin(); (rgb && i!=str.end()); ++i)
88 rgb = (*i=='R' || *i=='G' || *i=='B');
89 if(str.size()>6 || !rgb)
90 throw lexical_error(format("conversion of '%s' to LinkedColorsCondition::Colors", str));
92 fill(colors.colors, colors.colors+7, '\0');
93 copy(str.begin(), str.end(), colors.colors);