diff liboctave/caseless-str.h @ 11075:4e31d44a9763

extract caseless_str class to separate header file
author John W. Eaton <jwe@octave.org>
date Fri, 01 Oct 2010 14:18:37 -0400
parents
children fd0a3ac60b0e
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/liboctave/caseless-str.h	Fri Oct 01 14:18:37 2010 -0400
@@ -0,0 +1,70 @@
+/*
+
+Copyright (C) 2007, 2008, 2009, 2010 Shai Ayal
+
+This file is part of Octave.
+
+Octave is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+Octave is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with Octave; see the file COPYING.  If not, see
+<http://www.gnu.org/licenses/>.
+
+*/
+
+#if !defined (octave_caseless_str_h)
+#define octave_caseless_str_h 1
+
+#include <string>
+
+class caseless_str : public std::string
+{
+public:
+
+  typedef std::string::iterator iterator;
+  typedef std::string::const_iterator const_iterator;
+
+  caseless_str (void) : std::string () { }
+  caseless_str (const std::string& s) : std::string (s) { }
+  caseless_str (const char *s) : std::string (s) { }
+
+  caseless_str (const caseless_str& name) : std::string (name) { }
+
+  caseless_str& operator = (const caseless_str& pname)
+  {
+    std::string::operator = (pname);
+    return *this;
+  }
+
+  operator std::string (void) const { return *this; }
+
+  // Case-insensitive comparison.
+  bool compare (const std::string& s, size_t limit = std::string::npos) const
+  {
+    const_iterator p1 = begin ();
+    const_iterator p2 = s.begin ();
+
+    size_t k = 0;
+
+    while (p1 != end () && p2 != s.end () && k++ < limit)
+      {
+        if (std::tolower (*p1) != std::tolower (*p2))
+          return false;
+
+        *p1++;
+        *p2++;
+      }
+
+    return (limit == std::string::npos) ? size () == s.size () : k == limit;
+  }
+};
+
+#endif