From f409b8a6e8d60e4654b3fe184d8ec6107754f0ac Mon Sep 17 00:00:00 2001 From: Dan Goodliffe Date: Sat, 3 Mar 2018 17:19:21 +0000 Subject: Switch move things to string_view --- icespider/core/xwwwFormUrlEncoded.cpp | 29 +++++++++++++++++++---------- icespider/core/xwwwFormUrlEncoded.h | 10 +++++----- icespider/fcgi/cgiRequestBase.cpp | 22 +++++++++------------- icespider/fcgi/cgiRequestBase.h | 3 +-- 4 files changed, 34 insertions(+), 30 deletions(-) diff --git a/icespider/core/xwwwFormUrlEncoded.cpp b/icespider/core/xwwwFormUrlEncoded.cpp index 2a65137..655c839 100644 --- a/icespider/core/xwwwFormUrlEncoded.cpp +++ b/icespider/core/xwwwFormUrlEncoded.cpp @@ -4,6 +4,7 @@ #include namespace ba = boost::algorithm; +using namespace std::literals; extern long hextable[]; @@ -71,15 +72,17 @@ namespace IceSpider { }; std::string - XWwwFormUrlEncoded::urlencode(const std::string & s) + XWwwFormUrlEncoded::urlencode(const std::string_view & s) { return urlencode(s.begin(), s.end()); } inline char hexchar(char c) { return c < 10 ? '0' + c : 'a' - 10 + c; } + template + inline char hexlookup(const T & i) { return hextable[(int)*i]; } std::string - XWwwFormUrlEncoded::urlencode(std::string::const_iterator i, std::string::const_iterator e) + XWwwFormUrlEncoded::urlencode(std::string_view::const_iterator i, std::string_view::const_iterator e) { std::string t; t.reserve(std::distance(i, e)); @@ -101,23 +104,29 @@ namespace IceSpider { } std::string - XWwwFormUrlEncoded::urldecode(std::string::const_iterator i, std::string::const_iterator e) + XWwwFormUrlEncoded::urldecode(std::string_view::const_iterator i, std::string_view::const_iterator e) { std::string t; t.reserve(std::distance(i, e)); while (i != e) { - if (*i == '+') t += ' '; - else if (*i == '%') { - t += (16 * hextable[(int)*++i]) + hextable[(int)*++i]; + switch (*i) { + case '+': + t += ' '; + break; + case '%': + t += (16 * hexlookup(i + 1)) + hexlookup(i + 2); + i += 2; + break; + default: + t += *i; } - else t += *i; ++i; } return t; } void - XWwwFormUrlEncoded::iterateVars(const KVh & h, ba::split_iterator pi) + XWwwFormUrlEncoded::iterateVars(const KVh & h, ba::split_iterator pi) { for (; pi != decltype(pi)(); ++pi) { auto eq = std::find(pi->begin(), pi->end(), '='); @@ -131,7 +140,7 @@ namespace IceSpider { } void - XWwwFormUrlEncoded::iterateVars(const std::string & input, const KVh & h, const std::string & split) + XWwwFormUrlEncoded::iterateVars(const std::string_view & input, const KVh & h, const std::string_view & split) { if (!input.empty()) { iterateVars(h, ba::make_split_iterator(input, ba::first_finder(split, ba::is_equal()))); @@ -141,7 +150,7 @@ namespace IceSpider { void XWwwFormUrlEncoded::iterateVars(const KVh & h) { - iterateVars(input, h, "&"); + iterateVars(input, h, "&"sv); } void diff --git a/icespider/core/xwwwFormUrlEncoded.h b/icespider/core/xwwwFormUrlEncoded.h index 4f6cdae..68f6480 100644 --- a/icespider/core/xwwwFormUrlEncoded.h +++ b/icespider/core/xwwwFormUrlEncoded.h @@ -13,14 +13,14 @@ namespace IceSpider { XWwwFormUrlEncoded(std::istream & in); void Deserialize(Slicer::ModelPartForRootPtr mp) override; - DLL_PUBLIC static void iterateVars(const std::string & input, const KVh & h, const std::string & split); + DLL_PUBLIC static void iterateVars(const std::string_view & input, const KVh & h, const std::string_view & split); - DLL_PUBLIC static std::string urldecode(std::string::const_iterator s, std::string::const_iterator); - DLL_PUBLIC static std::string urlencode(std::string::const_iterator s, std::string::const_iterator); - DLL_PUBLIC static std::string urlencode(const std::string & s); + DLL_PUBLIC static std::string urldecode(std::string_view::const_iterator s, std::string_view::const_iterator); + DLL_PUBLIC static std::string urlencode(std::string_view::const_iterator s, std::string_view::const_iterator); + DLL_PUBLIC static std::string urlencode(const std::string_view & s); private: - static inline void iterateVars(const KVh & h, boost::algorithm::split_iterator pi); + static inline void iterateVars(const KVh & h, boost::algorithm::split_iterator pi); void iterateVars(const KVh & h); diff --git a/icespider/fcgi/cgiRequestBase.cpp b/icespider/fcgi/cgiRequestBase.cpp index 1daab68..73a6770 100644 --- a/icespider/fcgi/cgiRequestBase.cpp +++ b/icespider/fcgi/cgiRequestBase.cpp @@ -9,12 +9,7 @@ #include namespace ba = boost::algorithm; - -namespace std { - ostream & operator<<(ostream & s, const IceSpider::CgiRequestBase::Env & e) { - return s.write(std::get<0>(e), std::get<1>(e) - std::get<0>(e)); - } -} +using namespace std::literals; #define CGI_CONST(NAME) static const std::string_view NAME(#NAME) @@ -38,14 +33,15 @@ namespace IceSpider { CgiRequestBase::addenv(const char * const e) { if (auto eq = strchr(e, '=')) { - envmap.insert({ std::string_view(e, eq - e), Env(eq + 1, strchr(eq, '\0')) }); + envmap.insert({ std::string_view(e, eq - e), eq + 1 }); } } + inline std::string - operator*(const CgiRequestBase::Env & t) + operator*(const std::string_view & t) { - return std::string(std::get<0>(t), std::get<1>(t)); + return std::string(t); } void @@ -62,15 +58,15 @@ namespace IceSpider { auto qs = envmap.find(QUERY_STRING); if (qs != envmap.end()) { - XWwwFormUrlEncoded::iterateVars(*qs->second, [this](auto k, auto v) { + XWwwFormUrlEncoded::iterateVars(qs->second, [this](auto k, auto v) { qsmap.insert({ k, v }); - }, "&"); + }, "&"sv); } auto cs = envmap.find(HTTP_COOKIE); if (cs != envmap.end()) { - XWwwFormUrlEncoded::iterateVars(*cs->second, [this](auto k, auto v) { + XWwwFormUrlEncoded::iterateVars(cs->second, [this](auto k, auto v) { cookiemap.insert({ k, v }); - }, "; "); + }, "; "sv); } } diff --git a/icespider/fcgi/cgiRequestBase.h b/icespider/fcgi/cgiRequestBase.h index 88bdc52..9ccdfe3 100644 --- a/icespider/fcgi/cgiRequestBase.h +++ b/icespider/fcgi/cgiRequestBase.h @@ -15,8 +15,7 @@ namespace IceSpider { void initialize(); public: - typedef std::tuple Env; - typedef std::map VarMap; + typedef std::map VarMap; const PathElements & getRequestPath() const override; PathElements & getRequestPath() override; -- cgit v1.2.3