diff options
author | brain <brain@e03df62e-2008-0410-955e-edbf42e46eb7> | 2006-07-16 02:09:58 +0000 |
---|---|---|
committer | brain <brain@e03df62e-2008-0410-955e-edbf42e46eb7> | 2006-07-16 02:09:58 +0000 |
commit | ef10f984fa75c3197ec2515418e1b180fdbfc390 (patch) | |
tree | 7edd90390773d9ff0e76298abcfbef2d7a2b782b | |
parent | 6ab0b94dceb7d7f0bfca39976e745f22c7ba8939 (diff) |
This should be faster, we read it like a stream now with GetToken until GetToken returns "".
The optimizations done by gcc means theres only one std::string constructor call per token, which is mmm yum.
git-svn-id: http://svn.inspircd.org/repository/trunk/inspircd@4397 e03df62e-2008-0410-955e-edbf42e46eb7
-rw-r--r-- | include/hashcomp.h | 9 | ||||
-rw-r--r-- | src/hashcomp.cpp | 55 | ||||
-rw-r--r-- | src/inspircd.cpp | 32 |
3 files changed, 57 insertions, 39 deletions
diff --git a/include/hashcomp.h b/include/hashcomp.h index ad6a2133e..b818b16f5 100644 --- a/include/hashcomp.h +++ b/include/hashcomp.h @@ -82,14 +82,15 @@ namespace irc class tokenstream { private: - std::string tokenbuffer; - std::vector<std::string> tokens; + std::string tokens; + std::string::iterator last_starting_position; + std::string::iterator n; + bool last_pushed; public: tokenstream(std::string &source); ~tokenstream(); - unsigned int GetNumTokens(); - const std::string& GetToken(unsigned int index); + const std::string GetToken(); }; diff --git a/src/hashcomp.cpp b/src/hashcomp.cpp index 08fbc8e2f..351dc1fd7 100644 --- a/src/hashcomp.cpp +++ b/src/hashcomp.cpp @@ -178,19 +178,19 @@ std::istream& operator>>(std::istream &is, irc::string &str) return is; } -irc::tokenstream::tokenstream(std::string &source) +irc::tokenstream::tokenstream(std::string &source) : tokens(source), last_pushed(false) { - std::string::iterator last_starting_position = source.begin(); - bool last_pushed = false; + last_starting_position = tokens.begin(); + n = tokens.begin(); - for (std::string::iterator n = source.begin(); n != source.end(); n++) + /*for (std::string::iterator n = source.begin(); n != source.end(); n++) { if ((last_pushed) && (*n == ':')) { - /* If we find a token thats not the first and starts with :, + * If we find a token thats not the first and starts with :, * this is the last token on the line - */ - tokens.push_back(std::string(n+1, source.end())); + * + tokens.push_back(new std::string(n+1, source.end())); break; } @@ -198,26 +198,51 @@ irc::tokenstream::tokenstream(std::string &source) if ((*n == ' ') || (n+1 == source.end())) { - /* If we find a space, or end of string, this is the end of a token. - */ - tokens.push_back(std::string(last_starting_position, n+1 == source.end() ? n+1 : n)); + * If we find a space, or end of string, this is the end of a token. + + tokens.push_back(new std::string(last_starting_position, n+1 == source.end() ? n+1 : n)); last_starting_position = n+1; last_pushed = true; } - } + }*/ } irc::tokenstream::~tokenstream() { } -unsigned int irc::tokenstream::GetNumTokens() +/*unsigned int irc::tokenstream::GetNumTokens() { return tokens.size(); -} +}*/ -const std::string& irc::tokenstream::GetToken(unsigned int index) +const std::string irc::tokenstream::GetToken() { - return tokens[index]; + std::string::iterator lsp = last_starting_position; + + while (n != tokens.end()) + { + if ((last_pushed) && (*n == ':')) + { + /* If we find a token thats not the first and starts with :, + * this is the last token on the line + */ + return std::string(n+1, tokens.end()); + } + + last_pushed = false; + + if ((*n == ' ') || (n+1 == tokens.end())) + { + /* If we find a space, or end of string, this is the end of a token. + */ + last_starting_position = n+1; + last_pushed = true; + return std::string(lsp, n+1 == tokens.end() ? n+1 : n++); + } + + n++; + } + return ""; } diff --git a/src/inspircd.cpp b/src/inspircd.cpp index 9635f707a..41410a26c 100644 --- a/src/inspircd.cpp +++ b/src/inspircd.cpp @@ -949,60 +949,52 @@ int main(int argc, char** argv) * Expected output: * * String: 'PRIVMSG #test FOO BAR' - * NumItems = 4 * Token 0 = 'PRIVMSG' * Token 1 = '#test' * Token 2 = 'FOO' * Token 3 = 'BAR' * String: 'PRIVMSG #test :FOO BAR BAZ' - * NumItems = 3 * Token 0 = 'PRIVMSG' * Token 1 = '#test' * Token 2 = 'FOO BAR BAZ' * String: ':PRIVMSG #test :FOO BAR BAZ' - * NumItems = 3 * Token 0 = ':PRIVMSG' * String: 'AAAAAAA' - * NumItems = 1 * Token 0 = 'AAAAAAA' * String: '' * NumItems = 0 - * + */ std::string a = "PRIVMSG #test FOO BAR"; printf("String: '%s'\n",a.c_str()); irc::tokenstream test(a); - printf("NumItems = %d\n",test.GetNumTokens()); - printf("Token 0 = '%s'\n",test.GetToken(0).c_str()); - printf("Token 1 = '%s'\n",test.GetToken(1).c_str()); - printf("Token 2 = '%s'\n",test.GetToken(2).c_str()); - printf("Token 3 = '%s'\n",test.GetToken(3).c_str()); + printf("Token 0 = '%s'\n",test.GetToken().c_str()); + printf("Token 1 = '%s'\n",test.GetToken().c_str()); + printf("Token 2 = '%s'\n",test.GetToken().c_str()); + printf("Token 3 = '%s'\n",test.GetToken().c_str()); std::string b = "PRIVMSG #test :FOO BAR BAZ"; printf("String: '%s'\n",b.c_str()); irc::tokenstream test2(b); - printf("NumItems = %d\n",test2.GetNumTokens()); - printf("Token 0 = '%s'\n",test2.GetToken(0).c_str()); - printf("Token 1 = '%s'\n",test2.GetToken(1).c_str()); - printf("Token 2 = '%s'\n",test2.GetToken(2).c_str()); + printf("Token 0 = '%s'\n",test2.GetToken().c_str()); + printf("Token 1 = '%s'\n",test2.GetToken().c_str()); + printf("Token 2 = '%s'\n",test2.GetToken().c_str()); std::string c = ":PRIVMSG #test :FOO BAR BAZ"; printf("String: '%s'\n",c.c_str()); irc::tokenstream test3(c); - printf("NumItems = %d\n",test3.GetNumTokens()); - printf("Token 0 = '%s'\n",test3.GetToken(0).c_str()); + printf("Token 0 = '%s'\n",test3.GetToken().c_str()); c = "AAAAAAA"; printf("String: '%s'\n",c.c_str()); irc::tokenstream test4(c); - printf("NumItems = %d\n",test4.GetNumTokens()); - printf("Token 0 = '%s'\n",test4.GetToken(0).c_str()); + printf("Token 0 = '%s'\n",test4.GetToken().c_str()); c = ""; printf("String: '%s'\n",c.c_str()); irc::tokenstream test5(c); - printf("NumItems = %d\n",test5.GetNumTokens()); + printf("Token 0 = '%s'\n",test5.GetToken().c_str()); - exit(0); */ + exit(0); try { |