//===-- 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 // 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; }