| /* Distributed under the OSI-approved BSD 3-Clause License. See accompanying |
| file Copyright.txt or https://cmake.org/licensing for details. */ |
| #include "cmSubcommandTable.h" |
| |
| #include <algorithm> |
| |
| #include "cmExecutionStatus.h" |
| #include "cmStringAlgorithms.h" |
| |
| cmSubcommandTable::cmSubcommandTable(std::initializer_list<InitElem> init) |
| : Impl(init.begin(), init.end()) |
| { |
| std::sort(this->Impl.begin(), this->Impl.end(), |
| [](Elem const& left, Elem const& right) { |
| return left.first < right.first; |
| }); |
| } |
| |
| bool cmSubcommandTable::operator()(cm::string_view key, |
| std::vector<std::string> const& args, |
| cmExecutionStatus& status) const |
| { |
| auto const it = std::lower_bound( |
| this->Impl.begin(), this->Impl.end(), key, |
| [](Elem const& elem, cm::string_view k) { return elem.first < k; }); |
| if (it != this->Impl.end() && it->first == key) { |
| return it->second(args, status); |
| } |
| status.SetError(cmStrCat("does not recognize sub-command ", key)); |
| return false; |
| } |