From f7841227035e5533f864def9aafcfaedcf742e05 Mon Sep 17 00:00:00 2001 From: Ollrogge Date: Mon, 15 Jan 2024 11:56:06 +0100 Subject: [PATCH] LibCore: Refactor template definitions to header in ArgsParser This allows for automatic template instatiation and remove the need to explicitly instantiate the template functions for different types. --- Userland/Libraries/LibCore/ArgsParser.cpp | 96 ----------------------- Userland/Libraries/LibCore/ArgsParser.h | 86 ++++++++++++++++++-- 2 files changed, 81 insertions(+), 101 deletions(-) diff --git a/Userland/Libraries/LibCore/ArgsParser.cpp b/Userland/Libraries/LibCore/ArgsParser.cpp index 5ce62712c9..f8ad3940db 100644 --- a/Userland/Libraries/LibCore/ArgsParser.cpp +++ b/Userland/Libraries/LibCore/ArgsParser.cpp @@ -490,33 +490,6 @@ void ArgsParser::add_option(StringView& value, char const* help_string, char con add_option(move(option)); } -template -void ArgsParser::add_option(I& value, char const* help_string, char const* long_name, char short_name, char const* value_name, OptionHideMode hide_mode) -{ - Option option { - OptionArgumentMode::Required, - help_string, - long_name, - short_name, - value_name, - [&value](StringView view) -> ErrorOr { - Optional opt = view.to_number(); - value = opt.value_or(0); - return opt.has_value(); - }, - hide_mode, - }; - add_option(move(option)); -} - -template void ArgsParser::add_option(i16&, char const*, char const*, char, char const*, OptionHideMode); -template void ArgsParser::add_option(i32&, char const*, char const*, char, char const*, OptionHideMode); -template void ArgsParser::add_option(i64&, char const*, char const*, char, char const*, OptionHideMode); -template void ArgsParser::add_option(u8&, char const*, char const*, char, char const*, OptionHideMode); -template void ArgsParser::add_option(u16&, char const*, char const*, char, char const*, OptionHideMode); -template void ArgsParser::add_option(u32&, char const*, char const*, char, char const*, OptionHideMode); -template void ArgsParser::add_option(u64&, char const*, char const*, char, char const*, OptionHideMode); - void ArgsParser::add_option(double& value, char const* help_string, char const* long_name, char short_name, char const* value_name, OptionHideMode hide_mode) { Option option { @@ -552,49 +525,6 @@ void ArgsParser::add_option(Optional& value, char const* help_string, ch add_option(move(option)); } -void ArgsParser::add_option(Optional& value, char const* help_string, char const* long_name, char short_name, char const* value_name, OptionHideMode hide_mode) -{ - Option option { - OptionArgumentMode::Required, - help_string, - long_name, - short_name, - value_name, - [&value](StringView s) -> ErrorOr { - value = s.to_number(); - return value.has_value(); - }, - hide_mode, - }; - add_option(move(option)); -} - -void ArgsParser::add_option(Vector& values, char const* help_string, char const* long_name, char short_name, char const* value_name, char separator, OptionHideMode hide_mode) -{ - Option option { - OptionArgumentMode::Required, - help_string, - long_name, - short_name, - value_name, - [&values, separator](StringView s) -> ErrorOr { - bool parsed_all_values = true; - - s.for_each_split_view(separator, SplitBehavior::Nothing, [&](auto value) { - if (auto maybe_value = AK::StringUtils::convert_to_uint(value); maybe_value.has_value()) - values.append(*maybe_value); - else - parsed_all_values = false; - }); - - return parsed_all_values; - }, - hide_mode - }; - - add_option(move(option)); -} - void ArgsParser::add_option(Vector& values, char const* help_string, char const* long_name, char short_name, char const* value_name, OptionHideMode hide_mode) { Option option { @@ -663,32 +593,6 @@ void ArgsParser::add_positional_argument(String& value, char const* help_string, add_positional_argument(move(arg)); } -template -void ArgsParser::add_positional_argument(I& value, char const* help_string, char const* name, Required required) -{ - Arg arg { - help_string, - name, - required == Required::Yes ? 1 : 0, - 1, - [&value](StringView view) -> ErrorOr { - Optional opt = view.to_number(); - value = opt.value_or(0); - return opt.has_value(); - }, - }; - add_positional_argument(move(arg)); -} - -template void ArgsParser::add_positional_argument(int&, char const*, char const*, Required); -template void ArgsParser::add_positional_argument(long&, char const*, char const*, Required); -template void ArgsParser::add_positional_argument(long long&, char const*, char const*, Required); -template void ArgsParser::add_positional_argument(short&, char const*, char const*, Required); -template void ArgsParser::add_positional_argument(unsigned&, char const*, char const*, Required); -template void ArgsParser::add_positional_argument(unsigned long&, char const*, char const*, Required); -template void ArgsParser::add_positional_argument(unsigned long long&, char const*, char const*, Required); -template void ArgsParser::add_positional_argument(unsigned short&, char const*, char const*, Required); - void ArgsParser::add_positional_argument(double& value, char const* help_string, char const* name, Required required) { Arg arg { diff --git a/Userland/Libraries/LibCore/ArgsParser.h b/Userland/Libraries/LibCore/ArgsParser.h index 254fa317ed..e84998a30d 100644 --- a/Userland/Libraries/LibCore/ArgsParser.h +++ b/Userland/Libraries/LibCore/ArgsParser.h @@ -101,15 +101,77 @@ public: }, .hide_mode = hide_mode }); } + + template + void add_option(I& value, char const* help_string, char const* long_name, char short_name, char const* value_name, OptionHideMode hide_mode = OptionHideMode::None) + { + Option option { + OptionArgumentMode::Required, + help_string, + long_name, + short_name, + value_name, + [&value](StringView view) -> ErrorOr { + Optional opt = view.to_number(); + value = opt.value_or(0); + return opt.has_value(); + }, + hide_mode, + }; + add_option(move(option)); + } + + template + void add_option(Optional& value, char const* help_string, char const* long_name, char short_name, char const* value_name, OptionHideMode hide_mode = OptionHideMode::None) + { + + Option option { + OptionArgumentMode::Required, + help_string, + long_name, + short_name, + value_name, + [&value](StringView view) -> ErrorOr { + value = view.to_number(); + return value.has_value(); + }, + hide_mode, + }; + add_option(move(option)); + } + + template + void add_option(Vector& values, char const* help_string, char const* long_name, char short_name, char const* value_name, char separator = ',', OptionHideMode hide_mode = OptionHideMode::None) + { + + Option option { + OptionArgumentMode::Required, + help_string, + long_name, + short_name, + value_name, + [&values, separator](StringView s) -> ErrorOr { + bool parsed_all_values = true; + + s.for_each_split_view(separator, SplitBehavior::Nothing, [&](auto value) { + if (auto maybe_value = value.template to_number(); maybe_value.has_value()) + values.append(*maybe_value); + else + parsed_all_values = false; + }); + + return parsed_all_values; + }, + hide_mode + }; + + add_option(move(option)); + } void add_option(ByteString& value, char const* help_string, char const* long_name, char short_name, char const* value_name, OptionHideMode hide_mode = OptionHideMode::None); void add_option(String& value, char const* help_string, char const* long_name, char short_name, char const* value_name, OptionHideMode hide_mode = OptionHideMode::None); void add_option(StringView& value, char const* help_string, char const* long_name, char short_name, char const* value_name, OptionHideMode hide_mode = OptionHideMode::None); - template - void add_option(I& value, char const* help_string, char const* long_name, char short_name, char const* value_name, OptionHideMode hide_mode = OptionHideMode::None); void add_option(double& value, char const* help_string, char const* long_name, char short_name, char const* value_name, OptionHideMode hide_mode = OptionHideMode::None); void add_option(Optional& value, char const* help_string, char const* long_name, char short_name, char const* value_name, OptionHideMode hide_mode = OptionHideMode::None); - void add_option(Optional& value, char const* help_string, char const* long_name, char short_name, char const* value_name, OptionHideMode hide_mode = OptionHideMode::None); - void add_option(Vector& values, char const* help_string, char const* long_name, char short_name, char const* value_name, char separator = ',', OptionHideMode hide_mode = OptionHideMode::None); // Note: This option is being used when we expect the user to use the same option // multiple times (e.g. "program --option=example --option=anotherexample ..."). void add_option(Vector& values, char const* help_string, char const* long_name, char short_name, char const* value_name, OptionHideMode hide_mode = OptionHideMode::None); @@ -119,7 +181,21 @@ public: void add_positional_argument(StringView& value, char const* help_string, char const* name, Required required = Required::Yes); void add_positional_argument(String& value, char const* help_string, char const* name, Required required = Required::Yes); template - void add_positional_argument(I& value, char const* help_string, char const* name, Required required = Required::Yes); + void add_positional_argument(I& value, char const* help_string, char const* name, Required required = Required::Yes) + { + Arg arg { + help_string, + name, + required == Required::Yes ? 1 : 0, + 1, + [&value](StringView view) -> ErrorOr { + Optional opt = view.to_number(); + value = opt.value_or(0); + return opt.has_value(); + }, + }; + add_positional_argument(move(arg)); + } void add_positional_argument(double& value, char const* help_string, char const* name, Required required = Required::Yes); void add_positional_argument(Vector& value, char const* help_string, char const* name, Required required = Required::Yes); void add_positional_argument(Vector& value, char const* help_string, char const* name, Required required = Required::Yes);