]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
[multiple changes]
authorPaolo Carlini <paolo@gcc.gnu.org>
Mon, 11 Oct 2010 22:32:01 +0000 (22:32 +0000)
committerPaolo Carlini <paolo@gcc.gnu.org>
Mon, 11 Oct 2010 22:32:01 +0000 (22:32 +0000)
2010-10-11  Jonathan Wakely  <jwakely.gcc@gmail.com>

* testsuite/23_containers/bitset/cons/2.cc: Tweak.

2010-10-11  Paolo Carlini  <paolo.carlini@oracle.com>

* include/std/bitset (bitset<>::bitset(const _CharT*,
typename std::basic_string<>::size_type, _CharT, _CharT)):
Implement new proposed resolution for DR 1325.
* include/debug/bitset: Likewise.
* include/profile/bitset: Likewise.
* testsuite/23_containers/bitset/cons/dr1325-1.cc: New.
* testsuite/23_containers/bitset/cons/dr1325-2.cc: Likewise.

From-SVN: r165338

libstdc++-v3/ChangeLog
libstdc++-v3/include/debug/bitset
libstdc++-v3/include/profile/bitset
libstdc++-v3/include/std/bitset
libstdc++-v3/testsuite/23_containers/bitset/cons/2.cc
libstdc++-v3/testsuite/23_containers/bitset/cons/dr1325-1.cc [new file with mode: 0644]
libstdc++-v3/testsuite/23_containers/bitset/cons/dr1325-2.cc [new file with mode: 0644]

index 0ec847a89a997ec3c093dab44f21ee062089eead..14d834e4a58a2e0014100039b79afbde06046ed0 100644 (file)
@@ -1,3 +1,17 @@
+2010-10-11  Jonathan Wakely  <jwakely.gcc@gmail.com>
+
+       * testsuite/23_containers/bitset/cons/2.cc: Tweak.
+
+2010-10-11  Paolo Carlini  <paolo.carlini@oracle.com>
+
+       * include/std/bitset (bitset<>::bitset(const _CharT*,
+       typename std::basic_string<>::size_type, _CharT, _CharT)):
+       Implement new proposed resolution for DR 1325.
+       * include/debug/bitset: Likewise.
+       * include/profile/bitset: Likewise.
+       * testsuite/23_containers/bitset/cons/dr1325-1.cc: New.
+       * testsuite/23_containers/bitset/cons/dr1325-2.cc: Likewise.
+
 2010-10-11  Benjamin Kosnik  <bkoz@redhat.com>
 
        * doc/xml/api.xml: Add link to 4.5 generated docs.
index 017c9e020dd9108c9877c1dbc5799c883f876485..739dcfd38f179d6f526ccd31c848b6fa6e7be653 100644 (file)
@@ -150,8 +150,13 @@ namespace __debug
       bitset(const _Base& __x) : _Base(__x), _Safe_base() { }
 
 #ifdef __GXX_EXPERIMENTAL_CXX0X__
-      explicit
-      bitset(const char* __str) : _Base(__str) { }
+      template<typename _CharT>
+        explicit
+        bitset(const _CharT* __str,
+              typename std::basic_string<_CharT>::size_type __n
+              = std::basic_string<_CharT>::npos,
+              _CharT __zero = _CharT('0'), _CharT __one = _CharT('1'))
+       : _Base(__str, __n, __zero, __one) { }
 #endif
 
       // 23.3.5.2 bitset operations:
index 79175244bed3c26a8db4456cf293e20816db4a90..b8b1e65f9e55d3fa37a07c300ca392be64d536b3 100644 (file)
@@ -127,8 +127,13 @@ namespace __profile
       bitset(const _Base& __x) : _Base(__x) { }
 
 #ifdef __GXX_EXPERIMENTAL_CXX0X__
-      explicit
-      bitset(const char* __str) : _Base(__str) { }
+      template<typename _CharT>
+        explicit
+        bitset(const _CharT* __str,
+              typename std::basic_string<_CharT>::size_type __n
+              = std::basic_string<_CharT>::npos,
+              _CharT __zero = _CharT('0'), _CharT __one = _CharT('1'))
+       : _Base(__str, __n, __zero, __one) { }
 #endif
 
       // 23.3.5.2 bitset operations:
index d263fae645acf98bb20ba8fb3b41e5359eed24ed..1c71c4fb96940c6ea75ec01eb49bd29849573068 100644 (file)
@@ -870,22 +870,31 @@ _GLIBCXX_BEGIN_NESTED_NAMESPACE(std, _GLIBCXX_STD_D)
 
 #ifdef __GXX_EXPERIMENTAL_CXX0X__
       /**
-       *  @brief  Construct from a string.
-       *  @param  str  A string of @a 0 and @a 1 characters.
+       *  @brief  Construct from a character %array.
+       *  @param  str  An %array of characters @a zero and @a one.
+       *  @param  n    The number of characters to use.
+       *  @param  zero The character corresponding to the value 0.
+       *  @param  one  The character corresponding to the value 1.
        *  @throw  std::invalid_argument  If a character appears in the string
-       *                                 which is neither @a 0 nor @a 1.
+       *                                 which is neither @a zero nor @a one.
        */
-      explicit
-      bitset(const char* __str)
-      : _Base()
-      {
-       if (!__str)
-         __throw_logic_error(__N("bitset::bitset(const char*)"));
-
-       const size_t __len = __builtin_strlen(__str);
-       _M_copy_from_ptr<char, std::char_traits<char>>(__str, __len, 0,
-                                                      __len, '0', '1');
-      }
+      template<typename _CharT>
+        explicit
+        bitset(const _CharT* __str,
+              typename std::basic_string<_CharT>::size_type __n
+              = std::basic_string<_CharT>::npos,
+              _CharT __zero = _CharT('0'), _CharT __one = _CharT('1'))
+        : _Base()
+        {
+         if (!__str)
+           __throw_logic_error(__N("bitset::bitset(const _CharT*, ...)"));
+
+         if (__n == std::basic_string<_CharT>::npos)
+           __n = std::char_traits<_CharT>::length(__str);
+         _M_copy_from_ptr<_CharT, std::char_traits<_CharT>>(__str, __n, 0,
+                                                            __n, __zero,
+                                                            __one);
+       }
 #endif
 
       // 23.3.5.2 bitset operations:
index a1b9c649c9d8580060178d91b1237d289a3de036..4a394473f98b6e7fc46fb2168c259b596a8afcf6 100644 (file)
@@ -1,6 +1,6 @@
 // { dg-options "-std=gnu++0x" }
 
-// Copyright (C) 2009 Free Software Foundation, Inc.
+// Copyright (C) 2009, 2010 Free Software Foundation, Inc.
 //
 // This file is part of the GNU ISO C++ Library.  This library is free
 // software; you can redistribute it and/or modify it under the
@@ -33,7 +33,7 @@ test01()
 
   X x;
   std::string s(x);
-  std::bitset<32> b1(x);
+  std::bitset<32> b1(static_cast<const char*>(x));
   std::bitset<32> b2(s);
   VERIFY( b1 == b2 );
 }
diff --git a/libstdc++-v3/testsuite/23_containers/bitset/cons/dr1325-1.cc b/libstdc++-v3/testsuite/23_containers/bitset/cons/dr1325-1.cc
new file mode 100644 (file)
index 0000000..c79727e
--- /dev/null
@@ -0,0 +1,26 @@
+// { dg-options "-std=gnu++0x" }
+// { dg-do compile }
+
+// 2010-10-11  Paolo Carlini  <paolo.carlini@oracle.com>
+
+// Copyright (C) 2010 Free Software Foundation, Inc.
+//
+// This file is part of the GNU ISO C++ Library.  This library is free
+// software; you can redistribute it and/or modify it under the
+// terms of the GNU General Public License as published by the
+// Free Software Foundation; either version 3, or (at your option)
+// any later version.
+
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+
+// You should have received a copy of the GNU General Public License along
+// with this library; see the file COPYING3.  If not see
+// <http://www.gnu.org/licenses/>.
+
+#include <bitset>
+
+// DR 1325.
+std::bitset<10> b(0);
diff --git a/libstdc++-v3/testsuite/23_containers/bitset/cons/dr1325-2.cc b/libstdc++-v3/testsuite/23_containers/bitset/cons/dr1325-2.cc
new file mode 100644 (file)
index 0000000..e585651
--- /dev/null
@@ -0,0 +1,80 @@
+// { dg-options "-std=gnu++0x" }
+
+// 2010-10-11  Paolo Carlini  <paolo.carlini@oracle.com>
+
+// Copyright (C) 2010 Free Software Foundation, Inc.
+//
+// This file is part of the GNU ISO C++ Library.  This library is free
+// software; you can redistribute it and/or modify it under the
+// terms of the GNU General Public License as published by the
+// Free Software Foundation; either version 3, or (at your option)
+// any later version.
+
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+
+// You should have received a copy of the GNU General Public License along
+// with this library; see the file COPYING3.  If not see
+// <http://www.gnu.org/licenses/>.
+
+#include <bitset>
+#include <testsuite_hooks.h>
+
+template<std::size_t Nb, typename CharT>
+  std::bitset<Nb>
+  test01_ref(const CharT* str,
+            typename std::basic_string<CharT>::size_type n
+            = std::basic_string<CharT>::npos,
+            CharT zero = CharT('0'), CharT one = CharT('1'))
+  {
+    return std::bitset<Nb>(n == std::basic_string<CharT>::npos
+                          ? std::basic_string<CharT>(str)
+                          : std::basic_string<CharT>(str, n),
+                          0, n, zero, one);
+  }
+
+// DR 1325.
+void test01()
+{
+  bool test __attribute__((unused)) = true;
+  using namespace std;
+
+  const char s1[4] = { '0', '1', '0', '1' };
+  VERIFY( bitset<4>(s1, 4) == test01_ref<4>(s1, 4) );
+
+  const char s2[3] = { '1', '1', '0' };
+  VERIFY( bitset<6>(s1, 3) == test01_ref<6>(s1, 3) );
+
+  const char* s3 = "1110110";
+  VERIFY( bitset<7>(s3) == test01_ref<7>(s3) );
+
+  const char* s4 = "0011";
+  VERIFY( bitset<10>(s4) == test01_ref<10>(s4) );
+
+  const char* s5 = "011110000111001";
+  VERIFY( bitset<5>(s5) == test01_ref<5>(s5) );
+
+  const char* s6 = "1cc1c1";
+  VERIFY( bitset<6>(s6, basic_string<char>::npos, 'c')
+         == test01_ref<6>(s6, basic_string<char>::npos, 'c') );
+
+  const char* s7 = "001011101";
+  VERIFY( bitset<9>(s7, basic_string<char>::npos, '0', '1')
+         == test01_ref<9>(s7, basic_string<char>::npos, '0', '1') );
+
+  const char* s8 = "babb";
+  VERIFY( bitset<4>(s8, basic_string<char>::npos, 'a', 'b')
+         == test01_ref<4>(s8, basic_string<char>::npos, 'a', 'b') );
+
+  const char* s9 = "bbabbbaaa";
+  VERIFY( bitset<100>(s9, basic_string<char>::npos, 'a', 'b')
+         == test01_ref<100>(s9, basic_string<char>::npos, 'a', 'b') );
+}
+
+int main()
+{
+  test01();
+  return 0;
+}