diff options
-rw-r--r-- | Source/cmArgumentParser.cxx | 23 | ||||
-rw-r--r-- | Source/cmArgumentParser.h | 53 | ||||
-rw-r--r-- | Utilities/IWYU/mapping.imp | 2 |
3 files changed, 46 insertions, 32 deletions
diff --git a/Source/cmArgumentParser.cxx b/Source/cmArgumentParser.cxx index f0c4cfc..355cfdc 100644 --- a/Source/cmArgumentParser.cxx +++ b/Source/cmArgumentParser.cxx @@ -74,19 +74,16 @@ void Instance::Bind(std::vector<std::vector<std::string>>& val) this->ExpectValue = false; } -void Instance::Consume(cm::string_view arg, void* result, - std::vector<std::string>* unparsedArguments, - std::vector<cm::string_view>* keywordsMissingValue, - std::vector<cm::string_view>* parsedKeywords) +void Instance::Consume(cm::string_view arg) { auto const it = this->Bindings.Find(arg); if (it != this->Bindings.end()) { - if (parsedKeywords != nullptr) { - parsedKeywords->emplace_back(it->first); + if (this->ParsedKeywords != nullptr) { + this->ParsedKeywords->emplace_back(it->first); } - it->second(*this, result); - if (this->ExpectValue && keywordsMissingValue != nullptr) { - keywordsMissingValue->emplace_back(it->first); + it->second(*this); + if (this->ExpectValue && this->KeywordsMissingValue != nullptr) { + this->KeywordsMissingValue->emplace_back(it->first); } return; } @@ -97,13 +94,13 @@ void Instance::Consume(cm::string_view arg, void* result, this->CurrentList = nullptr; } else if (this->CurrentList != nullptr) { this->CurrentList->emplace_back(arg); - } else if (unparsedArguments != nullptr) { - unparsedArguments->emplace_back(arg); + } else if (this->UnparsedArguments != nullptr) { + this->UnparsedArguments->emplace_back(arg); } if (this->ExpectValue) { - if (keywordsMissingValue != nullptr) { - keywordsMissingValue->pop_back(); + if (this->KeywordsMissingValue != nullptr) { + this->KeywordsMissingValue->pop_back(); } this->ExpectValue = false; } diff --git a/Source/cmArgumentParser.h b/Source/cmArgumentParser.h index 26148d9..a26195d 100644 --- a/Source/cmArgumentParser.h +++ b/Source/cmArgumentParser.h @@ -16,10 +16,13 @@ #include "cmArgumentParserTypes.h" // IWYU pragma: keep +template <typename Result> +class cmArgumentParser; // IWYU pragma: keep + namespace ArgumentParser { class Instance; -using Action = std::function<void(Instance&, void*)>; +using Action = std::function<void(Instance&)>; // using ActionMap = cm::flat_map<cm::string_view, Action>; class ActionMap : public std::vector<std::pair<cm::string_view, Action>> @@ -32,8 +35,16 @@ public: class Instance { public: - Instance(ActionMap const& bindings) + Instance(ActionMap const& bindings, + std::vector<std::string>* unparsedArguments, + std::vector<cm::string_view>* keywordsMissingValue, + std::vector<cm::string_view>* parsedKeywords, + void* result = nullptr) : Bindings(bindings) + , UnparsedArguments(unparsedArguments) + , KeywordsMissingValue(keywordsMissingValue) + , ParsedKeywords(parsedKeywords) + , Result(result) { } @@ -54,16 +65,21 @@ public: this->Bind(*optVal); } - void Consume(cm::string_view arg, void* result, - std::vector<std::string>* unparsedArguments, - std::vector<cm::string_view>* keywordsMissingValue, - std::vector<cm::string_view>* parsedKeywords); + void Consume(cm::string_view arg); private: ActionMap const& Bindings; + std::vector<std::string>* UnparsedArguments = nullptr; + std::vector<cm::string_view>* KeywordsMissingValue = nullptr; + std::vector<cm::string_view>* ParsedKeywords = nullptr; + void* Result = nullptr; + std::string* CurrentString = nullptr; std::vector<std::string>* CurrentList = nullptr; bool ExpectValue = false; + + template <typename Result> + friend class ::cmArgumentParser; }; } // namespace ArgumentParser @@ -80,8 +96,9 @@ public: bool const inserted = this->Bindings .Emplace(name, - [member](ArgumentParser::Instance& instance, void* result) { - instance.Bind(static_cast<Result*>(result)->*member); + [member](ArgumentParser::Instance& instance) { + instance.Bind( + static_cast<Result*>(instance.Result)->*member); }) .second; assert(inserted), (void)inserted; @@ -94,10 +111,11 @@ public: std::vector<cm::string_view>* keywordsMissingValue = nullptr, std::vector<cm::string_view>* parsedKeywords = nullptr) const { - ArgumentParser::Instance instance(this->Bindings); + ArgumentParser::Instance instance(this->Bindings, unparsedArguments, + keywordsMissingValue, parsedKeywords, + &result); for (cm::string_view arg : args) { - instance.Consume(arg, &result, unparsedArguments, keywordsMissingValue, - parsedKeywords); + instance.Consume(arg); } } @@ -133,10 +151,10 @@ public: std::vector<cm::string_view>* keywordsMissingValue = nullptr, std::vector<cm::string_view>* parsedKeywords = nullptr) const { - ArgumentParser::Instance instance(this->Bindings); + ArgumentParser::Instance instance(this->Bindings, unparsedArguments, + keywordsMissingValue, parsedKeywords); for (cm::string_view arg : args) { - instance.Consume(arg, nullptr, unparsedArguments, keywordsMissingValue, - parsedKeywords); + instance.Consume(arg); } } @@ -145,10 +163,9 @@ protected: bool Bind(cm::string_view name, T& ref) { return this->Bindings - .Emplace(name, - [&ref](ArgumentParser::Instance& instance, void*) { - instance.Bind(ref); - }) + .Emplace( + name, + [&ref](ArgumentParser::Instance& instance) { instance.Bind(ref); }) .second; } diff --git a/Utilities/IWYU/mapping.imp b/Utilities/IWYU/mapping.imp index b80fc22..b0ed911 100644 --- a/Utilities/IWYU/mapping.imp +++ b/Utilities/IWYU/mapping.imp @@ -91,7 +91,7 @@ { symbol: [ "std::__decay_and_strip<cmFindPackageCommand::PathLabel &>::__type", private, "\"cmConfigure.h\"", public ] }, { symbol: [ "std::__decay_and_strip<cmGlobalNinjaGenerator::TargetAlias &>::__type", private, "\"cmConfigure.h\"", public ] }, { symbol: [ "std::__decay_and_strip<__gnu_cxx::__normal_iterator<const cmCTestTestHandler::cmCTestTestProperties *, std::vector<cmCTestTestHandler::cmCTestTestProperties, std::allocator<cmCTestTestHandler::cmCTestTestProperties> > > &>::__type", private, "\"cmConfigure.h\"", public ] }, - { symbol: [ "std::__decay_and_strip<const __gnu_cxx::__normal_iterator<std::pair<cm::string_view, std::function<void (ArgumentParser::Instance &, void *)> > *, std::vector<std::pair<cm::string_view, std::function<void (ArgumentParser::Instance &, void *)> >, std::allocator<std::pair<cm::string_view, std::function<void (ArgumentParser::Instance &, void *)> > > > > &>::__type", private, "\"cmConfigure.h\"", public ] }, + { symbol: [ "std::__decay_and_strip<const __gnu_cxx::__normal_iterator<std::pair<cm::string_view, std::function<void (ArgumentParser::Instance &)> > *, std::vector<std::pair<cm::string_view, std::function<void (ArgumentParser::Instance &)> >, std::allocator<std::pair<cm::string_view, std::function<void (ArgumentParser::Instance &)> > > > > &>::__type", private, "\"cmConfigure.h\"", public ] }, { symbol: [ "std::__success_type<std::chrono::duration<double, std::ratio<1, 1> > >::type", private, "\"cmConfigure.h\"", public ] }, { symbol: [ "std::__success_type<std::chrono::duration<long, std::ratio<1, 1000000000> > >::type", private, "\"cmConfigure.h\"", public ] }, { symbol: [ "std::enable_if<true, std::chrono::duration<long, std::ratio<1, 1> > >::type", private, "\"cmConfigure.h\"", public ] }, |