// Copyright (c) 2012 Robert Ramey // // 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) #if 1 #include "safe_integer.hpp" const intmax_t x = std::numeric_limits< boost::numeric::safe< signed char, boost::numeric::policies< boost::numeric::native, boost::numeric::relaxed, boost::numeric::throw_exception > > >::min(); #endif #if 0 #include template< class T, class P > struct safe; std::numeric_limits ai0; namespace std { numeric_limits ai2; template struct numeric_limits { // no message here with numeric_limits because it's already // specialized in typedef typename boost::mpl::print::type t0; }; template struct std::numeric_limits > : public numeric_limits{ typedef typename boost::mpl::print::type t0; typedef typename boost::mpl::print

::type t1; }; numeric_limits ai3; } // std #endif #if 0 #include #include namespace std { template class numeric_limits; } // std template class std::numeric_limits { typedef typename boost::mpl::print::type t0; }; std::numeric_limits ai; #endif #if 0 #include #include namespace std { template class numeric_limits { typedef typename boost::mpl::print::type t0; }; } // std std::numeric_limits ai; #endif #if 0 #include #include // EXIT_SUCCESS #include #include #endif #if 0 typedef boost::numeric::safe_signed_range<-64, 63> X; //typedef boost::mpl::print::type>::type t8 ; //typedef boost::mpl::print::type>::type t9 ; //typedef boost::mpl::print::type >::type t7 ; //typedef boost::mpl::print::type>::type t10; typedef boost::mpl::print::type> t13; #endif #if 0 typedef boost::numeric::safe_signed_range<-64, 63> X; typedef boost::mpl::print::type>::type t12; typedef boost::mpl::print::type > t11; #endif #if 0 bool test1(){ std::cout << "test1" << std::endl; boost::numeric::safe_signed_range<-64, 63> x, y, z; x = 1; y = 2; z = 3; z = x + y; z = x - y; typedef boost::mpl::print< boost::numeric::addition_result_bits< boost::numeric::safe_signed_range<-64, 63>, int >::type >::type t1; typedef boost::mpl::print< boost::numeric::bits< boost::numeric::safe_signed_range<-64, 63> >::type >::type t2; typedef boost::mpl::print< boost::numeric::bits< int >::type >::type t3; try{ short int yi, zi; yi = y; zi = x + yi; } catch(std::exception e){ // none of the above should trap. Mark failure if they do std::cout << e.what() << std::endl; return false; } return true; } bool test2(){ std::cout << "test2" << std::endl; boost::numeric::safe_unsigned_range<0, 64> x, y, z; x = 1; y = 2; z = 3; bool success = false; try{ z = x - y; // should trap here } catch(std::exception e){ success = true; } if(success == false) return false; try{ int yi = y; z = x + yi; // should trap here } catch(std::exception e){ // none of the above should trap. Mark failure if they do std::cout << e.what() << std::endl; return false; } return true; } bool test3(){ std::cout << "test3" << std::endl; boost::numeric::safe x, y, z; x = 1; y = 2; z = 3; try{ z = x + y; z = x - y; int yi, zi; zi = x + yi; z = x + yi; } catch(std::exception e){ // none of the above should trap. Mark failure if they do std::cout << e.what() << std::endl; return false; } return true; } bool test4(){ std::cout << "test4" << std::endl; boost::numeric::safe x, y, z; x = 1; y = 2; z = 3; z = x + y; bool success = false; try{ z = x - y; // should trap here } catch(std::exception e){ success = true; } if(success == false) return false; unsigned int yi, zi; zi = x; zi = x + yi; z = x + yi; zi = x + y; return true; } #include bool test5(){ std::cout << "test5" << std::endl; boost::numeric::safe x, y, z; x = 1; y = 2; z = 3; z = x + y; bool success = false; try{ z = x - y; // should trap here } catch(std::exception e){ success = true; } if(success == false) return false; boost::uint64_t yi, zi; zi = x; zi = x + yi; z = x + yi; zi = x + y; return true; } int main(int argc, char *argv[]){ return ( test1() && test2() && test3() && test4() && test5() ) ? EXIT_SUCCESS : EXIT_FAILURE; } #endif