• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2023 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #include "mdrecord.h"
17 
18 namespace MDGen {
19 constexpr unsigned int kInValidStrIdx = UINT_MAX;
20 
SetContent(const StrInfo curInfo,const std::set<unsigned int> & childTySet)21 bool DefTyElement::SetContent(const StrInfo curInfo, const std::set<unsigned int> &childTySet)
22 {
23     if (!childTySet.count(curInfo.idx)) {
24         return false;
25     }
26     elementIdx = curInfo.idx;
27     return true;
28 }
29 
SetContent(const StrInfo curInfo,const MDClass & parentClass)30 bool DefObjElement::SetContent(const StrInfo curInfo, const MDClass &parentClass)
31 {
32     if (!parentClass.IsClassMember(curInfo.idx)) {
33         return false;
34     }
35     elementIdx = curInfo.idx;
36     return true;
37 }
38 
GetOneMDElement(size_t index) const39 const MDElement *MDObject::GetOneMDElement(size_t index) const
40 {
41     CHECK_FATAL(index < mdElements.size(), "Array boundary check failed");
42     return mdElements[index];
43 }
44 
GetOneMDObject(size_t index) const45 const MDObject &MDClass::GetOneMDObject(size_t index) const
46 {
47     CHECK_FATAL(index < mdObjects.size(), "Array boundary check failed");
48     return mdObjects[index];
49 }
50 
AddClassMember(MDObject inputObj)51 void MDClass::AddClassMember(MDObject inputObj)
52 {
53     mdObjects.emplace_back(inputObj);
54     (void)childObjNames.insert(inputObj.GetIdx());
55 }
56 
IsClassMember(unsigned int curIdx) const57 bool MDClass::IsClassMember(unsigned int curIdx) const
58 {
59     return childObjNames.count(curIdx);
60 }
61 
BuildFormalTypes(unsigned int memberIdx,bool isVec)62 void MDClass::BuildFormalTypes(unsigned int memberIdx, bool isVec)
63 {
64     formalTypes.emplace_back(std::make_pair(memberIdx, isVec));
65 }
66 
IsValidStructEle(RecordType curTy) const67 bool MDClass::IsValidStructEle(RecordType curTy) const
68 {
69     return (curTy == kTypeName || curTy == kClassName || curTy == kIntType || curTy == kStringType);
70 }
71 
CreateStrInTable(const std::string & inStr,RecordType curTy)72 unsigned int MDClassRange::CreateStrInTable(const std::string &inStr, RecordType curTy)
73 {
74     unsigned int result = kInValidStrIdx;
75     StrInfo curInfo(totalStr, curTy);
76     auto ret = stringHashTable.insert(std::make_pair(inStr, curInfo));
77     if (ret.second) {
78         unsigned int temp = totalStr;
79         stringTable.emplace_back(inStr);
80         ++totalStr;
81         return temp;
82     }
83     return result;
84 }
85 
GetStrInTable(const std::string & inStr)86 StrInfo MDClassRange::GetStrInTable(const std::string &inStr)
87 {
88     auto ret = stringHashTable.find(inStr);
89     StrInfo inValidInfo(UINT_MAX, kUndefinedStr);
90     return (ret != stringHashTable.end()) ? ret->second : inValidInfo;
91 }
92 
GetStrTyByIdx(size_t curIdx)93 RecordType MDClassRange::GetStrTyByIdx(size_t curIdx)
94 {
95     CHECK_FATAL(curIdx < stringTable.size(), "Array boundary check failed");
96     return GetStrInTable(stringTable[curIdx]).sType;
97 }
98 
GetStrByIdx(size_t curIdx)99 const std::string &MDClassRange::GetStrByIdx(size_t curIdx)
100 {
101     CHECK_FATAL(curIdx < stringTable.size(), "Array boundary check failed");
102     return stringTable[curIdx];
103 }
104 
ModifyStrTyInTable(const std::string & inStr,RecordType newTy)105 void MDClassRange::ModifyStrTyInTable(const std::string &inStr, RecordType newTy)
106 {
107     auto ret = stringHashTable.find(inStr);
108     CHECK_FATAL(ret != stringHashTable.end(), "find string failed!");
109     ret->second.sType = newTy;
110 }
111 
AddDefinedType(unsigned int typesName,std::set<unsigned int> typesSet)112 void MDClassRange::AddDefinedType(unsigned int typesName, std::set<unsigned int> typesSet)
113 {
114     (void)definedTypes.insert(std::make_pair(typesName, typesSet));
115 }
116 
AddMDClass(MDClass curClass)117 void MDClassRange::AddMDClass(MDClass curClass)
118 {
119     (void)allClasses.insert(std::make_pair(curClass.GetClassIdx(), curClass));
120 }
121 
FillMDClass(unsigned int givenIdx,const MDObject & insertObj)122 void MDClassRange::FillMDClass(unsigned int givenIdx, const MDObject &insertObj)
123 {
124     auto ret = allClasses.find(givenIdx);
125     CHECK_FATAL(ret != allClasses.end(), "Cannot achieve target MD Class");
126     ret->second.AddClassMember(insertObj);
127 }
128 
GetOneMDClass(unsigned int givenIdx)129 MDClass MDClassRange::GetOneMDClass(unsigned int givenIdx)
130 {
131     auto ret = allClasses.find(givenIdx);
132     CHECK_FATAL(ret != allClasses.end(), "Cannot achieve target MD Class");
133     return ret->second;
134 }
135 
GetOneSpcType(unsigned int givenTyIdx)136 std::set<unsigned int> MDClassRange::GetOneSpcType(unsigned int givenTyIdx)
137 {
138     auto ret = definedTypes.find(givenTyIdx);
139     CHECK_FATAL(ret != definedTypes.end(), "Cannot achieve a defined type");
140     return ret->second;
141 }
142 } /* namespace MDGen */
143