.. Macros/Asserts//BOOST_MPL_ASSERT_RELATION

.. Copyright Aleksey Gurtovoy, David Abrahams 2007.
.. 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)

BOOST_MPL_ASSERT_RELATION
=========================

Synopsis
--------

.. parsed-literal::
    
    #define BOOST_MPL_ASSERT_RELATION( x, relation, y ) \\
        |unspecified-token-seq| \\
    /\*\*/



Description
-----------

A specialized assertion macro for checking numerical conditions. Generates 
a compilation error when the condition ``( x relation y )`` 
doesn't hold.


Header
------

.. parsed-literal::
    
    #include <boost/mpl/assert.hpp>


Parameters
----------

+---------------+-----------------------------------+-----------------------------------------------+
| Parameter     | Requirement                       | Description                                   |
+===============+===================================+===============================================+
| ``x``         | An integral constant              | Left operand of the checked relation.         |
+---------------+-----------------------------------+-----------------------------------------------+
| ``y``         | An integral constant              | Right operand of the checked relation.        |
+---------------+-----------------------------------+-----------------------------------------------+
| ``relation``  | A C++ operator token              | An operator token for the relation being      |
|               |                                   | checked.                                      |
+---------------+-----------------------------------+-----------------------------------------------+


Expression semantics
--------------------

For any integral constants ``x``, ``y`` and a legal C++ operator token ``op``:


.. parsed-literal::

    BOOST_MPL_ASSERT_RELATION( x, op, y );

:Return type:
    None.

:Semantics:
    Generates a compilation error if ``( x op y ) != true``, otherwise
    has no effect. 
    
    When possible within the compiler's diagnostic capabilities,
    the error message will include a name of the relation being checked,
    the actual values of both operands, and have a general form of:

    .. parsed-literal::
    
        |...| \*\*\*\*\*\*\*\*\*\*\*\*\ |...|\ assert_relation<op, x, y>::\*\*\*\*\*\*\*\*\*\*\*\*) |...|


Example
-------

::
    
    template< typename T, typename U > struct my
    {
        // ...
        BOOST_MPL_ASSERT_RELATION( sizeof(T), <, sizeof(U) );
    };
    
    my<char[50],char[10]> test;

    // In instantiation of `my<char[50], char[10]>':
    //   instantiated from here
    // conversion from `
    //   mpl_::failed************mpl_::assert_relation<less, 50, 10>::************' 
    //   to non-scalar type `mpl_::assert<false>' requested


See also
--------

|Asserts|, |BOOST_MPL_ASSERT|, |BOOST_MPL_ASSERT_NOT|, |BOOST_MPL_ASSERT_MSG|

