| /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ |
| /* This Source Code Form is subject to the terms of the Mozilla Public |
| * License, v. 2.0. If a copy of the MPL was not distributed with this |
| * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ |
| |
| /* |
| * Robin J. Maxwell 11-22-96 |
| * Fredrik Roubert <roubert@google.com> 2010-07-23 |
| * Matt Austern <austern@google.com> 2010-07-23 |
| */ |
| |
| #ifndef _PRSTRMS_H |
| #define _PRSTRMS_H |
| |
| #include <cstddef> |
| #include <istream> |
| #include <ostream> |
| #include <streambuf> |
| |
| #include "prio.h" |
| |
| #ifdef _MSC_VER |
| // http://support.microsoft.com/kb/q168958/ |
| class PR_IMPLEMENT(std::_Mutex); |
| class PR_IMPLEMENT(std::ios_base); |
| #endif |
| |
| |
| class PR_IMPLEMENT(PRfilebuf): public std::streambuf |
| { |
| public: |
| PRfilebuf(); |
| PRfilebuf(PRFileDesc *fd); |
| PRfilebuf(PRFileDesc *fd, char_type *ptr, std::streamsize len); |
| virtual ~PRfilebuf(); |
| |
| bool is_open() const { return _fd != NULL; } |
| |
| PRfilebuf *open( |
| const char *name, |
| std::ios_base::openmode flags, |
| PRIntn mode); |
| PRfilebuf *attach(PRFileDesc *fd); |
| PRfilebuf *close(); |
| |
| protected: |
| virtual std::streambuf *setbuf(char_type *ptr, std::streamsize len); |
| virtual pos_type seekoff( |
| off_type offset, |
| std::ios_base::seekdir dir, |
| std::ios_base::openmode flags); |
| virtual pos_type seekpos( |
| pos_type pos, |
| std::ios_base::openmode flags) { |
| return seekoff(pos, std::ios_base::beg, flags); |
| } |
| virtual int sync(); |
| virtual int_type underflow(); |
| virtual int_type overflow(int_type c = traits_type::eof()); |
| |
| // TODO: Override pbackfail(), showmanyc(), uflow(), xsgetn(), and xsputn(). |
| |
| private: |
| bool allocate(); |
| void setb(char_type *buf_base, char_type *buf_end, bool user_buf); |
| |
| PRFileDesc *_fd; |
| bool _opened; |
| bool _allocated; |
| bool _unbuffered; |
| bool _user_buf; |
| char_type *_buf_base; |
| char_type *_buf_end; |
| }; |
| |
| |
| class PR_IMPLEMENT(PRifstream): public std::istream |
| { |
| public: |
| PRifstream(); |
| PRifstream(PRFileDesc *fd); |
| PRifstream(PRFileDesc *fd, char_type *ptr, std::streamsize len); |
| PRifstream(const char *name, openmode flags = in, PRIntn mode = 0); |
| virtual ~PRifstream(); |
| |
| PRfilebuf *rdbuf() const { return &_filebuf; } |
| bool is_open() const { return _filebuf.is_open(); } |
| |
| void open(const char *name, openmode flags = in, PRIntn mode = 0); |
| void attach(PRFileDesc *fd); |
| void close(); |
| |
| private: |
| mutable PRfilebuf _filebuf; |
| }; |
| |
| |
| class PR_IMPLEMENT(PRofstream): public std::ostream |
| { |
| public: |
| PRofstream(); |
| PRofstream(PRFileDesc *fd); |
| PRofstream(PRFileDesc *fd, char_type *ptr, std::streamsize len); |
| PRofstream(const char *name, openmode flags = out, PRIntn mode = 0); |
| virtual ~PRofstream(); |
| |
| PRfilebuf *rdbuf() const { return &_filebuf; } |
| bool is_open() const { return _filebuf.is_open(); } |
| |
| void open(const char *name, openmode flags = out, PRIntn mode = 0); |
| void attach(PRFileDesc *fd); |
| void close(); |
| |
| private: |
| mutable PRfilebuf _filebuf; |
| }; |
| |
| |
| class PR_IMPLEMENT(PRfstream): public std::iostream |
| { |
| public: |
| PRfstream(); |
| PRfstream(PRFileDesc *fd); |
| PRfstream(PRFileDesc *fd, char_type *ptr, std::streamsize len); |
| PRfstream(const char *name, openmode flags = in | out, PRIntn mode = 0); |
| virtual ~PRfstream(); |
| |
| PRfilebuf *rdbuf() const { return &_filebuf; } |
| bool is_open() const { return _filebuf.is_open(); } |
| |
| void open(const char *name, openmode flags = in | out, PRIntn mode = 0); |
| void attach(PRFileDesc *fd); |
| void close(); |
| |
| private: |
| mutable PRfilebuf _filebuf; |
| }; |
| |
| |
| #endif /* _PRSTRMS_H */ |