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>; 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 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 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 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 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 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 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 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> 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> 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 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 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 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 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 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 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 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> 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 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 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