diff -r e1b950c65cb4 -r 837f303aceeb epoc32/include/stdapis/stlportv5/stl/_bitset.h
--- a/epoc32/include/stdapis/stlportv5/stl/_bitset.h	Wed Mar 31 12:27:01 2010 +0100
+++ b/epoc32/include/stdapis/stlportv5/stl/_bitset.h	Wed Mar 31 12:33:34 2010 +0100
@@ -1,15 +1,14 @@
 /*
- * © Portions copyright (c) 2006-2007 Nokia Corporation.  All rights reserved.
  * Copyright (c) 1998
  * Silicon Graphics Computer Systems, Inc.
  *
- * Copyright (c) 1999 
+ * Copyright (c) 1999
  * Boris Fomitchev
  *
  * This material is provided "as is", with absolutely no warranty expressed
  * or implied. Any use is at your own risk.
  *
- * Permission to use or copy this software for any purpose is hereby granted 
+ * Permission to use or copy this software for any purpose is hereby granted
  * without fee, provided the above notices are retained on all copies.
  * Permission to modify the code and to distribute modified code is granted,
  * provided the above notices are retained, and a notice that the code was
@@ -20,12 +19,12 @@
 #ifndef _STLP_BITSET_H
 #define _STLP_BITSET_H
 
-// A bitset of size N has N % (sizeof(unsigned long) * CHAR_BIT) unused 
+// A bitset of size N has N % (sizeof(unsigned long) * CHAR_BIT) unused
 // bits.  (They are the high- order bits in the highest word.)  It is
 // a class invariant of class bitset<> that those unused bits are
 // always zero.
 
-// Most of the actual code isn't contained in bitset<> itself, but in the 
+// Most of the actual code isn't contained in bitset<> itself, but in the
 // base class _Base_bitset.  The base class works with whole words, not with
 // individual bits.  This allows us to specialize _Base_bitset for the
 // important special case where the bitset is only a single word.
@@ -36,47 +35,74 @@
 // returns a reference to a bit, again without doing any range checking.
 
 
-# ifndef _STLP_INTERNAL_ALGOBASE_H
+#ifndef _STLP_INTERNAL_ALGOBASE_H
 #  include <stl/_algobase.h>
-# endif
+#endif
 
-# ifndef _STLP_INTERNAL_ALLOC_H
+#ifndef _STLP_INTERNAL_ALLOC_H
 #  include <stl/_alloc.h>
-# endif
+#endif
 
-# ifndef _STLP_INTERNAL_ITERATOR_H
+#ifndef _STLP_INTERNAL_ITERATOR_H
 #  include <stl/_iterator.h>
-# endif
+#endif
 
-# ifndef _STLP_INTERNAL_UNINITIALIZED_H
+#ifndef _STLP_INTERNAL_UNINITIALIZED_H
 #  include <stl/_uninitialized.h>
-# endif
+#endif
 
-# ifndef _STLP_RANGE_ERRORS_H
+#ifndef _STLP_RANGE_ERRORS_H
 #  include <stl/_range_errors.h>
-# endif
+#endif
 
-# ifndef _STLP_STRING
-#  include <string>
-# endif
-
-# ifndef _STLP_ISTREAM
-#  include <istream>
-# endif
+#ifndef _STLP_INTERNAL_STRING_H
+#  include <stl/_string.h>
+#endif
 
 #define __BITS_PER_WORD (CHAR_BIT*sizeof(unsigned long))
 #define __BITSET_WORDS(__n) ((__n + __BITS_PER_WORD - 1)/__BITS_PER_WORD)
 
 _STLP_BEGIN_NAMESPACE
 
+_STLP_MOVE_TO_PRIV_NAMESPACE
+
 // structure to aid in counting bits
-template<class _Dummy> 
-class _Bs_G {
-public:
-  static const unsigned char _S_bit_count[256];
-  // Mapping from 8 bit unsigned integers to the index of the first one
-  // bit:
-  static const unsigned char _S_first_one[256];
+class _STLP_CLASS_DECLSPEC _Bs_G
+{
+  public:
+    //returns the number of bit set within the buffer between __beg and __end.
+   #if defined (__SYMBIAN32__)
+    _STLP_DECLSPEC 
+#endif 
+	  static size_t _S_count(const unsigned char *__beg, const unsigned char *__end)
+#if defined (_STLP_USE_NO_IOSTREAMS)
+    {
+      size_t __result = 0;
+      for (; __beg != __end; ++__beg) {
+        for (size_t i = 0; i < (sizeof(unsigned char) * 8); ++i) {
+          if ((*__beg & (1 << i)) != 0) { ++__result; }
+        }
+      }
+      return __result;
+    }
+#else
+      ;
+#endif
+    // Mapping from 8 bit unsigned integers to the index of the first one bit set:
+#if defined (__SYMBIAN32__)
+    _STLP_DECLSPEC 
+#endif
+	static unsigned char _S_first_one(unsigned char __x)
+#if defined (_STLP_USE_NO_IOSTREAMS)
+    {
+      for (unsigned char i = 0; i < (sizeof(unsigned char) * 8); ++i) {
+        if ((__x & (1 << i)) != 0) { return i; }
+      }
+      return 0;
+    }
+#else
+      ;
+#endif
 };
 
 //
@@ -89,13 +115,13 @@
 
   _WordT _M_w[_Nw];                // 0 is the least significant word.
 
-  _Base_bitset( void ) { _M_do_reset(); }
+  _Base_bitset() { _M_do_reset(); }
 
   _Base_bitset(unsigned long __val) {
     _M_do_reset();
     _M_w[0] = __val;
   }
-  
+
   static size_t _STLP_CALL _S_whichword( size_t __pos ) {
     return __pos / __BITS_PER_WORD;
   }
@@ -149,7 +175,6 @@
     }
   }
 
-
   void _M_do_reset() { memset(_M_w, 0, _Nw * sizeof(_WordT)); }
 
   bool _M_is_equal(const _Base_bitset<_Nw>& __x) const {
@@ -169,18 +194,13 @@
   }
 
   size_t _M_do_count() const {
-    size_t __result = 0;
     const unsigned char* __byte_ptr = (const unsigned char*)_M_w;
     const unsigned char* __end_ptr = (const unsigned char*)(_M_w+_Nw);
 
-    while ( __byte_ptr < __end_ptr ) {
-      __result += _Bs_G<bool>::_S_bit_count[*__byte_ptr];
-      __byte_ptr++;
-    }
-    return __result;
+    return _Bs_G::_S_count(__byte_ptr, __end_ptr);
   }
 
-  unsigned long _M_do_to_ulong() const; 
+  unsigned long _M_do_to_ulong() const;
 
   // find first "on" bit
   size_t _M_do_find_first(size_t __not_found) const;
@@ -192,7 +212,6 @@
 //
 // Base class: specialization for a single word.
 //
-
 _STLP_TEMPLATE_NULL
 struct _Base_bitset<1UL> {
   typedef unsigned long _WordT;
@@ -202,7 +221,7 @@
 
   _Base_bitset( void ) : _M_w(0) {}
   _Base_bitset(unsigned long __val) : _M_w(__val) {}
-  
+
   static size_t _STLP_CALL _S_whichword( size_t __pos ) {
     return __pos / __BITS_PER_WORD ;
   }
@@ -222,7 +241,6 @@
   _WordT& _M_hiword()       { return _M_w; }
   _WordT  _M_hiword() const { return _M_w; }
 
-
   void _M_do_and(const _Self& __x) { _M_w &= __x._M_w; }
   void _M_do_or(const _Self& __x)  { _M_w |= __x._M_w; }
   void _M_do_xor(const _Self& __x) { _M_w ^= __x._M_w; }
@@ -240,14 +258,9 @@
   }
 
   size_t _M_do_count() const {
-    size_t __result = 0;
     const unsigned char* __byte_ptr = (const unsigned char*)&_M_w;
     const unsigned char* __end_ptr = ((const unsigned char*)&_M_w)+sizeof(_M_w);
-    while ( __byte_ptr < __end_ptr ) {
-      __result += _Bs_G<bool>::_S_bit_count[*__byte_ptr];
-      __byte_ptr++;
-    }
-    return __result;
+    return _Bs_G::_S_count(__byte_ptr, __end_ptr);
   }
 
   unsigned long _M_do_to_ulong() const { return _M_w; }
@@ -255,8 +268,7 @@
   inline size_t _M_do_find_first(size_t __not_found) const;
 
   // find the next "on" bit that follows "prev"
-  inline size_t _M_do_find_next(size_t __prev, size_t __not_found) const; 
-
+  inline size_t _M_do_find_next(size_t __prev, size_t __not_found) const;
 };
 
 
@@ -265,10 +277,8 @@
 // Definitions of should-be-non-inline functions from the single-word version of
 //  _Base_bitset.
 //
-
-inline size_t 
-_Base_bitset<1UL>::_M_do_find_first(size_t __not_found) const
-{
+inline size_t
+_Base_bitset<1UL>::_M_do_find_first(size_t __not_found) const {
   //  typedef unsigned long _WordT;
   _WordT __thisword = _M_w;
 
@@ -278,7 +288,7 @@
       unsigned char __this_byte
         = __STATIC_CAST(unsigned char,(__thisword & (~(unsigned char)0)));
       if ( __this_byte )
-        return __j*CHAR_BIT + _Bs_G<bool>::_S_first_one[__this_byte];
+        return __j*CHAR_BIT + _Bs_G::_S_first_one(__this_byte);
 
       __thisword >>= CHAR_BIT;
     }
@@ -287,10 +297,9 @@
   return __not_found;
 }
 
-inline size_t 
-_Base_bitset<1UL>::_M_do_find_next(size_t __prev, 
-                                   size_t __not_found ) const
-{
+inline size_t
+_Base_bitset<1UL>::_M_do_find_next(size_t __prev,
+                                   size_t __not_found ) const {
   // make bound inclusive
   ++__prev;
 
@@ -312,7 +321,7 @@
       unsigned char __this_byte
         = __STATIC_CAST(unsigned char,(__thisword & (~(unsigned char)0)));
       if ( __this_byte )
-        return __j*CHAR_BIT + _Bs_G<bool>::_S_first_one[__this_byte];
+        return __j*CHAR_BIT + _Bs_G::_S_first_one(__this_byte);
 
       __thisword >>= CHAR_BIT;
     }
@@ -328,29 +337,28 @@
 
 template <size_t _Extrabits> struct _Sanitize {
   static void _STLP_CALL _M_do_sanitize(unsigned long& __val)
-    { __val &= ~((~__STATIC_CAST(unsigned long,0)) << _Extrabits); }
+  { __val &= ~((~__STATIC_CAST(unsigned long,0)) << _Extrabits); }
 };
 
 _STLP_TEMPLATE_NULL struct _Sanitize<0UL> {
   static void _STLP_CALL _M_do_sanitize(unsigned long) {}
 };
 
+_STLP_MOVE_TO_STD_NAMESPACE
+
 // ------------------------------------------------------------
 // Class bitset.
 //   _Nb may be any nonzero number of type size_t.
-
-
 template<size_t _Nb>
-class bitset : public _Base_bitset<__BITSET_WORDS(_Nb) > 
-{
+class bitset : public _STLP_PRIV _Base_bitset<__BITSET_WORDS(_Nb) > {
 public:
   enum { _Words = __BITSET_WORDS(_Nb) } ;
 
 private:
-  typedef _Base_bitset< _Words > _Base;
+  typedef _STLP_PRIV _Base_bitset< _Words > _Base;
 
   void _M_do_sanitize() {
-    _Sanitize<_Nb%__BITS_PER_WORD >::_M_do_sanitize(this->_M_hiword());
+    _STLP_PRIV _Sanitize<_Nb%__BITS_PER_WORD >::_M_do_sanitize(this->_M_hiword());
   }
 public:
   typedef unsigned long _WordT;
@@ -359,7 +367,7 @@
 
   // bit reference:
   struct reference {
-  typedef _Base_bitset<_Words > _Bitset_base;
+  typedef _STLP_PRIV _Base_bitset<_Words > _Bitset_base;
   typedef bitset<_Nb> _Bitset;
     //    friend _Bitset;
     _WordT *_M_wp;
@@ -412,15 +420,14 @@
   // 23.3.5.1 constructors:
   bitset() {}
 
-  bitset(unsigned long __val) : _Base_bitset<_Words>(__val) { _M_do_sanitize(); }
+  bitset(unsigned long __val) : _STLP_PRIV _Base_bitset<_Words>(__val) { _M_do_sanitize(); }
 
-# ifdef _STLP_MEMBER_TEMPLATES
+#if defined (_STLP_MEMBER_TEMPLATES)
   template<class _CharT, class _Traits, class _Alloc>
   explicit bitset(const basic_string<_CharT,_Traits,_Alloc>& __s,
                   size_t __pos = 0)
-    : _Base_bitset<_Words >() 
-  {
-    if (__pos > __s.size()) 
+    : _STLP_PRIV _Base_bitset<_Words >() {
+    if (__pos > __s.size())
       __stl_throw_out_of_range("bitset");
     _M_copy_from_string(__s, __pos,
                         basic_string<_CharT, _Traits, _Alloc>::npos);
@@ -429,19 +436,17 @@
   bitset(const basic_string<_CharT, _Traits, _Alloc>& __s,
           size_t __pos,
           size_t __n)
-  : _Base_bitset<_Words >() 
-  {
-    if (__pos > __s.size()) 
+  : _STLP_PRIV _Base_bitset<_Words >() {
+    if (__pos > __s.size())
       __stl_throw_out_of_range("bitset");
     _M_copy_from_string(__s, __pos, __n);
   }
 #else /* _STLP_MEMBER_TEMPLATES */
   explicit bitset(const string& __s,
                   size_t __pos = 0,
-                  size_t __n = (size_t)-1) 
-    : _Base_bitset<_Words >() 
-  {
-    if (__pos > __s.size()) 
+                  size_t __n = (size_t)-1)
+    : _STLP_PRIV _Base_bitset<_Words >() {
+    if (__pos > __s.size())
       __stl_throw_out_of_range("bitset");
     _M_copy_from_string(__s, __pos, __n);
   }
@@ -464,36 +469,14 @@
   }
 
   bitset<_Nb>& operator<<=(size_t __pos) {
-#ifdef __SYMBIAN32__
-	if(__pos < _Nb)
-	{
-    	this->_M_do_left_shift(__pos);
-    	this->_M_do_sanitize();
-	}
-	else
-		this->_M_do_reset();
-#else
-	this->_M_do_left_shift(__pos);
-	this->_M_do_sanitize();
-#endif
-
+    this->_M_do_left_shift(__pos);
+    this->_M_do_sanitize();
     return *this;
   }
 
   bitset<_Nb>& operator>>=(size_t __pos) {
-#ifdef __SYMBIAN32__
-	if(__pos < _Nb)
-	{
-    	this->_M_do_right_shift(__pos);
-    	this->_M_do_sanitize();
-	}
-	else
-		this->_M_do_reset();
-#else
-	this->_M_do_right_shift(__pos);
+    this->_M_do_right_shift(__pos);
     this->_M_do_sanitize();
-#endif
-
     return *this;
   }
 
@@ -503,7 +486,7 @@
   //
 
   bitset<_Nb>& _Unchecked_set(size_t __pos) {
-    this->_M_getword(__pos) |= _Base_bitset<_Words > ::_S_maskbit(__pos);
+    this->_M_getword(__pos) |= _STLP_PRIV _Base_bitset<_Words > ::_S_maskbit(__pos);
     return *this;
   }
 
@@ -575,7 +558,7 @@
     return _Unchecked_flip(__pos);
   }
 
-  bitset<_Nb> operator~() const { 
+  bitset<_Nb> operator~() const {
     return bitset<_Nb>(*this).flip();
   }
 
@@ -586,7 +569,7 @@
 
   unsigned long to_ulong() const { return this->_M_do_to_ulong(); }
 
-#if defined (_STLP_MEMBER_TEMPLATES) && !  defined (_STLP_NO_EXPLICIT_FUNCTION_TMPL_ARGS)
+#if defined (_STLP_MEMBER_TEMPLATES) && !defined (_STLP_NO_EXPLICIT_FUNCTION_TMPL_ARGS)
   template <class _CharT, class _Traits, class _Alloc>
   basic_string<_CharT, _Traits, _Alloc> to_string() const {
     basic_string<_CharT, _Traits, _Alloc> __result;
@@ -615,78 +598,90 @@
   bool test(size_t __pos) const {
     if (__pos >= _Nb)
       __stl_throw_out_of_range("bitset");
-    
+
     return _Unchecked_test(__pos);
   }
 
   bool any() const { return this->_M_is_any(); }
   bool none() const { return !this->_M_is_any(); }
 
-  bitset<_Nb> operator<<(size_t __pos) const { 
+  bitset<_Nb> operator<<(size_t __pos) const {
     bitset<_Nb> __result(*this);
-    __result <<= __pos ;  return __result; 
+    __result <<= __pos ;  return __result;
   }
-  bitset<_Nb> operator>>(size_t __pos) const { 
+  bitset<_Nb> operator>>(size_t __pos) const {
     bitset<_Nb> __result(*this);
-    __result >>= __pos ;  return __result; 
+    __result >>= __pos ;  return __result;
   }
 
+#if !defined (_STLP_NO_EXTENSIONS)
   //
   // EXTENSIONS: bit-find operations.  These operations are
   // experimental, and are subject to change or removal in future
   // versions.
-  // 
+  //
 
   // find the index of the first "on" bit
-  size_t _Find_first() const 
+  size_t _Find_first() const
     { return this->_M_do_find_first(_Nb); }
 
   // find the index of the next "on" bit after prev
-  size_t _Find_next( size_t __prev ) const 
+  size_t _Find_next( size_t __prev ) const
     { return this->_M_do_find_next(__prev, _Nb); }
+#endif
 
 //
 // Definitions of should-be non-inline member functions.
 //
-# if defined (_STLP_MEMBER_TEMPLATES)
+#if defined (_STLP_MEMBER_TEMPLATES)
   template<class _CharT, class _Traits, class _Alloc>
-    void _M_copy_from_string(const basic_string<_CharT,_Traits,_Alloc>& __s,
-			     size_t __pos,
-			     size_t __n) {
+  void _M_copy_from_string(const basic_string<_CharT,_Traits,_Alloc>& __s,
+                           size_t __pos, size_t __n) {
 #else
-    void _M_copy_from_string(const string& __s,
-			     size_t __pos,
-			     size_t __n) {
-      typedef char_traits<char> _Traits;
+  void _M_copy_from_string(const string& __s,
+                           size_t __pos, size_t __n) {
+    typedef typename string::traits_type _Traits;
 #endif
-      reset();
-      size_t __tmp = _Nb;
-      const size_t __Nbits = (min) (__tmp, (min) (__n, __s.size() - __pos));
-      for ( size_t __i= 0; __i < __Nbits; ++__i) {
-        typename _Traits::int_type __k = _Traits::to_int_type(__s[__pos + __Nbits - __i - 1]);
-        // boris : widen() ?
-        if (__k == '1')
-          set(__i);
-        else if (__k !='0')
-          __stl_throw_invalid_argument("bitset");
-      }
+    reset();
+    size_t __tmp = _Nb;
+    const size_t __Nbits = (min) (__tmp, (min) (__n, __s.size() - __pos));
+    for ( size_t __i= 0; __i < __Nbits; ++__i) {
+      typename _Traits::int_type __k = _Traits::to_int_type(__s[__pos + __Nbits - __i - 1]);
+      // boris : widen() ?
+      if (__k == '1')
+        set(__i);
+      else if (__k != '0')
+        __stl_throw_invalid_argument("bitset");
     }
-  
-# if defined (_STLP_MEMBER_TEMPLATES)
+  }
+
+#if defined (_STLP_MEMBER_TEMPLATES)
   template <class _CharT, class _Traits, class _Alloc>
-    void _M_copy_to_string(basic_string<_CharT, _Traits, _Alloc>& __s) const
-# else
-    void _M_copy_to_string(string& __s) const
-# endif
-    {
-      __s.assign(_Nb, '0');
-      
-      for (size_t __i = 0; __i < _Nb; ++__i) 
-	if (_Unchecked_test(__i))
-	  __s[_Nb - 1 - __i] = '1';
+  void _M_copy_to_string(basic_string<_CharT, _Traits, _Alloc>& __s) const
+#else
+  void _M_copy_to_string(string& __s) const
+#endif
+  {
+    __s.assign(_Nb, '0');
+
+    for (size_t __i = 0; __i < _Nb; ++__i) {
+      if (_Unchecked_test(__i))
+        __s[_Nb - 1 - __i] = '1';
     }
+  }
 
-# if defined (_STLP_NON_TYPE_TMPL_PARAM_BUG)
+#if !defined (_STLP_MEMBER_TEMPLATES) && !defined (_STLP_NO_WCHAR_T)
+  void _M_copy_to_string(wstring& __s) const {
+    __s.assign(_Nb, '0');
+
+    for (size_t __i = 0; __i < _Nb; ++__i) {
+      if (_Unchecked_test(__i))
+        __s[_Nb - 1 - __i] = '1';
+    }
+  }
+#endif
+
+#if defined (_STLP_NON_TYPE_TMPL_PARAM_BUG)
   bitset<_Nb> operator&(const bitset<_Nb>& __y) const {
     bitset<_Nb> __result(*this);
     __result &= __y;
@@ -702,17 +697,14 @@
     __result ^= __y;
     return __result;
   }
-# endif 
-
+#endif
 };
 
 // ------------------------------------------------------------
 //
 // 23.3.5.3 bitset operations:
 //
-
-# if ! defined (_STLP_NON_TYPE_TMPL_PARAM_BUG)
-
+#if ! defined (_STLP_NON_TYPE_TMPL_PARAM_BUG)
 template <size_t _Nb>
 inline bitset<_Nb>  _STLP_CALL
 operator&(const bitset<_Nb>& __x,
@@ -741,51 +733,154 @@
   return __result;
 }
 
-#if defined ( _STLP_USE_NEW_IOSTREAMS )
+#if !defined (_STLP_USE_NO_IOSTREAMS)
+
+_STLP_END_NAMESPACE
+
+#  if !(defined (_STLP_MSVC) && (_STLP_MSVC < 1300)) && \
+      !(defined(__SUNPRO_CC) && (__SUNPRO_CC < 0x500))
+
+#ifndef _STLP_INTERNAL_IOSFWD
+#  include <stl/_iosfwd.h>
+#endif
+
+_STLP_BEGIN_NAMESPACE
 
 template <class _CharT, class _Traits, size_t _Nb>
 basic_istream<_CharT, _Traits>&  _STLP_CALL
 operator>>(basic_istream<_CharT, _Traits>& __is, bitset<_Nb>& __x);
 
-
 template <class _CharT, class _Traits, size_t _Nb>
 basic_ostream<_CharT, _Traits>& _STLP_CALL
 operator<<(basic_ostream<_CharT, _Traits>& __os, const bitset<_Nb>& __x);
 
-#elif ! defined ( _STLP_USE_NO_IOSTREAMS )
+#  else
 
-// (reg) For Watcom IO, this tells if ostream class is in .exe or in .dll
-template <size_t _Nb>
-_ISTREAM_DLL& _STLP_CALL
-operator>>(_ISTREAM_DLL& __is, bitset<_Nb>& __x);
+#ifndef _STLP_STRING_IO_H
+#  include <stl/_string_io.h> //includes _istream.h and _ostream.h
+#endif
+
+_STLP_BEGIN_NAMESPACE
 
 template <size_t _Nb>
-inline _OSTREAM_DLL&  _STLP_CALL operator<<(_OSTREAM_DLL& __os, const bitset<_Nb>& __x) {
+istream&  _STLP_CALL
+operator>>(istream& __is, bitset<_Nb>& __x) {
+  typedef typename string::traits_type _Traits;
+  string __tmp;
+  __tmp.reserve(_Nb);
+
+  // Skip whitespace
+  typename istream::sentry __sentry(__is);
+  if (__sentry) {
+    streambuf* __buf = __is.rdbuf();
+    for (size_t __i = 0; __i < _Nb; ++__i) {
+      static typename _Traits::int_type __eof = _Traits::eof();
+
+      typename _Traits::int_type __c1 = __buf->sbumpc();
+      if (_Traits::eq_int_type(__c1, __eof)) {
+        __is.setstate(ios_base::eofbit);
+        break;
+      }
+      else {
+        typename _Traits::char_type __c2 = _Traits::to_char_type(__c1);
+        char __c  = __is.narrow(__c2, '*');
+
+        if (__c == '0' || __c == '1')
+          __tmp.push_back(__c);
+        else if (_Traits::eq_int_type(__buf->sputbackc(__c2), __eof)) {
+          __is.setstate(ios_base::failbit);
+          break;
+        }
+      }
+    }
+
+    if (__tmp.empty())
+      __is.setstate(ios_base::failbit);
+    else
+      __x._M_copy_from_string(__tmp, __STATIC_CAST(size_t,0), _Nb);
+  }
+
+  return __is;
+}
+
+template <size_t _Nb>
+ostream& _STLP_CALL
+operator<<(ostream& __os, const bitset<_Nb>& __x) {
   string __tmp;
   __x._M_copy_to_string(__tmp);
   return __os << __tmp;
 }
 
+#    if !defined (_STLP_NO_WCHAR_T)
+
+template <size_t _Nb>
+wistream&  _STLP_CALL
+operator>>(wistream& __is, bitset<_Nb>& __x) {
+  typedef typename wstring::traits_type _Traits;
+  wstring __tmp;
+  __tmp.reserve(_Nb);
+
+  // Skip whitespace
+  typename wistream::sentry __sentry(__is);
+  if (__sentry) {
+    wstreambuf* __buf = __is.rdbuf();
+    for (size_t __i = 0; __i < _Nb; ++__i) {
+      static typename _Traits::int_type __eof = _Traits::eof();
+
+      typename _Traits::int_type __c1 = __buf->sbumpc();
+      if (_Traits::eq_int_type(__c1, __eof)) {
+        __is.setstate(ios_base::eofbit);
+        break;
+      }
+      else {
+        typename _Traits::char_type __c2 = _Traits::to_char_type(__c1);
+        char __c  = __is.narrow(__c2, '*');
+
+        if (__c == '0' || __c == '1')
+          __tmp.push_back(__c);
+        else if (_Traits::eq_int_type(__buf->sputbackc(__c2), __eof)) {
+          __is.setstate(ios_base::failbit);
+          break;
+        }
+      }
+    }
+
+    if (__tmp.empty())
+      __is.setstate(ios_base::failbit);
+    else
+      __x._M_copy_from_string(__tmp, __STATIC_CAST(size_t,0), _Nb);
+  }
+
+  return __is;
+}
+
+template <size_t _Nb>
+wostream& _STLP_CALL
+operator<<(wostream& __os, const bitset<_Nb>& __x) {
+  wstring __tmp;
+  __x._M_copy_to_string(__tmp);
+  return __os << __tmp;
+}
+
+#    endif /* _STLP_NO_WCHAR_T */
+#  endif
 #endif
 
-# endif /* _STLP_NON_TYPE_TMPL_PARAM_BUG */
+#endif /* _STLP_NON_TYPE_TMPL_PARAM_BUG */
 
-#  undef  bitset
-
+#undef  bitset
 
 _STLP_END_NAMESPACE
 
-#  undef __BITS_PER_WORD
-#  undef __BITSET_WORDS
+#undef __BITS_PER_WORD
+#undef __BITSET_WORDS
 
-# if !defined (_STLP_LINK_TIME_INSTANTIATION)
+#if !defined (_STLP_LINK_TIME_INSTANTIATION)
 #  include <stl/_bitset.c>
-# endif
+#endif
 
 #endif /* _STLP_BITSET_H */
 
-
 // Local Variables:
 // mode:C++
 // End:
-