//===-- MICmdArgValBase.h ---------------------------------------*- C++ -*-===//
//
//                     The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//

#pragma once

// C Includes
// C++ Includes
// Other libraries and framework includes
// Project includes
#include "MIUtilString.h"
#include "MICmdArgSet.h"

//++ ============================================================================
// Details: MI common code class. Command argument base class. Arguments objects
//          needing specialization derived from *this class. An argument knows
//          what type of argument it is and how it is to interpret the options
//          (context) string to find and validate a matching argument and so
//          extract a value from it.
//          Argument objects are added to the CMICmdArgSet container object.
//          Once added the container they belong to that contain and will be
//          deleted when the container goes out of scope. Allocate argument
//          objects on the heap and pass in to the Add().
//          Note the code is written such that a command will produce an error
//          should it be presented with arguments or options it does not understand.
//          A command can recognise an option or argument then ignore if it
//          wishes (a warning is sent to the MI's Log file). This is so it is
//          hardwired to fail and catch arguments or options that presented by
//          different driver clients.
//          Based on the Interpreter pattern.
//--
class CMICmdArgValBase : public CMICmdArgSet::IArg
{
    // Methods:
  public:
    CMICmdArgValBase();
    CMICmdArgValBase(const CMIUtilString &vrArgName, const bool vbMandatory, const bool vbHandleByCmd);

    // Overrideable:
    ~CMICmdArgValBase() override = default;

    // Overridden:
    // From CMICmdArgSet::IArg
    bool GetFound() const override;
    bool GetIsHandledByCmd() const override;
    bool GetIsMandatory() const override;
    bool GetIsMissingOptions() const override;
    const CMIUtilString &GetName() const override;
    bool GetValid() const override;
    bool Validate(CMICmdArgContext &vwArgContext) override;

    // Attributes:
  protected:
    bool m_bFound;     // True = yes found in arguments options text, false = not found
    bool m_bValid;     // True = yes argument parsed and valid, false = not valid
    bool m_bMandatory; // True = yes arg must be present, false = optional argument
    CMIUtilString m_strArgName;
    bool m_bHandled;          // True = Command processes *this option, false = not handled
    bool m_bIsMissingOptions; // True = Command needs more information, false = ok
};

//++ ============================================================================
// Details: MI common code class. Templated command argument base class.
//--
template <class T> class CMICmdArgValBaseTemplate : public CMICmdArgValBase
{
    // Methods:
  public:
    CMICmdArgValBaseTemplate() = default;
    CMICmdArgValBaseTemplate(const CMIUtilString &vrArgName, const bool vbMandatory, const bool vbHandleByCmd);
    //
    const T &GetValue() const;

    // Overrideable:
    ~CMICmdArgValBaseTemplate() override = default;

    // Attributes:
  protected:
    T m_argValue;
};

//++ ------------------------------------------------------------------------------------
// Details: CMICmdArgValBaseTemplate constructor.
// Type:    Method.
// Args:    vrArgName       - (R) Argument's name to search by.
//          vbMandatory     - (R) True = Yes must be present, false = optional argument.
//          vbHandleByCmd   - (R) True = Command processes *this option, false = not handled.
// Return:  None.
// Throws:  None.
//--
template <class T>
CMICmdArgValBaseTemplate<T>::CMICmdArgValBaseTemplate(const CMIUtilString &vrArgName, const bool vbMandatory, const bool vbHandleByCmd)
    : CMICmdArgValBase(vrArgName, vbMandatory, vbHandleByCmd)
{
}

//++ ------------------------------------------------------------------------------------
// Details: Retrieve the value the argument parsed from the command's argument / options
//          text string.
// Type:    Method.
// Args:    None.
// Return:  Template type & - The arg value of *this object.
// Throws:  None.
//--
template <class T>
const T &
CMICmdArgValBaseTemplate<T>::GetValue() const
{
    return m_argValue;
}
