aboutsummaryrefslogtreecommitdiff
path: root/tools/lldb-mi/MIUtilMapIdToVariant.h
diff options
context:
space:
mode:
Diffstat (limited to 'tools/lldb-mi/MIUtilMapIdToVariant.h')
-rw-r--r--tools/lldb-mi/MIUtilMapIdToVariant.h148
1 files changed, 148 insertions, 0 deletions
diff --git a/tools/lldb-mi/MIUtilMapIdToVariant.h b/tools/lldb-mi/MIUtilMapIdToVariant.h
new file mode 100644
index 000000000000..9570bfa0306f
--- /dev/null
+++ b/tools/lldb-mi/MIUtilMapIdToVariant.h
@@ -0,0 +1,148 @@
+//===-- MIUtilMapIdToVariant.h ----------------------------------*- C++ -*-===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+//++
+// File: MIUtilMapIdToVariant.h
+//
+// Overview: CMIUtilMapIdToVariant 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>
+
+// In-house headers:
+#include "MICmnBase.h"
+#include "MICmnResources.h"
+#include "MIUtilString.h"
+#include "MIUtilVariant.h"
+
+//++ ============================================================================
+// Details: MI common code utility class. Map type container that hold general
+// object types (by being wrappin an variant wrapper)
+// objects by ID.
+// Gotchas: None.
+// Authors: Illya Rudkin 19/06/2014.
+// Changes: None.
+//--
+class CMIUtilMapIdToVariant : public CMICmnBase
+{
+// Methods:
+public:
+ /* ctor */ CMIUtilMapIdToVariant( void );
+
+ template< typename T >
+ bool Add( const CMIUtilString & vId, const T & vData );
+ void Clear( void );
+ template< typename T >
+ bool Get( const CMIUtilString & vId, T & vrwData, bool & vrwbFound ) const;
+ bool HaveAlready( const CMIUtilString & vId ) const;
+ bool IsEmpty( void ) const;
+ bool Remove( const CMIUtilString & vId );
+
+// Overridden:
+public:
+ // From CMICmnBase
+ /* dtor */ virtual ~CMIUtilMapIdToVariant( void );
+
+// Typdefs:
+private:
+ typedef std::map< CMIUtilString, CMIUtilVariant > MapKeyToVariantValue_t;
+ typedef std::pair< CMIUtilString, CMIUtilVariant > MapPairKeyToVariantValue_t;
+
+// Methods:
+private:
+ bool IsValid( const CMIUtilString & vId ) const;
+
+// Attributes:
+ MapKeyToVariantValue_t m_mapKeyToVariantValue;
+};
+
+//++ ------------------------------------------------------------------------------------
+// Details: Add to *this container a data object of general type identified by an ID.
+// If the data with that ID already exists in the container it is replace with
+// the new data specified.
+// Type: Method.
+// Args: T - The data object's variable type.
+// vId - (R) Unique ID i.e. GUID.
+// vData - (R) The general data object to be stored of some type.
+// Return: MIstatus::success - Functional succeeded.
+// MIstatus::failure - Functional failed.
+// Throws: None.
+//--
+template< typename T >
+bool CMIUtilMapIdToVariant::Add( const CMIUtilString & vId, const T & vData )
+{
+ if( !IsValid( vId ) )
+ {
+ SetErrorDescription( CMIUtilString::Format( MIRSRC( IDS_VARIANT_ERR_MAP_KEY_INVALID ), vId.c_str() ) );
+ return MIstatus::failure;
+ }
+
+ const bool bOk = HaveAlready( vId ) ? Remove( vId ) : MIstatus::success;
+ if( bOk )
+ {
+ CMIUtilVariant data;
+ data.Set< T >( vData );
+ MapPairKeyToVariantValue_t pr( vId, data );
+ m_mapKeyToVariantValue.insert( pr );
+ }
+
+ return bOk;
+}
+
+//++ ------------------------------------------------------------------------------------
+// Details: Retrieve a data object from *this container identified by the specified ID.
+// Type: Method.
+// Args: T - The data object's variable type.
+// vId - (R) Unique ID i.e. GUID.
+// vrwData - (W) Copy of the data object held.
+// vrwbFound - (W) True = data found, false = data not found.
+// Return: MIstatus::success - Functional succeeded.
+// MIstatus::failure - Functional failed.
+// Throws: None.
+//--
+template< typename T >
+bool CMIUtilMapIdToVariant::Get( const CMIUtilString & vId, T & vrwData, bool & vrwbFound ) const
+{
+ vrwbFound = false;
+
+ if( !IsValid( vId ) )
+ {
+ SetErrorDescription( CMIUtilString::Format( MIRSRC( IDS_VARIANT_ERR_MAP_KEY_INVALID ), vId.c_str() ) );
+ return MIstatus::failure;
+ }
+
+ const MapKeyToVariantValue_t::const_iterator it = m_mapKeyToVariantValue.find( vId );
+ if( it != m_mapKeyToVariantValue.end() )
+ {
+ const CMIUtilVariant & rData = (*it).second;
+ const T * pDataObj = rData.Get< T >();
+ if( pDataObj != nullptr )
+ {
+ vrwbFound = true;
+ vrwData = *pDataObj;
+ return MIstatus::success;
+ }
+ else
+ {
+ SetErrorDescription( MIRSRC( IDS_VARIANT_ERR_USED_BASECLASS ) );
+ return MIstatus::failure;
+ }
+ }
+
+ return MIstatus::success;
+}