xref: /freebsd-src/contrib/llvm-project/llvm/tools/llvm-xray/xray-registry.cpp (revision 753f127f3ace09432b2baeffd71a308760641a62)
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 Andric static 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 Andric CommandRegistration::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 Andric HandlerType 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