23 [[nodiscard]]
const std::string&
getName()
const {
return theName; }
27 [[nodiscard]]
virtual std::string
help(std::span<const TclObject> tokens)
const = 0;
38 template<
typename ITER>
41 bool caseSensitive =
true);
42 template<
typename RANGE>
44 RANGE&& possibleValues,
45 bool caseSensitive =
true);
46 template<
typename RANGE>
54 std::span<const std::string_view> input);
60 void checkNumArgs(std::span<const TclObject> tokens,
unsigned exactly,
const char* errMessage)
const;
61 void checkNumArgs(std::span<const TclObject> tokens,
AtLeast atLeast,
const char* errMessage)
const;
62 void checkNumArgs(std::span<const TclObject> tokens,
Between between,
const char* errMessage)
const;
63 void checkNumArgs(std::span<const TclObject> tokens,
unsigned exactly,
Prefix prefix,
const char* errMessage)
const;
71 template<
typename String>
73 : theName(
std::forward<String>(name_))
80 static bool equalHead(std::string_view s1, std::string_view s2,
bool caseSensitive);
81 template<
typename ITER>
82 static std::vector<std::string_view> filter(
83 std::string_view str, ITER
begin, ITER
end,
bool caseSensitive);
84 template<
typename RANGE>
85 static std::vector<std::string_view> filter(
86 std::string_view str, RANGE&& range,
bool caseSensitive);
87 static bool completeImpl(std::string& str, std::vector<std::string_view>
matches,
89 static void completeFileNameImpl(std::vector<std::string>& tokens,
91 std::vector<std::string_view>
matches);
93 const std::string theName;
100 std::string_view str, ITER
begin, ITER
end,
bool caseSensitive)
102 std::vector<std::string_view> result;
103 for (
auto it =
begin; it !=
end; ++it) {
104 if (equalHead(str, *it, caseSensitive)) {
105 result.push_back(*it);
115 return filter(str, std::begin(range), std::end(range), caseSensitive);