Design-Frage: "Algorithmus" aus Filterschritten

11/06/2014 - 17:43 von Jens Müller | Report spam
Ich habe hier einen Algorithmus, der aus einer Reihe von Filterschritten
besteht. Das "besondere" daran ist, dass manche der Filterschritte
zustandsbehaftet sind, also nicht einfach nur eine Eingabe nach der
anderen in jeweils eine Ausgabe verwandeln.

Konkret ist das Problem ein Richtungsfilter für eine Folge von
Linienstücken. Dabei gibt es Linienstücke, die keine eigene Richtung
haben, aber sichtbar sein sollen, wenn eine Nachbarkante sichtbar ist.

Konkret sieht das momentan wie folgt aus:

1. Eingabe ist eine std::list von Kanten.
2. Es gibt eine Funktion, die aus einer Kante deren Sichtbarkeit
bestimmt, und zwar als boost::logic::tribool.
3. Eine Klasse verwandelt diese tribools in richtige bools. Dafür hat
sie einen operator()( boost::logic::tribool ). Die bools schreibt sie
auf ein Funktionsobjekt, dass man im Konstrktor übergibt. Die bools
werden ggf. verzögert ausgegeben, wenn es sich indeterminates
handelt, und zwar spàtestens beim nàchsten true oder false oder aber
im Destruktor.
4. Eine weitere Klasse bestimmt fortlaufende Ranges aus true-Werten.
Dafür bekommt sie einen Range (Iteratorenpaar) und ein
Funktionsobjekt, an das sie diese Ranges übergibt. Über den
operator()( bool ) übergibt man einen bool-Wert nach dem anderen.
Die Klasse durchlàuft ihren intern gemerkten Range.
Wenn ein false kommt (oder aber spàtestens im Destruktor), ruft sie
das gemerkte Funktionsobjekt mit dem Range auf, für den sie
fortlaufend true-Werte bekommen hat.
5. Und schließlich gibt es noch eine Funktion, die einen Range von
Iteratoren auf eine std::list bekommt und diesen in eine neue Liste
spliced.

Diese Funktionen/Klassen sind in der angegebenen Reihenfolge "ineinander
gesteckt".

Das Ganze funktioniert also quasi push-basiert, wobei einmal im
verwendenden Code und dann noch in den in 3. und 4. beschriebenen
Klassen jeweils über die gleiche std::list iteriert wird.

Ja, mit der Iteratorenstabilitàt passt es, aber das ist natürlich auch
nicht ganz offensichtlich.

Sinnvoll, oder wie würdet ihr es anders machen?

Gruß, Jens
 

Lesen sie die antworten

#1 Markus Schaaf
12/06/2014 - 12:31 | Warnen spam
Am 11.06.2014 17:43, schrieb Jens Müller:

3. Eine Klasse verwandelt diese tribools in richtige bools. Dafür hat
sie einen operator()( boost::logic::tribool ). Die bools schreibt sie
auf ein Funktionsobjekt, dass man im Konstrktor übergibt. Die bools
werden ggf. verzögert ausgegeben, wenn es sich indeterminates
handelt, und zwar spàtestens beim nàchsten true oder false oder aber
im Destruktor.



Was ich anders machen würde: Ich mag keine "Arbeitslogik" im D'tor. Ich
würde eine explizite `finish`-Methode benutzen. Sonst passiert z.B.
Folgendes: Deine Streams pumpen, ein I/O-Fehler wirft eine Exception,
alles wird abgeràumt, und im D'tor versucht jetzt wieder jemand zu
pumpen, I/O-Fehler, Exception, Absturz.

MfG

Ähnliche fragen