mirror of
https://github.com/boostorg/static_assert.git
synced 2025-06-27 21:11:01 +02:00
Compare commits
1 Commits
svn-branch
...
svn-branch
Author | SHA1 | Date | |
---|---|---|---|
0e93faa340 |
31
Jamfile.v2
31
Jamfile.v2
@ -1,31 +0,0 @@
|
|||||||
# copyright John Maddock 2003
|
|
||||||
# Use, modification and distribution are subject to 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)
|
|
||||||
|
|
||||||
# bring in the rules for testing
|
|
||||||
import testing ;
|
|
||||||
|
|
||||||
test-suite static_assert :
|
|
||||||
[ run static_assert_test.cpp ]
|
|
||||||
# [ run static_assert_example_1.cpp ]
|
|
||||||
[ run static_assert_example_2.cpp ]
|
|
||||||
[ run static_assert_example_3.cpp ]
|
|
||||||
[ compile-fail static_assert_test_fail_1.cpp ]
|
|
||||||
[ compile-fail static_assert_test_fail_2.cpp ]
|
|
||||||
[ compile-fail static_assert_test_fail_3.cpp ]
|
|
||||||
[ compile-fail static_assert_test_fail_4.cpp ]
|
|
||||||
[ compile-fail static_assert_test_fail_5.cpp ]
|
|
||||||
[ compile-fail static_assert_test_fail_6.cpp ]
|
|
||||||
[ compile-fail static_assert_test_fail_7.cpp ]
|
|
||||||
[ compile-fail static_assert_test_fail_8.cpp ]
|
|
||||||
[ compile-fail static_assert_test_fail_9.cpp ]
|
|
||||||
[ compile-fail static_assert_test_fail_10.cpp ]
|
|
||||||
;
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -1,20 +0,0 @@
|
|||||||
|
|
||||||
# Copyright John Maddock 2005. Use, modification, and distribution are
|
|
||||||
# subject to 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)
|
|
||||||
|
|
||||||
using quickbook ;
|
|
||||||
|
|
||||||
xml static_assert : static_assert.qbk ;
|
|
||||||
boostbook standalone
|
|
||||||
:
|
|
||||||
static_assert
|
|
||||||
:
|
|
||||||
<xsl:param>nav.layout=none
|
|
||||||
<xsl:param>navig.graphics=0
|
|
||||||
;
|
|
||||||
|
|
||||||
install html : ../../../doc/html/boostbook.css ;
|
|
||||||
install ../ : ../../../boost.png ;
|
|
||||||
|
|
||||||
|
|
@ -1,230 +0,0 @@
|
|||||||
[library Boost.StaticAssert
|
|
||||||
[copyright 2000 2005 Steve Cleary and John Maddock]
|
|
||||||
[purpose Compile time diagnostics library]
|
|
||||||
[license
|
|
||||||
Distributed under the Boost Software License, Version 1.0.
|
|
||||||
(See accompanying file LICENSE_1_0.txt or copy at
|
|
||||||
<ulink url="http://www.boost.org/LICENSE_1_0.txt">
|
|
||||||
http://www.boost.org/LICENSE_1_0.txt
|
|
||||||
</ulink>)
|
|
||||||
]
|
|
||||||
[authors [Maddock, John], [Cleary, Steve]]
|
|
||||||
[category template]
|
|
||||||
[category testing]
|
|
||||||
[category generic]
|
|
||||||
[last-revision $Date$]
|
|
||||||
]
|
|
||||||
|
|
||||||
This manual is also available in
|
|
||||||
[@http:svn.boost.org/svn/boost/sandbox/pdf/static_assert/release/static_assert.pdf
|
|
||||||
printer friendly PDF format].
|
|
||||||
|
|
||||||
[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;
|
|
||||||
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
|
|
||||||
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.
|
|
||||||
|
|
||||||
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
|
|
||||||
is not supported. While error messages obviously differ from compiler to compiler,
|
|
||||||
but you should see something like:
|
|
||||||
|
|
||||||
Illegal use of STATIC_ASSERTION_FAILURE<false>
|
|
||||||
|
|
||||||
Which is intended to at least catch the eye!
|
|
||||||
|
|
||||||
You can use `BOOST_STATIC_ASSERT` at any place where you can place a declaration,
|
|
||||||
that is at class, function or namespace scope, this is illustrated by the
|
|
||||||
following examples:
|
|
||||||
|
|
||||||
[section:namespace Use at namespace scope.]
|
|
||||||
|
|
||||||
The macro can be used at namespace scope, if there is some requirement must
|
|
||||||
always be true; generally this means some platform specific requirement.
|
|
||||||
Suppose we require that `int` be at least a 32-bit integral type, and that `wchar_t`
|
|
||||||
be an unsigned type. We can verify this at compile time as follows:
|
|
||||||
|
|
||||||
#include <climits>
|
|
||||||
#include <cwchar>
|
|
||||||
#include <limits>
|
|
||||||
#include <boost/static_assert.hpp>
|
|
||||||
|
|
||||||
namespace my_conditions {
|
|
||||||
|
|
||||||
BOOST_STATIC_ASSERT(std::numeric_limits<int>::digits >= 32);
|
|
||||||
BOOST_STATIC_ASSERT(WCHAR_MIN >= 0);
|
|
||||||
|
|
||||||
} // namespace my_conditions
|
|
||||||
|
|
||||||
The use of the namespace my_conditions here requires some comment.
|
|
||||||
The macro `BOOST_STATIC_ASSERT` works by generating an typedef declaration,
|
|
||||||
and since the typedef must have a name, the macro generates one automatically by
|
|
||||||
mangling a stub name with the value of `__LINE__`. When `BOOST_STATIC_ASSERT` is
|
|
||||||
used at either class or function scope then each use of `BOOST_STATIC_ASSERT`
|
|
||||||
is guaranteed to produce a name unique to that scope (provided you only use
|
|
||||||
the macro once on each line). However when used in a header at namespace
|
|
||||||
scope, that namespace can be continued over multiple headers, each of which
|
|
||||||
may have their own static assertions, and on the "same" lines, thereby generating
|
|
||||||
duplicate declarations. In theory the compiler should silently ignore duplicate
|
|
||||||
typedef declarations, however many do not do so (and even if they do they are
|
|
||||||
entitled to emit warnings in such cases). To avoid potential problems, if you
|
|
||||||
use `BOOST_STATIC_ASSERT` in a header and at namespace scope, then enclose
|
|
||||||
them in a namespace unique to that header.
|
|
||||||
|
|
||||||
[endsect]
|
|
||||||
|
|
||||||
[section:function Use at function scope]
|
|
||||||
|
|
||||||
The macro is typically used at function scope inside template functions,
|
|
||||||
when the template arguments need checking. Imagine that we have an
|
|
||||||
iterator-based algorithm that requires random access iterators.
|
|
||||||
If the algorithm is instantiated with iterators that do not meet our
|
|
||||||
requirements then an error will be generated eventually, but this may
|
|
||||||
be nested deep inside several templates, making it hard for the user to
|
|
||||||
determine what went wrong. One option is to add a static assertion at
|
|
||||||
the top level of the template, in that case if the condition is not met,
|
|
||||||
then an error will be generated in a way that makes it reasonably obvious to
|
|
||||||
the user that the template is being misused.
|
|
||||||
|
|
||||||
#include <iterator>
|
|
||||||
#include <boost/static_assert.hpp>
|
|
||||||
#include <boost/type_traits.hpp>
|
|
||||||
|
|
||||||
template <class RandomAccessIterator >
|
|
||||||
RandomAccessIterator foo(RandomAccessIterator from,
|
|
||||||
RandomAccessIterator to)
|
|
||||||
{
|
|
||||||
// this template can only be used with
|
|
||||||
// random access iterators...
|
|
||||||
typedef typename std::iterator_traits<
|
|
||||||
RandomAccessIterator >::iterator_category cat;
|
|
||||||
BOOST_STATIC_ASSERT(
|
|
||||||
(boost::is_convertible<
|
|
||||||
cat,
|
|
||||||
const std::random_access_iterator_tag&>::value));
|
|
||||||
//
|
|
||||||
// detail goes here...
|
|
||||||
return from;
|
|
||||||
}
|
|
||||||
|
|
||||||
A couple of footnotes are in order here: the extra set of parenthesis around the
|
|
||||||
assert, is to prevent the comma inside the `is_convertible` template being
|
|
||||||
interpreted by the preprocessor as a macro argument separator; the target type
|
|
||||||
for `is_convertible` is a reference type, as some compilers have problems
|
|
||||||
using `is_convertible` when the conversion is via a user defined constructor
|
|
||||||
(in any case there is no guarantee that the iterator tag classes are
|
|
||||||
copy-constructible).
|
|
||||||
|
|
||||||
[endsect]
|
|
||||||
|
|
||||||
[section:class Use at class scope]
|
|
||||||
|
|
||||||
The macro is typically used inside classes that are templates.
|
|
||||||
Suppose we have a template-class that requires an unsigned integral type with
|
|
||||||
at least 16-bits of precision as a template argument, we can achieve this
|
|
||||||
using something like this:
|
|
||||||
|
|
||||||
#include <climits>
|
|
||||||
#include <boost/static_assert.hpp>
|
|
||||||
|
|
||||||
template <class UnsignedInt>
|
|
||||||
class myclass
|
|
||||||
{
|
|
||||||
private:
|
|
||||||
BOOST_STATIC_ASSERT((std::numeric_limits<UnsignedInt>::digits >= 16)
|
|
||||||
&& std::numeric_limits<UnsignedInt>::is_specialized
|
|
||||||
&& std::numeric_limits<UnsignedInt>::is_integer
|
|
||||||
&& !std::numeric_limits<UnsignedInt>::is_signed);
|
|
||||||
public:
|
|
||||||
/* details here */
|
|
||||||
};
|
|
||||||
|
|
||||||
[endsect]
|
|
||||||
|
|
||||||
[section:templates Use in templates]
|
|
||||||
|
|
||||||
Normally static assertions when used inside a class or function template,
|
|
||||||
will not be instantiated until the template in which it is used is instantiated.
|
|
||||||
However, there is one potential problem to watch out for: if the static assertion
|
|
||||||
is not dependent upon one or more template parameters, then the compiler is
|
|
||||||
permitted to evaluate the static assertion at the point it is first seen,
|
|
||||||
irrespective of whether the template is ever instantiated, for example:
|
|
||||||
|
|
||||||
template <class T>
|
|
||||||
struct must_not_be_instantiated
|
|
||||||
{
|
|
||||||
BOOST_STATIC_ASSERT(false);
|
|
||||||
};
|
|
||||||
|
|
||||||
Will produce a compiler error with some compilers (for example Intel 8.1
|
|
||||||
or gcc 3.4), regardless of whether the template is ever instantiated. A
|
|
||||||
workaround in cases like this is to force the assertion to be dependent
|
|
||||||
upon a template parameter:
|
|
||||||
|
|
||||||
template <class T>
|
|
||||||
struct must_not_be_instantiated
|
|
||||||
{
|
|
||||||
// this will be triggered if this type is instantiated
|
|
||||||
BOOST_STATIC_ASSERT(sizeof(T) == 0);
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
[endsect]
|
|
||||||
|
|
||||||
[endsect]
|
|
||||||
|
|
||||||
[section:how How it works]
|
|
||||||
|
|
||||||
`BOOST_STATIC_ASSERT` works as follows. There is class `STATIC_ASSERTION_FAILURE`
|
|
||||||
which is defined as:
|
|
||||||
|
|
||||||
namespace boost{
|
|
||||||
|
|
||||||
template <bool> struct STATIC_ASSERTION_FAILURE;
|
|
||||||
|
|
||||||
template <> struct STATIC_ASSERTION_FAILURE<true>{};
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
The key feature is that the error message triggered by the undefined
|
|
||||||
expression `sizeof(STATIC_ASSERTION_FAILURE<0>)`, tends to be consistent
|
|
||||||
across a wide variety of compilers. The rest of the machinery of
|
|
||||||
`BOOST_STATIC_ASSERT` is just a way to feed the `sizeof` expression into a `typedef`.
|
|
||||||
The use of a macro here is somewhat ugly; however boost members have spent
|
|
||||||
considerable effort trying to invent a static assert that avoided macros,
|
|
||||||
all to no avail. The general conclusion was that the good of a static assert
|
|
||||||
working at namespace, function, and class scope outweighed the ugliness of a macro.
|
|
||||||
|
|
||||||
[endsect]
|
|
||||||
|
|
||||||
[section:test Test Programs]
|
|
||||||
|
|
||||||
[table Test programs provided with static_assert
|
|
||||||
[[Test Program][Expected to Compile][Description]]
|
|
||||||
|
|
||||||
[[[@../../libs/static_assert/static_assert_test.cpp static_assert_test.cpp]] [Yes] [Illustrates usage, and should always compile, really just tests compiler compatibility.]]
|
|
||||||
[[[@../../libs/static_assert/static_assert_example_1.cpp static_assert_example_1.cpp]] [Platform dependent.] [Namespace scope test program, may compile depending upon the platform. ]]
|
|
||||||
[[[@../../libs/static_assert/static_assert_example_2.cpp static_assert_example_2.cpp]] [Yes] [Function scope test program. ]]
|
|
||||||
[[[@../../libs/static_assert/static_assert_example_3.cpp static_assert_example_3.cpp]] [Yes] [Class scope test program. ]]
|
|
||||||
[[[@../../libs/static_assert/static_assert_test_fail_1.cpp static_assert_test_fail_1.cpp]] [No] [Illustrates failure at namespace scope. ]]
|
|
||||||
[[[@../../libs/static_assert/static_assert_test_fail_2.cpp static_assert_test_fail_2.cpp]] [No] [Illustrates failure at non-template function scope. ]]
|
|
||||||
[[[@../../libs/static_assert/static_assert_test_fail_3.cpp static_assert_test_fail_3.cpp]] [No] [Illustrates failure at non-template class scope. ]]
|
|
||||||
[[[@../../libs/static_assert/static_assert_test_fail_4.cpp static_assert_test_fail_4.cpp]] [No] [Illustrates failure at non-template class scope. ]]
|
|
||||||
[[[@../../libs/static_assert/static_assert_test_fail_5.cpp static_assert_test_fail_5.cpp]] [No] [Illustrates failure at template class scope. ]]
|
|
||||||
[[[@../../libs/static_assert/static_assert_test_fail_6.cpp static_assert_test_fail_6.cpp]] [No] [Illustrates failure at template class member function scope. ]]
|
|
||||||
[[[@../../libs/static_assert/static_assert_test_fail_7.cpp static_assert_test_fail_7.cpp]] [No] [Illustrates failure of class scope example. ]]
|
|
||||||
[[[@../../libs/static_assert/static_assert_test_fail_8.cpp static_assert_test_fail_8.cpp]] [No] [Illustrates failure of function scope example. ]]
|
|
||||||
[[[@../../libs/static_assert/static_assert_test_fail_9.cpp static_assert_test_fail_9.cpp]] [No] [Illustrates failure of function scope example (part 2). ]]
|
|
||||||
|
|
||||||
]
|
|
||||||
|
|
||||||
[endsect]
|
|
||||||
|
|
||||||
|
|
@ -28,20 +28,6 @@
|
|||||||
# define BOOST_SA_GCC_WORKAROUND
|
# define BOOST_SA_GCC_WORKAROUND
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
//
|
|
||||||
// If the compiler issues warnings about old C style casts,
|
|
||||||
// then enable this:
|
|
||||||
//
|
|
||||||
#if defined(__GNUC__) && ((__GNUC__ > 3) || ((__GNUC__ == 3) && (__GNUC_MINOR__ >= 4)))
|
|
||||||
# define BOOST_STATIC_ASSERT_BOOL_CAST( x ) ((x) == 0 ? false : true)
|
|
||||||
#else
|
|
||||||
# define BOOST_STATIC_ASSERT_BOOL_CAST(x) (bool)(x)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef BOOST_HAS_STATIC_ASSERT
|
|
||||||
# define BOOST_STATIC_ASSERT( B ) static_assert(B, #B)
|
|
||||||
#else
|
|
||||||
|
|
||||||
namespace boost{
|
namespace boost{
|
||||||
|
|
||||||
// HP aCC cannot deal with missing names for template value parameters
|
// HP aCC cannot deal with missing names for template value parameters
|
||||||
@ -88,14 +74,14 @@ template<int x> struct static_assert_test{};
|
|||||||
#elif defined(BOOST_MSVC)
|
#elif defined(BOOST_MSVC)
|
||||||
#define BOOST_STATIC_ASSERT( B ) \
|
#define BOOST_STATIC_ASSERT( B ) \
|
||||||
typedef ::boost::static_assert_test<\
|
typedef ::boost::static_assert_test<\
|
||||||
sizeof(::boost::STATIC_ASSERTION_FAILURE< BOOST_STATIC_ASSERT_BOOL_CAST ( B ) >)>\
|
sizeof(::boost::STATIC_ASSERTION_FAILURE< (bool)( B ) >)>\
|
||||||
BOOST_JOIN(boost_static_assert_typedef_, __COUNTER__)
|
BOOST_JOIN(boost_static_assert_typedef_, __COUNTER__)
|
||||||
#elif defined(BOOST_INTEL_CXX_VERSION) || defined(BOOST_SA_GCC_WORKAROUND)
|
#elif defined(BOOST_INTEL_CXX_VERSION) || defined(BOOST_SA_GCC_WORKAROUND)
|
||||||
// agurt 15/sep/02: a special care is needed to force Intel C++ issue an error
|
// agurt 15/sep/02: a special care is needed to force Intel C++ issue an error
|
||||||
// instead of warning in case of failure
|
// instead of warning in case of failure
|
||||||
# define BOOST_STATIC_ASSERT( B ) \
|
# define BOOST_STATIC_ASSERT( B ) \
|
||||||
typedef char BOOST_JOIN(boost_static_assert_typedef_, __LINE__) \
|
typedef char BOOST_JOIN(boost_static_assert_typedef_, __LINE__) \
|
||||||
[ ::boost::STATIC_ASSERTION_FAILURE< BOOST_STATIC_ASSERT_BOOL_CAST( B ) >::value ]
|
[ ::boost::STATIC_ASSERTION_FAILURE< (bool)( B ) >::value ]
|
||||||
#elif defined(__sgi)
|
#elif defined(__sgi)
|
||||||
// special version for SGI MIPSpro compiler
|
// special version for SGI MIPSpro compiler
|
||||||
#define BOOST_STATIC_ASSERT( B ) \
|
#define BOOST_STATIC_ASSERT( B ) \
|
||||||
@ -110,12 +96,12 @@ template<int x> struct static_assert_test{};
|
|||||||
#define BOOST_STATIC_ASSERT( B ) \
|
#define BOOST_STATIC_ASSERT( B ) \
|
||||||
BOOST_STATIC_CONSTANT(int, \
|
BOOST_STATIC_CONSTANT(int, \
|
||||||
BOOST_JOIN(boost_static_assert_test_, __LINE__) = \
|
BOOST_JOIN(boost_static_assert_test_, __LINE__) = \
|
||||||
sizeof(::boost::STATIC_ASSERTION_FAILURE< BOOST_STATIC_ASSERT_BOOL_CAST( B ) >) )
|
sizeof(::boost::STATIC_ASSERTION_FAILURE< (bool)( B ) >) )
|
||||||
#else
|
#else
|
||||||
// generic version
|
// generic version
|
||||||
#define BOOST_STATIC_ASSERT( B ) \
|
#define BOOST_STATIC_ASSERT( B ) \
|
||||||
typedef ::boost::static_assert_test<\
|
typedef ::boost::static_assert_test<\
|
||||||
sizeof(::boost::STATIC_ASSERTION_FAILURE< BOOST_STATIC_ASSERT_BOOL_CAST( B ) >)>\
|
sizeof(::boost::STATIC_ASSERTION_FAILURE< (bool)( B ) >)>\
|
||||||
BOOST_JOIN(boost_static_assert_typedef_, __LINE__)
|
BOOST_JOIN(boost_static_assert_typedef_, __LINE__)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@ -125,7 +111,7 @@ template<int x> struct static_assert_test{};
|
|||||||
enum { BOOST_JOIN(boost_static_assert_enum_, __LINE__) \
|
enum { BOOST_JOIN(boost_static_assert_enum_, __LINE__) \
|
||||||
= sizeof(::boost::STATIC_ASSERTION_FAILURE< (bool)( B ) >) }
|
= sizeof(::boost::STATIC_ASSERTION_FAILURE< (bool)( B ) >) }
|
||||||
#endif
|
#endif
|
||||||
#endif // ndef BOOST_HAS_STATIC_ASSERT
|
|
||||||
|
|
||||||
#endif // BOOST_STATIC_ASSERT_HPP
|
#endif // BOOST_STATIC_ASSERT_HPP
|
||||||
|
|
||||||
|
18
index.html
18
index.html
@ -1,18 +0,0 @@
|
|||||||
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
|
|
||||||
<html>
|
|
||||||
<head>
|
|
||||||
<meta http-equiv="refresh" content="0; URL=../../doc/html/boost_staticassert.html">
|
|
||||||
</head>
|
|
||||||
<body>
|
|
||||||
Automatic redirection failed, please go to
|
|
||||||
<a href="../../doc/html/boost_staticassert.html">../../doc/html/boost_staticassert.html</a>
|
|
||||||
or view the online version at
|
|
||||||
<a href="http://www.boost.org/regression-logs/cs-win32_metacomm/doc/html/boost_staticassert.html">
|
|
||||||
http://www.boost.org/regression-logs/cs-win32_metacomm/doc/html/boost_staticassert.html</a>
|
|
||||||
<P>Copyright John Maddock 2006</P>
|
|
||||||
<P>Distributed under the Boost Software License, Version 1.0. (See accompanying file <A href="../../LICENSE_1_0.txt">
|
|
||||||
LICENSE_1_0.txt</A> or copy at <A href="http://www.boost.org/LICENSE_1_0.txt">www.boost.org/LICENSE_1_0.txt</A>).</P>
|
|
||||||
</body>
|
|
||||||
</html>
|
|
||||||
|
|
||||||
|
|
@ -1,18 +0,0 @@
|
|||||||
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
|
|
||||||
<html>
|
|
||||||
<head>
|
|
||||||
<meta http-equiv="refresh" content="0; URL=../../doc/html/boost_staticassert.html">
|
|
||||||
</head>
|
|
||||||
<body>
|
|
||||||
Automatic redirection failed, please go to
|
|
||||||
<a href="../../doc/html/boost_staticassert.html">../../doc/html/boost_staticassert.html</a>
|
|
||||||
or view the online version at
|
|
||||||
<a href="http://www.boost.org/regression-logs/cs-win32_metacomm/doc/html/boost_staticassert.html">
|
|
||||||
http://www.boost.org/regression-logs/cs-win32_metacomm/doc/html/boost_staticassert.html</a>
|
|
||||||
<P>Copyright John Maddock 2006</P>
|
|
||||||
<P>Distributed under the Boost Software License, Version 1.0. (See accompanying file <A href="../../LICENSE_1_0.txt">
|
|
||||||
LICENSE_1_0.txt</A> or copy at <A href="http://www.boost.org/LICENSE_1_0.txt">www.boost.org/LICENSE_1_0.txt</A>).</P>
|
|
||||||
</body>
|
|
||||||
</html>
|
|
||||||
|
|
||||||
|
|
@ -1,34 +0,0 @@
|
|||||||
// (C) Copyright Steve Cleary & John Maddock 2000.
|
|
||||||
// Use, modification and distribution are subject to 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)
|
|
||||||
|
|
||||||
// See http://www.boost.org for most recent version including documentation.
|
|
||||||
|
|
||||||
#include <climits>
|
|
||||||
#include <cwchar>
|
|
||||||
#include <limits>
|
|
||||||
#include <boost/static_assert.hpp>
|
|
||||||
|
|
||||||
#if !defined(WCHAR_MIN)
|
|
||||||
#define WCHAR_MIN 0
|
|
||||||
#endif
|
|
||||||
|
|
||||||
namespace boost{
|
|
||||||
|
|
||||||
namespace my_conditions {
|
|
||||||
BOOST_STATIC_ASSERT(std::numeric_limits<int>::digits >= 32);
|
|
||||||
BOOST_STATIC_ASSERT(WCHAR_MIN >= 0);
|
|
||||||
|
|
||||||
} // namespace my_conditions
|
|
||||||
|
|
||||||
} // namespace boost
|
|
||||||
|
|
||||||
int main()
|
|
||||||
{
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -1,40 +0,0 @@
|
|||||||
// (C) Copyright John Maddock 2000.
|
|
||||||
// Use, modification and distribution are subject to 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)
|
|
||||||
|
|
||||||
// See http://www.boost.org for most recent version including documentation.
|
|
||||||
|
|
||||||
#include <iterator>
|
|
||||||
#include <list>
|
|
||||||
#include <deque>
|
|
||||||
#include <boost/static_assert.hpp>
|
|
||||||
#include <boost/type_traits.hpp>
|
|
||||||
|
|
||||||
template <class RandomAccessIterator >
|
|
||||||
RandomAccessIterator foo(RandomAccessIterator from, RandomAccessIterator to)
|
|
||||||
{
|
|
||||||
// this template can only be used with
|
|
||||||
// random access iterators...
|
|
||||||
typedef typename std::iterator_traits< RandomAccessIterator >::iterator_category cat;
|
|
||||||
BOOST_STATIC_ASSERT((boost::is_convertible<cat, const std::random_access_iterator_tag&>::value));
|
|
||||||
//
|
|
||||||
// detail goes here...
|
|
||||||
return from;
|
|
||||||
}
|
|
||||||
|
|
||||||
int main()
|
|
||||||
{
|
|
||||||
std::deque<int> d;
|
|
||||||
std::list<int> l;
|
|
||||||
foo(d.begin(), d.end()); // OK
|
|
||||||
//foo(l.begin(), l.end()); // error
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -1,33 +0,0 @@
|
|||||||
// (C) Copyright John Maddock 2000.
|
|
||||||
// Use, modification and distribution are subject to 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)
|
|
||||||
|
|
||||||
// See http://www.boost.org for most recent version including documentation.
|
|
||||||
|
|
||||||
#include <climits>
|
|
||||||
#include <boost/limits.hpp>
|
|
||||||
#include <boost/static_assert.hpp>
|
|
||||||
|
|
||||||
template <class UnsignedInt>
|
|
||||||
class myclass
|
|
||||||
{
|
|
||||||
private:
|
|
||||||
BOOST_STATIC_ASSERT((std::numeric_limits<UnsignedInt>::digits >= 16)
|
|
||||||
&& std::numeric_limits<UnsignedInt>::is_specialized
|
|
||||||
&& std::numeric_limits<UnsignedInt>::is_integer
|
|
||||||
&& !std::numeric_limits<UnsignedInt>::is_signed);
|
|
||||||
public:
|
|
||||||
/* details here */
|
|
||||||
};
|
|
||||||
|
|
||||||
myclass<unsigned> m1; // this should be OK
|
|
||||||
//myclass<int> m2; // this should fail
|
|
||||||
//myclass<unsigned char> m3; // and so should this
|
|
||||||
|
|
||||||
int main()
|
|
||||||
{
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
@ -1,86 +0,0 @@
|
|||||||
// (C) Copyright Steve Cleary & John Maddock 2000.
|
|
||||||
// Use, modification and distribution are subject to 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)
|
|
||||||
|
|
||||||
// See http://www.boost.org for most recent version including documentation.
|
|
||||||
|
|
||||||
#include <boost/static_assert.hpp>
|
|
||||||
|
|
||||||
//
|
|
||||||
// all these tests should succeed.
|
|
||||||
// some of these tests are rather simplistic (ie useless)
|
|
||||||
// in order to ensure that they compile on all platforms.
|
|
||||||
//
|
|
||||||
|
|
||||||
// Namespace scope
|
|
||||||
BOOST_STATIC_ASSERT(sizeof(int) >= sizeof(short));
|
|
||||||
BOOST_STATIC_ASSERT(sizeof(char) == 1);
|
|
||||||
|
|
||||||
// Function (block) scope
|
|
||||||
void f()
|
|
||||||
{
|
|
||||||
BOOST_STATIC_ASSERT(sizeof(int) >= sizeof(short));
|
|
||||||
BOOST_STATIC_ASSERT(sizeof(char) == 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
struct Bob
|
|
||||||
{
|
|
||||||
private: // can be in private, to avoid namespace pollution
|
|
||||||
BOOST_STATIC_ASSERT(sizeof(int) >= sizeof(short));
|
|
||||||
BOOST_STATIC_ASSERT(sizeof(char) == 1);
|
|
||||||
public:
|
|
||||||
|
|
||||||
// Member function scope: provides access to member variables
|
|
||||||
int x;
|
|
||||||
char c;
|
|
||||||
int f()
|
|
||||||
{
|
|
||||||
#ifndef _MSC_VER // broken sizeof in VC6
|
|
||||||
BOOST_STATIC_ASSERT(sizeof(x) >= sizeof(short));
|
|
||||||
BOOST_STATIC_ASSERT(sizeof(c) == 1);
|
|
||||||
#endif
|
|
||||||
return x;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// Template class scope
|
|
||||||
template <class Int, class Char>
|
|
||||||
struct Bill
|
|
||||||
{
|
|
||||||
private: // can be in private, to avoid namespace pollution
|
|
||||||
BOOST_STATIC_ASSERT(sizeof(Int) > sizeof(char));
|
|
||||||
public:
|
|
||||||
|
|
||||||
// Template member function scope: provides access to member variables
|
|
||||||
Int x;
|
|
||||||
Char c;
|
|
||||||
template <class Int2, class Char2>
|
|
||||||
void f(Int2 , Char2 )
|
|
||||||
{
|
|
||||||
BOOST_STATIC_ASSERT(sizeof(Int) == sizeof(Int2));
|
|
||||||
BOOST_STATIC_ASSERT(sizeof(Char) == sizeof(Char2));
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
void test_Bill() // BOOST_CT_ASSERTs are not triggerred until instantiated
|
|
||||||
{
|
|
||||||
Bill<int, char> z;
|
|
||||||
//Bill<int, int> bad; // will not compile
|
|
||||||
int i = 3;
|
|
||||||
char ch = 'a';
|
|
||||||
z.f(i, ch);
|
|
||||||
//z.f(i, i); // should not compile
|
|
||||||
}
|
|
||||||
|
|
||||||
int main()
|
|
||||||
{
|
|
||||||
test_Bill();
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -1,23 +0,0 @@
|
|||||||
// (C) Copyright Steve Cleary & John Maddock 2000.
|
|
||||||
// Use, modification and distribution are subject to 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)
|
|
||||||
|
|
||||||
// See http://www.boost.org for most recent version including documentation.
|
|
||||||
|
|
||||||
#include <boost/static_assert.hpp>
|
|
||||||
|
|
||||||
//
|
|
||||||
// all these tests should fail:
|
|
||||||
//
|
|
||||||
typedef char a1[2];
|
|
||||||
typedef char a2[3];
|
|
||||||
|
|
||||||
// Namespace scope
|
|
||||||
BOOST_STATIC_ASSERT(sizeof(a1) == sizeof(a2)); // will not compile
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -1,18 +0,0 @@
|
|||||||
//~ Copyright 2005 Redshift Software, Inc.
|
|
||||||
//~ Distributed under the Boost Software License, Version 1.0.
|
|
||||||
//~ (See accompanying file LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt)
|
|
||||||
|
|
||||||
#include <boost/static_assert.hpp>
|
|
||||||
|
|
||||||
template <int N>
|
|
||||||
int foo()
|
|
||||||
{
|
|
||||||
BOOST_STATIC_ASSERT( N < 2 );
|
|
||||||
|
|
||||||
return N;
|
|
||||||
}
|
|
||||||
|
|
||||||
int main()
|
|
||||||
{
|
|
||||||
return foo<5>();
|
|
||||||
}
|
|
@ -1,25 +0,0 @@
|
|||||||
// (C) Copyright Steve Cleary & John Maddock 2000.
|
|
||||||
// Use, modification and distribution are subject to 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)
|
|
||||||
|
|
||||||
// See http://www.boost.org for most recent version including documentation.
|
|
||||||
|
|
||||||
#include <boost/static_assert.hpp>
|
|
||||||
|
|
||||||
//
|
|
||||||
// all these tests should fail:
|
|
||||||
//
|
|
||||||
typedef char a1[2];
|
|
||||||
typedef char a2[3];
|
|
||||||
|
|
||||||
// Function (block) scope
|
|
||||||
void f()
|
|
||||||
{
|
|
||||||
BOOST_STATIC_ASSERT(sizeof(a1) == sizeof(a2)); // should not compile
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -1,39 +0,0 @@
|
|||||||
// (C) Copyright Steve Cleary & John Maddock 2000.
|
|
||||||
// Use, modification and distribution are subject to 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)
|
|
||||||
|
|
||||||
// See http://www.boost.org for most recent version including documentation.
|
|
||||||
|
|
||||||
#include <boost/static_assert.hpp>
|
|
||||||
|
|
||||||
//
|
|
||||||
// this tests should fail:
|
|
||||||
//
|
|
||||||
typedef char a1[2];
|
|
||||||
typedef char a2[3];
|
|
||||||
|
|
||||||
struct Bob
|
|
||||||
{
|
|
||||||
private: // can be in private, to avoid namespace pollution
|
|
||||||
BOOST_STATIC_ASSERT(sizeof(a1) == sizeof(a2)); // will not compile
|
|
||||||
public:
|
|
||||||
|
|
||||||
// Member function scope: provides access to member variables
|
|
||||||
int x;
|
|
||||||
char c;
|
|
||||||
int f()
|
|
||||||
{
|
|
||||||
#ifndef _MSC_VER // broken sizeof in VC6
|
|
||||||
BOOST_STATIC_ASSERT(sizeof(x) == 4);
|
|
||||||
BOOST_STATIC_ASSERT(sizeof(c) == 1);
|
|
||||||
#endif
|
|
||||||
return x;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -1,38 +0,0 @@
|
|||||||
// (C) Copyright Steve Cleary & John Maddock 2000.
|
|
||||||
// Use, modification and distribution are subject to 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)
|
|
||||||
|
|
||||||
// See http://www.boost.org for most recent version including documentation.
|
|
||||||
|
|
||||||
#include <boost/config.hpp>
|
|
||||||
#include <boost/static_assert.hpp>
|
|
||||||
|
|
||||||
//
|
|
||||||
// all these tests should fail:
|
|
||||||
//
|
|
||||||
|
|
||||||
|
|
||||||
struct Bob
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
|
|
||||||
// Member function scope: provides access to member variables
|
|
||||||
char x[4];
|
|
||||||
char c;
|
|
||||||
int f()
|
|
||||||
{
|
|
||||||
#if !defined(BOOST_MSVC) || BOOST_MSVC > 1200 // broken sizeof in VC6
|
|
||||||
BOOST_STATIC_ASSERT(sizeof(x) == 4);
|
|
||||||
BOOST_STATIC_ASSERT(sizeof(c) == 1);
|
|
||||||
BOOST_STATIC_ASSERT((sizeof(x) == sizeof(c))); // should not compile
|
|
||||||
#endif
|
|
||||||
return x;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -1,39 +0,0 @@
|
|||||||
// (C) Copyright Steve Cleary & John Maddock 2000.
|
|
||||||
// Use, modification and distribution are subject to 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)
|
|
||||||
|
|
||||||
// See http://www.boost.org for most recent version including documentation.
|
|
||||||
|
|
||||||
#include <boost/static_assert.hpp>
|
|
||||||
|
|
||||||
//
|
|
||||||
// all these tests should fail:
|
|
||||||
//
|
|
||||||
|
|
||||||
// Template class scope
|
|
||||||
template <class Int, class Char>
|
|
||||||
struct Bill
|
|
||||||
{
|
|
||||||
private: // can be in private, to avoid namespace pollution
|
|
||||||
BOOST_STATIC_ASSERT(sizeof(Int) == 4);
|
|
||||||
BOOST_STATIC_ASSERT(sizeof(Int) == sizeof(Char)); // should not compile when instantiated
|
|
||||||
public:
|
|
||||||
|
|
||||||
// Template member function scope: provides access to member variables
|
|
||||||
Int x;
|
|
||||||
Char c;
|
|
||||||
template <class Int2, class Char2>
|
|
||||||
void f(Int2 , Char2 )
|
|
||||||
{
|
|
||||||
BOOST_STATIC_ASSERT(sizeof(Int) == sizeof(Int2));
|
|
||||||
BOOST_STATIC_ASSERT(sizeof(Char) == sizeof(Char2));
|
|
||||||
//BOOST_STATIC_ASSERT(sizeof(Int) == sizeof(Char)); // should not compile when instantiated
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
Bill<int, char> b;
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -1,46 +0,0 @@
|
|||||||
// (C) Copyright Steve Cleary & John Maddock 2000.
|
|
||||||
// Use, modification and distribution are subject to 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)
|
|
||||||
|
|
||||||
// See http://www.boost.org for most recent version including documentation.
|
|
||||||
|
|
||||||
#include <boost/static_assert.hpp>
|
|
||||||
|
|
||||||
//
|
|
||||||
// all these tests should fail:
|
|
||||||
//
|
|
||||||
|
|
||||||
// Template class scope
|
|
||||||
template <class Int, class Char>
|
|
||||||
struct Bill
|
|
||||||
{
|
|
||||||
private: // can be in private, to avoid namespace pollution
|
|
||||||
BOOST_STATIC_ASSERT(sizeof(Int) == 4);
|
|
||||||
//BOOST_STATIC_ASSERT(sizeof(Int) == sizeof(Char)); // should not compile when instantiated
|
|
||||||
public:
|
|
||||||
|
|
||||||
// Template member function scope: provides access to member variables
|
|
||||||
Int x;
|
|
||||||
Char c;
|
|
||||||
template <class Int2, class Char2>
|
|
||||||
void f(Int2 , Char2 )
|
|
||||||
{
|
|
||||||
BOOST_STATIC_ASSERT(sizeof(Int) == sizeof(Int2));
|
|
||||||
BOOST_STATIC_ASSERT(sizeof(Char) == sizeof(Char2));
|
|
||||||
BOOST_STATIC_ASSERT(sizeof(Int) == sizeof(Char)); // should not compile when instantiated
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
void foo()
|
|
||||||
{
|
|
||||||
int i = 0;
|
|
||||||
char c = 0;
|
|
||||||
Bill<int, char> b;
|
|
||||||
// this should fail:
|
|
||||||
b.f(i, c);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -1,31 +0,0 @@
|
|||||||
// (C) Copyright John Maddock 2000.
|
|
||||||
// Use, modification and distribution are subject to 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)
|
|
||||||
|
|
||||||
// See http://www.boost.org for most recent version including documentation.
|
|
||||||
|
|
||||||
#include <climits>
|
|
||||||
#include <boost/limits.hpp>
|
|
||||||
#include <boost/static_assert.hpp>
|
|
||||||
|
|
||||||
template <class UnsignedInt>
|
|
||||||
class myclass
|
|
||||||
{
|
|
||||||
private:
|
|
||||||
BOOST_STATIC_ASSERT(sizeof(UnsignedInt) * CHAR_BIT >= 16);
|
|
||||||
BOOST_STATIC_ASSERT(std::numeric_limits<UnsignedInt>::is_specialized
|
|
||||||
&& std::numeric_limits<UnsignedInt>::is_integer
|
|
||||||
&& !std::numeric_limits<UnsignedInt>::is_signed);
|
|
||||||
public:
|
|
||||||
/* details here */
|
|
||||||
};
|
|
||||||
|
|
||||||
myclass<int> m2; // this should fail
|
|
||||||
myclass<unsigned char> m3; // and so should this
|
|
||||||
|
|
||||||
int main()
|
|
||||||
{
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
@ -1,44 +0,0 @@
|
|||||||
// (C) Copyright John Maddock 2000.
|
|
||||||
// Use, modification and distribution are subject to 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)
|
|
||||||
|
|
||||||
// See http://www.boost.org for most recent version including documentation.
|
|
||||||
|
|
||||||
#include <iterator>
|
|
||||||
#include <list>
|
|
||||||
#include <deque>
|
|
||||||
#include <boost/static_assert.hpp>
|
|
||||||
#include <boost/type_traits.hpp>
|
|
||||||
|
|
||||||
template <class RandomAccessIterator >
|
|
||||||
RandomAccessIterator foo(RandomAccessIterator from, RandomAccessIterator)
|
|
||||||
{
|
|
||||||
// this template can only be used with
|
|
||||||
// random access iterators...
|
|
||||||
typedef typename std::iterator_traits< RandomAccessIterator >::iterator_category cat;
|
|
||||||
BOOST_STATIC_ASSERT((boost::is_convertible<cat*, std::random_access_iterator_tag*>::value));
|
|
||||||
//
|
|
||||||
// detail goes here...
|
|
||||||
return from;
|
|
||||||
}
|
|
||||||
|
|
||||||
// ensure that delayed instantiation compilers like Comeau see the failure early
|
|
||||||
// enough for "compile-fail" testing with the Boost.Build testing framework. (Greg Comeau)
|
|
||||||
template
|
|
||||||
std::list<int>::iterator
|
|
||||||
foo(std::list<int>::iterator, std::list<int>::iterator);
|
|
||||||
|
|
||||||
int main()
|
|
||||||
{
|
|
||||||
std::deque<int> d;
|
|
||||||
std::list<int> l;
|
|
||||||
foo(d.begin(), d.end()); // OK
|
|
||||||
foo(l.begin(), l.end()); // error
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -1,32 +0,0 @@
|
|||||||
// (C) Copyright John Maddock 2000.
|
|
||||||
// Use, modification and distribution are subject to 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)
|
|
||||||
|
|
||||||
// See http://www.boost.org for most recent version including documentation.
|
|
||||||
|
|
||||||
#include <climits>
|
|
||||||
#include <boost/limits.hpp>
|
|
||||||
#include <boost/static_assert.hpp>
|
|
||||||
|
|
||||||
template <class UnsignedInt>
|
|
||||||
class myclass
|
|
||||||
{
|
|
||||||
private:
|
|
||||||
BOOST_STATIC_ASSERT(sizeof(UnsignedInt) * CHAR_BIT >= 16);
|
|
||||||
BOOST_STATIC_ASSERT(std::numeric_limits<UnsignedInt>::is_specialized
|
|
||||||
&& std::numeric_limits<UnsignedInt>::is_integer
|
|
||||||
&& !std::numeric_limits<UnsignedInt>::is_signed);
|
|
||||||
public:
|
|
||||||
/* details here */
|
|
||||||
};
|
|
||||||
|
|
||||||
myclass<unsigned> m1; // this should be OK
|
|
||||||
//myclass<int> m2; // this should fail
|
|
||||||
myclass<unsigned char> m3; // and so should this
|
|
||||||
|
|
||||||
int main()
|
|
||||||
{
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
Reference in New Issue
Block a user