/* -*- c++ -*- */ /* * Copyright (C) 2010 The Android Open Source Project * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. */ #ifndef ANDROID_ASTL_SSTREAM__ #define ANDROID_ASTL_SSTREAM__ #include <char_traits.h> #include <ios_base.h> #include <streambuf> #include <string> #include <ostream> namespace std { // Declare basic_stringbuf which is a buffer implemented using a std::string. // Then declare stringstream which implement a stream using basic_stringbuf. struct basic_stringbuf : public streambuf { public: typedef streambuf::traits_type traits_type; typedef streambuf::char_type char_type; typedef streambuf::int_type int_type; typedef streambuf::pos_type pos_type; typedef streambuf::off_type off_type; // Construct an instance, in/out by default. explicit basic_stringbuf(ios_base::openmode mode = ios_base::in | ios_base::out); // Construct an instance and copy str into the underlying buffer // and initialize the input and output sequence according to the // flags set in mode. explicit basic_stringbuf(const string& str, ios_base::openmode mode = ios_base::in | ios_base::out); virtual ~basic_stringbuf(); // @return A copy of the underlying buffer. If the buffer was // creted in input mode, this is equal to the the input // sequence. Otherwise it is equal to the output sequence. // TODO: In the standard a copy is returned instead of const ref - // not sure why. const string& str() const; // Clear the current buffer then copy the content of str into // it. Initialize the input/output sequences according to the mode // used. // @param str The string to use as a new sequence. void str(const string & str); // @return -1 on output stream otherwise the number char available // for reading. streamsize in_avail(); protected: // Override the default impl from ostream to do the work. virtual streamsize xsputn(const char_type* str, streamsize num); ios_base::openmode mMode; string mString; }; // In a regular STL this is <char> full specialization. typedef basic_stringbuf stringbuf; class stringstream : public ostream { public: explicit stringstream(ios_base::openmode mode = ios_base::in | ios_base::out); explicit stringstream(const string& str, ios_base::openmode mode = ios_base::in | ios_base::out); virtual ~stringstream(); const string& str() const { return mStringBuf.str(); } void str(const string & str) { mStringBuf.str(str); } // TODO: move this to ostream. ostream& put(char c); private: basic_stringbuf mStringBuf; }; // In a regular STL stringstream inherits from ostringstream and // istringstream. Since we use stringstream everywhere we just declare // ostringstream as an alias to pass compilation. typedef stringstream ostringstream; } // namespace std #endif // ANDROID_ASTL_SSTREAM__