Commits

Anonymous committed 275c3e3

ENH: Added istream and ostream operators for stl string in KWSys when using old streams that do not provide them.

Comments (0)

Files changed (1)

GCC_XML/KWSys/kwsys_stl_string.hxx.in

+/*=========================================================================
+
+  Program:   KWSys - Kitware System Library
+  Module:    $RCSfile$
+
+  Copyright (c) Kitware, Inc., Insight Consortium.  All rights reserved.
+  See Copyright.txt or http://www.kitware.com/Copyright.htm for details.
+
+     This software is distributed WITHOUT ANY WARRANTY; without even
+     the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+     PURPOSE.  See the above copyright notices for more information.
+
+=========================================================================*/
+
+// This header is extra code for <@KWSYS_NAMESPACE@/stl/string>.
+#if !defined(@KWSYS_NAMESPACE@_stl_string_including_hxx)
+# error "The header <@KWSYS_NAMESPACE@/stl/string.hxx> may be included only by <@KWSYS_NAMESPACE@/stl/string>."
+#endif
+
+// Provide the istream operator for the stl string if it is not
+// provided by the system or another copy of kwsys.  Allow user code
+// to block this definition by defining the macro
+// @KWSYS_NAMESPACE@_STL_STRING_NO_ISTREAM
+// to avoid conflicts with other libraries.
+#if !@KWSYS_NAMESPACE@_STL_STRING_HAVE_ISTREAM && \
+    !defined(@KWSYS_NAMESPACE@_STL_STRING_NO_ISTREAM) && \
+    !defined(KWSYS_STL_STRING_ISTREAM_DEFINED)
+# define KWSYS_STL_STRING_ISTREAM_DEFINED
+# include <ctype.h> // isspace
+# include <@KWSYS_NAMESPACE@/ios/iostream>
+inline @KWSYS_NAMESPACE@_ios::istream&
+operator>>(@KWSYS_NAMESPACE@_ios::istream& is,
+           @KWSYS_NAMESPACE@_stl::string& s)
+{
+  // Keep track of the resulting state.
+  int state = @KWSYS_NAMESPACE@_ios::ios::goodbit;
+
+  // Save the width setting and set it back to zero.
+  size_t n = static_cast<size_t>(is.width(0));
+
+  // Clear any old contents of the output string.
+  s.erase();
+
+  // Skip leading whitespace.
+  is.eatwhite();
+  istream& okay = is;
+
+  if(okay)
+    {
+    // Select a maximum possible length.
+    if(n == 0 || n >= s.max_size())
+      {
+      n = s.max_size();
+      }
+
+    // Read until a space is found or the maximum length is reached.
+    bool success = false;
+    for(int c = is.peek(); (--n > 0 && c != EOF && !isspace(c)); c = is.peek())
+      {
+      s += static_cast<char>(c);
+      success = true;
+      is.ignore();
+      }
+
+    // Set flags for resulting state.
+    if(is.peek() == EOF) { state |= @KWSYS_NAMESPACE@_ios::ios::eofbit; }
+    if(success) { state |= @KWSYS_NAMESPACE@_ios::ios::failbit; }
+    }
+
+  // Set the final result state.
+  is.clear(state);
+  return is;
+}
+#endif
+
+// Provide the ostream operator for the stl string if it is not
+// provided by the system or another copy of kwsys.  Allow user code
+// to block this definition by defining the macro
+// @KWSYS_NAMESPACE@_STL_STRING_NO_OSTREAM
+// to avoid conflicts with other libraries.
+#if !@KWSYS_NAMESPACE@_STL_STRING_HAVE_OSTREAM && \
+    !defined(@KWSYS_NAMESPACE@_STL_STRING_NO_OSTREAM) && \
+    !defined(KWSYS_STL_STRING_OSTREAM_DEFINED)
+# define KWSYS_STL_STRING_OSTREAM_DEFINED
+# include <@KWSYS_NAMESPACE@/ios/iostream>
+inline @KWSYS_NAMESPACE@_ios::ostream&
+operator<<(@KWSYS_NAMESPACE@_ios::ostream& os,
+           @KWSYS_NAMESPACE@_stl::string const& s)
+{
+  return os << s.c_str();
+}
+#endif