//===-- ValueObject.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_ValueObject_h_
#define liblldb_ValueObject_h_

// C Includes
// C++ Includes
#include <map>
#include <vector>
// Other libraries and framework includes
// Project includes

#include "lldb/lldb-private.h"
#include "lldb/Core/DataExtractor.h"
#include "lldb/Core/Error.h"
#include "lldb/Core/Flags.h"
#include "lldb/Core/ConstString.h"
#include "lldb/Core/UserID.h"
#include "lldb/Core/Value.h"
#include "lldb/Target/ExecutionContextScope.h"

namespace lldb_private {

class ValueObject : public UserID
{
public:
    friend class ValueObjectList;

    virtual ~ValueObject();

    //------------------------------------------------------------------
    // Sublasses must implement the functions below.
    //------------------------------------------------------------------
    virtual size_t
    GetByteSize() = 0;

    virtual clang::ASTContext *
    GetClangAST () = 0;

    virtual lldb::clang_type_t
    GetClangType () = 0;

    virtual lldb::ValueType
    GetValueType() const = 0;

protected:
    // Should only be called by ValueObject::GetNumChildren()
    virtual uint32_t
    CalculateNumChildren() = 0;

public:
    virtual ConstString
    GetTypeName() = 0;

    virtual lldb::LanguageType
    GetObjectRuntimeLanguage();
    
    virtual void
    UpdateValue (ExecutionContextScope *exe_scope) = 0;

    //------------------------------------------------------------------
    // Sublasses can implement the functions below if they need to.
    //------------------------------------------------------------------
protected:
    // Should only be called by ValueObject::GetChildAtIndex()
    virtual lldb::ValueObjectSP
    CreateChildAtIndex (uint32_t idx, bool synthetic_array_member, int32_t synthetic_index);

public:

    virtual bool
    IsPointerType ();

    virtual bool
    IsPointerOrReferenceType ();

    virtual bool
    IsBaseClass ()
    {
        return false;
    }
    
    virtual bool
    IsDereferenceOfParent ()
    {
        return false;
    }
    
    virtual bool
    GetBaseClassPath (Stream &s);

    virtual void
    GetExpressionPath (Stream &s, bool qualify_cxx_base_classes);

    virtual bool
    IsInScope (StackFrame *frame)
    {
        return true;
    }

    virtual off_t
    GetByteOffset()
    {
        return 0;
    }

    virtual uint32_t
    GetBitfieldBitSize()
    {
        return 0;
    }

    virtual uint32_t
    GetBitfieldBitOffset()
    {
        return 0;
    }
    
    virtual bool
    SetClangAST (clang::ASTContext *ast)
    {
        return false;
    }

    virtual const char *
    GetValueAsCString (ExecutionContextScope *exe_scope);

    virtual bool
    SetValueFromCString (ExecutionContextScope *exe_scope, const char *value_str);

    //------------------------------------------------------------------
    // The functions below should NOT be modified by sublasses
    //------------------------------------------------------------------
    const Error &
    GetError() const;

    const ConstString &
    GetName() const;

    lldb::ValueObjectSP
    GetChildAtIndex (uint32_t idx, bool can_create);

    lldb::ValueObjectSP
    GetChildMemberWithName (const ConstString &name, bool can_create);

    uint32_t
    GetIndexOfChildWithName (const ConstString &name);

    uint32_t
    GetNumChildren ();

    const Value &
    GetValue() const;

    Value &
    GetValue();

    bool
    ResolveValue (ExecutionContextScope *exe_scope, Scalar &scalar);

    const char *
    GetLocationAsCString (ExecutionContextScope *exe_scope);

    const char *
    GetSummaryAsCString (ExecutionContextScope *exe_scope);
    
    const char *
    GetObjectDescription (ExecutionContextScope *exe_scope);


    lldb::user_id_t
    GetUpdateID() const;

    bool
    GetValueIsValid () const;

    bool
    GetValueDidChange (ExecutionContextScope *exe_scope);

    bool
    UpdateValueIfNeeded (ExecutionContextScope *exe_scope);

    const DataExtractor &
    GetDataExtractor () const;

    DataExtractor &
    GetDataExtractor ();

    bool
    Write ();

    void
    AddSyntheticChild (const ConstString &key,
                       lldb::ValueObjectSP& valobj_sp);

    lldb::ValueObjectSP
    GetSyntheticChild (const ConstString &key) const;

    lldb::ValueObjectSP
    GetSyntheticArrayMemberFromPointer (int32_t index, bool can_create);
    
    lldb::ValueObjectSP
    GetDynamicValue ()
    {
        return m_dynamic_value_sp;
    }
    
    virtual lldb::ValueObjectSP
    CreateConstantValue (ExecutionContextScope *exe_scope, const ConstString &name);

    virtual lldb::ValueObjectSP
    Dereference (Error &error);
    
    virtual lldb::ValueObjectSP
    AddressOf (Error &error);

    // The backing bits of this value object were updated, clear any value
    // values, summaries or descriptions so we refetch them.
    virtual void
    ValueUpdated ()
    {
        m_value_str.clear();
        m_summary_str.clear();
        m_object_desc_str.clear();
    }

    bool
    SetDynamicValue ();

    static void
    DumpValueObject (Stream &s,
                     ExecutionContextScope *exe_scope,
                     ValueObject *valobj,
                     const char *root_valobj_name,
                     uint32_t ptr_depth,
                     uint32_t curr_depth,
                     uint32_t max_depth,
                     bool show_types,
                     bool show_location,
                     bool use_objc,
                     bool scope_already_checked,
                     bool flat_output);

    bool
    GetIsConstant () const
    {
        return m_update_id == LLDB_INVALID_UID;
    }
    
    void
    SetIsConstant ()
    {
        m_update_id = LLDB_INVALID_UID;
    }

    lldb::Format
    GetFormat () const
    {
        return m_format;
    }
    
    void
    SetFormat (lldb::Format format)
    {
        if (format != m_format)
            m_value_str.clear();
        m_format = format;
    }

    ValueObject *
    GetParent()
    {
        return m_parent;
    }

    const ValueObject *
    GetParent() const
    {
        return m_parent;
    }

    ValueObject *
    GetNonBaseClassParent();

    void
    SetPointersPointToLoadAddrs (bool b)
    {
        m_pointers_point_to_load_addrs = b;
    }

protected:
    //------------------------------------------------------------------
    // Classes that inherit from ValueObject can see and modify these
    //------------------------------------------------------------------
    ValueObject*        m_parent;       // The parent value object, or NULL if this has no parent
    lldb::user_id_t     m_update_id;    // An integer that specifies the update number for this value in
                                        // this value object list. If this value object is asked to update itself
                                        // it will first check if the update ID match the value object
                                        // list update number. If the update numbers match, no update is
                                        // needed, if it does not match, this value object should update its
                                        // the next time it is asked.
    ConstString         m_name;         // The name of this object
    DataExtractor       m_data;         // A data extractor that can be used to extract the value.
    Value               m_value;
    Error               m_error;        // An error object that can describe any errors that occur when updating values.
    std::string         m_value_str;    // Cached value string that will get cleared if/when the value is updated.
    std::string         m_old_value_str;// Cached old value string from the last time the value was gotten
    std::string         m_location_str; // Cached location string that will get cleared if/when the value is updated.
    std::string         m_summary_str;  // Cached summary string that will get cleared if/when the value is updated.
    std::string         m_object_desc_str; // Cached result of the "object printer".  This differs from the summary
                                              // in that the summary is consed up by us, the object_desc_string is builtin.
    std::vector<lldb::ValueObjectSP> m_children;
    std::map<ConstString, lldb::ValueObjectSP> m_synthetic_children;
    lldb::ValueObjectSP m_dynamic_value_sp;
    lldb::Format        m_format;
    bool                m_value_is_valid:1,
                        m_value_did_change:1,
                        m_children_count_valid:1,
                        m_old_value_valid:1,
                        m_pointers_point_to_load_addrs:1,
                        m_is_deref_of_parent:1;
    
    friend class CommandObjectExpression;
    friend class ClangExpressionVariable;
    friend class Target;
    //------------------------------------------------------------------
    // Constructors and Destructors
    //------------------------------------------------------------------
    ValueObject (ValueObject *parent);

    void
    SetName (const char *name);

    void
    SetName (const ConstString &name);

    void
    SetNumChildren (uint32_t num_children);

    void
    SetValueDidChange (bool value_changed);

    void
    SetValueIsValid (bool valid);


    lldb::addr_t
    GetPointerValue (lldb::AddressType &address_type, 
                     bool scalar_is_load_address);

    lldb::addr_t
    GetAddressOf (lldb::AddressType &address_type, 
                  bool scalar_is_load_address);
private:
    //------------------------------------------------------------------
    // For ValueObject only
    //------------------------------------------------------------------
    DISALLOW_COPY_AND_ASSIGN (ValueObject);

};

} // namespace lldb_private

#endif  // liblldb_ValueObject_h_
