changeset 10133:2e4fc7fdba15

optimize strfind with 1 or 2 characters
author Jaroslav Hajek <highegg@gmail.com>
date Tue, 19 Jan 2010 13:24:54 +0100
parents aa0f575cf39b
children be13fa20656a
files src/ChangeLog src/DLD-FUNCTIONS/strfind.cc
diffstat 2 files changed, 35 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- a/src/ChangeLog	Tue Jan 19 10:06:42 2010 +0100
+++ b/src/ChangeLog	Tue Jan 19 13:24:54 2010 +0100
@@ -1,3 +1,7 @@
+2010-01-19  Jaroslav Hajek  <highegg@gmail.com>
+
+	* DLD-FUNCTIONS/strfind.cc: Optimize searching for 1 or 2 characters.
+
 2010-01-18  John W. Eaton  <jwe@octave.org>
 
 	* oct-parse.yy (fcn_end): Allow EOF as end of function if
--- a/src/DLD-FUNCTIONS/strfind.cc	Tue Jan 19 10:06:42 2010 +0100
+++ b/src/DLD-FUNCTIONS/strfind.cc	Tue Jan 19 13:24:54 2010 +0100
@@ -70,8 +70,38 @@
   // We'll use deque because it typically has the most favorable properties for
   // the operation we need.
   std::deque<octave_idx_type> accum;
-  if (n >= m)
+  if (m == 1)
+    {
+      // Looking for a single character.
+      for (octave_idx_type i = 0; i < n; i++)
+        {
+          if (y[i] == x[0])
+            accum.push_back (i);
+        }
+    }
+  else if (m == 2)
     {
+      // Two characters.
+      if (overlaps)
+        {
+          for (octave_idx_type i = 0; i < n-1; i++)
+            {
+              if (y[i] == x[0] && y[i+1] == x[1])
+                accum.push_back (i);
+            }
+        }
+      else
+        {
+          for (octave_idx_type i = 0; i < n-1; i++)
+            {
+              if (y[i] == x[0] && y[i+1] == x[1])
+                accum.push_back (i++);
+            }
+        }
+    }
+  else if (n >= m)
+    {
+      // General case.
       octave_idx_type j = 0;
 
       if (overlaps)