Forráskód Böngészése

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.
Ollrogge 1 éve
szülő
commit
f784122703

+ 0 - 96
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<Integral I>
-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<bool> {
-            Optional<I> opt = view.to_number<I>();
-            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<double>& value, char const* help_string, ch
     add_option(move(option));
 }
 
-void ArgsParser::add_option(Optional<size_t>& 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<bool> {
-            value = s.to_number<size_t>();
-            return value.has_value();
-        },
-        hide_mode,
-    };
-    add_option(move(option));
-}
-
-void ArgsParser::add_option(Vector<size_t>& 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> {
-            bool parsed_all_values = true;
-
-            s.for_each_split_view(separator, SplitBehavior::Nothing, [&](auto value) {
-                if (auto maybe_value = AK::StringUtils::convert_to_uint<size_t>(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<ByteString>& 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<Integral I>
-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<bool> {
-            Optional<I> opt = view.to_number<I>();
-            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 {

+ 81 - 5
Userland/Libraries/LibCore/ArgsParser.h

@@ -101,15 +101,77 @@ public:
             },
             .hide_mode = hide_mode });
     }
+
+    template<Integral I>
+    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<bool> {
+                Optional<I> opt = view.to_number<I>();
+                value = opt.value_or(0);
+                return opt.has_value();
+            },
+            hide_mode,
+        };
+        add_option(move(option));
+    }
+
+    template<Integral I>
+    void add_option(Optional<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<bool> {
+                value = view.to_number<I>();
+                return value.has_value();
+            },
+            hide_mode,
+        };
+        add_option(move(option));
+    }
+
+    template<Integral I>
+    void add_option(Vector<I>& 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> {
+                bool parsed_all_values = true;
+
+                s.for_each_split_view(separator, SplitBehavior::Nothing, [&](auto value) {
+                    if (auto maybe_value = value.template to_number<I>(); 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<Integral I>
-    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<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<size_t>& 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<size_t>& 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<ByteString>& 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<Integral I>
-    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<bool> {
+                Optional<I> opt = view.to_number<I>();
+                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<ByteString>& value, char const* help_string, char const* name, Required required = Required::Yes);
     void add_positional_argument(Vector<StringView>& value, char const* help_string, char const* name, Required required = Required::Yes);