1 //===-- MIUtilMapIdToVariant.h ----------------------------------*- C++ -*-===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
12 // Third party headers:
16 #include "MICmnBase.h"
17 #include "MICmnResources.h"
18 #include "MIUtilString.h"
19 #include "MIUtilVariant.h"
22 //============================================================================
23 // Details: MI common code utility class. Map type container that hold general
24 // object types (by being a variant wrapper)
27 class CMIUtilMapIdToVariant : public CMICmnBase {
30 /* ctor */ CMIUtilMapIdToVariant();
32 template <typename T> bool Add(const CMIUtilString &vId, const T &vData);
35 bool Get(const CMIUtilString &vId, T &vrwData, bool &vrwbFound) const;
36 bool HaveAlready(const CMIUtilString &vId) const;
38 bool Remove(const CMIUtilString &vId);
43 /* dtor */ ~CMIUtilMapIdToVariant() override;
47 typedef std::map<CMIUtilString, CMIUtilVariant> MapKeyToVariantValue_t;
48 typedef std::pair<CMIUtilString, CMIUtilVariant> MapPairKeyToVariantValue_t;
52 bool IsValid(const CMIUtilString &vId) const;
55 MapKeyToVariantValue_t m_mapKeyToVariantValue;
59 //------------------------------------------------------------------------------------
60 // Details: Add to *this container a data object of general type identified by
62 // If the data with that ID already exists in the container it is
64 // the new data specified.
66 // Args: T - The data object's variable type.
67 // vId - (R) Unique ID i.e. GUID.
68 // vData - (R) The general data object to be stored of some type.
69 // Return: MIstatus::success - Function succeeded.
70 // MIstatus::failure - Function failed.
74 bool CMIUtilMapIdToVariant::Add(const CMIUtilString &vId, const T &vData) {
76 SetErrorDescription(CMIUtilString::Format(
77 MIRSRC(IDS_VARIANT_ERR_MAP_KEY_INVALID), vId.c_str()));
78 return MIstatus::failure;
81 const bool bOk = HaveAlready(vId) ? Remove(vId) : MIstatus::success;
85 MapPairKeyToVariantValue_t pr(vId, data);
86 m_mapKeyToVariantValue.insert(pr);
93 //------------------------------------------------------------------------------------
94 // Details: Retrieve a data object from *this container identified by the
97 // Args: T - The data object's variable type.
98 // vId - (R) Unique ID i.e. GUID.
99 // vrwData - (W) Copy of the data object held.
100 // vrwbFound - (W) True = data found, false = data not found.
101 // Return: MIstatus::success - Function succeeded.
102 // MIstatus::failure - Function failed.
105 template <typename T>
106 bool CMIUtilMapIdToVariant::Get(const CMIUtilString &vId, T &vrwData,
107 bool &vrwbFound) const {
111 SetErrorDescription(CMIUtilString::Format(
112 MIRSRC(IDS_VARIANT_ERR_MAP_KEY_INVALID), vId.c_str()));
113 return MIstatus::failure;
116 const MapKeyToVariantValue_t::const_iterator it =
117 m_mapKeyToVariantValue.find(vId);
118 if (it != m_mapKeyToVariantValue.end()) {
119 const CMIUtilVariant &rData = (*it).second;
120 const T *pDataObj = rData.Get<T>();
121 if (pDataObj != nullptr) {
124 return MIstatus::success;
126 SetErrorDescription(MIRSRC(IDS_VARIANT_ERR_USED_BASECLASS));
127 return MIstatus::failure;
131 return MIstatus::success;