• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /**
2  * Copyright 2021-2024 Huawei Technologies Co., Ltd
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 #ifndef MINDSPORE_INCLUDE_API_DUAL_ABI_HELPER_H_
17 #define MINDSPORE_INCLUDE_API_DUAL_ABI_HELPER_H_
18 
19 #include <algorithm>
20 #include <iterator>
21 #include <map>
22 #include <memory>
23 #include <string>
24 #include <set>
25 #include <unordered_map>
26 #include <utility>
27 #include <vector>
28 
29 namespace mindspore {
30 using VecChar = std::vector<char>;
StringToChar(const std::string & s)31 inline std::vector<char> StringToChar(const std::string &s) {
32   if (s.empty()) {
33     const auto empty = std::vector<char>();
34     return empty;
35   }
36   return std::vector<char>(s.begin(), s.end());
37 }
38 
CharToString(const std::vector<char> & c)39 inline std::string CharToString(const std::vector<char> &c) {
40   if (c.empty()) {
41     const auto empty = "";
42     return empty;
43   }
44   return std::string(c.begin(), c.end());
45 }
46 
PairStringToChar(const std::pair<std::string,int32_t> & s)47 inline std::pair<std::vector<char>, int32_t> PairStringToChar(const std::pair<std::string, int32_t> &s) {
48   return std::pair<std::vector<char>, int32_t>(std::vector<char>(s.first.begin(), s.first.end()), s.second);
49 }
50 
PairCharToString(const std::pair<std::vector<char>,int32_t> & c)51 inline std::pair<std::string, int32_t> PairCharToString(const std::pair<std::vector<char>, int32_t> &c) {
52   return std::pair<std::string, int32_t>(std::string(c.first.begin(), c.first.end()), c.second);
53 }
54 
VectorStringToChar(const std::vector<std::string> & s)55 inline std::vector<std::vector<char>> VectorStringToChar(const std::vector<std::string> &s) {
56   std::vector<std::vector<char>> ret;
57   std::transform(s.begin(), s.end(), std::back_inserter(ret),
58                  [](auto str) { return std::vector<char>(str.begin(), str.end()); });
59   return ret;
60 }
61 
VectorCharToString(const std::vector<std::vector<char>> & c)62 inline std::vector<std::string> VectorCharToString(const std::vector<std::vector<char>> &c) {
63   std::vector<std::string> ret;
64   std::transform(c.begin(), c.end(), std::back_inserter(ret),
65                  [](auto ch) { return std::string(ch.begin(), ch.end()); });
66   return ret;
67 }
68 
SetStringToChar(const std::set<std::string> & s)69 inline std::set<std::vector<char>> SetStringToChar(const std::set<std::string> &s) {
70   std::set<std::vector<char>> ret;
71   std::transform(s.begin(), s.end(), std::inserter(ret, ret.begin()),
72                  [](auto str) { return std::vector<char>(str.begin(), str.end()); });
73   return ret;
74 }
75 
SetCharToString(const std::set<std::vector<char>> & c)76 inline std::set<std::string> SetCharToString(const std::set<std::vector<char>> &c) {
77   std::set<std::string> ret;
78   std::transform(c.begin(), c.end(), std::inserter(ret, ret.begin()),
79                  [](auto ch) { return std::string(ch.begin(), ch.end()); });
80   return ret;
81 }
82 
83 template <class T>
MapStringToChar(const std::map<std::string,T> & s)84 inline std::map<std::vector<char>, T> MapStringToChar(const std::map<std::string, T> &s) {
85   std::map<std::vector<char>, T> ret;
86   std::transform(s.begin(), s.end(), std::inserter(ret, ret.begin()), [](auto str) {
87     return std::pair<std::vector<char>, T>(std::vector<char>(str.first.begin(), str.first.end()), str.second);
88   });
89   return ret;
90 }
91 
92 template <class T>
MapCharToString(const std::map<std::vector<char>,T> & c)93 inline std::map<std::string, T> MapCharToString(const std::map<std::vector<char>, T> &c) {
94   std::map<std::string, T> ret;
95   std::transform(c.begin(), c.end(), std::inserter(ret, ret.begin()), [](auto ch) {
96     return std::pair<std::string, T>(std::string(ch.first.begin(), ch.first.end()), ch.second);
97   });
98   return ret;
99 }
100 
UnorderedMapStringToChar(const std::unordered_map<std::string,std::string> & s)101 inline std::map<std::vector<char>, std::vector<char>> UnorderedMapStringToChar(
102   const std::unordered_map<std::string, std::string> &s) {
103   std::map<std::vector<char>, std::vector<char>> ret;
104   std::transform(s.begin(), s.end(), std::inserter(ret, ret.begin()), [](auto str) {
105     return std::pair<std::vector<char>, std::vector<char>>(std::vector<char>(str.first.begin(), str.first.end()),
106                                                            std::vector<char>(str.second.begin(), str.second.end()));
107   });
108   return ret;
109 }
110 
UnorderedMapCharToString(const std::map<std::vector<char>,std::vector<char>> & c)111 inline std::unordered_map<std::string, std::string> UnorderedMapCharToString(
112   const std::map<std::vector<char>, std::vector<char>> &c) {
113   std::unordered_map<std::string, std::string> ret;
114   std::transform(c.begin(), c.end(), std::inserter(ret, ret.begin()), [](auto ch) {
115     return std::pair<std::string, std::string>(std::string(ch.first.begin(), ch.first.end()),
116                                                std::string(ch.second.begin(), ch.second.end()));
117   });
118   return ret;
119 }
120 
MapStringToVectorChar(const std::map<std::string,std::string> & s)121 inline std::map<std::vector<char>, std::vector<char>> MapStringToVectorChar(
122   const std::map<std::string, std::string> &s) {
123   std::map<std::vector<char>, std::vector<char>> ret;
124   std::transform(s.begin(), s.end(), std::inserter(ret, ret.begin()), [](auto str) {
125     return std::pair<std::vector<char>, std::vector<char>>(std::vector<char>(str.first.begin(), str.first.end()),
126                                                            std::vector<char>(str.second.begin(), str.second.end()));
127   });
128   return ret;
129 }
130 
MapVectorCharToString(const std::map<std::vector<char>,std::vector<char>> & c)131 inline std::map<std::string, std::string> MapVectorCharToString(
132   const std::map<std::vector<char>, std::vector<char>> &c) {
133   std::map<std::string, std::string> ret;
134   std::transform(c.begin(), c.end(), std::inserter(ret, ret.begin()), [](auto ch) {
135     return std::pair<std::string, std::string>(std::string(ch.first.begin(), ch.first.end()),
136                                                std::string(ch.second.begin(), ch.second.end()));
137   });
138   return ret;
139 }
140 
ClassIndexStringToChar(const std::vector<std::pair<std::string,std::vector<int32_t>>> & s)141 inline std::vector<std::pair<std::vector<char>, std::vector<int32_t>>> ClassIndexStringToChar(
142   const std::vector<std::pair<std::string, std::vector<int32_t>>> &s) {
143   std::vector<std::pair<std::vector<char>, std::vector<int32_t>>> ret;
144   std::transform(s.begin(), s.end(), std::back_inserter(ret), [](auto str) {
145     return std::pair<std::vector<char>, std::vector<int32_t>>(std::vector<char>(str.first.begin(), str.first.end()),
146                                                               str.second);
147   });
148   return ret;
149 }
150 
ClassIndexCharToString(const std::vector<std::pair<std::vector<char>,std::vector<int32_t>>> & c)151 inline std::vector<std::pair<std::string, std::vector<int32_t>>> ClassIndexCharToString(
152   const std::vector<std::pair<std::vector<char>, std::vector<int32_t>>> &c) {
153   std::vector<std::pair<std::string, std::vector<int32_t>>> ret;
154   std::transform(c.begin(), c.end(), std::back_inserter(ret), [](auto ch) {
155     return std::pair<std::string, std::vector<int32_t>>(std::string(ch.first.begin(), ch.first.end()), ch.second);
156   });
157   return ret;
158 }
159 
PairStringInt64ToPairCharInt64(const std::vector<std::pair<std::string,int64_t>> & s)160 inline std::vector<std::pair<std::vector<char>, int64_t>> PairStringInt64ToPairCharInt64(
161   const std::vector<std::pair<std::string, int64_t>> &s) {
162   std::vector<std::pair<std::vector<char>, int64_t>> ret;
163   std::transform(s.begin(), s.end(), std::back_inserter(ret), [](auto str) {
164     return std::pair<std::vector<char>, int64_t>(std::vector<char>(str.first.begin(), str.first.end()), str.second);
165   });
166   return ret;
167 }
168 
169 template <class T>
TensorMapCharToString(const std::map<std::vector<char>,T> * c,std::unordered_map<std::string,T> * s)170 inline void TensorMapCharToString(const std::map<std::vector<char>, T> *c, std::unordered_map<std::string, T> *s) {
171   if (c == nullptr || s == nullptr) {
172     return;
173   }
174   for (auto ch : *c) {
175     auto key = std::string(ch.first.begin(), ch.first.end());
176     auto val = ch.second;
177     s->insert(std::pair<std::string, T>(key, val));
178   }
179 }
180 
MapMapCharToString(const std::map<std::vector<char>,std::map<std::vector<char>,std::vector<char>>> & c)181 inline std::map<std::string, std::map<std::string, std::string>> MapMapCharToString(
182   const std::map<std::vector<char>, std::map<std::vector<char>, std::vector<char>>> &c) {
183   std::map<std::string, std::map<std::string, std::string>> ret;
184   for (auto iter : c) {
185     std::map<std::string, std::string> item;
186     std::transform(iter.second.begin(), iter.second.end(), std::inserter(item, item.begin()), [](auto ch) {
187       return std::pair<std::string, std::string>(std::string(ch.first.begin(), ch.first.end()),
188                                                  std::string(ch.second.begin(), ch.second.end()));
189     });
190     ret[CharToString(iter.first)] = item;
191   }
192   return ret;
193 }
194 
MapMapStringToChar(const std::map<std::string,std::map<std::string,std::string>> & s)195 inline std::map<std::vector<char>, std::map<std::vector<char>, std::vector<char>>> MapMapStringToChar(
196   const std::map<std::string, std::map<std::string, std::string>> &s) {
197   std::map<std::vector<char>, std::map<std::vector<char>, std::vector<char>>> ret;
198   for (auto iter : s) {
199     std::map<std::vector<char>, std::vector<char>> item;
200     std::transform(iter.second.begin(), iter.second.end(), std::inserter(item, item.begin()), [](auto ch) {
201       return std::pair<std::vector<char>, std::vector<char>>(StringToChar(ch.first), StringToChar(ch.second));
202     });
203     ret[StringToChar(iter.first)] = item;
204   }
205   return ret;
206 }
207 }  // namespace mindspore
208 #endif  // MINDSPORE_INCLUDE_API_DUAL_ABI_HELPER_H_
209