| 200 | } |
| 201 | |
| 202 | std::shared_ptr<KeyValueMetadata> KeyValueMetadata::Merge( |
| 203 | const KeyValueMetadata& other) const { |
| 204 | std::unordered_set<std::string> observed_keys; |
| 205 | std::vector<std::string> result_keys; |
| 206 | std::vector<std::string> result_values; |
| 207 | |
| 208 | result_keys.reserve(keys_.size()); |
| 209 | result_values.reserve(keys_.size()); |
| 210 | |
| 211 | for (int64_t i = 0; i < other.size(); ++i) { |
| 212 | const auto& key = other.key(i); |
| 213 | auto it = observed_keys.find(key); |
| 214 | if (it == observed_keys.end()) { |
| 215 | result_keys.push_back(key); |
| 216 | result_values.push_back(other.value(i)); |
| 217 | observed_keys.insert(key); |
| 218 | } |
| 219 | } |
| 220 | for (size_t i = 0; i < keys_.size(); ++i) { |
| 221 | auto it = observed_keys.find(keys_[i]); |
| 222 | if (it == observed_keys.end()) { |
| 223 | result_keys.push_back(keys_[i]); |
| 224 | result_values.push_back(values_[i]); |
| 225 | observed_keys.insert(keys_[i]); |
| 226 | } |
| 227 | } |
| 228 | |
| 229 | return std::make_shared<KeyValueMetadata>(std::move(result_keys), |
| 230 | std::move(result_values)); |
| 231 | } |
| 232 | |
| 233 | bool KeyValueMetadata::Equals(const KeyValueMetadata& other) const { |
| 234 | if (size() != other.size()) { |