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

#ifndef liblldb_CommandObjectWatchpoint_h_
#define liblldb_CommandObjectWatchpoint_h_

// C Includes
// C++ Includes

// Other libraries and framework includes
// Project includes
#include "lldb/Interpreter/CommandObjectMultiword.h"
#include "lldb/Interpreter/Options.h"

namespace lldb_private {

//-------------------------------------------------------------------------
// CommandObjectMultiwordWatchpoint
//-------------------------------------------------------------------------

class CommandObjectMultiwordWatchpoint : public CommandObjectMultiword
{
public:
    CommandObjectMultiwordWatchpoint (CommandInterpreter &interpreter);

    virtual
    ~CommandObjectMultiwordWatchpoint ();
};

//-------------------------------------------------------------------------
// CommandObjectWatchpointList
//-------------------------------------------------------------------------

class CommandObjectWatchpointList : public CommandObject
{
public:
    CommandObjectWatchpointList (CommandInterpreter &interpreter);

    virtual
    ~CommandObjectWatchpointList ();

    virtual bool
    Execute (Args& command,
             CommandReturnObject &result);

    virtual Options *
    GetOptions ();

    class CommandOptions : public Options
    {
    public:

        CommandOptions (CommandInterpreter &interpreter);

        virtual
        ~CommandOptions ();

        virtual Error
        SetOptionValue (uint32_t option_idx, const char *option_arg);

        void
        OptionParsingStarting ();

        const OptionDefinition *
        GetDefinitions ();

        // Options table: Required for subclasses of Options.

        static OptionDefinition g_option_table[];

        // Instance variables to hold the values for command options.

        lldb::DescriptionLevel m_level;
    };

private:
    CommandOptions m_options;
};

//-------------------------------------------------------------------------
// CommandObjectWatchpointEnable
//-------------------------------------------------------------------------

class CommandObjectWatchpointEnable : public CommandObject
{
public:
    CommandObjectWatchpointEnable (CommandInterpreter &interpreter);

    virtual
    ~CommandObjectWatchpointEnable ();

    virtual bool
    Execute (Args& command,
             CommandReturnObject &result);

private:
};

//-------------------------------------------------------------------------
// CommandObjectWatchpointDisable
//-------------------------------------------------------------------------

class CommandObjectWatchpointDisable : public CommandObject
{
public:
    CommandObjectWatchpointDisable (CommandInterpreter &interpreter);

    virtual
    ~CommandObjectWatchpointDisable ();

    virtual bool
    Execute (Args& command,
             CommandReturnObject &result);

private:
};

//-------------------------------------------------------------------------
// CommandObjectWatchpointDelete
//-------------------------------------------------------------------------

class CommandObjectWatchpointDelete : public CommandObject
{
public:
    CommandObjectWatchpointDelete (CommandInterpreter &interpreter);

    virtual
    ~CommandObjectWatchpointDelete ();

    virtual bool
    Execute (Args& command,
             CommandReturnObject &result);

private:
};

//-------------------------------------------------------------------------
// CommandObjectWatchpointIgnore
//-------------------------------------------------------------------------

class CommandObjectWatchpointIgnore : public CommandObject
{
public:
    CommandObjectWatchpointIgnore (CommandInterpreter &interpreter);

    virtual
    ~CommandObjectWatchpointIgnore ();

    virtual bool
    Execute (Args& command,
             CommandReturnObject &result);

    virtual Options *
    GetOptions ();

    class CommandOptions : public Options
    {
    public:

        CommandOptions (CommandInterpreter &interpreter);

        virtual
        ~CommandOptions ();

        virtual Error
        SetOptionValue (uint32_t option_idx, const char *option_arg);

        void
        OptionParsingStarting ();

        const OptionDefinition *
        GetDefinitions ();

        // Options table: Required for subclasses of Options.

        static OptionDefinition g_option_table[];

        // Instance variables to hold the values for command options.

        uint32_t m_ignore_count;
    };

private:
    CommandOptions m_options;
};

//-------------------------------------------------------------------------
// CommandObjectWatchpointModify
//-------------------------------------------------------------------------

class CommandObjectWatchpointModify : public CommandObject
{
public:

    CommandObjectWatchpointModify (CommandInterpreter &interpreter);

    virtual
    ~CommandObjectWatchpointModify ();

    virtual bool
    Execute (Args& command,
             CommandReturnObject &result);

    virtual Options *
    GetOptions ();

    class CommandOptions : public Options
    {
    public:

        CommandOptions (CommandInterpreter &interpreter);

        virtual
        ~CommandOptions ();

        virtual Error
        SetOptionValue (uint32_t option_idx, const char *option_arg);

        void
        OptionParsingStarting ();

        const OptionDefinition*
        GetDefinitions ();

        // Options table: Required for subclasses of Options.

        static OptionDefinition g_option_table[];

        // Instance variables to hold the values for command options.

        std::string m_condition;
        bool m_condition_passed;
    };

private:
    CommandOptions m_options;
};

} // namespace lldb_private

#endif  // liblldb_CommandObjectWatchpoint_h_
