12    inline URI::URI (
const optional<SchemeType>& scheme, 
const optional<Authority>& authority, 
const String& path,
 
   13                     const optional<String>& query, 
const optional<String>& fragment)
 
   15        , fAuthority_{authority}
 
   18        , fFragment_{fragment}
 
   24        CheckValidPathForAuthority_ (authority, path);
 
   26    template <Characters::IConvertibleToString STRISH_TYPE>
 
   27    inline URI::URI (STRISH_TYPE&& encodedURI)
 
   28        : URI{Parse (forward<STRISH_TYPE> (encodedURI))}
 
   31    inline bool URI::IsRelativeReference ()
 const 
   34        return fScheme_.has_value ();
 
 
   36    inline optional<URI::SchemeType> URI::GetScheme ()
 const 
 
   41    inline void URI::SetScheme (
const optional<SchemeType>& scheme)
 
 
   49    inline void URI::SetScheme (
const SchemeType& scheme)
 
   55    inline optional<URI::Authority> URI::GetAuthority ()
 const 
 
   60    inline void URI::SetAuthority (
const optional<Authority>& authority)
 
   63        CheckValidPathForAuthority_ (authority, fPath_);
 
   64        fAuthority_ = authority;
 
   66    inline PortType URI::GetPortValue ()
 const 
   69        optional<PortType>                                    op = fAuthority_ ? fAuthority_->GetPort () : optional<PortType>{};
 
   73        static constexpr PortType kDefault_{0}; 
 
   75            return fScheme_->GetDefaultPort ().value_or (kDefault_);
 
 
   79    inline String URI::GetPath ()
 const 
   84    inline void URI::SetPath (
const String& path)
 
   87        CheckValidPathForAuthority_ (fAuthority_, path);
 
 
   90    inline URI URI::GetSchemeAndAuthority ()
 const 
   92        return URI{GetScheme (), GetAuthority ()};
 
 
   94    template <Common::IAnyOf<String, 
string, URI> RETURN_TYPE>
 
   95    RETURN_TYPE URI::GetAuthorityRelativeResource ()
 const 
   98        if constexpr (same_as<RETURN_TYPE, String>) {
 
   99            static constexpr UniformResourceIdentification::PCTEncodeOptions kPathEncodeOptions_{
 
  100                .allowSubDelims = 
false, .allowGenDelims = 
false, .allowPChar = 
true, .allowFragOrQueryChars = 
false, .allowPathCharacters = 
true};
 
  103                static constexpr UniformResourceIdentification::PCTEncodeOptions kQueryEncodeOptions_{
 
  104                    .allowSubDelims = 
false, .allowGenDelims = 
false, .allowPChar = 
false, .allowFragOrQueryChars = 
true};
 
  105                result << 
"?"sv << UniformResourceIdentification::PCTEncode2String (*fQuery_, kQueryEncodeOptions_);
 
  107            return result.
str ();
 
  109        if constexpr (same_as<RETURN_TYPE, string>) {
 
  110            return GetAuthorityRelativeResource<String> ().
AsASCII ();
 
  112        if constexpr (same_as<RETURN_TYPE, URI>) {
 
  113            return URI{nullopt, nullopt, GetPath (), GetQuery<String> ()};
 
  116    template <Common::IAnyOf<String, optional<String>> RETURN_VALUE>
 
  117    RETURN_VALUE URI::GetAbsPath ()
 const 
  119        Debug::AssertExternallySynchronizedMutex::ReadContext declareContext{fThisAssertExternallySynchronized_};
 
  120        if constexpr (same_as<RETURN_VALUE, String>) {
 
  121            if (
auto op = GetAbsPath<optional<String>> ()) {
 
  124            static const auto kException_ = Execution::RuntimeErrorException{
"This URI does not have an absolute path"sv};
 
  125            Execution::Throw (kException_);
 
  127        if constexpr (same_as<RETURN_VALUE, optional<String>>) {
 
  128            if (fPath_.empty ()) {
 
  131            if (fPath_.StartsWith (
"/"sv)) {
 
  137    template <Common::IAnyOf<String, URI::Query> RETURN_TYPE>
 
  138    inline optional<RETURN_TYPE> URI::GetQuery ()
 const 
  140        Debug::AssertExternallySynchronizedMutex::ReadContext declareContext{fThisAssertExternallySynchronized_};
 
  141        if constexpr (same_as<RETURN_TYPE, String>) {
 
  144        if constexpr (same_as<RETURN_TYPE, Query>) {
 
  146                return Query{*fQuery_};
 
  151    inline void URI::SetQuery (
const optional<String>& query)
 
  153        Debug::AssertExternallySynchronizedMutex::WriteContext declareContext{fThisAssertExternallySynchronized_};
 
  156    inline void URI::SetQuery (
const optional<Query>& query)
 
  158        Debug::AssertExternallySynchronizedMutex::WriteContext declareContext{fThisAssertExternallySynchronized_};
 
  159        fQuery_ = query ? query->ComputeQueryString () : optional<String>{};
 
  161    inline optional<String> URI::LookupQueryArg (
const String& arg)
 const 
 
  169    inline optional<String> URI::GetFragment ()
 const 
  174    inline void URI::SetFragment (
const optional<String>& fragment)
 
  177        fFragment_ = fragment;
 
  179    inline strong_ordering URI::operator<=> (
const URI& rhs)
 const 
  181        return URI::TWC_ (*
this, rhs);
 
  183    inline bool URI::operator== (
const URI& rhs)
 const 
  185        return URI::TWC_ (*
this, rhs) == 0;
 
  187    template <Common::IAnyOf<String, 
string> T>
 
  188    inline T URI::As (optional<StringPCTEncodedFlag> pctEncode)
 const 
  190        if constexpr (same_as<T, String>) {
 
  191            return AsString_ (pctEncode);
 
  193        if constexpr (same_as<T, string>) {
 
  194            return AsString_ (pctEncode).AsASCII ();
 
  202    constexpr EnumNames<IO::Network::URI::NormalizationStyle> DefaultNames<IO::Network::URI::NormalizationStyle>::k{{{
 
  203        {IO::Network::URI::NormalizationStyle::eRFC3986, L
"RFC3986"},
 
Similar to String, but intended to more efficiently construct a String. Mutable type (String is large...
nonvirtual String str() const
String is like std::u32string, except it is much easier to use, often much more space efficient,...
nonvirtual T AsASCII() const
shared_lock< const AssertExternallySynchronizedMutex > ReadContext
Instantiate AssertExternallySynchronizedMutex::ReadContext to designate an area of code where protect...
unique_lock< AssertExternallySynchronizedMutex > WriteContext
Instantiate AssertExternallySynchronizedMutex::WriteContext to designate an area of code where protec...