196 lines
4.4 KiB
C++
196 lines
4.4 KiB
C++
//
|
|
// Copyright (c) 2019 Vinnie Falco (vinnie.falco@gmail.com)
|
|
// Copyright (c) 2022 Alan de Freitas (alandefreitas@gmail.com)
|
|
//
|
|
// 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)
|
|
//
|
|
// Official repository: https://github.com/boostorg/url
|
|
//
|
|
|
|
#ifndef BOOST_URL_SEGMENTS_VIEW_HPP
|
|
#define BOOST_URL_SEGMENTS_VIEW_HPP
|
|
|
|
#include <boost/url/detail/config.hpp>
|
|
#include <boost/url/segments_base.hpp>
|
|
#include <boost/core/detail/string_view.hpp>
|
|
|
|
namespace boost {
|
|
namespace urls {
|
|
|
|
/** A view representing path segments in a URL
|
|
|
|
Objects of this type are used to interpret
|
|
the path as a bidirectional view of segment
|
|
strings.
|
|
|
|
The view does not retain ownership of the
|
|
elements and instead references the original
|
|
character buffer. The caller is responsible
|
|
for ensuring that the lifetime of the buffer
|
|
extends until it is no longer referenced.
|
|
|
|
@par Example
|
|
@code
|
|
url_view u( "/path/to/file.txt" );
|
|
|
|
segments_view ps = u.segments();
|
|
|
|
assert( ps.buffer().data() == u.buffer().data() );
|
|
@endcode
|
|
|
|
Percent escapes in strings returned when
|
|
dereferencing iterators are automatically
|
|
decoded.
|
|
|
|
@par Iterator Invalidation
|
|
Changes to the underlying character buffer
|
|
can invalidate iterators which reference it.
|
|
|
|
@see
|
|
@ref segments_encoded_view,
|
|
@ref segments_encoded_ref,
|
|
@ref segments_ref.
|
|
*/
|
|
class segments_view
|
|
: public segments_base
|
|
{
|
|
friend class url_view_base;
|
|
friend class segments_encoded_view;
|
|
friend class segments_ref;
|
|
|
|
segments_view(
|
|
detail::path_ref const& ref) noexcept;
|
|
|
|
public:
|
|
/** Constructor
|
|
|
|
Default-constructed segments have
|
|
zero elements.
|
|
|
|
@par Example
|
|
@code
|
|
segments_view ps;
|
|
@endcode
|
|
|
|
@par Effects
|
|
@code
|
|
return segments_view( "" );
|
|
@endcode
|
|
|
|
@par Complexity
|
|
Constant.
|
|
|
|
@par Exception Safety
|
|
Throws nothing.
|
|
*/
|
|
segments_view() = default;
|
|
|
|
/** Constructor
|
|
|
|
After construction, viewss
|
|
reference the same underlying character
|
|
buffer.
|
|
|
|
Ownership is not transferred; the caller
|
|
is responsible for ensuring the lifetime
|
|
of the buffer extends until it is no
|
|
longer referenced.
|
|
|
|
@par Postconditions
|
|
@code
|
|
this->buffer().data() == other.buffer().data()
|
|
@endcode
|
|
|
|
@par Complexity
|
|
Constant
|
|
|
|
@par Exception Safety
|
|
Throws nothing
|
|
*/
|
|
segments_view(
|
|
segments_view const& other) = default;
|
|
|
|
/** Constructor
|
|
|
|
This function constructs segments from
|
|
a valid path string, which can contain
|
|
percent escapes.
|
|
Upon construction, the view references
|
|
the character buffer pointed to by `s`.
|
|
caller is responsible for ensuring
|
|
that the lifetime of the buffer
|
|
extends until the view is destroyed.
|
|
|
|
@par Example
|
|
@code
|
|
segments_view ps( "/path/to/file.txt" );
|
|
@endcode
|
|
|
|
@par Effects
|
|
@code
|
|
return parse_path( s ).value();
|
|
@endcode
|
|
|
|
@par Postconditions
|
|
@code
|
|
this->buffer().data() == s.data()
|
|
@endcode
|
|
|
|
@par Complexity
|
|
Linear in `s`.
|
|
|
|
@par Exception Safety
|
|
Exceptions thrown on invalid input.
|
|
|
|
@throw system_error
|
|
`s` contains an invalid path.
|
|
|
|
@param s The string to parse.
|
|
|
|
@par BNF
|
|
@code
|
|
path = [ "/" ] [ segment *( "/" segment ) ]
|
|
|
|
segment = *pchar
|
|
@endcode
|
|
|
|
@par Specification
|
|
@li <a href="https://datatracker.ietf.org/doc/html/rfc3986#section-3.3"
|
|
>3.3. Path</a>
|
|
*/
|
|
BOOST_URL_DECL
|
|
segments_view(
|
|
core::string_view s);
|
|
|
|
/** Assignment
|
|
|
|
After assignment, both views
|
|
reference the same underlying character
|
|
buffer.
|
|
|
|
Ownership is not transferred; the caller
|
|
is responsible for ensuring the lifetime
|
|
of the buffer extends until it is no
|
|
longer referenced.
|
|
|
|
@par Postconditions
|
|
@code
|
|
this->buffer().data() == other.buffer().data()
|
|
@endcode
|
|
|
|
@par Complexity
|
|
Constant
|
|
|
|
@par Exception Safety
|
|
Throws nothing
|
|
*/
|
|
segments_view&
|
|
operator=(segments_view const& other) = default;
|
|
};
|
|
|
|
} // urls
|
|
} // boost
|
|
|
|
#endif
|