summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorbrain <brain@e03df62e-2008-0410-955e-edbf42e46eb7>2006-07-16 02:09:58 +0000
committerbrain <brain@e03df62e-2008-0410-955e-edbf42e46eb7>2006-07-16 02:09:58 +0000
commitef10f984fa75c3197ec2515418e1b180fdbfc390 (patch)
tree7edd90390773d9ff0e76298abcfbef2d7a2b782b
parent6ab0b94dceb7d7f0bfca39976e745f22c7ba8939 (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.h9
-rw-r--r--src/hashcomp.cpp55
-rw-r--r--src/inspircd.cpp32
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
{