#ifndef INCLUDE_NASTPARAMETERCONTEXTAGGEDFILE_H
#define INCLUDE_NASTPARAMETERCONTEXTAGGEDFILE_H
//-----------------------------------------------------------------------------
// NastParameterContextTaggedFile.h
//-----------------------------------------------------------------------------
//
//  Copyright (C) 1998 Technische Universitaet Muenchen, Germany
//                   written by Bernhard Brueck
//
//  This file is part of Nast++
//
//-----------------------------------------------------------------------------
//  CNastParameterContextTaggedFile ermoeglicht das Einlesen von Parametern
//  aus einem stream.
//  Jeder Parameter besteht aus mehreren Teilen. Der Name setzt sich aus
//  den Bezeichungen fuer Bereiche, getrennt durch Punkte zusammen.
//  <Bereich>.<Unterbereich>.<UnterUnterbereich>.<Name> = <Wert>
//  Integerwerte und Fliesskommawerte werden direkt angegeben. Bei strings
//  wird die Zeichenkette in Hochkomma eingeschlossen. In strings sind
//  alle Zeichen bis auf Hochkomma erlaubt. Es ist kein Escapezeichen vorgesehen.
//  Mit einem Semikolon ausserhalb eines Strings wird ein Kommentar eingeleitet.
//  Alles in der Zeile nach dem Semikolon wird ignoriert.
//
//  Beispiel fuer ein Tagged File:
//
//     Geometrie.size_x = 1.0      ; Groesse der Geometrie in x-Richtung
//     Geometrie.size_y = 1.3      ; Groesse der Geometrie in y-Richtung
//     Geometrie.delta_x = 1.0     ; Zellgroesse in x-Richtung
//     Geometrie.delta_y = 1.3     ; Zellgroesse in y-Richtung
//
//     Output.Filename  = "DrivenCavity.out"
//     Output.Kommentar = "Einfacher Fall mit Driven Cavity"
//
//     Solver.SOR.itermax = 100
//     Solver.SOR.eps     = 0.001
//
//
//  Eine Besonderheit stellt die Funktion Sektion dar. Mit ihr ist es möglich
//  den Bereich einzuschraenken. Sie liefert als Ergebnis wieder eine
//  CNastParameterContextTaggedFile Objekt und kann desshalb beliebig ver-
//  schachtelt werden.
//  z.B. fuer obiges Beispiel liefert section("Solver")
//     
//     SOR.itermax = 100
//     SOR.eps     = 0.001
//
//  oder eps laesst sich auch direkt einlesen:
//
//  contextParameter.section("Solver").section("SOR").getParameter( eps, "eps");
//
//-----------------------------------------------------------------------------
//  Aenderungen:
//     
//
//

#include "NastConfig.h"
#include "NastParameterContext.h"
#include "NastArray.h"

class istream; 

class CNastParameterContextTaggedFile : public CNastParameterContext
{
public:
    //-------------------------------------------------------------------------
    //                         Konstruktor + Destruktor
    //-------------------------------------------------------------------------

    CNastParameterContextTaggedFile( istream &inputStream );			
    CNastParameterContextTaggedFile( const CNastParameterContextTaggedFile & other);
    virtual ~CNastParameterContextTaggedFile();			//  Destruktor

    //-------------------------------------------------------------------------
    //                         Memberfunktionen
    //-------------------------------------------------------------------------

    virtual bool getParameter( int &parameter, 
                               const char *szName,
        		       CNastParameterContext::Req req = CNastParameterContext::required ) const;
    
    virtual bool getParameter( double &parameter, 
                               const char *szName,
        		       CNastParameterContext::Req req = CNastParameterContext::required ) const;

    virtual bool getParameter( char *parameter,            
                               const char *szName,
        		       CNastParameterContext::Req req = CNastParameterContext::required ) const;

    virtual CNastParameterContext* section( const char *szSection ) const;

    //-------------------------------------------------------------------------
    //                               Debug
    //-------------------------------------------------------------------------
    //  debugInfo    gibt Information ueber den Zustand des Objekts aus
    //  assertValid  testet das Objekt auf Integritaet
    //

    virtual void debugDump( CNastDumpContext &dmpContext ) const;
    virtual void assertValid() const;


private:
    //-------------------------------------------------------------------------
    //                               Hilfsfunktionen
    //-------------------------------------------------------------------------
    CNastParameterContextTaggedFile();  //  nur fuer internen Gebrauch
    const char* searchValue( const char *szName) const;

    //-------------------------------------------------------------------------
    //                            Membervariablen
    //-------------------------------------------------------------------------
    
    CNastArray<char *> m_arrTags;	//  Array mit den Bereichs und Variablennamen
    CNastArray<char *> m_arrValues;     //  Array mit den Werten

    //   Zuweisung nicht impl.
    const CNastParameterContextTaggedFile& operator=( const CNastParameterContextTaggedFile &o );
};
#endif // INCLUDE_NASTPARAMETERCONTEXTAGGEDFILE_H

