Ein Adapter ist ein Codestück, was vergleichbar mit einem Workflow ist, da er über zwei Wege bedient wird. Gewissermaßen ein Cast in zwei Richtungen
Folgendes Problem:
bool IndexPolygon::completeHullPolygons( const Array<IndexPolygon>& faces, Array<IndexHalfEdge>& halfEdges, Array<std::pair<std::size_t, std::size_t>>* nonUniques, Array<std::size_t>* nonCorresponding ) { IndexPolygon::extractHalfEdgesFromPolygons( faces, halfEdges ); //ATR64FIXME return IndexHalfEdge::unique( halfEdges, nonUniques ) && IndexHalfEdge::hasCompleteCorrespondencies( halfEdges, nonCorresponding ); }
Die Funktion unique erwartet als 2. Parameter ein Array<std::pair<int, int»*. Nun steht hier nicht klar fest, ob das ein Ein- oder Ausgabeparameter ist.
Man könnte nun einen Adapter formulieren, der Werte von Array<std::pair<std::size_t, std::size_t» nach Array<std::pair<int, int» konvertiert und - sobald die Funktion fertig gelaufen ist, das resultierende Array wieder nach nonUniques zurückspielt.
adapt
{
std::size_t get int = static_cast< std::size_t >( value );
int set( std::size_t rhs ) = value : static_cast< int >( rhs );
int get std::size_t = static_cast< int >( value );
std::size_t set( int rhs ) = value : static_cast< std::size_t >( rhs );
Array<std::pair<int, int>> get( Array<std::pair<std::size_t, std::size_t>> )
{
return Array<std::pair<int, int>>( ... );
}
Array<std::pair<int, int>> set( Array<std::pair<std::size_t, std::size_t>> )
{
return Array<std::pair<std::size_t, std::size_t>>( ... )
}
// Man könnte nun auch überlegen, virtuelle Funktionen umzubelegen:
std::pair< int, int > Array<std::pair<int, int>>::operator[](size_t index) get Array<std::pair<std::size_t, std::size_t>>::operator[]( size_t )
{
pair is ref : this[index];
return std::pair< std::size_t, std::size_t >( adapt pair.left, adapt pair.right ); // Werte werden nach Rückkehr der Funktoin anschließend ins pair<int, int> zurückgeschrieben
}
}