1*5f757f3fSDimitry Andric //===- RemarkUtilRegistry.cpp: Implement a command registry. --------------===//
2*5f757f3fSDimitry Andric //
3*5f757f3fSDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*5f757f3fSDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
5*5f757f3fSDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6*5f757f3fSDimitry Andric //
7*5f757f3fSDimitry Andric //===----------------------------------------------------------------------===//
8*5f757f3fSDimitry Andric //
9*5f757f3fSDimitry Andric // Implement a simple subcommand registry.
10*5f757f3fSDimitry Andric //
11*5f757f3fSDimitry Andric //===----------------------------------------------------------------------===//
12*5f757f3fSDimitry Andric #include "RemarkUtilRegistry.h"
13*5f757f3fSDimitry Andric #include <unordered_map>
14*5f757f3fSDimitry Andric 
15*5f757f3fSDimitry Andric namespace llvm {
16*5f757f3fSDimitry Andric namespace remarkutil {
17*5f757f3fSDimitry Andric 
18*5f757f3fSDimitry Andric using HandlerType = std::function<Error()>;
19*5f757f3fSDimitry Andric 
getCommands()20*5f757f3fSDimitry Andric static std::unordered_map<cl::SubCommand *, HandlerType> &getCommands() {
21*5f757f3fSDimitry Andric   static std::unordered_map<cl::SubCommand *, HandlerType> Commands;
22*5f757f3fSDimitry Andric   return Commands;
23*5f757f3fSDimitry Andric }
24*5f757f3fSDimitry Andric 
CommandRegistration(cl::SubCommand * SC,HandlerType Command)25*5f757f3fSDimitry Andric CommandRegistration::CommandRegistration(cl::SubCommand *SC,
26*5f757f3fSDimitry Andric                                          HandlerType Command) {
27*5f757f3fSDimitry Andric   assert(getCommands().count(SC) == 0 &&
28*5f757f3fSDimitry Andric          "Attempting to overwrite a command handler");
29*5f757f3fSDimitry Andric   assert(Command && "Attempting to register an empty std::function<Error()>");
30*5f757f3fSDimitry Andric   getCommands()[SC] = Command;
31*5f757f3fSDimitry Andric }
32*5f757f3fSDimitry Andric 
dispatch(cl::SubCommand * SC)33*5f757f3fSDimitry Andric HandlerType dispatch(cl::SubCommand *SC) {
34*5f757f3fSDimitry Andric   auto It = getCommands().find(SC);
35*5f757f3fSDimitry Andric   assert(It != getCommands().end() &&
36*5f757f3fSDimitry Andric          "Attempting to dispatch on un-registered SubCommand.");
37*5f757f3fSDimitry Andric   return It->second;
38*5f757f3fSDimitry Andric }
39*5f757f3fSDimitry Andric 
40*5f757f3fSDimitry Andric } // namespace remarkutil
41*5f757f3fSDimitry Andric } // namespace llvm
42