/*========================================================================= 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 cmsys_ios_sstream #define cmsys_ios_sstream #include /* Define this macro temporarily to keep the code readable. */ #if !defined (KWSYS_NAMESPACE) && !cmsys_NAME_IS_KWSYS # define kwsys_stl cmsys_stl #endif #if cmsys_IOS_USE_SSTREAM # 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) # pragma warning (disable: 4995) /* Old streams are deprecated. */ # endif # if cmsys_IOS_USE_ANSI # include # elif cmsys_IOS_USE_STRSTREAM_H # include # elif cmsys_IOS_USE_STRSTREA_H # include # endif # if cmsys_IOS_USE_ANSI # include // Need placement operator new. # else # include // Need placement operator new. # 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 namespace cmsys_ios { using cmsys_ios_namespace::streambuf; using cmsys_ios_namespace::ostream; using cmsys_ios_namespace::istream; using cmsys_ios_namespace::strstream; using cmsys_ios_namespace::istrstream; using cmsys_ios_namespace::ostrstream; using cmsys_ios_namespace::ios; using cmsys_ios_namespace::endl; using cmsys_ios_namespace::ends; using cmsys_ios_namespace::flush; class stringstream_cleanup { public: stringstream_cleanup(strstream& str): m_StrStream(str) {} ~stringstream_cleanup() { m_StrStream.rdbuf()->freeze(0); } static void IgnoreUnusedVariable(const stringstream_cleanup&) {} protected: strstream& m_StrStream; private: void operator=(stringstream_cleanup const&); }; class stringstream: public strstream { public: typedef strstream Superclass; stringstream() {} stringstream(const kwsys_stl::string& s) { *this << s.c_str(); } kwsys_stl::string str() { stringstream_cleanup cleanup(*this); stringstream_cleanup::IgnoreUnusedVariable(cleanup); // Visual Studio 6 has a strstream::pcount, but this is not rdbuf()->pcount() #if (cmsys_IOS_USE_STRSTREA_H) && defined(_MSC_VER) && (_MSC_VER == 1200) int count = this->pcount(); #elif defined(__WATCOMC__) int count = this->rdbuf()->out_waiting(); #else int count = this->rdbuf()->pcount(); #endif const char* ptr = this->Superclass::str(); return kwsys_stl::string(ptr?ptr:"", count); } void str(const kwsys_stl::string& s) { this->~stringstream(); new (this) stringstream(s); } private: stringstream(const stringstream&); void operator=(const stringstream&); }; class ostringstream_cleanup { public: ostringstream_cleanup(ostrstream& ostr): m_OStrStream(ostr) {} ~ostringstream_cleanup() { m_OStrStream.rdbuf()->freeze(0); } static void IgnoreUnusedVariable(const ostringstream_cleanup&) {} protected: ostrstream& m_OStrStream; private: void operator=(ostringstream_cleanup const&); }; class ostringstream: public ostrstream { public: typedef ostrstream Superclass; ostringstream() {} ostringstream(const kwsys_stl::string& s) { *this << s.c_str(); } kwsys_stl::string str() { ostringstream_cleanup cleanup(*this); ostringstream_cleanup::IgnoreUnusedVariable(cleanup); int count = this->pcount(); const char* ptr = this->Superclass::str(); return kwsys_stl::string(ptr?ptr:"", count); } void str(const kwsys_stl::string& s) { this->~ostringstream(); new (this) ostringstream(s); } private: ostringstream(const ostringstream&); void operator=(const ostringstream&); }; #if defined(_MSC_VER) # pragma warning (push) # pragma warning (disable: 4097) /* typedef-name used as synonym for class */ #endif #if defined(__WATCOMC__) // W728: class modifiers for 'A' conflict with class modifiers for 'B' # pragma warning 728 10 #endif class istringstream: private kwsys_stl::string, public istrstream { public: typedef kwsys_stl::string StdString; typedef istrstream IStrStream; istringstream(): StdString(), IStrStream(const_cast(StdString::c_str())) {} istringstream(const kwsys_stl::string& s): StdString(s), IStrStream(const_cast(StdString::c_str())) {} kwsys_stl::string str() const { return *this; } void str(const kwsys_stl::string& s) { this->~istringstream(); new (this) istringstream(s); } void clear(int flags) { this->IStrStream::clear(flags); } private: istringstream(const istringstream&); void operator=(const istringstream&); }; #if defined(__WATCOMC__) # pragma warning 728 9 #endif #if defined(_MSC_VER) # pragma warning (pop) #endif } // namespace cmsys_ios #endif /* Undefine temporary macro. */ #if !defined (KWSYS_NAMESPACE) && !cmsys_NAME_IS_KWSYS # undef kwsys_stl #endif #endif