From 74f788d04f2ff8ce66302b6be401ec9b7e85a42f Mon Sep 17 00:00:00 2001 From: Robert Schumacher Date: Sat, 1 Apr 2017 01:09:34 -0700 Subject: [PATCH] [vcpkg] Replace explicit bulk operations with fmap --- toolsrc/include/vcpkg_Input.h | 9 ++++----- toolsrc/include/vcpkg_Util.h | 24 +++++++++++++++++++++++ toolsrc/src/commands_install.cpp | 15 ++++++++++++-- toolsrc/src/commands_remove.cpp | 11 +++++++++-- toolsrc/src/vcpkg_Input.cpp | 21 +------------------- toolsrc/vcpkglib/vcpkglib.vcxproj | 1 + toolsrc/vcpkglib/vcpkglib.vcxproj.filters | 3 +++ 7 files changed, 55 insertions(+), 29 deletions(-) create mode 100644 toolsrc/include/vcpkg_Util.h diff --git a/toolsrc/include/vcpkg_Input.h b/toolsrc/include/vcpkg_Input.h index 96cbeecc3..4f102d029 100644 --- a/toolsrc/include/vcpkg_Input.h +++ b/toolsrc/include/vcpkg_Input.h @@ -5,11 +5,10 @@ namespace vcpkg::Input { - package_spec check_and_get_package_spec(const std::string& package_spec_as_string, const triplet& default_target_triplet, const std::string& example_text); - - std::vector check_and_get_package_specs(const std::vector& package_specs_as_strings, const triplet& default_target_triplet, const std::string& example_text); + package_spec check_and_get_package_spec( + const std::string& package_spec_as_string, + const triplet& default_target_triplet, + cstring_view example_text); void check_triplet(const triplet& t, const vcpkg_paths& paths); - - void check_triplets(const std::vector& triplets, const vcpkg_paths& paths); } diff --git a/toolsrc/include/vcpkg_Util.h b/toolsrc/include/vcpkg_Util.h new file mode 100644 index 000000000..4ebb2a802 --- /dev/null +++ b/toolsrc/include/vcpkg_Util.h @@ -0,0 +1,24 @@ +#pragma once + +#include +#include + +namespace vcpkg::Util +{ + template + using FmapOut = decltype(std::declval()(std::declval()[0])); + + template> + std::vector fmap(const Cont& xs, Func&& f) + { + using O = decltype(f(xs[0])); + + std::vector ret; + ret.reserve(xs.size()); + + for (auto&& x : xs) + ret.push_back(f(x)); + + return ret; + } +} \ No newline at end of file diff --git a/toolsrc/src/commands_install.cpp b/toolsrc/src/commands_install.cpp index 85e6fee72..50ea0a603 100644 --- a/toolsrc/src/commands_install.cpp +++ b/toolsrc/src/commands_install.cpp @@ -6,6 +6,7 @@ #include "vcpkg_System.h" #include "vcpkg_Dependencies.h" #include "vcpkg_Input.h" +#include "vcpkg_Util.h" #include "Paragraphs.h" namespace vcpkg::Commands::Install @@ -185,16 +186,25 @@ namespace vcpkg::Commands::Install void perform_and_exit(const vcpkg_cmd_arguments& args, const vcpkg_paths& paths, const triplet& default_target_triplet) { + // input sanitization static const std::string example = Commands::Help::create_example_string("install zlib zlib:x64-windows curl boost"); args.check_min_arg_count(1, example); - std::vector specs = Input::check_and_get_package_specs(args.command_arguments, default_target_triplet, example); - Input::check_triplets(specs, paths); + + auto specs = Util::fmap(args.command_arguments, [&](auto&& arg) + { + auto spec = Input::check_and_get_package_spec(arg, default_target_triplet, example); + Input::check_triplet(spec.target_triplet(), paths); + return spec; + }); + args.check_and_get_optional_command_arguments({}); + // create the plan StatusParagraphs status_db = database_load_check(paths); std::vector install_plan = Dependencies::create_install_plan(paths, specs, status_db); Checks::check_exit(VCPKG_LINE_INFO, !install_plan.empty(), "Install plan cannot be empty"); + // log the plan std::string specs_string = install_plan[0].spec.toString(); for (size_t i = 1; i < install_plan.size(); ++i) { @@ -203,6 +213,7 @@ namespace vcpkg::Commands::Install } TrackProperty("installplan", specs_string); + // execute the plan for (const package_spec_with_install_plan& action : install_plan) { try diff --git a/toolsrc/src/commands_remove.cpp b/toolsrc/src/commands_remove.cpp index 9f4c76b11..a0f846470 100644 --- a/toolsrc/src/commands_remove.cpp +++ b/toolsrc/src/commands_remove.cpp @@ -4,6 +4,7 @@ #include "vcpkg_System.h" #include "vcpkg_Input.h" #include "vcpkg_Dependencies.h" +#include "vcpkg_Util.h" namespace vcpkg::Commands::Remove { @@ -168,8 +169,14 @@ namespace vcpkg::Commands::Remove { static const std::string example = Commands::Help::create_example_string("remove zlib zlib:x64-windows curl boost"); args.check_min_arg_count(1, example); - std::vector specs = Input::check_and_get_package_specs(args.command_arguments, default_target_triplet, example); - Input::check_triplets(specs, paths); + + auto specs = Util::fmap(args.command_arguments, [&](auto&& arg) + { + auto spec = Input::check_and_get_package_spec(arg, default_target_triplet, example); + Input::check_triplet(spec.target_triplet(), paths); + return spec; + }); + const std::unordered_set options = args.check_and_get_optional_command_arguments({ OPTION_PURGE, OPTION_RECURSE, OPTION_DRY_RUN }); const bool alsoRemoveFolderFromPackages = options.find(OPTION_PURGE) != options.end(); const bool isRecursive = options.find(OPTION_RECURSE) != options.end(); diff --git a/toolsrc/src/vcpkg_Input.cpp b/toolsrc/src/vcpkg_Input.cpp index ac89981fb..82dcca8a8 100644 --- a/toolsrc/src/vcpkg_Input.cpp +++ b/toolsrc/src/vcpkg_Input.cpp @@ -6,7 +6,7 @@ namespace vcpkg::Input { - package_spec check_and_get_package_spec(const std::string& package_spec_as_string, const triplet& default_target_triplet, const std::string& example_text) + package_spec check_and_get_package_spec(const std::string& package_spec_as_string, const triplet& default_target_triplet, cstring_view example_text) { const std::string as_lowercase = Strings::ascii_to_lowercase(package_spec_as_string); expected expected_spec = package_spec::from_string(as_lowercase, default_target_triplet); @@ -21,17 +21,6 @@ namespace vcpkg::Input Checks::exit_fail(VCPKG_LINE_INFO); } - std::vector check_and_get_package_specs(const std::vector& package_specs_as_strings, const triplet& default_target_triplet, const std::string& example_text) - { - std::vector specs; - for (const std::string& spec : package_specs_as_strings) - { - specs.push_back(check_and_get_package_spec(spec, default_target_triplet, example_text)); - } - - return specs; - } - void check_triplet(const triplet& t, const vcpkg_paths& paths) { if (!paths.is_valid_triplet(t)) @@ -42,12 +31,4 @@ namespace vcpkg::Input Checks::exit_fail(VCPKG_LINE_INFO); } } - - void check_triplets(const std::vector& triplets, const vcpkg_paths& paths) - { - for (const package_spec& spec : triplets) - { - check_triplet(spec.target_triplet(), paths); - } - } } diff --git a/toolsrc/vcpkglib/vcpkglib.vcxproj b/toolsrc/vcpkglib/vcpkglib.vcxproj index c6ba877d0..664c33dce 100644 --- a/toolsrc/vcpkglib/vcpkglib.vcxproj +++ b/toolsrc/vcpkglib/vcpkglib.vcxproj @@ -178,6 +178,7 @@ + diff --git a/toolsrc/vcpkglib/vcpkglib.vcxproj.filters b/toolsrc/vcpkglib/vcpkglib.vcxproj.filters index c06e216ef..914efbb91 100644 --- a/toolsrc/vcpkglib/vcpkglib.vcxproj.filters +++ b/toolsrc/vcpkglib/vcpkglib.vcxproj.filters @@ -308,5 +308,8 @@ Header Files + + Header Files + \ No newline at end of file