1 //===- xray-registry.cpp: Implement a command registry. -------------------===// 2 // 3 // The LLVM Compiler Infrastructure 4 // 5 // This file is distributed under the University of Illinois Open Source 6 // License. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 // 10 // Implement a simple subcommand registry. 11 // 12 //===----------------------------------------------------------------------===// 13 #include "xray-registry.h" 14 15 #include "llvm/Support/ManagedStatic.h" 16 #include <unordered_map> 17 18 namespace llvm { 19 namespace xray { 20 21 using HandlerType = std::function<Error()>; 22 23 ManagedStatic<std::unordered_map<cl::SubCommand *, HandlerType>> Commands; 24 CommandRegistration(cl::SubCommand * SC,HandlerType Command)25CommandRegistration::CommandRegistration(cl::SubCommand *SC, 26 HandlerType Command) { 27 assert(Commands->count(SC) == 0 && 28 "Attempting to overwrite a command handler"); 29 assert(Command && "Attempting to register an empty std::function<Error()>"); 30 (*Commands)[SC] = Command; 31 } 32 dispatch(cl::SubCommand * SC)33HandlerType dispatch(cl::SubCommand *SC) { 34 auto It = Commands->find(SC); 35 assert(It != Commands->end() && 36 "Attempting to dispatch on un-registered SubCommand."); 37 return It->second; 38 } 39 40 } // namespace xray 41 } // namespace llvm 42