mirror of
https://git.mirrors.martin98.com/https://github.com/google/draco
synced 2025-08-12 02:09:01 +08:00
Making metadata block in DRC files deterministic.
This commit is contained in:
parent
9fa96af9d1
commit
adb34a7af2
@ -18,7 +18,7 @@
|
|||||||
#include <cstring>
|
#include <cstring>
|
||||||
#include <memory>
|
#include <memory>
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <unordered_map>
|
#include <map>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
#include "draco/core/hash_utils.h"
|
#include "draco/core/hash_utils.h"
|
||||||
@ -150,10 +150,10 @@ class Metadata {
|
|||||||
void RemoveEntry(const std::string &name);
|
void RemoveEntry(const std::string &name);
|
||||||
|
|
||||||
int num_entries() const { return static_cast<int>(entries_.size()); }
|
int num_entries() const { return static_cast<int>(entries_.size()); }
|
||||||
const std::unordered_map<std::string, EntryValue> &entries() const {
|
const std::map<std::string, EntryValue> &entries() const {
|
||||||
return entries_;
|
return entries_;
|
||||||
}
|
}
|
||||||
const std::unordered_map<std::string, std::unique_ptr<Metadata>>
|
const std::map<std::string, std::unique_ptr<Metadata>>
|
||||||
&sub_metadatas() const {
|
&sub_metadatas() const {
|
||||||
return sub_metadatas_;
|
return sub_metadatas_;
|
||||||
}
|
}
|
||||||
@ -178,8 +178,8 @@ class Metadata {
|
|||||||
return itr->second.GetValue(entry_value);
|
return itr->second.GetValue(entry_value);
|
||||||
}
|
}
|
||||||
|
|
||||||
std::unordered_map<std::string, EntryValue> entries_;
|
std::map<std::string, EntryValue> entries_;
|
||||||
std::unordered_map<std::string, std::unique_ptr<Metadata>> sub_metadatas_;
|
std::map<std::string, std::unique_ptr<Metadata>> sub_metadatas_;
|
||||||
|
|
||||||
friend struct MetadataHasher;
|
friend struct MetadataHasher;
|
||||||
};
|
};
|
||||||
|
@ -20,8 +20,7 @@ namespace draco {
|
|||||||
|
|
||||||
bool MetadataEncoder::EncodeMetadata(EncoderBuffer *out_buffer,
|
bool MetadataEncoder::EncodeMetadata(EncoderBuffer *out_buffer,
|
||||||
const Metadata *metadata) {
|
const Metadata *metadata) {
|
||||||
const std::unordered_map<std::string, EntryValue> &entries =
|
const std::map<std::string, EntryValue> &entries = metadata->entries();
|
||||||
metadata->entries();
|
|
||||||
// Encode number of entries.
|
// Encode number of entries.
|
||||||
EncodeVarint(static_cast<uint32_t>(metadata->num_entries()), out_buffer);
|
EncodeVarint(static_cast<uint32_t>(metadata->num_entries()), out_buffer);
|
||||||
// Encode all entries.
|
// Encode all entries.
|
||||||
@ -33,8 +32,8 @@ bool MetadataEncoder::EncodeMetadata(EncoderBuffer *out_buffer,
|
|||||||
EncodeVarint(data_size, out_buffer);
|
EncodeVarint(data_size, out_buffer);
|
||||||
out_buffer->Encode(entry_value.data(), data_size);
|
out_buffer->Encode(entry_value.data(), data_size);
|
||||||
}
|
}
|
||||||
const std::unordered_map<std::string, std::unique_ptr<Metadata>>
|
const std::map<std::string, std::unique_ptr<Metadata>> &sub_metadatas =
|
||||||
&sub_metadatas = metadata->sub_metadatas();
|
metadata->sub_metadatas();
|
||||||
// Encode number of sub-metadata
|
// Encode number of sub-metadata
|
||||||
EncodeVarint(static_cast<uint32_t>(sub_metadatas.size()), out_buffer);
|
EncodeVarint(static_cast<uint32_t>(sub_metadatas.size()), out_buffer);
|
||||||
// Encode each sub-metadata
|
// Encode each sub-metadata
|
||||||
|
@ -75,9 +75,9 @@ class MetadataEncoderTest : public ::testing::Test {
|
|||||||
void CheckMetadatasAreEqual(const draco::Metadata &metadata0,
|
void CheckMetadatasAreEqual(const draco::Metadata &metadata0,
|
||||||
const draco::Metadata &metadata1) {
|
const draco::Metadata &metadata1) {
|
||||||
ASSERT_EQ(metadata0.num_entries(), metadata1.num_entries());
|
ASSERT_EQ(metadata0.num_entries(), metadata1.num_entries());
|
||||||
const std::unordered_map<std::string, draco::EntryValue> &entries0 =
|
const std::map<std::string, draco::EntryValue> &entries0 =
|
||||||
metadata0.entries();
|
metadata0.entries();
|
||||||
const std::unordered_map<std::string, draco::EntryValue> &entries1 =
|
const std::map<std::string, draco::EntryValue> &entries1 =
|
||||||
metadata1.entries();
|
metadata1.entries();
|
||||||
for (const auto &entry : entries0) {
|
for (const auto &entry : entries0) {
|
||||||
const std::string &entry_name = entry.first;
|
const std::string &entry_name = entry.first;
|
||||||
@ -90,7 +90,7 @@ class MetadataEncoderTest : public ::testing::Test {
|
|||||||
// Check nested metadata.
|
// Check nested metadata.
|
||||||
ASSERT_EQ(metadata0.sub_metadatas().size(),
|
ASSERT_EQ(metadata0.sub_metadatas().size(),
|
||||||
metadata1.sub_metadatas().size());
|
metadata1.sub_metadatas().size());
|
||||||
const std::unordered_map<std::string, std::unique_ptr<draco::Metadata>>
|
const std::map<std::string, std::unique_ptr<draco::Metadata>>
|
||||||
&sub_metadatas0 = metadata0.sub_metadatas();
|
&sub_metadatas0 = metadata0.sub_metadatas();
|
||||||
// Encode each sub-metadata
|
// Encode each sub-metadata
|
||||||
for (auto &&sub_metadata_entry0 : sub_metadatas0) {
|
for (auto &&sub_metadata_entry0 : sub_metadatas0) {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user