Loading tools/aapt2/ResourceTable.cpp +23 −0 Original line number Diff line number Diff line Loading @@ -47,6 +47,13 @@ static bool less_than_struct_with_name(const std::unique_ptr<T>& lhs, const Stri return lhs->name.compare(0, lhs->name.size(), rhs.data(), rhs.size()) < 0; } template <typename T> static bool less_than_struct_with_name_and_id(const std::unique_ptr<T>& lhs, const std::pair<StringPiece, Maybe<uint8_t>>& rhs) { int name_cmp = lhs->name.compare(0, lhs->name.size(), rhs.first.data(), rhs.first.size()); return name_cmp < 0 || (name_cmp == 0 && lhs->id < rhs.second); } ResourceTablePackage* ResourceTable::FindPackage(const StringPiece& name) const { const auto last = packages.end(); auto iter = std::lower_bound(packages.begin(), last, name, Loading Loading @@ -79,6 +86,22 @@ ResourceTablePackage* ResourceTable::CreatePackage(const StringPiece& name, Mayb return package; } ResourceTablePackage* ResourceTable::CreatePackageAllowingDuplicateNames(const StringPiece& name, const Maybe<uint8_t> id) { const auto last = packages.end(); auto iter = std::lower_bound(packages.begin(), last, std::make_pair(name, id), less_than_struct_with_name_and_id<ResourceTablePackage>); if (iter != last && name == (*iter)->name && id == (*iter)->id) { return iter->get(); } std::unique_ptr<ResourceTablePackage> new_package = util::make_unique<ResourceTablePackage>(); new_package->name = name.to_string(); new_package->id = id; return packages.emplace(iter, std::move(new_package))->get(); } ResourceTablePackage* ResourceTable::FindOrCreatePackage(const StringPiece& name) { const auto last = packages.end(); auto iter = std::lower_bound(packages.begin(), last, name, Loading tools/aapt2/ResourceTable.h +7 −1 Original line number Diff line number Diff line Loading @@ -229,6 +229,11 @@ class ResourceTable { ResourceTablePackage* CreatePackage(const android::StringPiece& name, Maybe<uint8_t> id = {}); // Attempts to find a package having the specified name and ID. If not found, a new package // of the specified parameters is created and returned. ResourceTablePackage* CreatePackageAllowingDuplicateNames(const android::StringPiece& name, const Maybe<uint8_t> id); std::unique_ptr<ResourceTable> Clone() const; // The string pool used by this resource table. Values that reference strings must use Loading @@ -239,7 +244,8 @@ class ResourceTable { // destroyed. StringPool string_pool; // The list of packages in this table, sorted alphabetically by package name. // The list of packages in this table, sorted alphabetically by package name and increasing // package ID (missing ID being the lowest). std::vector<std::unique_ptr<ResourceTablePackage>> packages; // Set of dynamic packages that this table may reference. Their package names get encoded Loading tools/aapt2/format/proto/ProtoDeserialize.cpp +2 −1 Original line number Diff line number Diff line Loading @@ -381,7 +381,8 @@ static bool DeserializePackageFromPb(const pb::Package& pb_package, const ResStr std::map<ResourceId, ResourceNameRef> id_index; ResourceTablePackage* pkg = out_table->CreatePackage(pb_package.package_name(), id); ResourceTablePackage* pkg = out_table->CreatePackageAllowingDuplicateNames(pb_package.package_name(), id); for (const pb::Type& pb_type : pb_package.type()) { const ResourceType* res_type = ParseResourceType(pb_type.name()); if (res_type == nullptr) { Loading Loading
tools/aapt2/ResourceTable.cpp +23 −0 Original line number Diff line number Diff line Loading @@ -47,6 +47,13 @@ static bool less_than_struct_with_name(const std::unique_ptr<T>& lhs, const Stri return lhs->name.compare(0, lhs->name.size(), rhs.data(), rhs.size()) < 0; } template <typename T> static bool less_than_struct_with_name_and_id(const std::unique_ptr<T>& lhs, const std::pair<StringPiece, Maybe<uint8_t>>& rhs) { int name_cmp = lhs->name.compare(0, lhs->name.size(), rhs.first.data(), rhs.first.size()); return name_cmp < 0 || (name_cmp == 0 && lhs->id < rhs.second); } ResourceTablePackage* ResourceTable::FindPackage(const StringPiece& name) const { const auto last = packages.end(); auto iter = std::lower_bound(packages.begin(), last, name, Loading Loading @@ -79,6 +86,22 @@ ResourceTablePackage* ResourceTable::CreatePackage(const StringPiece& name, Mayb return package; } ResourceTablePackage* ResourceTable::CreatePackageAllowingDuplicateNames(const StringPiece& name, const Maybe<uint8_t> id) { const auto last = packages.end(); auto iter = std::lower_bound(packages.begin(), last, std::make_pair(name, id), less_than_struct_with_name_and_id<ResourceTablePackage>); if (iter != last && name == (*iter)->name && id == (*iter)->id) { return iter->get(); } std::unique_ptr<ResourceTablePackage> new_package = util::make_unique<ResourceTablePackage>(); new_package->name = name.to_string(); new_package->id = id; return packages.emplace(iter, std::move(new_package))->get(); } ResourceTablePackage* ResourceTable::FindOrCreatePackage(const StringPiece& name) { const auto last = packages.end(); auto iter = std::lower_bound(packages.begin(), last, name, Loading
tools/aapt2/ResourceTable.h +7 −1 Original line number Diff line number Diff line Loading @@ -229,6 +229,11 @@ class ResourceTable { ResourceTablePackage* CreatePackage(const android::StringPiece& name, Maybe<uint8_t> id = {}); // Attempts to find a package having the specified name and ID. If not found, a new package // of the specified parameters is created and returned. ResourceTablePackage* CreatePackageAllowingDuplicateNames(const android::StringPiece& name, const Maybe<uint8_t> id); std::unique_ptr<ResourceTable> Clone() const; // The string pool used by this resource table. Values that reference strings must use Loading @@ -239,7 +244,8 @@ class ResourceTable { // destroyed. StringPool string_pool; // The list of packages in this table, sorted alphabetically by package name. // The list of packages in this table, sorted alphabetically by package name and increasing // package ID (missing ID being the lowest). std::vector<std::unique_ptr<ResourceTablePackage>> packages; // Set of dynamic packages that this table may reference. Their package names get encoded Loading
tools/aapt2/format/proto/ProtoDeserialize.cpp +2 −1 Original line number Diff line number Diff line Loading @@ -381,7 +381,8 @@ static bool DeserializePackageFromPb(const pb::Package& pb_package, const ResStr std::map<ResourceId, ResourceNameRef> id_index; ResourceTablePackage* pkg = out_table->CreatePackage(pb_package.package_name(), id); ResourceTablePackage* pkg = out_table->CreatePackageAllowingDuplicateNames(pb_package.package_name(), id); for (const pb::Type& pb_type : pb_package.type()) { const ResourceType* res_type = ParseResourceType(pb_type.name()); if (res_type == nullptr) { Loading