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

//++
// File:		MICmnLLDBDebugSessionInfoVarObj.h
//
// Overview:	CMICmnLLDBDebugSessionInfoVarObj interface.
//
// Environment:	Compilers:	Visual C++ 12.
//							gcc (Ubuntu/Linaro 4.8.1-10ubuntu9) 4.8.1
//				Libraries:	See MIReadmetxt. 
//
// Copyright:	None.
//--

#pragma once

// Third Party Headers:
#include <map>
#include <lldb/API/SBValue.h>

// In-house headers:
#include "MIUtilString.h"

//++ ============================================================================
// Details:	MI debug session variable object. The static functionality in *this
//			class manages a map container of *these variable objects.
// Gotchas:	None.
// Authors:	Illya Rudkin 24/03/2014.
// Changes:	None.
//--
class CMICmnLLDBDebugSessionInfoVarObj
{
// Enums:
public:
	//++ ----------------------------------------------------------------------
	// Details:	Enumeration of a variable type that is not a composite type
	//--
	enum varFormat_e
	{
		// CODETAG_SESSIONINFO_VARFORMAT_ENUM
		// *** Order is import here ***
		eVarFormat_Invalid = 0,
		eVarFormat_Binary,
		eVarFormat_Octal,
		eVarFormat_Decimal,
		eVarFormat_Hex,
		eVarFormat_Natural,
		eVarFormat_count	// Always last one
	};

	//++ ----------------------------------------------------------------------
	// Details:	Enumeration of a variable type by composite or internal type
	//--
	enum varType_e
	{
		eVarType_InValid = 0,
		eVarType_Composite,		// i.e. struct
		eVarType_Internal,		// i.e. int 
		eVarType_count			// Always last one
	};

// Statics:
public:
	static varFormat_e		GetVarFormatForString( const CMIUtilString & vrStrFormat );
	static varFormat_e		GetVarFormatForChar( const MIchar & vrcFormat );
	static CMIUtilString	GetValueStringFormatted( const lldb::SBValue & vrValue, const varFormat_e veVarFormat );
	static void				VarObjAdd( const CMICmnLLDBDebugSessionInfoVarObj & vrVarObj );
	static void				VarObjDelete( const CMIUtilString & vrVarName );
	static bool				VarObjGet( const CMIUtilString & vrVarName, CMICmnLLDBDebugSessionInfoVarObj & vrwVarObj );
	static void				VarObjUpdate( const CMICmnLLDBDebugSessionInfoVarObj & vrVarObj );
	static void				VarObjIdInc( void );
	static MIuint			VarObjIdGet( void );
	static void				VarObjIdResetToZero( void );
	static void				VarObjClear( void );

// Methods:
public:
	/* ctor */	CMICmnLLDBDebugSessionInfoVarObj( void );
	/* ctor */	CMICmnLLDBDebugSessionInfoVarObj( const CMIUtilString & vrStrNameReal, const CMIUtilString & vrStrName, const lldb::SBValue & vrValue );
	/* ctor */	CMICmnLLDBDebugSessionInfoVarObj( const CMIUtilString & vrStrNameReal, const CMIUtilString & vrStrName, const lldb::SBValue & vrValue, const CMIUtilString & vrStrVarObjParentName );
	/* ctor */	CMICmnLLDBDebugSessionInfoVarObj( const CMICmnLLDBDebugSessionInfoVarObj & vrOther );
	/* ctor */	CMICmnLLDBDebugSessionInfoVarObj( CMICmnLLDBDebugSessionInfoVarObj & vrOther );
	//
	CMICmnLLDBDebugSessionInfoVarObj & operator= ( const CMICmnLLDBDebugSessionInfoVarObj & vrOther );
	//
	const CMIUtilString &	GetName( void ) const;
	const CMIUtilString &	GetNameReal( void ) const;
	const CMIUtilString &	GetValueFormatted( void ) const;
	const lldb::SBValue &	GetValue( void ) const;
	varType_e				GetType( void ) const;
	bool					SetVarFormat( const varFormat_e veVarFormat );
	const CMIUtilString &	GetVarParentName( void ) const;
	void					UpdateValue( void );

// Overridden:
public:
	// From CMICmnBase
	/* dtor */ virtual ~CMICmnLLDBDebugSessionInfoVarObj( void );

// Typedefs:
private:
	typedef std::map< CMIUtilString, CMICmnLLDBDebugSessionInfoVarObj >		MapKeyToVarObj_t;			
	typedef std::pair< CMIUtilString, CMICmnLLDBDebugSessionInfoVarObj >	MapPairKeyToVarObj_t;

// Statics:
private:
	static CMIUtilString 	GetStringFormatted( const MIuint64 vnValue, const MIchar * vpStrValueNatural, varFormat_e veVarFormat );
	
// Methods:
private:
	bool	CopyOther( const CMICmnLLDBDebugSessionInfoVarObj & vrOther );

// Attributes:
private:
	static const MIchar *	ms_aVarFormatStrings[];
	static const MIchar *	ms_aVarFormatChars[];
	static MapKeyToVarObj_t	ms_mapVarIdToVarObj;
	static MIuint			ms_nVarUniqueId;
	//
	// *** Upate the copy constructors and assignment operator ***
	varFormat_e		m_eVarFormat;
	varType_e		m_eVarType;
	CMIUtilString	m_strName;
	lldb::SBValue	m_SBValue;
	CMIUtilString	m_strNameReal;
	CMIUtilString	m_strFormattedValue;
	CMIUtilString	m_strVarObjParentName;
	// *** Upate the copy constructors and assignment operator ***
};
