Boost logo

Boost-Commit :

Subject: [Boost-commit] svn:boost r68584 - in trunk: boost libs/static_assert libs/static_assert/doc
From: bdawes_at_[hidden]
Date: 2011-01-31 10:03:43


Author: bemandawes
Date: 2011-01-31 10:03:41 EST (Mon, 31 Jan 2011)
New Revision: 68584
URL: http://svn.boost.org/trac/boost/changeset/68584

Log:
Add BOOST_STATIC_ASSERT_MSG
Text files modified:
   trunk/boost/static_assert.hpp | 6 ++++++
   trunk/libs/static_assert/doc/static_assert.qbk | 23 ++++++++++++++++++-----
   trunk/libs/static_assert/static_assert_test.cpp | 15 +++++++++++++--
   3 files changed, 37 insertions(+), 7 deletions(-)

Modified: trunk/boost/static_assert.hpp
==============================================================================
--- trunk/boost/static_assert.hpp (original)
+++ trunk/boost/static_assert.hpp 2011-01-31 10:03:41 EST (Mon, 31 Jan 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:

Modified: trunk/libs/static_assert/doc/static_assert.qbk
==============================================================================
--- trunk/libs/static_assert/doc/static_assert.qbk (original)
+++ trunk/libs/static_assert/doc/static_assert.qbk 2011-01-31 10:03:41 EST (Mon, 31 Jan 2011)
@@ -21,15 +21,28 @@
 
 [section:intro Overview and Tutorial]
 
-The header `<boost/static_assert.hpp>` supplies a single macro `BOOST_STATIC_ASSERT(x)`,
-which generates a compile time error message if the integral-constant-expression `x`
-is not true. In other words it is the compile time equivalent of the assert macro;
+The header `<boost/static_assert.hpp>` supplies two macros:
+
+ BOOST_STATIC_ASSERT(x)
+ BOOST_STATIC_ASSERT_MSG(x, msg)
+
+Both generate a compile time error message if the integral-constant-expression `x`
+is not true. In other words, they are the compile time equivalent of the assert macro;
 this is sometimes known as a "compile-time-assertion", but will be called a
 "static assertion" throughout these docs. Note that if the condition is `true`,
-then the macro will generate neither code nor data - and the macro can also
+then the macros will generate neither code nor data - and the macros can also
 be used at either namespace, class or function scope. When used in a template,
 the static assertion will be evaluated at the time the template is instantiated;
-this is particularly useful for validating template parameters.
+this is particularly useful for validating template parameters.
+
+If the C++0x `static_assert` feature is available, both macros will use it.
+For `BOOST_STATIC_ASSERT(x)`, the error message with be a stringized version of `x`.
+For `BOOST_STATIC_ASSERT_MSG(x, msg)`, the error message will be the `msg` string.
+
+If the C++0x `static_assert` feature is not available, `BOOST_STATIC_ASSERT_MSG(x, msg)`
+will be treated as `BOOST_STATIC_ASSERT(x)`.
+
+The material that follows assumes the C++0x `static_assert` feature is not available.
 
 One of the aims of `BOOST_STATIC_ASSERT` is to generate readable error messages.
 These immediately tell the user that a library is being used in a manner that

Modified: trunk/libs/static_assert/static_assert_test.cpp
==============================================================================
--- trunk/libs/static_assert/static_assert_test.cpp (original)
+++ trunk/libs/static_assert/static_assert_test.cpp 2011-01-31 10:03:41 EST (Mon, 31 Jan 2011)
@@ -16,12 +16,16 @@
 // Namespace scope
 BOOST_STATIC_ASSERT(sizeof(int) >= sizeof(short));
 BOOST_STATIC_ASSERT(sizeof(char) == 1);
+BOOST_STATIC_ASSERT_MSG(sizeof(int) >= sizeof(short), "msg1");
+BOOST_STATIC_ASSERT_MSG(sizeof(char) == 1, "msg2");
 
 // Function (block) scope
 void f()
 {
   BOOST_STATIC_ASSERT(sizeof(int) >= sizeof(short));
   BOOST_STATIC_ASSERT(sizeof(char) == 1);
+ BOOST_STATIC_ASSERT_MSG(sizeof(int) >= sizeof(short), "msg3");
+ BOOST_STATIC_ASSERT_MSG(sizeof(char) == 1, "msg4");
 }
 
 struct Bob
@@ -29,6 +33,8 @@
   private: // can be in private, to avoid namespace pollution
     BOOST_STATIC_ASSERT(sizeof(int) >= sizeof(short));
     BOOST_STATIC_ASSERT(sizeof(char) == 1);
+ BOOST_STATIC_ASSERT_MSG(sizeof(int) >= sizeof(short), "msg5");
+ BOOST_STATIC_ASSERT_MSG(sizeof(char) == 1, "msg6");
   public:
 
   // Member function scope: provides access to member variables
@@ -36,9 +42,11 @@
   char c;
   int f()
   {
-#ifndef _MSC_VER // broken sizeof in VC6
+#if defined(_MSC_VER) && _MSC_VER < 1300 // broken sizeof in VC6
     BOOST_STATIC_ASSERT(sizeof(x) >= sizeof(short));
     BOOST_STATIC_ASSERT(sizeof(c) == 1);
+ BOOST_STATIC_ASSERT_MSG(sizeof(x) >= sizeof(short), "msg7");
+ BOOST_STATIC_ASSERT_MSG(sizeof(c) == 1, "msg8");
 #endif
     return x;
   }
@@ -52,6 +60,7 @@
 {
   private: // can be in private, to avoid namespace pollution
     BOOST_STATIC_ASSERT(sizeof(Int) > sizeof(char));
+ BOOST_STATIC_ASSERT_MSG(sizeof(Int) > sizeof(char), "msg9");
   public:
 
   // Template member function scope: provides access to member variables
@@ -62,10 +71,12 @@
   {
     BOOST_STATIC_ASSERT(sizeof(Int) == sizeof(Int2));
     BOOST_STATIC_ASSERT(sizeof(Char) == sizeof(Char2));
+ BOOST_STATIC_ASSERT_MSG(sizeof(Int) == sizeof(Int2), "msg10");
+ BOOST_STATIC_ASSERT_MSG(sizeof(Char) == sizeof(Char2), "msg11");
   }
 };
 
-void test_Bill() // BOOST_CT_ASSERTs are not triggerred until instantiated
+void test_Bill() // BOOST_STATIC_ASSERTs are not triggerred until instantiated
 {
   Bill<int, char> z;
   //Bill<int, int> bad; // will not compile


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