Skip to content
Snippets Groups Projects
Commit b66b7464 authored by wahikihiki's avatar wahikihiki
Browse files

Introduce cmSubcommandTable

parent 2b785875
No related branches found
No related tags found
No related merge requests found
......@@ -639,6 +639,8 @@ set(SRCS
cmStringReplaceHelper.cxx
cmStringCommand.cxx
cmStringCommand.h
cmSubcommandTable.cxx
cmSubcommandTable.h
cmSubdirCommand.cxx
cmSubdirCommand.h
cmSubdirDependsCommand.cxx
......
/* 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;
}
/* Distributed under the OSI-approved BSD 3-Clause License. See accompanying
file Copyright.txt or https://cmake.org/licensing for details. */
#ifndef cmSubcommandTable_h
#define cmSubcommandTable_h
#include "cmConfigure.h" // IWYU pragma: keep
#include "cm_static_string_view.hxx"
#include "cm_string_view.hxx"
#include <initializer_list>
#include <string>
#include <utility>
#include <vector>
class cmExecutionStatus;
class cmSubcommandTable
{
public:
using Command = bool (*)(std::vector<std::string> const&,
cmExecutionStatus&);
using Elem = std::pair<cm::string_view, Command>;
using InitElem = std::pair<cm::static_string_view, Command>;
cmSubcommandTable(std::initializer_list<InitElem> init);
bool operator()(cm::string_view key, std::vector<std::string> const& args,
cmExecutionStatus& status) const;
private:
std::vector<Elem> Impl;
};
#endif
......@@ -426,6 +426,7 @@ CMAKE_CXX_SOURCES="\
cmStringAlgorithms \
cmStringReplaceHelper \
cmStringCommand \
cmSubcommandTable \
cmSubdirCommand \
cmSystemTools \
cmTarget \
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment