summaryrefslogtreecommitdiff
path: root/graphics/asymptote/LspCpp/third_party/uri/src/detail/uri_advance_parts.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'graphics/asymptote/LspCpp/third_party/uri/src/detail/uri_advance_parts.cpp')
-rw-r--r--graphics/asymptote/LspCpp/third_party/uri/src/detail/uri_advance_parts.cpp78
1 files changed, 78 insertions, 0 deletions
diff --git a/graphics/asymptote/LspCpp/third_party/uri/src/detail/uri_advance_parts.cpp b/graphics/asymptote/LspCpp/third_party/uri/src/detail/uri_advance_parts.cpp
new file mode 100644
index 0000000000..7fe35a1c08
--- /dev/null
+++ b/graphics/asymptote/LspCpp/third_party/uri/src/detail/uri_advance_parts.cpp
@@ -0,0 +1,78 @@
+// Copyright 2016-2017 Glyn Matthews.
+// Distributed under the Boost Software License, Version 1.0.
+// (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+#include "uri_advance_parts.hpp"
+#include <iterator>
+#include <utility>
+#include <limits>
+
+namespace network_detail = network::detail;
+using network::string_view;
+using network::detail::uri_part;
+
+namespace {
+template <class Iterator>
+uri_part copy_part(Iterator first, Iterator last,
+ string_view::const_iterator &it) {
+ auto part_first = it;
+ std::advance(it, std::distance(first, last));
+ return network_detail::uri_part(part_first, it);
+}
+} // namespace
+
+uri_part network_detail::copy_part(const std::string &uri,
+ string_view::const_iterator &it) {
+ return ::copy_part(std::begin(uri), std::end(uri), it);
+}
+
+void network_detail::advance_parts(string_view uri_view, uri_parts &parts,
+ const uri_parts &existing_parts) {
+ auto first = std::begin(uri_view);
+
+ auto it = first;
+ if (auto scheme = existing_parts.scheme) {
+ parts.scheme = ::copy_part(std::begin(*scheme), std::end(*scheme), it);
+
+ // ignore : for all URIs
+ if (*it == ':') {
+ ++it;
+ }
+
+ // ignore // for hierarchical URIs
+ if (existing_parts.hier_part.host) {
+ std::advance(it, 2);
+ }
+ }
+
+ if (auto user_info = existing_parts.hier_part.user_info) {
+ parts.hier_part.user_info =
+ ::copy_part(std::begin(*user_info), std::end(*user_info), it);
+ ++it; // ignore @
+ }
+
+ if (auto host = existing_parts.hier_part.host) {
+ parts.hier_part.host = ::copy_part(std::begin(*host), std::end(*host), it);
+ }
+
+ if (auto port = existing_parts.hier_part.port) {
+ ++it; // ignore :
+ parts.hier_part.port = ::copy_part(std::begin(*port), std::end(*port), it);
+ }
+
+ if (auto path = existing_parts.hier_part.path) {
+ parts.hier_part.path = ::copy_part(std::begin(*path), std::end(*path), it);
+ }
+
+ if (auto query = existing_parts.query) {
+ ++it; // ignore ?
+ parts.query = ::copy_part(std::begin(*query), std::end(*query), it);
+ }
+
+ if (auto fragment = existing_parts.fragment) {
+ ++it; // ignore #
+ parts.fragment =
+ ::copy_part(std::begin(*fragment), std::end(*fragment), it);
+ }
+}