aboutsummaryrefslogtreecommitdiff
path: root/libstdc++-v3
diff options
context:
space:
mode:
authorPaolo Carlini <paolo@gcc.gnu.org>2010-10-11 22:32:01 +0000
committerPaolo Carlini <paolo@gcc.gnu.org>2010-10-11 22:32:01 +0000
commita0a2a39912679f761df40e4b88fed9326398e63b (patch)
tree18bf2f094ffa4469352b648b932b7f456d33a389 /libstdc++-v3
parent2c8865f1c135dd460121a6fcb87e1d18bda72ada (diff)
downloadgcc-a0a2a39912679f761df40e4b88fed9326398e63b.zip
gcc-a0a2a39912679f761df40e4b88fed9326398e63b.tar.gz
gcc-a0a2a39912679f761df40e4b88fed9326398e63b.tar.bz2
[multiple changes]
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
Diffstat (limited to 'libstdc++-v3')
-rw-r--r--libstdc++-v3/ChangeLog14
-rw-r--r--libstdc++-v3/include/debug/bitset9
-rw-r--r--libstdc++-v3/include/profile/bitset9
-rw-r--r--libstdc++-v3/include/std/bitset37
-rw-r--r--libstdc++-v3/testsuite/23_containers/bitset/cons/2.cc4
-rw-r--r--libstdc++-v3/testsuite/23_containers/bitset/cons/dr1325-1.cc26
-rw-r--r--libstdc++-v3/testsuite/23_containers/bitset/cons/dr1325-2.cc80
7 files changed, 159 insertions, 20 deletions
diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog
index 0ec847a..14d834e 100644
--- a/libstdc++-v3/ChangeLog
+++ b/libstdc++-v3/ChangeLog
@@ -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.
diff --git a/libstdc++-v3/include/debug/bitset b/libstdc++-v3/include/debug/bitset
index 017c9e0..739dcfd 100644
--- a/libstdc++-v3/include/debug/bitset
+++ b/libstdc++-v3/include/debug/bitset
@@ -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:
diff --git a/libstdc++-v3/include/profile/bitset b/libstdc++-v3/include/profile/bitset
index 7917524..b8b1e65 100644
--- a/libstdc++-v3/include/profile/bitset
+++ b/libstdc++-v3/include/profile/bitset
@@ -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:
diff --git a/libstdc++-v3/include/std/bitset b/libstdc++-v3/include/std/bitset
index d263fae..1c71c4f 100644
--- a/libstdc++-v3/include/std/bitset
+++ b/libstdc++-v3/include/std/bitset
@@ -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:
diff --git a/libstdc++-v3/testsuite/23_containers/bitset/cons/2.cc b/libstdc++-v3/testsuite/23_containers/bitset/cons/2.cc
index a1b9c64..4a39447 100644
--- a/libstdc++-v3/testsuite/23_containers/bitset/cons/2.cc
+++ b/libstdc++-v3/testsuite/23_containers/bitset/cons/2.cc
@@ -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
index 0000000..c79727e
--- /dev/null
+++ b/libstdc++-v3/testsuite/23_containers/bitset/cons/dr1325-1.cc
@@ -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
index 0000000..e585651
--- /dev/null
+++ b/libstdc++-v3/testsuite/23_containers/bitset/cons/dr1325-2.cc
@@ -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;
+}