Boost logo

Boost-Commit :

Subject: [Boost-commit] svn:boost r68912 - in branches/release: boost libs/utility
From: bdawes_at_[hidden]
Date: 2011-02-15 09:54:18


Author: bemandawes
Date: 2011-02-15 09:54:16 EST (Tue, 15 Feb 2011)
New Revision: 68912
URL: http://svn.boost.org/trac/boost/changeset/68912

Log:
Merge trunk BOOST_ASSERT_MSG additions
Properties modified:
   branches/release/boost/static_assert.hpp (contents, props changed)
   branches/release/libs/utility/assert.html (contents, props changed)
   branches/release/libs/utility/assert_test.cpp (contents, props changed)
Text files modified:
   branches/release/boost/static_assert.hpp | 10 ++++-
   branches/release/libs/utility/assert.html | 74 ++++++++++++++++++++++++++++++++++-----
   branches/release/libs/utility/assert_test.cpp | 44 +++++++++++++++++++++++
   3 files changed, 116 insertions(+), 12 deletions(-)

Modified: branches/release/boost/static_assert.hpp
==============================================================================
--- branches/release/boost/static_assert.hpp (original)
+++ branches/release/boost/static_assert.hpp 2011-02-15 09:54:16 EST (Tue, 15 Feb 2011)
@@ -17,6 +17,12 @@
 #include <boost/config.hpp>
 #include <boost/detail/workaround.hpp>
 
+#ifndef BOOST_NO_STATIC_ASSERT
+# define BOOST_STATIC_ASSERT_MSG( B, Msg ) static_assert(B, Msg)
+#else
+# define BOOST_STATIC_ASSERT_MSG( B, Msg ) BOOST_STATIC_ASSERT( B )
+#endif
+
 #ifdef __BORLANDC__
 //
 // workaround for buggy integral-constant expression support:
@@ -38,7 +44,7 @@
 # define BOOST_STATIC_ASSERT_BOOL_CAST(x) (bool)(x)
 #endif
 
-#ifdef BOOST_HAS_STATIC_ASSERT
+#ifndef BOOST_NO_STATIC_ASSERT
 # define BOOST_STATIC_ASSERT( B ) static_assert(B, #B)
 #else
 
@@ -125,7 +131,7 @@
    enum { BOOST_JOIN(boost_static_assert_enum_, __LINE__) \
       = sizeof(::boost::STATIC_ASSERTION_FAILURE< (bool)( B ) >) }
 #endif
-#endif // ndef BOOST_HAS_STATIC_ASSERT
+#endif // defined(BOOST_NO_STATIC_ASSERT)
 
 #endif // BOOST_STATIC_ASSERT_HPP
 

Modified: branches/release/libs/utility/assert.html
==============================================================================
--- branches/release/libs/utility/assert.html (original)
+++ branches/release/libs/utility/assert.html 2011-02-15 09:54:16 EST (Tue, 15 Feb 2011)
@@ -18,35 +18,88 @@
                         </tr>
                 </table>
                 <p>
+ BOOST_ASSERT<br>
+ BOOST_ASSERT_MSG<br>
+ BOOST_VERIFY</p>
+
+<h2><a name="BOOST_ASSERT">BOOST_ASSERT</a></h2>
+ <p>
                         The header <STRONG>&lt;boost/assert.hpp&gt;</STRONG> defines the macro <b>BOOST_ASSERT</b>,
                         which is similar to the standard <STRONG>assert</STRONG> macro defined in <STRONG>&lt;cassert&gt;</STRONG>.
- The macro is intended to be used in Boost libraries.
+ The macro is intended to be used in both Boost libraries and user
+ code.
                 </p>
                 <P>By default, <tt>BOOST_ASSERT(expr)</tt> is equivalent to <tt>assert(expr)</tt>.</P>
- <P>When the macro <STRONG>BOOST_DISABLE_ASSERTS</STRONG> is defined when <STRONG>&lt;boost/assert.hpp&gt;</STRONG>
+ <P>If the macro <STRONG>BOOST_DISABLE_ASSERTS</STRONG> is defined when <STRONG>&lt;boost/assert.hpp&gt;</STRONG>
                         is included, <tt>BOOST_ASSERT(expr)</tt> is defined as <tt>((void)0)</tt>. This
                         allows users to selectively disable <STRONG>BOOST_ASSERT</STRONG> without
                         affecting the definition of the standard <STRONG>assert</STRONG>.</P>
- <P>When the macro <STRONG>BOOST_ENABLE_ASSERT_HANDLER</STRONG> is defined when <STRONG>&lt;boost/assert.hpp&gt;</STRONG>
+ <P>If the macro <STRONG>BOOST_ENABLE_ASSERT_HANDLER</STRONG> is defined when <STRONG>&lt;boost/assert.hpp&gt;</STRONG>
                         is included, <tt>BOOST_ASSERT(expr)</tt> evaluates <b>expr</b> and, if the
                         result is false, evaluates the expression</P>
+ <blockquote>
                 <P><tt>::boost::assertion_failed(#expr, BOOST_CURRENT_FUNCTION,
                                 __FILE__, __LINE__)</tt></P>
+ </blockquote>
                 <P><STRONG>assertion_failed</STRONG> is declared in <STRONG>&lt;boost/assert.hpp&gt;</STRONG>
                         as</P>
- <pre>
-namespace boost
+ <blockquote>
+ <pre>namespace boost
 {
-
-void assertion_failed(char const * expr, char const * function, char const * file, long line);
-
+ void assertion_failed(char const * expr, char const * function, char const * file, long line);
 }
 </pre>
+ </blockquote>
                 <p>but it is never defined. The user is expected to supply an appropriate
                         definition.</p>
                 <P>As is the case with <STRONG>&lt;cassert&gt;</STRONG>, <STRONG>&lt;boost/assert.hpp&gt;</STRONG>
                         can be included multiple times in a single translation unit. <STRONG>BOOST_ASSERT</STRONG>
                         will be redefined each time as specified above.</P>
+
+<h2><a name="BOOST_ASSERT_MSG">BOOST_ASSERT_MSG</a></h2>
+ <p>
+ The header <STRONG>&lt;boost/assert.hpp&gt;</STRONG> defines the macro <b>BOOST_ASSERT_MSG</b>,
+ which is similar to the standard <STRONG>assert</STRONG> macro defined in <STRONG>&lt;cassert&gt;</STRONG>,
+ but with an additional macro parameter supplying an error message. The macro is intended to be used in both Boost libraries
+ and user code.
+ </p>
+ <P> <tt>BOOST_ASSERT_MSG(expr, msg)</tt> is equivalent to <code>
+ ((void)0)</code> if <b>BOOST_DISABLE_ASSERTS</b> or <b>NDEBUG</b> are
+ defined or <code>expr</code> evaluates to <code>true</code>. If those
+ macros and <STRONG>BOOST_ENABLE_ASSERT_HANDLER</STRONG> are not
+ defined, and <code>expr</code> evaluates to <code>false</code>, an error
+ message that includes <tt>#expr</tt>, <tt>msg</tt>, <tt> BOOST_CURRENT_FUNCTION</tt>, <tt>
+ __FILE__</tt>, and <tt>__LINE__</tt> is sent to output stream <b>
+ BOOST_ASSERT_MSG_OSTREAM</b>
+ and <code>std::abort()</code> is called.</P>
+ <P> <b>BOOST_ASSERT_MSG_OSTREAM</b> defines the output stream. It defaults to <code>std::cerr</code>.
+ Integrated development environments (IDE's) like Microsoft Visual Studio
+ may produce easier to understand output if messages go to a different
+ stream, such as <code>std::cout</code>. Users may define <b>BOOST_ASSERT_MSG_OSTREAM</b> before including <STRONG>&lt;boost/assert.hpp&gt;</STRONG>
+ to specify a different output stream.&nbsp; </P>
+ <P>If the macro <STRONG>BOOST_ENABLE_ASSERT_HANDLER</STRONG> is defined when <STRONG>&lt;boost/assert.hpp&gt;</STRONG>
+ is included, instead of sending a error message to an output
+ stream, this expression is evaluated</P>
+ <blockquote>
+ <P><tt>::boost::assertion_failed_msg(#expr, msg, BOOST_CURRENT_FUNCTION,
+ __FILE__, __LINE__)</tt></P>
+ </blockquote>
+ <P><STRONG>assertion_failed_msg</STRONG> is declared in <STRONG>&lt;boost/assert.hpp&gt;</STRONG>
+ as</P>
+ <blockquote>
+ <pre>namespace boost
+{
+ void assertion_failed_msg(char const * expr, char const * msg, char const * function, char const * file, long line);
+}
+</pre>
+ </blockquote>
+ <p>but it is never defined. The user is expected to supply an appropriate
+ definition.</p>
+ <P>As is the case with <STRONG>&lt;cassert&gt;</STRONG>, <STRONG>&lt;boost/assert.hpp&gt;</STRONG>
+ can be included multiple times in a single translation unit. <STRONG>BOOST_ASSERT_MSG</STRONG>
+ will be redefined each time as specified above.</P>
+
+<h2><a name="BOOST_VERIFY">BOOST_VERIFY</a></h2>
                 <p><STRONG>&lt;boost/assert.hpp&gt;</STRONG> also defines the macro <STRONG>BOOST_VERIFY</STRONG>.
                         It has exactly the same behavior as <STRONG>BOOST_ASSERT</STRONG>, except that
                         the expression that is passed to <STRONG>BOOST_VERIFY</STRONG> is always
@@ -54,8 +107,9 @@
                         effects; it can also help suppress warnings about unused variables when the
                         only use of the variable is inside an assertion.</p>
                 <p><br>
- <small>Copyright © 2002, 2007 by Peter Dimov. Distributed under the Boost Software
+ <small>Copyright © 2002, 2007 by Peter Dimov.&nbsp; Copyright © 2011
+ by Beman Dawes. Distributed under the Boost Software
                                 License, Version 1.0. See accompanying file LICENSE_1_0.txt
                                 or copy at http://www.boost.org/LICENSE_1_0.txt.</small></p>
         </body>
-</html>
+</html>
\ No newline at end of file

Modified: branches/release/libs/utility/assert_test.cpp
==============================================================================
--- branches/release/libs/utility/assert_test.cpp (original)
+++ branches/release/libs/utility/assert_test.cpp 2011-02-15 09:54:16 EST (Tue, 15 Feb 2011)
@@ -2,6 +2,7 @@
 // assert_test.cpp - a test for boost/assert.hpp
 //
 // Copyright (c) 2002 Peter Dimov and Multi Media Ltd.
+// Copyright (2) Beman Dawes 2011
 //
 // Distributed under the Boost Software License, Version 1.0. (See
 // accompanying file LICENSE_1_0.txt or copy at
@@ -20,6 +21,11 @@
     BOOST_ASSERT(x);
     BOOST_ASSERT(x == 1);
     BOOST_ASSERT(&x);
+
+ BOOST_ASSERT_MSG(1, "msg");
+ BOOST_ASSERT_MSG(x, "msg");
+ BOOST_ASSERT_MSG(x == 1, "msg");
+ BOOST_ASSERT_MSG(&x, "msg");
 }
 
 #define BOOST_DISABLE_ASSERTS
@@ -34,13 +40,23 @@
     BOOST_ASSERT(x == 1);
     BOOST_ASSERT(&x);
 
+ BOOST_ASSERT_MSG(1, "msg");
+ BOOST_ASSERT_MSG(x, "msg");
+ BOOST_ASSERT_MSG(x == 1, "msg");
+ BOOST_ASSERT_MSG(&x, "msg");
+
     BOOST_ASSERT(0);
     BOOST_ASSERT(!x);
     BOOST_ASSERT(x == 0);
 
+ BOOST_ASSERT_MSG(0, "msg");
+ BOOST_ASSERT_MSG(!x, "msg");
+ BOOST_ASSERT_MSG(x == 0, "msg");
+
     void * p = 0;
 
     BOOST_ASSERT(p);
+ BOOST_ASSERT_MSG(p, "msg");
 
     // supress warnings
     p = &x;
@@ -55,6 +71,7 @@
 #include <cstdio>
 
 int handler_invoked = 0;
+int msg_handler_invoked = 0;
 
 void boost::assertion_failed(char const * expr, char const * function, char const * file, long line)
 {
@@ -66,11 +83,24 @@
     ++handler_invoked;
 }
 
+void boost::assertion_failed_msg(char const * expr, char const * msg, char const * function,
+ char const * file, long line)
+{
+#if !defined(BOOST_NO_STDC_NAMESPACE)
+ using std::printf;
+#endif
+
+ printf("Expression: %s Message: %s\nFunction: %s\nFile: %s\nLine: %ld\n\n",
+ expr, msg, function, file, line);
+ ++msg_handler_invoked;
+}
+
 struct X
 {
     static void f()
     {
         BOOST_ASSERT(0);
+ BOOST_ASSERT_MSG(0, "msg f()");
     }
 };
 
@@ -83,21 +113,35 @@
     BOOST_ASSERT(x == 1);
     BOOST_ASSERT(&x);
 
+ BOOST_ASSERT_MSG(1, "msg2");
+ BOOST_ASSERT_MSG(x, "msg3");
+ BOOST_ASSERT_MSG(x == 1, "msg4");
+ BOOST_ASSERT_MSG(&x, "msg5");
+
     BOOST_ASSERT(0);
     BOOST_ASSERT(!x);
     BOOST_ASSERT(x == 0);
 
+ BOOST_ASSERT_MSG(0,"msg 0");
+ BOOST_ASSERT_MSG(!x, "msg !x");
+ BOOST_ASSERT_MSG(x == 0, "msg x == 0");
+
     void * p = 0;
 
     BOOST_ASSERT(p);
+ BOOST_ASSERT_MSG(p, "msg p");
 
     X::f();
 
     BOOST_ASSERT(handler_invoked == 5);
     BOOST_TEST(handler_invoked == 5);
+
+ BOOST_ASSERT_MSG(msg_handler_invoked == 5, "msg_handler_invoked count is wrong");
+ BOOST_TEST(msg_handler_invoked == 5);
 }
 
 #undef BOOST_ENABLE_ASSERT_HANDLER
+#undef BOOST_ENABLE_ASSERT_MSG_HANDLER
 
 int main()
 {


Boost-Commit list run by bdawes at acm.org, david.abrahams at rcn.com, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk