/* libzz
 *
 * This program is distributed under the GNU General Public License, version 2.
 * A copy of this license is included with this source.
 *
 * Copyright 2000-2006, Toni Thomsson <toni@tonjac.org> 
*/

#ifndef zz_arguments_h
#define zz_arguments_h

#include <zz_string.h>
#include <zz_exception.h>
#include <map>
#include <zz_export.h>
#include <zz_parameter_map.h>

#ifdef _WIN32
    using namespace std;
    #pragma warning(disable: 4786) // Debugsymbols truncated
    #pragma warning(disable: 4251) // DLL-interface missing for private map members
#endif

/**
    Argument parser

    @author Toni Thomsson, toni@tonjac.org
*/
    class ZZ_API CzzArguments : public CzzParameterMap
{
public:

    /**
        Parses a traditional C-argument-list

        @param argc       Number of arguments
        @param argv       Pointer to a vector with the arguments
        @param delmiter   Charachter used as a argument switch
        @param minargs    Minimum number of expected arguments
    */
    CzzArguments( int argc,
                    char** argv,
                    char delmiter,
                    int minargs );

    /**
        Copy constructor

        @param  args    Object to be copied
    */
    CzzArguments( CzzArguments& args );
    
    /**
        Default constructor
    */
    CzzArguments( void );

    virtual ~CzzArguments();

    /**
        Number of arguments in the list
    */
    int Count( void ) { return m_Count; };

    /**
        Get argument by position

        @param pos  0 based index
    */
    CzzString Get( int pos );

    /**
        Get argument by name
        
        @param  name Name
    */
    CzzString Get( const CzzString& name );

    /**
        Same as Get
    */
    CzzString operator[]( int pos );
    /**
        Same as Get
    */
    CzzString operator[]( const CzzString& name );

    /** Delmiter char */
    char getDelmiter( void ) { return m_Delmiter; };

    /** Minimum number of expected arguments */
    int getMinArgs( void ) { return m_MinArgs; };

    /** Argument map  (pos-index) */
    map<int, CzzString > getPosList( void ) { return m_ArgsByPos; };

    /** Argument map (name-index) */
    map<CzzString, CzzString > getNameList( void ) { return m_ArgsByName; };

    
private:

    int m_Count;
    char m_Delmiter;
    int m_MinArgs;
    map<int, CzzString > m_ArgsByPos;
    map<CzzString, CzzString > m_ArgsByName;
};

#endif // zz_arguments_h