#ifndef SERVICES_SERVICE_MANAGER_SERVICE_INSTANCE_REGISTRY_H_
#define SERVICES_SERVICE_MANAGER_SERVICE_INSTANCE_REGISTRY_H_
#include <map>
#include <optional>
#include <string>
#include <vector>
#include "base/memory/raw_ptr.h"
#include "base/token.h"
#include "services/service_manager/public/cpp/identity.h"
#include "services/service_manager/public/cpp/service_filter.h"
namespace service_manager {
class ServiceInstance;
class ServiceInstanceRegistry {
public:
ServiceInstanceRegistry();
ServiceInstanceRegistry(const ServiceInstanceRegistry&) = delete;
ServiceInstanceRegistry& operator=(const ServiceInstanceRegistry&) = delete;
~ServiceInstanceRegistry();
void Register(ServiceInstance* instance);
bool Unregister(ServiceInstance* instance);
ServiceInstance* FindMatching(const ServiceFilter& filter) const;
private:
struct Entry {
Entry(const base::Token& guid, ServiceInstance* instance);
Entry(const Entry&);
~Entry();
base::Token guid;
raw_ptr<ServiceInstance> instance = nullptr;
};
struct RegularInstanceKey {
RegularInstanceKey(const std::string& service_name,
const base::Token& instance_group,
const base::Token& instance_id);
RegularInstanceKey(const RegularInstanceKey&);
~RegularInstanceKey();
bool operator==(const RegularInstanceKey& other) const;
bool operator<(const RegularInstanceKey& other) const;
const std::string service_name;
const base::Token instance_group;
const base::Token instance_id;
};
struct SharedInstanceKey {
SharedInstanceKey(const std::string& service_name,
const base::Token& instance_id);
SharedInstanceKey(const SharedInstanceKey&);
~SharedInstanceKey();
bool operator==(const SharedInstanceKey& other) const;
bool operator<(const SharedInstanceKey& other) const;
const std::string service_name;
const base::Token instance_id;
};
using RegularInstanceMap = std::map<RegularInstanceKey, std::vector<Entry>>;
using SharedInstanceMap = std::map<SharedInstanceKey, std::vector<Entry>>;
using SingletonInstanceMap = std::map<std::string, std::vector<Entry>>;
ServiceInstance* FindMatchInEntries(
const std::vector<Entry>& entries,
const std::optional<base::Token>& guid) const;
bool EraseEntry(const base::Token& guid, std::vector<Entry>* entries);
RegularInstanceMap regular_instances_;
SharedInstanceMap shared_instances_;
SingletonInstanceMap singleton_instances_;
};
}
#endif