/*=========================================================================

  Program:   KWSys - Kitware System Library
  Module:    $RCSfile: kwsys_ios_sstream.h.in,v $

  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@_ios_sstream
#define @KWSYS_NAMESPACE@_ios_sstream

#include <@KWSYS_NAMESPACE@/Configure.hxx>

/* Define this macro temporarily to keep the code readable.  */
#if !defined (KWSYS_NAMESPACE) && !@KWSYS_NAMESPACE@_NAME_IS_KWSYS
# define kwsys_stl @KWSYS_NAMESPACE@_stl
#endif

#if @KWSYS_NAMESPACE@_IOS_USE_SSTREAM
# ifdef _MSC_VER
#  pragma warning (push, 1)
#  pragma warning (disable: 4702)
# endif
# include <sstream>
# 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 @KWSYS_NAMESPACE@_IOS_USE_ANSI
#  include <strstream>
# elif @KWSYS_NAMESPACE@_IOS_USE_STRSTREAM_H
#  include <strstream.h>
# elif @KWSYS_NAMESPACE@_IOS_USE_STRSTREA_H
#  include <strstrea.h>
# endif
# if @KWSYS_NAMESPACE@_IOS_USE_ANSI
#  include <new> // Need placement operator new.
# else
#  include <new.h> // 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 <@KWSYS_NAMESPACE@/stl/string>

namespace @KWSYS_NAMESPACE@_ios
{
using @KWSYS_NAMESPACE@_ios_namespace::streambuf;
using @KWSYS_NAMESPACE@_ios_namespace::ostream;
using @KWSYS_NAMESPACE@_ios_namespace::istream;
using @KWSYS_NAMESPACE@_ios_namespace::strstream;
using @KWSYS_NAMESPACE@_ios_namespace::istrstream;
using @KWSYS_NAMESPACE@_ios_namespace::ostrstream;
using @KWSYS_NAMESPACE@_ios_namespace::ios;
using @KWSYS_NAMESPACE@_ios_namespace::endl;
using @KWSYS_NAMESPACE@_ios_namespace::ends;
using @KWSYS_NAMESPACE@_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 (@KWSYS_NAMESPACE@_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<char*>(StdString::c_str())) {}
  istringstream(const kwsys_stl::string& s):
    StdString(s), IStrStream(const_cast<char*>(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 @KWSYS_NAMESPACE@_ios

#endif

/* Undefine temporary macro.  */
#if !defined (KWSYS_NAMESPACE) && !@KWSYS_NAMESPACE@_NAME_IS_KWSYS
# undef kwsys_stl
#endif

#endif
