| 
									
										
										
										
											2001-12-07 13:19:38 +00:00
										 |  |  | //  boost integer_mask.hpp test program  -------------------------------------//
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2004-07-30 04:46:56 +00:00
										 |  |  | //  (C) Copyright Daryle Walker 2001.
 | 
					
						
							|  |  |  | //  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)
 | 
					
						
							| 
									
										
										
										
											2001-12-07 13:19:38 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | //  See http://www.boost.org for most recent version including documentation.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | //  Revision History
 | 
					
						
							| 
									
										
										
										
											2008-07-27 16:34:38 +00:00
										 |  |  | //  27 Jul 2008  Changed tests to use the unit-test system (Daryle Walker)
 | 
					
						
							| 
									
										
										
										
											2001-12-07 13:19:38 +00:00
										 |  |  | //  23 Sep 2001  Initial version (Daryle Walker)
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-07-27 16:34:38 +00:00
										 |  |  | #define BOOST_TEST_MODULE  "Integer mask tests"
 | 
					
						
							|  |  |  | #include <boost/test/unit_test.hpp>  // unit testing framework
 | 
					
						
							| 
									
										
										
										
											2001-12-07 13:19:38 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-07-27 16:34:38 +00:00
										 |  |  | #include <boost/cstdint.hpp>               // for boost::uintmax_t
 | 
					
						
							| 
									
										
										
										
											2001-12-07 13:19:38 +00:00
										 |  |  | #include <boost/integer/integer_mask.hpp>  // for boost::high_bit_mask_t, etc.
 | 
					
						
							| 
									
										
										
										
											2008-07-27 16:34:38 +00:00
										 |  |  | #include <boost/mpl/assert.hpp>            // for BOOST_MPL_ASSERT_RELATION
 | 
					
						
							|  |  |  | #include <boost/mpl/range_c.hpp>           // for boost::mpl::range_c
 | 
					
						
							| 
									
										
										
										
											2001-12-07 13:19:38 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-07-27 16:34:38 +00:00
										 |  |  | #include <cstddef>   // for std::size_t
 | 
					
						
							| 
									
										
										
										
											2001-12-07 13:19:38 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-07-27 16:34:38 +00:00
										 |  |  | // Custom types/templates, helper functions, and objects
 | 
					
						
							|  |  |  | namespace | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // A big one
 | 
					
						
							|  |  |  | boost::uintmax_t const  one = 1u; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // List the ranges of template parameters tests (ranges are half-open)
 | 
					
						
							|  |  |  | typedef boost::mpl::range_c<std::size_t, 0u, 32u>  high_bit_offsets; | 
					
						
							|  |  |  | typedef boost::mpl::range_c<std::size_t, 1u, 33u>  low_bit_lengths; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | }  // unnamed namespace
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-12-07 13:19:38 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-07-27 16:34:38 +00:00
										 |  |  | // Check the various integer-valued bit-masks
 | 
					
						
							|  |  |  | BOOST_AUTO_TEST_SUITE( integer_mask_tests ) | 
					
						
							| 
									
										
										
										
											2001-12-07 13:19:38 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-07-27 16:34:38 +00:00
										 |  |  | // Check the bit-masks of one offset bit
 | 
					
						
							|  |  |  | BOOST_AUTO_TEST_CASE_TEMPLATE( high_bit_mask_test, T, high_bit_offsets ) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     BOOST_MPL_ASSERT_RELATION( boost::high_bit_mask_t<T::value>::high_bit, ==, | 
					
						
							|  |  |  |      (one << T::value) ); | 
					
						
							|  |  |  |     BOOST_MPL_ASSERT_RELATION( boost::high_bit_mask_t<T::value>::high_bit_fast, | 
					
						
							|  |  |  |      ==, (one << T::value) ); | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2001-12-07 13:19:38 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-07-27 16:34:38 +00:00
										 |  |  | // Check the bit-masks of a block of low-valued bits
 | 
					
						
							|  |  |  | BOOST_AUTO_TEST_CASE_TEMPLATE( low_bits_mask_test, T, low_bit_lengths ) | 
					
						
							| 
									
										
										
										
											2001-12-07 13:19:38 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2008-07-27 16:34:38 +00:00
										 |  |  |     // One can express (2^x - 1) in two ways
 | 
					
						
							|  |  |  |     // 1. (1 << x) - 1
 | 
					
						
							|  |  |  |     // 2. (1 << (x-1)) | ((1 << (x-1)) - 1)
 | 
					
						
							|  |  |  |     // Since unsigneds have modulo arithmetic, [1] gives the right answer even
 | 
					
						
							|  |  |  |     // when x is the number of bits in the register.  However, that last case
 | 
					
						
							|  |  |  |     // gives warnings about the sole bit flowing past the register.  Applying
 | 
					
						
							|  |  |  |     // distributive property backwards gives [2], which works without overflow.
 | 
					
						
							|  |  |  |     BOOST_MPL_ASSERT_RELATION( boost::low_bits_mask_t<T::value>::sig_bits, ==, | 
					
						
							|  |  |  |      (one << ( T::value - 1u )) | (( one << (T::value - 1u) ) - 1u) ); | 
					
						
							|  |  |  |     BOOST_MPL_ASSERT_RELATION( boost::low_bits_mask_t<T::value>::sig_bits_fast, | 
					
						
							|  |  |  |      ==, (one << ( T::value - 1u )) | (( one << (T::value - 1u) ) - 1u) ); | 
					
						
							| 
									
										
										
										
											2001-12-07 13:19:38 +00:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2008-07-27 16:34:38 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | BOOST_AUTO_TEST_SUITE_END() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // Verification of bugs and their fixes
 | 
					
						
							|  |  |  | BOOST_AUTO_TEST_SUITE( bug_fix_tests ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | BOOST_AUTO_TEST_SUITE_END() |