aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRobert Schumacher <roschuma@microsoft.com>2017-04-01 03:30:52 -0700
committerRobert Schumacher <roschuma@microsoft.com>2017-04-01 03:30:52 -0700
commitb788c2b2098093843d4521d12a617199af39e7dc (patch)
treeffcd55b39c9019adab6993c99dde130fa2aceb5d
parentbb865fb312d9f603a18a40768ae357da0421905d (diff)
downloadvcpkg-b788c2b2098093843d4521d12a617199af39e7dc.tar.gz
vcpkg-b788c2b2098093843d4521d12a617199af39e7dc.zip
[vcpkg] ImmutableSortedVector is actually Mutable via move.
Use fmap instead of construct/insert. Don't cache VS2015 instances since it is called once. Add ParagraphDataMap alias.
-rw-r--r--toolsrc/include/ImmutableSortedVector.h73
-rw-r--r--toolsrc/include/Paragraphs.h10
-rw-r--r--toolsrc/include/SortedVector.h55
-rw-r--r--toolsrc/include/vcpkglib.h4
-rw-r--r--toolsrc/src/commands_install.cpp18
-rw-r--r--toolsrc/src/commands_portsdiff.cpp2
-rw-r--r--toolsrc/src/commands_update.cpp2
-rw-r--r--toolsrc/src/vcpkg_paths.cpp29
-rw-r--r--toolsrc/src/vcpkglib.cpp2
-rw-r--r--toolsrc/vcpkglib/vcpkglib.vcxproj2
-rw-r--r--toolsrc/vcpkglib/vcpkglib.vcxproj.filters6
11 files changed, 90 insertions, 113 deletions
diff --git a/toolsrc/include/ImmutableSortedVector.h b/toolsrc/include/ImmutableSortedVector.h
deleted file mode 100644
index 0756068eb..000000000
--- a/toolsrc/include/ImmutableSortedVector.h
+++ /dev/null
@@ -1,73 +0,0 @@
-#pragma once
-
-#include <vector>
-#include <algorithm>
-
-// Add more forwarding functions to the delegate std::vector as needed.
-namespace vcpkg
-{
- template <class T>
- class ImmutableSortedVector
- {
- typedef typename std::vector<T>::size_type size_type;
-
- public:
- static ImmutableSortedVector<T> create(std::vector<T> vector)
- {
- ImmutableSortedVector out;
- out.delegate = std::move(vector);
- if (!std::is_sorted(out.delegate.cbegin(), out.delegate.cend()))
- {
- std::sort(out.delegate.begin(), out.delegate.end());
- }
-
- return out;
- }
-
- template <class Compare>
- static ImmutableSortedVector<T> create(std::vector<T> vector, Compare comp)
- {
- ImmutableSortedVector<T> out;
- out.delegate = std::move(vector);
- if (!std::is_sorted(out.delegate.cbegin(), out.delegate.cend(), comp))
- {
- std::sort(out.delegate.begin(), out.delegate.end(), comp);
- }
-
- return out;
- }
-
- typename std::vector<T>::const_iterator begin() const
- {
- return this->delegate.cbegin();
- }
-
- typename std::vector<T>::const_iterator end() const
- {
- return this->delegate.cend();
- }
-
- typename std::vector<T>::const_iterator cbegin() const
- {
- return this->delegate.cbegin();
- }
-
- typename std::vector<T>::const_iterator cend() const
- {
- return this->delegate.cend();
- }
-
- bool empty() const
- {
- return this->delegate.empty();
- }
-
- size_type size() const
- {
- return this->delegate.size();
- }
-
- private:
- std::vector<T> delegate;
- };
-}
diff --git a/toolsrc/include/Paragraphs.h b/toolsrc/include/Paragraphs.h
index 39880192c..26f81ffad 100644
--- a/toolsrc/include/Paragraphs.h
+++ b/toolsrc/include/Paragraphs.h
@@ -9,10 +9,12 @@
namespace vcpkg::Paragraphs
{
- expected<std::unordered_map<std::string, std::string>> get_single_paragraph(const fs::path& control_path);
- expected<std::vector<std::unordered_map<std::string, std::string>>> get_paragraphs(const fs::path& control_path);
- expected<std::unordered_map<std::string, std::string>> parse_single_paragraph(const std::string& str);
- expected<std::vector<std::unordered_map<std::string, std::string>>> parse_paragraphs(const std::string& str);
+ using ParagraphDataMap = std::unordered_map<std::string, std::string>;
+
+ expected<ParagraphDataMap> get_single_paragraph(const fs::path& control_path);
+ expected<std::vector<ParagraphDataMap>> get_paragraphs(const fs::path& control_path);
+ expected<ParagraphDataMap> parse_single_paragraph(const std::string& str);
+ expected<std::vector<ParagraphDataMap>> parse_paragraphs(const std::string& str);
expected<SourceParagraph> try_load_port(const fs::path& control_path);
diff --git a/toolsrc/include/SortedVector.h b/toolsrc/include/SortedVector.h
new file mode 100644
index 000000000..d11c3544a
--- /dev/null
+++ b/toolsrc/include/SortedVector.h
@@ -0,0 +1,55 @@
+#pragma once
+
+#include <vector>
+#include <algorithm>
+
+// Add more forwarding functions to the m_data std::vector as needed.
+namespace vcpkg
+{
+ template <class T>
+ class SortedVector
+ {
+ public:
+ using size_type = typename std::vector<T>::size_type;
+ using iterator = typename std::vector<T>::const_iterator;
+
+ explicit SortedVector<T>(std::vector<T> v) : m_data(std::move(v))
+ {
+ if (!std::is_sorted(m_data.begin(), m_data.end()))
+ {
+ std::sort(m_data.begin(), m_data.end());
+ }
+ }
+ template <class Compare>
+ SortedVector<T>(std::vector<T> v, Compare comp) : m_data(std::move(v))
+ {
+ if (!std::is_sorted(m_data.cbegin(), m_data.cend(), comp))
+ {
+ std::sort(m_data.begin(), m_data.end(), comp);
+ }
+ }
+
+ iterator begin() const
+ {
+ return this->m_data.cbegin();
+ }
+
+ iterator end() const
+ {
+ return this->m_data.cend();
+ }
+
+ bool empty() const
+ {
+ return this->m_data.empty();
+ }
+
+ size_type size() const
+ {
+ return this->m_data.size();
+ }
+
+ private:
+ std::vector<T> m_data;
+ };
+}
diff --git a/toolsrc/include/vcpkglib.h b/toolsrc/include/vcpkglib.h
index b589c1617..bab1c28a1 100644
--- a/toolsrc/include/vcpkglib.h
+++ b/toolsrc/include/vcpkglib.h
@@ -2,7 +2,7 @@
#include "StatusParagraphs.h"
#include "vcpkg_paths.h"
-#include "ImmutableSortedVector.h"
+#include "SortedVector.h"
namespace vcpkg
{
@@ -15,7 +15,7 @@ namespace vcpkg
struct StatusParagraph_and_associated_files
{
StatusParagraph pgh;
- ImmutableSortedVector<std::string> files;
+ SortedVector<std::string> files;
};
std::vector<StatusParagraph*> get_installed_ports(const StatusParagraphs& status_db);
diff --git a/toolsrc/src/commands_install.cpp b/toolsrc/src/commands_install.cpp
index e504cf8ee..bba3c665f 100644
--- a/toolsrc/src/commands_install.cpp
+++ b/toolsrc/src/commands_install.cpp
@@ -106,14 +106,14 @@ namespace vcpkg::Commands::Install
continue;
}
- output.insert(output.end(), t.files.cbegin(), t.files.cend());
+ output.insert(output.end(), t.files.begin(), t.files.end());
}
std::sort(output.begin(), output.end());
return output;
}
- static ImmutableSortedVector<std::string> build_list_of_package_files(const fs::path& package_dir)
+ static SortedVector<std::string> build_list_of_package_files(const fs::path& package_dir)
{
const std::vector<fs::path> package_file_paths = Files::recursive_find_all_files_in_dir(package_dir);
const size_t package_remove_char_count = package_dir.generic_string().size() + 1; // +1 for the slash
@@ -124,16 +124,16 @@ namespace vcpkg::Commands::Install
return std::move(as_string);
});
- return ImmutableSortedVector<std::string>::create(std::move(package_files));
+ return SortedVector<std::string>(std::move(package_files));
}
- static ImmutableSortedVector<std::string> build_list_of_installed_files(const std::vector<StatusParagraph_and_associated_files>& pgh_and_files, const triplet& triplet)
+ static SortedVector<std::string> build_list_of_installed_files(const std::vector<StatusParagraph_and_associated_files>& pgh_and_files, const triplet& triplet)
{
std::vector<std::string> installed_files = extract_files_in_triplet(pgh_and_files, triplet);
const size_t installed_remove_char_count = triplet.canonical_name().size() + 1; // +1 for the slash
remove_first_n_chars(&installed_files, installed_remove_char_count);
- return ImmutableSortedVector<std::string>::create(std::move(installed_files));
+ return SortedVector<std::string>(std::move(installed_files));
}
void install_package(const vcpkg_paths& paths, const BinaryParagraph& binary_paragraph, StatusParagraphs* status_db)
@@ -142,12 +142,12 @@ namespace vcpkg::Commands::Install
const triplet& triplet = binary_paragraph.spec.target_triplet();
const std::vector<StatusParagraph_and_associated_files> pgh_and_files = get_installed_files(paths, *status_db);
- const ImmutableSortedVector<std::string> package_files = build_list_of_package_files(package_dir);
- const ImmutableSortedVector<std::string> installed_files = build_list_of_installed_files(pgh_and_files, triplet);
+ const SortedVector<std::string> package_files = build_list_of_package_files(package_dir);
+ const SortedVector<std::string> installed_files = build_list_of_installed_files(pgh_and_files, triplet);
std::vector<std::string> intersection;
- std::set_intersection(package_files.cbegin(), package_files.cend(),
- installed_files.cbegin(), installed_files.cend(),
+ std::set_intersection(package_files.begin(), package_files.end(),
+ installed_files.begin(), installed_files.end(),
std::back_inserter(intersection));
if (!intersection.empty())
diff --git a/toolsrc/src/commands_portsdiff.cpp b/toolsrc/src/commands_portsdiff.cpp
index d3c8b29e1..ce1e6a4c7 100644
--- a/toolsrc/src/commands_portsdiff.cpp
+++ b/toolsrc/src/commands_portsdiff.cpp
@@ -4,7 +4,7 @@
#include "vcpkg_Maps.h"
#include "SourceParagraph.h"
#include "Paragraphs.h"
-#include "ImmutableSortedVector.h"
+#include "SortedVector.h"
namespace vcpkg::Commands::PortsDiff
{
diff --git a/toolsrc/src/commands_update.cpp b/toolsrc/src/commands_update.cpp
index 701302dfc..b6c933521 100644
--- a/toolsrc/src/commands_update.cpp
+++ b/toolsrc/src/commands_update.cpp
@@ -44,7 +44,7 @@ namespace vcpkg::Commands::Update
const StatusParagraphs status_db = database_load_check(paths);
- const auto outdated_packages = ImmutableSortedVector<outdated_package>::create(find_outdated_packages(paths, status_db),
+ const auto outdated_packages = SortedVector<outdated_package>(find_outdated_packages(paths, status_db),
&outdated_package::compare_by_name);
if (outdated_packages.empty())
diff --git a/toolsrc/src/vcpkg_paths.cpp b/toolsrc/src/vcpkg_paths.cpp
index dd26e89e4..eb2478f2e 100644
--- a/toolsrc/src/vcpkg_paths.cpp
+++ b/toolsrc/src/vcpkg_paths.cpp
@@ -5,6 +5,7 @@
#include "vcpkg_System.h"
#include "package_spec.h"
#include "vcpkg_Files.h"
+#include "vcpkg_Util.h"
namespace vcpkg
{
@@ -62,10 +63,7 @@ namespace vcpkg
return {};
}
- const std::vector<std::string> paths_to_add = Strings::split(out.output, "\n");
- std::vector<fs::path> v;
- v.insert(v.end(), paths_to_add.cbegin(), paths_to_add.cend());
- return v;
+ return Util::fmap(Strings::split(out.output, "\n"), [](auto&& s) { return fs::path(s); });
}
static fs::path fetch_dependency(const fs::path scripts_folder, const std::wstring& tool_name, const fs::path& expected_downloaded_path)
@@ -252,21 +250,16 @@ namespace vcpkg
return Strings::split(ec_data.output, "\n");
}
- static const optional<fs::path>& get_VS2015_installation_instance()
+ static optional<fs::path> get_VS2015_installation_instance()
{
- static const optional<fs::path> vs2015_path = []() -> optional<fs::path>
- {
- const optional<std::wstring> vs2015_cmntools_optional = System::get_environmental_variable(L"VS140COMNTOOLS");
- if (auto v = vs2015_cmntools_optional.get())
- {
- static const fs::path vs2015_cmntools = fs::path(*v).parent_path(); // The call to parent_path() is needed because the env variable has a trailing backslash
- static const fs::path vs2015_path = vs2015_cmntools.parent_path().parent_path();
- return vs2015_path;
- }
+ const optional<std::wstring> vs2015_cmntools_optional = System::get_environmental_variable(L"VS140COMNTOOLS");
+ if (auto v = vs2015_cmntools_optional.get())
+ {
+ const fs::path vs2015_cmntools = fs::path(*v).parent_path(); // The call to parent_path() is needed because the env variable has a trailing backslash
+ return vs2015_cmntools.parent_path().parent_path();
+ }
- return nullopt;
- }();
- return vs2015_path;
+ return nullopt;
}
static toolset_t find_toolset_instance(const vcpkg_paths& paths)
@@ -312,7 +305,7 @@ namespace vcpkg
}
// VS2015
- const optional<fs::path>& vs_2015_installation_instance = get_VS2015_installation_instance();
+ const optional<fs::path> vs_2015_installation_instance = get_VS2015_installation_instance();
if (auto v = vs_2015_installation_instance.get())
{
const fs::path vs2015_vcvarsall_bat = *v / "VC" / "vcvarsall.bat";
diff --git a/toolsrc/src/vcpkglib.cpp b/toolsrc/src/vcpkglib.cpp
index 47592ea1d..152b9ac2b 100644
--- a/toolsrc/src/vcpkglib.cpp
+++ b/toolsrc/src/vcpkglib.cpp
@@ -208,7 +208,7 @@ namespace vcpkg
}
), installed_files_of_current_pgh.end());
- StatusParagraph_and_associated_files pgh_and_files = { *pgh, ImmutableSortedVector<std::string>::create(std::move(installed_files_of_current_pgh)) };
+ StatusParagraph_and_associated_files pgh_and_files = { *pgh, SortedVector<std::string>(std::move(installed_files_of_current_pgh)) };
installed_files.push_back(std::move(pgh_and_files));
}
diff --git a/toolsrc/vcpkglib/vcpkglib.vcxproj b/toolsrc/vcpkglib/vcpkglib.vcxproj
index 664c33dce..d79c77a94 100644
--- a/toolsrc/vcpkglib/vcpkglib.vcxproj
+++ b/toolsrc/vcpkglib/vcpkglib.vcxproj
@@ -146,7 +146,7 @@
<ClInclude Include="..\include\coff_file_reader.h" />
<ClInclude Include="..\include\vcpkg_expected.h" />
<ClInclude Include="..\include\filesystem_fs.h" />
- <ClInclude Include="..\include\ImmutableSortedVector.h" />
+ <ClInclude Include="..\include\SortedVector.h" />
<ClInclude Include="..\include\MachineType.h" />
<ClInclude Include="..\include\metrics.h" />
<ClInclude Include="..\include\opt_bool.h" />
diff --git a/toolsrc/vcpkglib/vcpkglib.vcxproj.filters b/toolsrc/vcpkglib/vcpkglib.vcxproj.filters
index 914efbb91..acfecbcc5 100644
--- a/toolsrc/vcpkglib/vcpkglib.vcxproj.filters
+++ b/toolsrc/vcpkglib/vcpkglib.vcxproj.filters
@@ -236,9 +236,6 @@
<ClInclude Include="..\include\vcpkglib.h">
<Filter>Header Files</Filter>
</ClInclude>
- <ClInclude Include="..\include\ImmutableSortedVector.h">
- <Filter>Header Files</Filter>
- </ClInclude>
<ClInclude Include="..\include\opt_bool.h">
<Filter>Header Files</Filter>
</ClInclude>
@@ -311,5 +308,8 @@
<ClInclude Include="..\include\vcpkg_Util.h">
<Filter>Header Files</Filter>
</ClInclude>
+ <ClInclude Include="..\include\SortedVector.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
</ItemGroup>
</Project> \ No newline at end of file