Browse Source

Introduce cmSubcommandTable

Regina Pfeifer 6 years ago
parent
commit
b66b7464ab
4 changed files with 70 additions and 0 deletions
  1. 2 0
      Source/CMakeLists.txt
  2. 31 0
      Source/cmSubcommandTable.cxx
  3. 36 0
      Source/cmSubcommandTable.h
  4. 1 0
      bootstrap

+ 2 - 0
Source/CMakeLists.txt

@@ -639,6 +639,8 @@ set(SRCS
   cmStringReplaceHelper.cxx
   cmStringReplaceHelper.cxx
   cmStringCommand.cxx
   cmStringCommand.cxx
   cmStringCommand.h
   cmStringCommand.h
+  cmSubcommandTable.cxx
+  cmSubcommandTable.h
   cmSubdirCommand.cxx
   cmSubdirCommand.cxx
   cmSubdirCommand.h
   cmSubdirCommand.h
   cmSubdirDependsCommand.cxx
   cmSubdirDependsCommand.cxx

+ 31 - 0
Source/cmSubcommandTable.cxx

@@ -0,0 +1,31 @@
+/* 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;
+}

+ 36 - 0
Source/cmSubcommandTable.h

@@ -0,0 +1,36 @@
+/* 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

+ 1 - 0
bootstrap

@@ -426,6 +426,7 @@ CMAKE_CXX_SOURCES="\
   cmStringAlgorithms \
   cmStringAlgorithms \
   cmStringReplaceHelper \
   cmStringReplaceHelper \
   cmStringCommand \
   cmStringCommand \
+  cmSubcommandTable \
   cmSubdirCommand \
   cmSubdirCommand \
   cmSystemTools \
   cmSystemTools \
   cmTarget \
   cmTarget \