|
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><boost/assert.hpp></STRONG> defines the macro <b>BOOST_ASSERT</b>,
which is similar to the standard <STRONG>assert</STRONG> macro defined in <STRONG><cassert></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><boost/assert.hpp></STRONG>
+ <P>If the macro <STRONG>BOOST_DISABLE_ASSERTS</STRONG> is defined when <STRONG><boost/assert.hpp></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><boost/assert.hpp></STRONG>
+ <P>If the macro <STRONG>BOOST_ENABLE_ASSERT_HANDLER</STRONG> is defined when <STRONG><boost/assert.hpp></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><boost/assert.hpp></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><cassert></STRONG>, <STRONG><boost/assert.hpp></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><boost/assert.hpp></STRONG> defines the macro <b>BOOST_ASSERT_MSG</b>,
+ which is similar to the standard <STRONG>assert</STRONG> macro defined in <STRONG><cassert></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><boost/assert.hpp></STRONG>
+ to specify a different output stream. </P>
+ <P>If the macro <STRONG>BOOST_ENABLE_ASSERT_HANDLER</STRONG> is defined when <STRONG><boost/assert.hpp></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><boost/assert.hpp></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><cassert></STRONG>, <STRONG><boost/assert.hpp></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><boost/assert.hpp></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. 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