genericopenlibs/cppstdlib/stl/stlport/stl/_streambuf.h
changeset 22 ddc455616bd6
parent 0 e4d67989cc36
child 45 4b03adbd26ca
--- a/genericopenlibs/cppstdlib/stl/stlport/stl/_streambuf.h	Fri Apr 16 16:46:38 2010 +0300
+++ b/genericopenlibs/cppstdlib/stl/stlport/stl/_streambuf.h	Mon May 03 14:06:43 2010 +0300
@@ -72,7 +72,7 @@
 //  _STLP_mutex _M_lock;
 
 public:                         // Destructor.
-  virtual ~basic_streambuf();
+	virtual ~basic_streambuf(){}
 
 protected:                      // The default constructor.
   basic_streambuf()
@@ -122,24 +122,34 @@
     _M_pend   = __pend;
   }
 
-protected:                      // Virtual buffer management functions.
-
-  virtual basic_streambuf<_CharT, _Traits>* setbuf(char_type*, streamsize);
-
+protected:                   // Virtual buffer management functions.                                     
+  
+  
+  
+  virtual basic_streambuf<_CharT, _Traits>* setbuf(char_type*, streamsize) {
+      return this; 
+  }
+  
   // Alters the stream position, using an integer offset.  In this
   // class seekoff does nothing; subclasses are expected to override it.
+  
   virtual pos_type seekoff(off_type, ios_base::seekdir,
-                           ios_base::openmode = ios_base::in | ios_base::out);
-
+                             ios_base::openmode = ios_base::in | ios_base::out) {
+      return pos_type(-1); 
+  }
+  
   // Alters the stream position, using a previously obtained streampos.  In
   // this class seekpos does nothing; subclasses are expected to override it.
   virtual pos_type
-  seekpos(pos_type, ios_base::openmode = ios_base::in | ios_base::out);
-
+    seekpos(pos_type, ios_base::openmode = ios_base::in | ios_base::out) {
+      return pos_type(-1); 
+  }
+  
   // Synchronizes (i.e. flushes) the buffer.  All subclasses are expected to
   // override this virtual member function.
-  virtual int sync();
-
+  virtual int sync() {
+      return 0; 
+  }                             
 
 public:                         // Buffer management.
   basic_streambuf<_CharT, _Traits>* pubsetbuf(char_type* __s, streamsize __n)
@@ -155,46 +165,133 @@
 
   int pubsync() { return this->sync(); }
 
-protected:                      // Virtual get area functions, as defined in
-                                // 17.5.2.4.3 and 17.5.2.4.4 of the standard.
+protected:            // Virtual get area functions, as defined in
+                   // 17.5.2.4.3 and 17.5.2.4.4 of the standard.     
   // Returns a lower bound on the number of characters that we can read,
   // with underflow, before reaching end of file.  (-1 is a special value:
   // it means that underflow will fail.)  Most subclasses should probably
   // override this virtual member function.
-  virtual streamsize showmanyc();
-
+  
+  virtual streamsize showmanyc() {
+      return 0; 
+  }
+  
   // Reads up to __n characters.  Return value is the number of
   // characters read.
-  virtual streamsize xsgetn(char_type* __s, streamsize __n);
+  virtual streamsize xsgetn(char_type* __s, streamsize __n) {
+      streamsize __result = 0;
+      const int_type __eof = _Traits::eof();
 
+      while (__result < __n) {
+        if (_M_gnext < _M_gend) {
+          size_t __chunk = (min) (__STATIC_CAST(size_t,_M_gend - _M_gnext),
+                                  __STATIC_CAST(size_t,__n - __result));
+          _Traits::copy(__s, _M_gnext, __chunk);
+          __result += __chunk;
+          __s += __chunk;
+          _M_gnext += __chunk;
+        }
+        else {
+          int_type __c = this->sbumpc();
+          if (!_Traits::eq_int_type(__c, __eof)) {
+            *__s = _Traits::to_char_type(__c);
+            ++__result;
+            ++__s;
+          }
+          else
+            break;
+        }
+      }
+
+      return __result;
+  }
+  
   // Called when there is no read position, i.e. when gptr() is null
   // or when gptr() >= egptr().  Subclasses are expected to override
   // this virtual member function.
-  virtual int_type underflow();
-
+  virtual int_type underflow() {
+      return _Traits::eof(); 
+  }
+  
   // Similar to underflow(), but used for unbuffered input.  Most
   // subclasses should probably override this virtual member function.
-  virtual int_type uflow();
-
+  virtual int_type uflow() {
+      return ( _Traits::eq_int_type(this->underflow(),_Traits::eof()) ?
+               _Traits::eof() :
+               _Traits::to_int_type(*_M_gnext++));
+  }
+  
   // Called when there is no putback position, i.e. when gptr() is null
   // or when gptr() == eback().  All subclasses are expected to override
   // this virtual member function.
-  virtual int_type pbackfail(int_type = traits_type::eof());
+  virtual int_type pbackfail(int_type = traits_type::eof()) {
+      return _Traits::eof();                                    
+  }                                                             
+  
+
+protected:                  // Virtual put area functions, as defined in
+                           // 27.5.2.4.5 of the standard.
+              
+    // Writes up to __n characters.  Return value is the number of characters
+  	// written.
 
-protected:                      // Virtual put area functions, as defined in
-                                // 27.5.2.4.5 of the standard.
+    virtual streamsize xsputn(const char_type* __s, streamsize __n) {
+      streamsize __result = 0;
+      const int_type __eof = _Traits::eof();
+
+      while (__result < __n) {
+        if (_M_pnext < _M_pend) {
+          size_t __chunk = (min) (__STATIC_CAST(size_t,_M_pend - _M_pnext),
+                               __STATIC_CAST(size_t,__n - __result));
+          _Traits::copy(_M_pnext, __s, __chunk);
+          __result += __chunk;
+          __s += __chunk;
+          _M_pnext += __chunk;
+        }
 
-  // Writes up to __n characters.  Return value is the number of characters
-  // written.
-  virtual streamsize xsputn(const char_type* __s, streamsize __n);
-
-  // Extension: writes up to __n copies of __c.  Return value is the number
+        else if (!_Traits::eq_int_type(this->overflow(_Traits::to_int_type(*__s)),
+                                       __eof)) {
+          ++__result;
+          ++__s;
+        }
+        else
+          break;
+      }
+      return __result;
+  }
+  
+    // Extension: writes up to __n copies of __c.  Return value is the number
   // of characters written.
-  virtual streamsize _M_xsputnc(char_type __c, streamsize __n);
+
+  virtual streamsize _M_xsputnc(char_type __c, streamsize __n) {
+      streamsize __result = 0;
+      const int_type __eof = _Traits::eof();
+
+      while (__result < __n) {
+        if (_M_pnext < _M_pend) {
+          size_t __chunk = (min) (__STATIC_CAST(size_t,_M_pend - _M_pnext),
+                               __STATIC_CAST(size_t,__n - __result));
+          _Traits::assign(_M_pnext, __chunk, __c);
+          __result += __chunk;
+          _M_pnext += __chunk;
+        }
 
-  // Called when there is no write position.  All subclasses are expected to
+        else if (!_Traits::eq_int_type(this->overflow(_Traits::to_int_type(__c)),
+                                       __eof))
+          ++__result;
+        else
+          break;
+      }
+      return __result;
+  }
+  
+    // Called when there is no write position.  All subclasses are expected to
   // override this virtual member function.
-  virtual int_type overflow(int_type = traits_type::eof());
+
+  virtual int_type overflow(int_type = traits_type::eof()) {
+      return _Traits::eof();                                  
+  }                                                                 
+  
 
 public:                         // Public members for writing characters.
   // Write a single character.
@@ -259,7 +356,8 @@
   // sets the streambuf's locale to __loc.  Note that imbue should
   // not (and cannot, since it has no access to streambuf's private
   // members) set the streambuf's locale itself.
-  virtual void imbue(const locale&);
+
+  virtual void imbue(const locale&) {}
 
 public:                         // Locale-related functions.
   locale pubimbue(const locale&);