From: <man...@us...> - 2015-02-21 17:46:48
|
Revision: 4780 http://sourceforge.net/p/modplug/code/4780 Author: manxorist Date: 2015-02-21 17:46:36 +0000 (Sat, 21 Feb 2015) Log Message: ----------- [Ref] test: More test cases for mpt::saturate_cast. [Fix] mpt::sturate_cast was wrong for Tsrc unsigned and Tdst signed. Modified Paths: -------------- trunk/OpenMPT/common/misc_util.h trunk/OpenMPT/test/test.cpp Modified: trunk/OpenMPT/common/misc_util.h =================================================================== --- trunk/OpenMPT/common/misc_util.h 2015-02-21 17:39:59 UTC (rev 4779) +++ trunk/OpenMPT/common/misc_util.h 2015-02-21 17:46:36 UTC (rev 4780) @@ -216,11 +216,15 @@ return static_cast<Tdst>(std::min<Tsrc>(src, std::numeric_limits<Tdst>::max())); } else if(std::numeric_limits<Tdst>::is_signed && !std::numeric_limits<Tsrc>::is_signed) { - if(sizeof(Tdst) >= sizeof(Tsrc)) + if(sizeof(Tdst) > sizeof(Tsrc)) { + return static_cast<Tdst>(src); + } + if(sizeof(Tdst) == sizeof(Tsrc)) + { return static_cast<Tdst>(std::min<Tsrc>(src, static_cast<Tsrc>(std::numeric_limits<Tdst>::max()))); } - return static_cast<Tdst>(std::max<Tsrc>(std::numeric_limits<Tdst>::min(), std::min<Tsrc>(src, std::numeric_limits<Tdst>::max()))); + return static_cast<Tdst>(std::min<Tsrc>(src, static_cast<Tsrc>(std::numeric_limits<Tdst>::max()))); } else // Tdst unsigned, Tsrc signed { if(sizeof(Tdst) >= sizeof(Tsrc)) Modified: trunk/OpenMPT/test/test.cpp =================================================================== --- trunk/OpenMPT/test/test.cpp 2015-02-21 17:39:59 UTC (rev 4779) +++ trunk/OpenMPT/test/test.cpp 2015-02-21 17:46:36 UTC (rev 4780) @@ -614,7 +614,36 @@ VERIFY_EQUAL( mpt::saturate_cast<uint16>(std::numeric_limits<int16>::max() + 1), (uint16)std::numeric_limits<int16>::max() + 1 ); VERIFY_EQUAL( mpt::saturate_cast<uint32>(std::numeric_limits<int32>::min() - int64(1)), std::numeric_limits<uint32>::min() ); VERIFY_EQUAL( mpt::saturate_cast<uint32>(std::numeric_limits<int32>::max() + int64(1)), (uint32)std::numeric_limits<int32>::max() + 1 ); + + VERIFY_EQUAL( mpt::saturate_cast<int8>( int16(32000) ), 127 ); + VERIFY_EQUAL( mpt::saturate_cast<int8>( int16(-32000) ), -128 ); + VERIFY_EQUAL( mpt::saturate_cast<int8>( uint16(32000) ), 127 ); + VERIFY_EQUAL( mpt::saturate_cast<int8>( uint16(64000) ), 127 ); + VERIFY_EQUAL( mpt::saturate_cast<uint8>( int16(32000) ), 255 ); + VERIFY_EQUAL( mpt::saturate_cast<uint8>( int16(-32000) ), 0 ); + VERIFY_EQUAL( mpt::saturate_cast<uint8>( uint16(32000) ), 255 ); + VERIFY_EQUAL( mpt::saturate_cast<uint8>( uint16(64000) ), 255 ); + VERIFY_EQUAL( mpt::saturate_cast<int16>( int16(32000) ), 32000 ); + VERIFY_EQUAL( mpt::saturate_cast<int16>( int16(-32000) ), -32000 ); + VERIFY_EQUAL( mpt::saturate_cast<int16>( uint16(32000) ), 32000 ); + VERIFY_EQUAL( mpt::saturate_cast<int16>( uint16(64000) ), 32767 ); + VERIFY_EQUAL( mpt::saturate_cast<uint16>( int16(32000) ), 32000 ); + VERIFY_EQUAL( mpt::saturate_cast<uint16>( int16(-32000) ), 0 ); + VERIFY_EQUAL( mpt::saturate_cast<uint16>( uint16(32000) ), 32000 ); + VERIFY_EQUAL( mpt::saturate_cast<uint16>( uint16(64000) ), 64000 ); + VERIFY_EQUAL( mpt::saturate_cast<int32>( int16(32000) ), 32000 ); + VERIFY_EQUAL( mpt::saturate_cast<int32>( int16(-32000) ), -32000 ); + VERIFY_EQUAL( mpt::saturate_cast<int32>( uint16(32000) ), 32000 ); + VERIFY_EQUAL( mpt::saturate_cast<int32>( uint16(64000) ), 64000 ); + VERIFY_EQUAL( mpt::saturate_cast<uint32>( int16(32000) ), 32000 ); + VERIFY_EQUAL( mpt::saturate_cast<uint32>( int16(-32000) ), 0 ); + VERIFY_EQUAL( mpt::saturate_cast<uint32>( uint16(32000) ), 32000 ); + VERIFY_EQUAL( mpt::saturate_cast<uint32>( uint16(64000) ), 64000 ); + + VERIFY_EQUAL( mpt::saturate_cast<uint32>(std::numeric_limits<int64>::max() - 1), std::numeric_limits<uint32>::max() ); + VERIFY_EQUAL( mpt::saturate_cast<int32>(std::numeric_limits<uint64>::max() - 1), std::numeric_limits<int32>::max() ); + VERIFY_EQUAL( mpt::saturate_cast<uint32>(static_cast<double>(std::numeric_limits<int64>::max())), std::numeric_limits<uint32>::max() ); VERIFY_EQUAL( mpt::String::LTrim(std::string(" ")), "" ); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |