#ifndef _mitrax_mitrax_hpp_INCLUDED_
#define _mitrax_mitrax_hpp_INCLUDED_
/// \file mitrax.hpp
///
/// \brief Kompletteinbindung und Projektbeschreibung
///
/// Diese Datei bindet alle mitrax-Dateien ein. Dies ist nur zum Testen gedacht, einer Einbindung
/// der wirklich benötigten Komponenten ist der Vorzug zu gewähren.
///
/// Weiterhin steht in dieser Datei die Projektbeschreibung für die Dokumentation.
#include "mitrax/io.hpp"
#include "mitrax/simple_operator.hpp"
/// \mainpage Übersicht
///
/// \author Benjamin Buch
/// \version 0.5.2
/// \date 14.06.2011
///
/// \section intro_sec Einleitung
///
/// mitrax ist eine C++-Bibliothek, welche als Herzstück eine matrix-Klasse (im Sinne einer
/// mathematischen Matrix) zur Verfügung stellt. Es werden eine Reihe von Rechenoperationen,
/// Ein- und Ausgabe (inklusive eigener Manipulatoren), der Zugriff auf Zeilen und Spalten mittels
/// Proxyklassen und ein Iterator-Interface für elementweise Bearbeitung angeboten.
///
/// \subsection intro_name_sec Entstehung
///
/// <div style="float:right;border:1px black solid;">
/// \image html mitra_mitra_html.jpg "Mitra Mitra aus der Gattung der Mitra"</div>
/// Die Bibliothek entstand als Semesterprojekt während meines Studiums und ist vornehmlich als
/// Lehrbeispiel für die aufgeführten Funktionalitäten gedacht. Für die praktische Nutzung ist
/// Boost::uBLAS zu empfehlen, welche deutlich mehr Funktionalitäten implementiert.
///
/// Der Name mitrax entstand durch zufälliges Vertauschen der Buchstaben von matrix, wobei sich
/// nach entfernen des Buchstabens x am Ende, ein Wort ergab, das in der Biologie eine Gattung
/// innerhalb der Familie der Mitridae (auch Mitraschnecken genannt) bezeichnet. Da deren Gestalt
/// zwar immer ähnlich und dennoch abwechslungsreich ist, erinnern diese Tiere ein wenig an den
/// Templatecharakter der Matrixklasse, auf den besonderen Wert gelegt wurde.
///
/// \image latex mitra_mitra.jpg "Mitra Mitra aus der Gattung der Mitra" width=7cm
///
/// \section install_sec Installation
///
/// Die Bibliothek ist als Header-Only-Bibliothek aufgebaut. Eine Installation oder Vorkompilierung
/// ist daher nicht nötig.
///
/// \section structure_sec Struktur
///
/// Die Datei mitrax.hpp bindet alle Funktionalitäten von mitrax ein. Die Verwendung dieser Datei
/// ist nur für Testzwecke zu empfehlen, da sich die Compilierzeit gegenüber der Verwendung der
/// spezifisch benötigten Funktionen erhöhen kann.
///
/// Die Kernkomponente von mitrax ist die <code>matrix</code>-Klasse. Die Ein- und Ausgabe sowie
/// die Operatoren sind von dieser losgelöst und müssen daher zusätzlich eingebunden werden, wenn
/// sie benötigt werden.
///
/// \section Konventionen
///
/// Templateparameter beginnen mit einem Großbuchstaben und werden durch im Falle mehrteiliger
/// Bezeichner durch Großbuchstaben getrennt. Alle anderen Bezeichner werden vollständig klein
/// geschrieben und die Trennung mehrteiliger Bezeichner erfolgt per Unterstrich. Private
/// Memberdaten-Bezeichner enden auf einen Unterstrich.
///
/// Alles womit der Nutzer nicht unmittelbar Kontakt haben sollte, steht im Namensraum
/// <code>detail</code>. Die Schnittstellen der dortigen Komponenten können sich jederzeit ändern,
/// sofern dadurch kein Nutzercode ungültig wird, der diese Komponenten nur indirekt nutzt.
///
/// Als Methoden werden nur jene Funktionen implementiert die zwingend Zugriff auf
/// nicht-öffentliche Member benötigen. Im Falle der Proxyklassen gibt es mehrere Member mit
/// gleicher Funktionalität. Dies dient der Schaffung einer einheitlichen Schnittstelle aller
/// Proxyklassen, so dass Templates richtungsunabhängig gestaltet werden können. Weitere Ausnahmen
/// gibt es derzeit nicht.
///
/// Die Iteratorklassen folgenden den Richtlinien, die der C++-Standard zu Iteratoren vorgibt.
/// Entsprechend ist keine nähere Erläuterung der einzelnen Member Notwendig. Der Nutzer sollte mit
/// diesen Klassen ohnehin nur in Form von <code>typedef</code>s Kontakt haben.
///
/// Sofern nichts unmittelbar dagegen spricht, sind zurückgegebene Objekte konstant. Im Falle der
/// Iteratormethoden wird hierbei den Vorgaben des C++-Standards widersprochen. Dies sollte jedoch
/// in realem Code keine Probleme bereiten.
///
/// Funktionen des C++-Standard werden zunächst mittels <code>using</code>-Deklaration verfügbar
/// gemacht und dann ohne Qualifizierer aufgerufen, um eine parameterabhängige Namenssuche für
/// etwaige Spezialisierungen zu unterstützen.
/// \brief Namensraum der mitrax-Bibliothek
///
/// In diesem Namensraum stehen alle Komponente, welche mitrax für die Nutzung durch den
/// Bibliotheksnutzer bereitstellt.
namespace mitrax{
/// \brief Namensraum für Hilfskonstrukte der Bibliothekskomponenten
///
/// Auf Komponenten aus diesem Namensraum sollte der Bibliotheksnutzer niemals direkt zugreifen.
/// Sie dienen ausschließt als Helfer für die Komponenten aus dem Namensraum mitrax. Insbesondere
/// können sich Schnittstellen, welche der Nutzer nicht durch einen indirekten Zugriff zu Gesicht
/// bekommt auch bei kleinen Versionssprüngen ändern. Auf derartige Änderungen muss bei einem
/// Update der Bibliothek nicht zwingend hingewiesen werden.
namespace detail{}
/// \brief Namensraum für die Fehlerklassen von mitrax
///
/// In diesem Namensraum stehen alle Fehlerklassen, welche von mitrax-Komponenten mittels
/// <code>throw</code> geworfen werden.
namespace error{}
}
#endif