blob: f9f7742c986443acc07353fa2c67071400878304 [file] [log] [blame]
// Copyright 2016 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "services/service_manager/catalog.h"
#include <vector>
namespace service_manager {
namespace {
std::map<Manifest::ServiceName, const Manifest*> CreateManifestMap(
const std::vector<Manifest>& manifests) {
std::map<Manifest::ServiceName, const Manifest*> map;
for (const auto& manifest : manifests) {
map[manifest.service_name] = &manifest;
for (const auto& entry : CreateManifestMap(manifest.packaged_services))
map[entry.first] = entry.second;
}
return map;
}
std::map<Manifest::ServiceName, const Manifest*> CreateParentManifestMap(
const std::vector<Manifest>& manifests) {
std::map<Manifest::ServiceName, const Manifest*> map;
for (const auto& parent : manifests) {
for (const auto& child : parent.packaged_services)
map[child.service_name] = &parent;
for (const auto& entry : CreateParentManifestMap(parent.packaged_services))
map[entry.first] = entry.second;
}
return map;
}
} // namespace
Catalog::Catalog(const std::vector<Manifest>& manifests)
: manifests_(manifests),
manifest_map_(CreateManifestMap(manifests_)),
parent_manifest_map_(CreateParentManifestMap(manifests_)) {}
Catalog::~Catalog() = default;
const Manifest* Catalog::GetManifest(
const Manifest::ServiceName& service_name) {
const auto it = manifest_map_.find(service_name);
if (it == manifest_map_.end())
return nullptr;
return it->second;
}
const Manifest* Catalog::GetParentManifest(
const Manifest::ServiceName& service_name) {
auto it = parent_manifest_map_.find(service_name);
if (it == parent_manifest_map_.end())
return nullptr;
return it->second;
}
} // namespace service_manager