C++-Programmierung/ Eine Matrix-Bibliothek – mitrax/ dimension.hpp

Aus Wikibooks
Zur Navigation springen Zur Suche springen
Nuvola-inspired-terminal.svg
  1 #ifndef _mitrax_mitrax_dimension_hpp_INCLUDED_
  2 #define _mitrax_mitrax_dimension_hpp_INCLUDED_
  3 /// \file dimension.hpp
  4 ///
  5 /// \brief Dimensionstyp für Matrizen
  6 ///
  7 /// Diese Datei stellt einen Datentyp <code>dimension</code> bereit, welcher eine Anzahl von Zeilen
  8 /// und Spalten zusammenfasst.
  9 
 10 namespace mitrax{
 11 
 12 /// \brief Speichert eine Anzahl von Zeilen und Spalten.
 13 ///
 14 /// \param T Typ von dem die Anzahl von Zeilen und Spalten sein soll.
 15 ///
 16 /// Ein Objekt einer <code>dimension</code> enthält eine Anzahl von Zeilen und Spalten. Die
 17 /// Zusammenfassung dieser beiden Größen in einem Datentyp erhöht die Lesbarkeit des Codes.
 18 /// Insbesondere Vergleiche von 2 Dimensionen lassen sich besser darstellen.
 19 ///
 20 /// Innerhalb dieser Dokumentation wird dimension(„Zeilenanzahl“, „Spaltenanzahl“) geschrieben,
 21 /// wenn eine <code>dimension</code> mit „Zeilenanzahl“ Zeilen und „Spaltenanzahl“ Spalten gemeint
 22 /// ist.
 23 template < typename T >
 24 class dimension{
 25 public:
 26     /// \brief Typ von dem die Anzahl von Zeilen und Spalten ist.
 27     typedef T value_type;
 28 
 29 
 30     /// \brief Standardkonstruktor
 31     ///
 32     /// Erstellt eine <code>dimension</code> mit dimension(<code>value_type()</code>,
 33     /// <code>value_type()</code>). Für eingebaute Datentypen entspricht das dimension(0, 0).
 34     ///
 35     /// Bedingung:
 36     ///   - <code>value_type</code> muss defaultkonstruierbar sein.
 37     dimension(): rows_(T()), columns_(T()){}
 38     /// \brief Erstellen mit dimension(<code>rows</code>, <code>columns</code>)
 39     dimension(value_type const& rows, value_type const& columns): rows_(rows), columns_(columns){}
 40     /// \brief Erstellung aus einem kompatiblen <code>SizeType</code>-Objekt mit
 41     ///        dimension(<code>size.height()</code>, <code>size.width()</code>)
 42     ///
 43     /// Oft existieren bereits Typen, die ebenfalls eine Breite (Anzahl Spalten) und Höhe (Anzahl
 44     /// Zeilen) bereitstellen. Falls <code>SizeType</code> die Methoden <code>width()</code> und
 45     /// <code>height()</code> anbietet, kann daraus ein <code>dimension</code>-Objekt konstruiert
 46     /// werden.
 47     ///
 48     /// Bedingungen:
 49     ///   - <code>width()</code> und <code>height()</code> müssen existieren,
 50     ///   - sie müssen konstante Methoden sein
 51     ///   - und einen implizit in <code>value_type</code> wandelbaren Rückgabetyp besitzen.
 52     ///
 53     /// <code>explicit</code> wird verwendet, um implizite Umwandlung nach <code>dimension</code>
 54     /// und die Schreibweise <code>dimension< T > name = SizeType();</code> zu verhindern, wobei
 55     /// <code>SizeType()</code> ein beliebiges Objekt vom Typ <code>SizeType</code> sein kann.
 56     template < typename SizeType >
 57     explicit dimension(SizeType const& size): rows_(size.height()), columns_(size.width()){}
 58 
 59 
 60     /// \brief Setzt die <code>dimension</code> auf dimension(rows, columns)
 61     void resize(value_type const& rows, value_type const& columns){
 62         rows_ = rows; columns_ = columns;
 63     }
 64 
 65     /// \brief Lesezugriff auf Anzahl der Zeilen
 66     value_type const rows()const{ return rows_; }
 67     /// \brief Lesezugriff auf Anzahl der Spalten
 68     value_type const columns()const{ return columns_; }
 69 
 70 private:
 71     /// \brief Anzahl der Zeilen
 72     value_type rows_;
 73     /// \brief Anzahl der Spalten
 74     value_type columns_;
 75 };
 76 
 77 
 78 /// \brief Zeilen * Spalten
 79 ///
 80 /// Gibt das Produkt aus Zeilen und Spalten der Dimension zurück.
 81 template < typename T >
 82 T elements(dimension< T > const& value){
 83     return value.rows() * value.columns();
 84 }
 85 
 86 /// \brief Liefert <code>true</code> wenn die Anzahl der Zeilen und Spalten übereinstimmt.
 87 template < typename T >
 88 bool operator==(dimension< T > const& lhs, dimension< T > const& rhs){
 89     return lhs.rows() == rhs.rows() && lhs.columns() == rhs.columns();
 90 }
 91 
 92 /// \brief Liefert <code>true</code> wenn die Anzahl der Zeilen oder Spalten nicht übereinstimmt.
 93 template < typename T >
 94 bool operator!=(dimension< T > const& lhs, dimension< T > const& rhs){
 95     return !(lhs == rhs);
 96 }
 97 
 98 }
 99 
100 #endif