//===-- MIUtilMapIdToVariant.h ----------------------------------*- C++ -*-===// // // The LLVM Compiler Infrastructure // // This file is distributed under the University of Illinois Open Source // License. See LICENSE.TXT for details. // //===----------------------------------------------------------------------===// #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 a variant wrapper) // objects by ID. //-- class CMIUtilMapIdToVariant : public CMICmnBase { // Methods: public: /* ctor */ CMIUtilMapIdToVariant(); template bool Add(const CMIUtilString &vId, const T &vData); void Clear(); template bool Get(const CMIUtilString &vId, T &vrwData, bool &vrwbFound) const; bool HaveAlready(const CMIUtilString &vId) const; bool IsEmpty() const; bool Remove(const CMIUtilString &vId); // Overridden: public: // From CMICmnBase /* dtor */ ~CMIUtilMapIdToVariant() override; // Typedefs: private: typedef std::map MapKeyToVariantValue_t; typedef std::pair 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 - Function succeeded. // MIstatus::failure - Function failed. // Throws: None. //-- template 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(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 - Function succeeded. // MIstatus::failure - Function failed. // Throws: None. //-- template 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(); if (pDataObj != nullptr) { vrwbFound = true; vrwData = *pDataObj; return MIstatus::success; } else { SetErrorDescription(MIRSRC(IDS_VARIANT_ERR_USED_BASECLASS)); return MIstatus::failure; } } return MIstatus::success; }