//===-- Language.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_Language_h_
#define liblldb_Language_h_

#include "lldb/lldb-private.h"

namespace lldb_private {

//----------------------------------------------------------------------
/// @class Language Language.h "lldb/Core/Language.h"
/// @brief Encapsulates the programming language for an lldb object.
///
/// Languages are represented by an enumeration value.
///
/// The enumeration values used when describing the programming language
/// are the same values as the latest DWARF specification.
//----------------------------------------------------------------------
class Language
{
public:
    //------------------------------------------------------------------
    /// Construct with optional language enumeration.
    //------------------------------------------------------------------
    Language(lldb::LanguageType language = lldb::eLanguageTypeUnknown);

    //------------------------------------------------------------------
    /// Destructor.
    ///
    /// The destructor is virtual in case this class is subclassed.
    //------------------------------------------------------------------
    virtual
    ~Language();

    //------------------------------------------------------------------
    /// Get the language value as a NULL termianted C string.
    ///
    /// @return
    ///     The C string representation of the language. The returned
    ///     string does not need to be freed as it comes from constant
    ///     strings. NULL can be returned when the language is set to
    ///     a value that doesn't match of of the lldb::LanguageType
    ///     enumerations.
    //------------------------------------------------------------------
    const char *
    AsCString (lldb::DescriptionLevel level = lldb::eDescriptionLevelBrief) const;

    void
    Clear();

    void
    GetDescription (Stream *s, lldb::DescriptionLevel level) const;

    //------------------------------------------------------------------
    /// Dump the language value to the stream \a s.
    ///
    /// @param[in] s
    ///     The stream to which to dump the language description.
    //------------------------------------------------------------------
    void
    Dump(Stream *s) const;

    //------------------------------------------------------------------
    /// Get accessor for the language.
    ///
    /// @return
    ///     The enumeration value that describes the programming
    ///     language that an object is associated with.
    //------------------------------------------------------------------
    lldb::LanguageType
    GetLanguage() const;

    //------------------------------------------------------------------
    /// Set accessor for the language.
    ///
    /// @param[in] language
    ///     The new enumeration value that describes the programming
    ///     language that an object is associated with.
    //------------------------------------------------------------------
    void
    SetLanguage(lldb::LanguageType language);

    //------------------------------------------------------------------
    /// Set accessor for the language.
    ///
    /// @param[in] language_cstr
    ///     The language name as a C string.
    //------------------------------------------------------------------
    bool
    SetLanguageFromCString(const char *language_cstr);


protected:
    //------------------------------------------------------------------
    // Member variables
    //------------------------------------------------------------------
    lldb::LanguageType m_language; ///< The programming language enumeration value.
                                   ///< The enumeration values are the same as the
                                   ///< latest DWARF specification.
};

//--------------------------------------------------------------
/// Stream the language enumeration as a string object to a
/// Stream.
//--------------------------------------------------------------
Stream& operator << (Stream& s, const Language& language);

} // namespace lldb_private

#endif  // liblldb_Language_h_
