10b57cec5SDimitry Andric //===- xray-registry.cpp: Implement a command registry. -------------------===// 20b57cec5SDimitry Andric // 30b57cec5SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 40b57cec5SDimitry Andric // See https://llvm.org/LICENSE.txt for license information. 50b57cec5SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 60b57cec5SDimitry Andric // 70b57cec5SDimitry Andric //===----------------------------------------------------------------------===// 80b57cec5SDimitry Andric // 90b57cec5SDimitry Andric // Implement a simple subcommand registry. 100b57cec5SDimitry Andric // 110b57cec5SDimitry Andric //===----------------------------------------------------------------------===// 120b57cec5SDimitry Andric #include "xray-registry.h" 130b57cec5SDimitry Andric 140b57cec5SDimitry Andric #include <unordered_map> 150b57cec5SDimitry Andric 160b57cec5SDimitry Andric namespace llvm { 170b57cec5SDimitry Andric namespace xray { 180b57cec5SDimitry Andric 190b57cec5SDimitry Andric using HandlerType = std::function<Error()>; 200b57cec5SDimitry Andric getCommands()21*753f127fSDimitry Andricstatic std::unordered_map<cl::SubCommand *, HandlerType> &getCommands() { 22*753f127fSDimitry Andric static std::unordered_map<cl::SubCommand *, HandlerType> Commands; 23*753f127fSDimitry Andric return Commands; 24*753f127fSDimitry Andric } 250b57cec5SDimitry Andric CommandRegistration(cl::SubCommand * SC,HandlerType Command)260b57cec5SDimitry AndricCommandRegistration::CommandRegistration(cl::SubCommand *SC, 270b57cec5SDimitry Andric HandlerType Command) { 28*753f127fSDimitry Andric assert(getCommands().count(SC) == 0 && 290b57cec5SDimitry Andric "Attempting to overwrite a command handler"); 300b57cec5SDimitry Andric assert(Command && "Attempting to register an empty std::function<Error()>"); 31*753f127fSDimitry Andric getCommands()[SC] = Command; 320b57cec5SDimitry Andric } 330b57cec5SDimitry Andric dispatch(cl::SubCommand * SC)340b57cec5SDimitry AndricHandlerType dispatch(cl::SubCommand *SC) { 35*753f127fSDimitry Andric auto It = getCommands().find(SC); 36*753f127fSDimitry Andric assert(It != getCommands().end() && 370b57cec5SDimitry Andric "Attempting to dispatch on un-registered SubCommand."); 380b57cec5SDimitry Andric return It->second; 390b57cec5SDimitry Andric } 400b57cec5SDimitry Andric 410b57cec5SDimitry Andric } // namespace xray 420b57cec5SDimitry Andric } // namespace llvm 43