summaryrefslogtreecommitdiff
path: root/graphics/asymptote/LspCpp/third_party/uri/include/network/uri/uri_builder.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'graphics/asymptote/LspCpp/third_party/uri/include/network/uri/uri_builder.hpp')
-rw-r--r--graphics/asymptote/LspCpp/third_party/uri/include/network/uri/uri_builder.hpp277
1 files changed, 277 insertions, 0 deletions
diff --git a/graphics/asymptote/LspCpp/third_party/uri/include/network/uri/uri_builder.hpp b/graphics/asymptote/LspCpp/third_party/uri/include/network/uri/uri_builder.hpp
new file mode 100644
index 0000000000..87f0b79221
--- /dev/null
+++ b/graphics/asymptote/LspCpp/third_party/uri/include/network/uri/uri_builder.hpp
@@ -0,0 +1,277 @@
+// Copyright (c) Glyn Matthews 2012-2016.
+// Copyright 2012 Dean Michael Berris <dberris@google.com>
+// Copyright 2012 Google, Inc.
+// 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)
+
+/**
+ * \file
+ * \brief Contains the definition of the uri_builder.
+ */
+
+#ifndef NETWORK_URI_BUILDER_INC
+#define NETWORK_URI_BUILDER_INC
+
+#include <cstdint>
+#include <utility>
+#include <type_traits>
+#include <network/uri/uri.hpp>
+
+#ifdef NETWORK_URI_MSVC
+#pragma warning(push)
+#pragma warning(disable : 4251 4231 4660)
+#endif
+
+namespace network {
+#if !defined(DOXYGEN_SHOULD_SKIP_THIS)
+namespace detail {
+
+template <class T>
+struct host_converter {
+ uri::string_type operator()(const T &host) const {
+ return detail::translate(host);
+ }
+};
+
+template <class T, class Enable = void>
+struct port_converter {
+ uri::string_type operator()(const T &port) const {
+ return detail::translate(port);
+ }
+};
+
+template <class T>
+struct port_converter<T, typename std::enable_if<std::is_integral<
+ typename std::decay<T>::type>::value>::type> {
+ uri::string_type operator()(std::uint16_t port) const {
+ return std::to_string(port);
+ }
+};
+
+template <class T>
+struct path_converter {
+ uri::string_type operator()(const T &path) const {
+ return detail::translate(path);
+ }
+};
+} // namespace detail
+#endif // !defined(DOXYGEN_SHOULD_SKIP_THIS)
+
+/**
+ * \ingroup uri
+ * \class uri_builder network/uri/uri_builder.hpp network/uri.hpp
+ * \brief A class that allows complex uri objects to be constructed.
+ * \sa uri
+ */
+class uri_builder {
+#if !defined(DOXYGEN_SHOULD_SKIP_THIS)
+ friend class uri;
+#endif // !defined(DOXYGEN_SHOULD_SKIP_THIS)
+
+ uri_builder(const uri_builder &) = delete;
+ uri_builder &operator=(const uri_builder &) = delete;
+
+ public:
+ /**
+ * \brief The uri_builder string_type.
+ */
+ using string_type = network::uri::string_type;
+
+ /**
+ * \brief Constructor.
+ */
+ uri_builder() = default;
+
+ /**
+ * \brief Constructor.
+ * \param base A URI that is the base on which a new URI is built.
+ */
+ explicit uri_builder(const uri &base);
+
+ /**
+ * \brief Destructor.
+ */
+ ~uri_builder() noexcept;
+
+ /**
+ * \brief Adds a new scheme to the uri_builder.
+ * \param scheme The scheme.
+ * \returns \c *this
+ */
+ template <typename Source>
+ uri_builder &scheme(const Source &scheme) {
+ set_scheme(detail::translate(scheme));
+ return *this;
+ }
+
+ /**
+ * \brief Adds a new user info to the uri_builder.
+ * \param user_info The user info.
+ * \returns \c *this
+ */
+ template <typename Source>
+ uri_builder &user_info(const Source &user_info) {
+ set_user_info(detail::translate(user_info));
+ return *this;
+ }
+
+ /**
+ * \brief Clears the URI user_info part.
+ * \returns \c *this
+ */
+ uri_builder &clear_user_info();
+
+ /**
+ * \brief Adds a new host to the uri_builder.
+ * \param host The host.
+ * \returns \c *this
+ */
+ template <typename Source>
+ uri_builder &host(const Source &host) {
+ detail::host_converter<Source> convert;
+ set_host(convert(host));
+ return *this;
+ }
+
+ /**
+ * \brief Adds a new port to the uri_builder.
+ * \param port The port.
+ * \returns \c *this
+ */
+ template <typename Source>
+ uri_builder &port(const Source &port) {
+ detail::port_converter<Source> convert;
+ set_port(convert(port));
+ return *this;
+ }
+
+ /**
+ * \brief Clears the URI port part.
+ * \returns \c *this
+ */
+ uri_builder &clear_port();
+
+ /**
+ * \brief Adds a new authority to the uri_builder.
+ * \param authority The authority.
+ * \returns \c *this
+ */
+ template <typename Source>
+ uri_builder &authority(const Source &authority) {
+ set_authority(detail::translate(authority));
+ return *this;
+ }
+
+ /**
+ * \brief Sets a new path to the uri_builder.
+ * \param path The path.
+ * \returns \c *this
+ */
+ template <typename Source>
+ uri_builder &path(const Source &path) {
+ detail::path_converter<Source> convert;
+ set_path(convert(path));
+ return *this;
+ }
+
+ /**
+ * \brief Clears the URI path part.
+ * \returns \c *this
+ */
+ uri_builder &clear_path();
+
+ /**
+ * \deprecated Use append_query_component
+ * \warning This function's behaviour has changed and percent encoding
+ * of the '=' character is not ignored.
+ * \brief Adds a new query to the uri_builder.
+ * \param query The query.
+ * \returns \c *this
+ * \sa append_query_parameter
+ */
+ template <typename Source>
+ uri_builder &append_query(const Source &query) {
+ return append_query_component(query);
+ }
+
+ /**
+ * \brief Appends a new query component to the uri_builder. The
+ * '=' symbol is percent encoded.
+ * \param component The query component.
+ * \returns \c *this
+ * \sa append_query_key_value_pair
+ */
+ template <typename Source>
+ uri_builder &append_query_component(const Source &component) {
+ append_query_component(detail::translate(component));
+ return *this;
+ }
+
+ /**
+ * \brief Adds a new query key/value pair to the uri_builder.
+ * \param key The query parameter key.
+ * \param value The query parameter value.
+ * \returns \c *this
+ */
+ template <typename Key, typename Value>
+ uri_builder &append_query_key_value_pair(const Key &key, const Value &value) {
+ append_query_key_value_pair(detail::translate(key),
+ detail::translate(value));
+ return *this;
+ }
+
+ /**
+ * \brief Clears the URI query part.
+ * \returns \c *this
+ */
+ uri_builder &clear_query();
+
+ /**
+ * \brief Adds a new fragment to the uri_builder.
+ * \param fragment The fragment.
+ * \returns \c *this
+ */
+ template <typename Source>
+ uri_builder &fragment(const Source &fragment) {
+ set_fragment(detail::translate(fragment));
+ return *this;
+ }
+
+ /**
+ * \brief Clears the URI fragment part.
+ * \returns \c *this
+ */
+ uri_builder &clear_fragment();
+
+ /**
+ * \brief Builds a new uri object.
+ * \returns A valid uri object.
+ * \throws uri_builder_error if the uri_builder is unable to build
+ * a valid URI.
+ * \throws std::bad_alloc If the underlying string cannot be
+ * allocated.
+ */
+ network::uri uri() const;
+
+ private:
+ void set_scheme(string_type &&scheme);
+ void set_user_info(string_type &&user_info);
+ void set_host(string_type &&host);
+ void set_port(string_type &&port);
+ void set_authority(string_type &&authority);
+ void set_path(string_type &&path);
+ void append_query_component(string_type &&name);
+ void append_query_key_value_pair(string_type &&key, string_type &&value);
+ void set_fragment(string_type &&fragment);
+
+ optional<string_type> scheme_, user_info_, host_, port_, path_, query_,
+ fragment_;
+};
+} // namespace network
+
+#ifdef NETWORK_URI_MSVC
+#pragma warning(pop)
+#endif
+
+#endif // NETWORK_URI_BUILDER_INC