1 #ifndef _METADATA_STORAGE_H_ 2 #define _METADATA_STORAGE_H_ 4 #include "vtr_string_interning.h" 18 template<
typename LookupKey>
22 VTR_ASSERT(
map_.empty());
25 void add_metadata(
const LookupKey& lookup_key, vtr::interned_string meta_key, vtr::interned_string meta_value) {
27 VTR_ASSERT(
map_.empty());
28 data_.push_back(std::make_tuple(lookup_key, meta_key, meta_value));
31 typename vtr::flat_map<LookupKey, t_metadata_dict>::const_iterator
find(
const LookupKey& lookup_key)
const {
34 return map_.find(lookup_key);
47 typename vtr::flat_map<LookupKey, t_metadata_dict>::const_iterator
begin()
const {
52 typename vtr::flat_map<LookupKey, t_metadata_dict>::const_iterator
end()
const {
68 VTR_ASSERT(!
data_.empty());
69 VTR_ASSERT(
map_.empty());
71 std::sort(
data_.begin(),
data_.end(), [](
const std::tuple<LookupKey, vtr::interned_string, vtr::interned_string>& lhs,
const std::tuple<LookupKey, vtr::interned_string, vtr::interned_string>& rhs) {
72 return std::get<0>(lhs) < std::get<0>(rhs);
75 std::vector<typename vtr::flat_map<LookupKey, t_metadata_dict>::value_type> storage;
76 storage.push_back(std::make_pair(std::get<0>(
data_[0]), t_metadata_dict()));
77 for (
const auto& value :
data_) {
78 if (storage.back().first != std::get<0>(value)) {
79 storage.push_back(std::make_pair(std::get<0>(value), t_metadata_dict()));
82 storage.back().second.add(std::get<1>(value), std::get<2>(value));
85 map_.assign_sorted(std::move(storage));
88 data_.shrink_to_fit();
91 mutable std::vector<std::tuple<LookupKey, vtr::interned_string, vtr::interned_string>>
data_;
92 mutable vtr::flat_map<LookupKey, t_metadata_dict>
map_;