Blame boost/format/alt_sstream.hpp

Packit 58578d
// ----------------------------------------------------------------------------
Packit 58578d
//  alt_sstream.hpp : alternative stringstream 
Packit 58578d
// ----------------------------------------------------------------------------
Packit 58578d
Packit 58578d
//  Copyright Samuel Krempp 2003. Use, modification, and distribution are
Packit 58578d
//  subject to the Boost Software License, Version 1.0. (See accompanying
Packit 58578d
//  file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
Packit 58578d
Packit 58578d
//  See http://www.boost.org/libs/format for library home page
Packit 58578d
Packit 58578d
// ----------------------------------------------------------------------------
Packit 58578d
Packit 58578d
Packit 58578d
Packit 58578d
#ifndef BOOST_SK_ALT_SSTREAM_HPP
Packit 58578d
#define BOOST_SK_ALT_SSTREAM_HPP
Packit 58578d
Packit 58578d
#include <string>
Packit 58578d
#include <boost/format/detail/compat_workarounds.hpp>
Packit 58578d
#include <boost/utility/base_from_member.hpp>
Packit 58578d
#include <boost/shared_ptr.hpp>
Packit 58578d
#include <boost/config.hpp>
Packit 58578d
#include <boost/assert.hpp>
Packit 58578d
Packit 58578d
namespace boost {
Packit 58578d
    namespace io {
Packit 58578d
Packit 58578d
        template<class Ch, class Tr=::std::char_traits<Ch>, 
Packit 58578d
                 class Alloc=::std::allocator<Ch> >
Packit 58578d
        class basic_altstringbuf;
Packit 58578d
Packit 58578d
        template<class Ch, class Tr =::std::char_traits<Ch>, 
Packit 58578d
                 class Alloc=::std::allocator<Ch> >
Packit 58578d
        class basic_oaltstringstream;
Packit 58578d
Packit 58578d
Packit 58578d
        template<class Ch, class Tr, class Alloc>
Packit 58578d
        class basic_altstringbuf 
Packit 58578d
            : public ::std::basic_streambuf<Ch, Tr>
Packit 58578d
        {
Packit 58578d
            typedef ::std::basic_streambuf<Ch, Tr>  streambuf_t;
Packit 58578d
            typedef typename CompatAlloc<Alloc>::compatible_type compat_allocator_type;
Packit 58578d
            typedef typename CompatTraits::compatible_type   compat_traits_type;
Packit 58578d
        public:
Packit 58578d
            typedef Ch     char_type;
Packit 58578d
            typedef Tr     traits_type;
Packit 58578d
            typedef typename compat_traits_type::int_type     int_type;
Packit 58578d
            typedef typename compat_traits_type::pos_type     pos_type;
Packit 58578d
            typedef typename compat_traits_type::off_type     off_type;
Packit 58578d
            typedef Alloc                     allocator_type;
Packit 58578d
            typedef ::std::basic_string<Ch, Tr, Alloc> string_type;
Packit 58578d
            typedef typename string_type::size_type    size_type;
Packit 58578d
Packit 58578d
            typedef ::std::streamsize streamsize;
Packit 58578d
Packit 58578d
Packit 58578d
            explicit basic_altstringbuf(std::ios_base::openmode mode
Packit 58578d
                                        = std::ios_base::in | std::ios_base::out)
Packit 58578d
                : putend_(NULL), is_allocated_(false), mode_(mode) 
Packit 58578d
                {}
Packit 58578d
            explicit basic_altstringbuf(const string_type& s,
Packit 58578d
                                        ::std::ios_base::openmode mode
Packit 58578d
                                        = ::std::ios_base::in | ::std::ios_base::out)
Packit 58578d
                : putend_(NULL), is_allocated_(false), mode_(mode) 
Packit 58578d
                { dealloc(); str(s); }
Packit 58578d
            virtual ~basic_altstringbuf() BOOST_NOEXCEPT_OR_NOTHROW
Packit 58578d
                { dealloc(); }
Packit 58578d
            using streambuf_t::pbase;
Packit 58578d
            using streambuf_t::pptr;
Packit 58578d
            using streambuf_t::epptr;
Packit 58578d
            using streambuf_t::eback;
Packit 58578d
            using streambuf_t::gptr;
Packit 58578d
            using streambuf_t::egptr;
Packit 58578d
    
Packit 58578d
            void clear_buffer();
Packit 58578d
            void str(const string_type& s);
Packit 58578d
Packit 58578d
            // 0-copy access :
Packit 58578d
            Ch * begin() const; 
Packit 58578d
            size_type size() const;
Packit 58578d
            size_type cur_size() const; // stop at current pointer
Packit 58578d
            Ch * pend() const // the highest position reached by pptr() since creation
Packit 58578d
                { return ((putend_ < pptr()) ? pptr() : putend_); }
Packit 58578d
            size_type pcount() const 
Packit 58578d
                { return static_cast<size_type>( pptr() - pbase()) ;}
Packit 58578d
Packit 58578d
            // copy buffer to string :
Packit 58578d
            string_type str() const 
Packit 58578d
                { return string_type(begin(), size()); }
Packit 58578d
            string_type cur_str() const 
Packit 58578d
                { return string_type(begin(), cur_size()); }
Packit 58578d
        protected:
Packit 58578d
            explicit basic_altstringbuf (basic_altstringbuf * s,
Packit 58578d
                                         ::std::ios_base::openmode mode 
Packit 58578d
                                         = ::std::ios_base::in | ::std::ios_base::out)
Packit 58578d
                : putend_(NULL), is_allocated_(false), mode_(mode) 
Packit 58578d
                { dealloc(); str(s); }
Packit 58578d
Packit 58578d
            virtual pos_type seekoff(off_type off, ::std::ios_base::seekdir way, 
Packit 58578d
                                     ::std::ios_base::openmode which 
Packit 58578d
                                     = ::std::ios_base::in | ::std::ios_base::out);
Packit 58578d
            virtual pos_type seekpos (pos_type pos, 
Packit 58578d
                                      ::std::ios_base::openmode which 
Packit 58578d
                                      = ::std::ios_base::in | ::std::ios_base::out);
Packit 58578d
            virtual int_type underflow();
Packit 58578d
            virtual int_type pbackfail(int_type meta = compat_traits_type::eof());
Packit 58578d
            virtual int_type overflow(int_type meta = compat_traits_type::eof());
Packit 58578d
            void dealloc();
Packit 58578d
        private:
Packit 58578d
            enum { alloc_min = 256}; // minimum size of allocations
Packit 58578d
Packit 58578d
            Ch *putend_;  // remembers (over seeks) the highest value of pptr()
Packit 58578d
            bool is_allocated_;
Packit 58578d
            ::std::ios_base::openmode mode_;
Packit 58578d
            compat_allocator_type alloc_;  // the allocator object
Packit 58578d
        };
Packit 58578d
Packit 58578d
Packit 58578d
// ---   class basic_oaltstringstream ----------------------------------------
Packit 58578d
        template <class Ch, class Tr, class Alloc>
Packit 58578d
        class basic_oaltstringstream 
Packit 58578d
            : private base_from_member< shared_ptr< basic_altstringbuf< Ch, Tr, Alloc> > >,
Packit 58578d
              public ::std::basic_ostream<Ch, Tr>
Packit 58578d
        {
Packit 58578d
            class No_Op { 
Packit 58578d
                // used as no-op deleter for (not-owner) shared_pointers
Packit 58578d
            public: 
Packit 58578d
                template<class T>
Packit 58578d
                const T & operator()(const T & arg) { return arg; }
Packit 58578d
            };
Packit 58578d
            typedef ::std::basic_ostream<Ch, Tr> stream_t;
Packit 58578d
            typedef boost::base_from_member
Packit 58578d
                basic_altstringbuf<Ch,Tr, Alloc> > > 
Packit 58578d
                pbase_type;
Packit 58578d
            typedef ::std::basic_string<Ch, Tr, Alloc>  string_type;
Packit 58578d
            typedef typename string_type::size_type     size_type;
Packit 58578d
            typedef basic_altstringbuf<Ch, Tr, Alloc>   stringbuf_t;
Packit 58578d
        public:
Packit 58578d
            typedef Alloc  allocator_type;
Packit 58578d
            basic_oaltstringstream() 
Packit 58578d
                : pbase_type(new stringbuf_t), stream_t(pbase_type::member.get())
Packit 58578d
                { }
Packit 58578d
            basic_oaltstringstream(::boost::shared_ptr<stringbuf_t> buf) 
Packit 58578d
                : pbase_type(buf), stream_t(pbase_type::member.get())
Packit 58578d
                { }
Packit 58578d
            basic_oaltstringstream(stringbuf_t * buf) 
Packit 58578d
                : pbase_type(buf, No_Op() ), stream_t(pbase_type::member.get())
Packit 58578d
                { }
Packit 58578d
            stringbuf_t * rdbuf() const 
Packit 58578d
                { return pbase_type::member.get(); }
Packit 58578d
            void clear_buffer() 
Packit 58578d
                { rdbuf()->clear_buffer(); }
Packit 58578d
Packit 58578d
            // 0-copy access :
Packit 58578d
            Ch * begin() const 
Packit 58578d
                { return rdbuf()->begin(); }
Packit 58578d
            size_type size() const 
Packit 58578d
                { return rdbuf()->size(); }
Packit 58578d
            size_type cur_size() const // stops at current position
Packit 58578d
                { return rdbuf()->cur_size(); }
Packit 58578d
Packit 58578d
            // copy buffer to string :
Packit 58578d
            string_type str()     const   // [pbase, epptr[
Packit 58578d
                { return rdbuf()->str(); } 
Packit 58578d
            string_type cur_str() const   // [pbase, pptr[
Packit 58578d
                { return rdbuf()->cur_str(); }
Packit 58578d
            void str(const string_type& s) 
Packit 58578d
                { rdbuf()->str(s); }
Packit 58578d
        };
Packit 58578d
Packit 58578d
    } // N.S. io
Packit 58578d
} // N.S. boost
Packit 58578d
Packit 58578d
#include <boost/format/alt_sstream_impl.hpp>
Packit 58578d
Packit 58578d
#endif // include guard
Packit 58578d