#pragma once #include namespace panda { namespace uri { struct URIStrict : URI { using URI::URI; URIStrict (const URI& source) : URI(source) {} }; template struct URI::Strict : URIStrict { Strict () : URIStrict() {} Strict (const string& source, int flags = 0) : URIStrict(source, flags) { strict_scheme(); } Strict (const URI& source) : URIStrict(source) { strict_scheme(); } using URI::assign; void assign (const URI& source) override { URI::assign(source); strict_scheme(); } using URI::scheme; void scheme (const string& scheme) override { URI::scheme(scheme); strict_scheme(); } protected: void parse (const string& uristr) override { URI::parse(uristr); strict_scheme(); } void strict_scheme () { if (!_scheme.length()) { if (_host.length()) URI::scheme(TYPE1::default_scheme()); } else if (!scheme_info || (*(scheme_info->type_info) != typeid(TYPE1) && *(scheme_info->type_info) != typeid(TYPE2))) { throw WrongScheme("URI: wrong scheme '" + _scheme + "' for " + typeid(TYPE1).name()); } } }; }}