/*========================================================================= 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. =========================================================================*/ #ifndef @KWSYS_NAMESPACE@_std_sstream #define @KWSYS_NAMESPACE@_std_sstream #include <@KWSYS_NAMESPACE@/Configure.hxx> /* Define this macro temporarily to keep the code readable. */ #if !defined (KWSYS_NAMESPACE) && !defined(@KWSYS_NAMESPACE@_NAME_IS_KWSYS) # define kwsys_std @KWSYS_NAMESPACE@_std #endif #if !defined(@KWSYS_NAMESPACE@_NO_ANSI_STRING_STREAM) # ifdef _MSC_VER # pragma warning (push, 1) # pragma warning (disable: 4702) # endif # include # ifdef _MSC_VER # pragma warning(pop) # endif #else # ifdef _MSC_VER # pragma warning (push, 1) # pragma warning (disable: 4702) # endif # if !defined(@KWSYS_NAMESPACE@_NO_ANSI_STREAM_HEADERS) # include # else # include # if !defined(@KWSYS_NAMESPACE@_NO_STD_NAMESPACE) && !defined(@KWSYS_NAMESPACE@_FAKE_STD_NAMESPACE) namespace std { using ::ostream; using ::istream; using ::istrstream; using ::ostrstream; using ::ios; using ::endl; using ::ends; using ::flush; } # endif # endif # ifdef _MSC_VER # pragma warning(pop) # endif // Only have old std::strstream classes. Wrap them to look like new // ostringstream and istringstream classes. # include <@KWSYS_NAMESPACE@/std/string> # if !defined(@KWSYS_NAMESPACE@_NO_STD_NAMESPACE) namespace std { # endif class ostringstream_cleanup { public: ostringstream_cleanup(kwsys_std::ostrstream& ostr): m_OStrStream(ostr) {} ~ostringstream_cleanup() { m_OStrStream.rdbuf()->freeze(0); } static void IgnoreUnusedVariable(const ostringstream_cleanup&) {} protected: kwsys_std::ostrstream& m_OStrStream; }; class ostringstream: public kwsys_std::ostrstream { public: typedef kwsys_std::ostrstream Superclass; ostringstream() {} kwsys_std::string str() { ostringstream_cleanup cleanup(*this); ostringstream_cleanup::IgnoreUnusedVariable(cleanup); int pcount = this->pcount(); const char* ptr = this->Superclass::str(); return kwsys_std::string(ptr?ptr:"", pcount); } private: ostringstream(const ostringstream&); void operator=(const ostringstream&); }; class istringstream: private kwsys_std::string, public kwsys_std::istrstream { public: typedef kwsys_std::string StdString; typedef kwsys_std::istrstream IStrStream; istringstream(): StdString(), IStrStream(StdString::c_str()) {} istringstream(const kwsys_std::string& s): StdString(s), IStrStream(StdString::c_str()) {} kwsys_std::string str() const { return *this; } void str(const kwsys_std::string& s) { // Very dangerous. If this throws, the object is hosed. When the // destructor is later called, the program is hosed too. this->~istringstream(); new (this) istringstream(s); } private: istringstream(const istringstream&); void operator=(const istringstream&); }; # if !defined(@KWSYS_NAMESPACE@_NO_STD_NAMESPACE) } # endif #endif /* Undefine temporary macro. */ #if !defined (KWSYS_NAMESPACE) && !defined(@KWSYS_NAMESPACE@_NAME_IS_KWSYS) # undef kwsys_std #endif #endif