This is the mail archive of the libstdc++@gcc.gnu.org mailing list for the libstdc++ project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [c++0x patch] allow std::bind<void>


Jonathan Wakely wrote:
2009/12/24 Paolo Carlini:
Jon, when you have the time, I think we have also another special case
in <functional> which could be improved, maybe for std::function itself,
please help me figuring out the details, I noticed this issue a lot of
time ago. Anyway, I think the issue is that we don't have overloads /
specializations for variadic functions: we catch elegantly any number of
arguments with variadic templates but we don't catch variadic functions
themselves. I think the std::is_function trait is already ok, however.

You mean old fashioned variadic "..." functions like printf? Hmm, I hadn't thought of that - I'll look into it.

Here is a new patch incorporating the test changes suggested by Jonathan and removing the stupid paste-o size_t thing.

Regtested and bootstrapped of course.

In addition, for discussion, is a patch with the umsigned long long changes. I made the ctor available ic C++-x *and* have long long. So in we're doing C++-0x and long long is not available you should still get the unsigned long ctor.

Index: libstdc++-v3/include/std/bitset
===================================================================
--- libstdc++-v3/include/std/bitset	(revision 155433)
+++ libstdc++-v3/include/std/bitset	(working copy)
@@ -76,11 +76,21 @@
       _Base_bitset()
       { _M_do_reset(); }
 
+#if defined(__GXX_EXPERIMENTAL_CXX0X__) && defined(_GLIBCXX_USE_LONG_LONG)
+      _Base_bitset(unsigned long long __val)
+      {
+	_M_do_reset();
+	const size_t __n = sizeof(unsigned long long) / sizeof(unsigned long);
+	for (size_t __i = 0; __i < __n && __i < _Nw; ++__i)
+	  _M_w[__i] = __val >> (__i * _GLIBCXX_BITSET_BITS_PER_WORD);
+      }
+#else
       _Base_bitset(unsigned long __val)
       {
 	_M_do_reset();
 	_M_w[0] = __val;
       }
+#endif
 
       static size_t
       _S_whichword(size_t __pos )
@@ -199,6 +209,13 @@
       unsigned long
       _M_do_to_ulong() const;
 
+#ifdef __GXX_EXPERIMENTAL_CXX0X__
+#ifdef _GLIBCXX_USE_LONG_LONG
+      unsigned long long
+      _M_do_to_ullong() const;
+#endif
+#endif
+
       // find first "on" bit
       size_t
       _M_do_find_first(size_t __not_found) const;
@@ -272,7 +289,25 @@
       return _M_w[0];
     }
 
+#ifdef __GXX_EXPERIMENTAL_CXX0X__
+#ifdef _GLIBCXX_USE_LONG_LONG
   template<size_t _Nw>
+    unsigned long long
+    _Base_bitset<_Nw>::_M_do_to_ullong() const
+    {
+      const size_t __n = sizeof(unsigned long long) / sizeof(unsigned long);
+      for (size_t __i = __n; __i < _Nw; ++__i)
+	if (_M_w[__i])
+	  __throw_overflow_error(__N("_Base_bitset::_M_do_to_ullong"));
+      unsigned long long __res = 0ULL;
+      for (size_t __i = 0; __i < __n && __i < _Nw; ++__i)
+	__res += _M_w[__i] << (__i * _GLIBCXX_BITSET_BITS_PER_WORD);
+      return __res;
+    }
+#endif
+#endif
+
+  template<size_t _Nw>
     size_t
     _Base_bitset<_Nw>::_M_do_find_first(size_t __not_found) const
     {
@@ -337,9 +372,15 @@
       : _M_w(0)
       { }
 
+#if defined(__GXX_EXPERIMENTAL_CXX0X__) && defined(_GLIBCXX_USE_LONG_LONG)
+      _Base_bitset(unsigned long long __val)
+      : _M_w(static_cast<unsigned long>(__val))
+      { }
+#else
       _Base_bitset(unsigned long __val)
       : _M_w(__val)
       { }
+#endif
 
       static size_t
       _S_whichword(size_t __pos )
@@ -425,6 +466,14 @@
       _M_do_to_ulong() const
       { return _M_w; }
 
+#ifdef __GXX_EXPERIMENTAL_CXX0X__
+#ifdef _GLIBCXX_USE_LONG_LONG
+      unsigned long long
+      _M_do_to_ullong() const
+      { return _M_w; }
+#endif
+#endif
+
       size_t
       _M_do_find_first(size_t __not_found) const
       {
@@ -463,8 +512,13 @@
       _Base_bitset()
       { }
 
+#if defined(__GXX_EXPERIMENTAL_CXX0X__) && defined(_GLIBCXX_USE_LONG_LONG)
+      _Base_bitset(unsigned long long)
+      { }
+#else
       _Base_bitset(unsigned long)
       { }
+#endif
 
       static size_t
       _S_whichword(size_t __pos )
@@ -555,6 +609,14 @@
       _M_do_to_ulong() const
       { return 0; }
 
+#ifdef __GXX_EXPERIMENTAL_CXX0X__
+#ifdef _GLIBCXX_USE_LONG_LONG
+      unsigned long long
+      _M_do_to_ullong() const
+      { return 0; }
+#endif
+#endif
+
       // Normally "not found" is the size, but that could also be
       // misinterpreted as an index in this corner case.  Oh well.
       size_t
@@ -737,9 +799,15 @@
       { }
 
       /// Initial bits bitwise-copied from a single word (others set to zero).
+#if defined(__GXX_EXPERIMENTAL_CXX0X__) && defined(_GLIBCXX_USE_LONG_LONG)
+      bitset(unsigned long long __val)
+      : _Base(__val)
+      { _M_do_sanitize(); }
+#else
       bitset(unsigned long __val)
       : _Base(__val)
       { _M_do_sanitize(); }
+#endif
 
       /**
        *  @brief  Use a subset of a string.
@@ -798,6 +866,26 @@
 	  _M_copy_from_string(__s, __position, __n, __zero, __one);
 	}
 
+#ifdef __GXX_EXPERIMENTAL_CXX0X__
+      /**
+       *  @brief  Construct from a string.
+       *  @param  str  A string of '0' and '1' characters.
+       *  @throw  std::invalid_argument  If a character appears in the string
+       *                                 which is neither '0' nor '1'.
+       */
+      explicit
+      bitset(const char* __str)
+      : _Base()
+      {
+	if (__str)
+	  {
+	    const size_t __len = __builtin_strlen(__str);
+	    _M_copy_from_ptr<char, std::char_traits<char>>
+			(__str, __len, 0, __len, '0', '1');
+	  }
+      }
+#endif // __GXX_EXPERIMENTAL_CXX0X__
+
       // 23.3.5.2 bitset operations:
       //@{
       /**
@@ -1019,6 +1107,14 @@
       to_ulong() const
       { return this->_M_do_to_ulong(); }
 
+#ifdef __GXX_EXPERIMENTAL_CXX0X__
+#ifdef _GLIBCXX_USE_LONG_LONG
+      unsigned long long
+      to_ullong() const
+      { return this->_M_do_to_ullong(); }
+#endif
+#endif
+
       /**
        *  @brief Returns a character interpretation of the %bitset.
        *  @return  The string equivalent of the bits.
Index: libstdc++-v3/testsuite/23_containers/bitset/cons/2.cc
===================================================================
--- libstdc++-v3/testsuite/23_containers/bitset/cons/2.cc	(revision 0)
+++ libstdc++-v3/testsuite/23_containers/bitset/cons/2.cc	(revision 0)
@@ -0,0 +1,52 @@
+// { dg-options "-std=gnu++0x" }
+
+// 2009-12-23 emsr
+
+// Copyright (C) 2009 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/>.
+
+// 23.3.7.1 bitset const char * constructor.
+
+#include <bitset>
+#include <string>
+#include <testsuite_hooks.h>
+
+struct X
+{
+  operator const char* () { return "10101010"; }
+};
+
+bool
+test01()
+{
+  bool test __attribute__((unused)) = true;
+
+  X x;
+  std::string s(x);
+  std::bitset<32> b1(x);
+  std::bitset<32> b2(s);
+  VERIFY( b1 == b2 );
+
+  return test;
+}
+
+int
+main()
+{
+  test01();
+  return 0;
+}
Index: libstdc++-v3/testsuite/23_containers/bitset/to_ulong/2.cc
===================================================================
--- libstdc++-v3/testsuite/23_containers/bitset/to_ulong/2.cc	(revision 0)
+++ libstdc++-v3/testsuite/23_containers/bitset/to_ulong/2.cc	(revision 0)
@@ -0,0 +1,49 @@
+// { dg-options "-std=gnu++0x" }
+
+// 2009-12-16 emsr
+
+// Copyright (C) 2009 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/>.
+
+// 23.3.7.2 bitset members
+
+#include <bitset>
+#include <stdexcept>
+#include <sstream>
+#include <testsuite_hooks.h>
+
+void test01()
+{
+  bool test __attribute__((unused)) = true;
+  std::bitset<5>      b;
+  std::stringstream   ss("101");
+  ss.exceptions(std::ios_base::eofbit);
+
+  try
+  {
+    ss >> b;
+  }
+  catch (std::exception&) { }
+
+  VERIFY( b.to_ullong() == 5 );
+}
+
+int main()
+{
+  test01();
+  return 0;
+}
Index: include/std/bitset
===================================================================
--- include/std/bitset	(revision 155433)
+++ include/std/bitset	(working copy)
@@ -798,6 +798,26 @@
 	  _M_copy_from_string(__s, __position, __n, __zero, __one);
 	}
 
+#ifdef __GXX_EXPERIMENTAL_CXX0X__
+      /**
+       *  @brief  Construct from a string.
+       *  @param  str  A string of '0' and '1' characters.
+       *  @throw  std::invalid_argument  If a character appears in the string
+       *                                 which is neither '0' nor '1'.
+       */
+      explicit
+      bitset(const char* __str)
+      : _Base()
+      {
+	if (__str)
+	  {
+	    const size_t __len = __builtin_strlen(__str);
+	    _M_copy_from_ptr<char, std::char_traits<char>>
+			(__str, __len, 0, __len, '0', '1');
+	  }
+      }
+#endif // __GXX_EXPERIMENTAL_CXX0X__
+
       // 23.3.5.2 bitset operations:
       //@{
       /**
Index: testsuite/23_containers/bitset/cons/2.cc
===================================================================
--- testsuite/23_containers/bitset/cons/2.cc	(revision 0)
+++ testsuite/23_containers/bitset/cons/2.cc	(revision 0)
@@ -0,0 +1,52 @@
+// { dg-options "-std=gnu++0x" }
+
+// 2009-12-23 emsr
+
+// Copyright (C) 2009 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/>.
+
+// 23.3.7.1 bitset const char * constructor.
+
+#include <bitset>
+#include <string>
+#include <testsuite_hooks.h>
+
+struct X
+{
+  operator const char* () { return "10101010"; }
+};
+
+bool
+test01()
+{
+  bool test __attribute__((unused)) = true;
+
+  X x;
+  std::string s(x);
+  std::bitset<32> b1(x);
+  std::bitset<32> b2(s);
+  VERIFY( b1 == b2 );
+
+  return test;
+}
+
+int
+main()
+{
+  test01();
+  return 0;
+}

Attachment: CL_bitset_0x
Description: video/flv


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]