int_conversions.lua (1376B)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 | #! /usr/bin/lua local s = { "s64", "s32", "s16", "s8" } local u = { "u64", "u32", "u16", "u8" } local function printf( form, ... ) print( form:format( ... ) ) end local function codes( t ) printf( "template< typename T >\n" .. "%s check_%s( T x ) {\n" .. "\tif( IS_SIGNED( T ) ) assert( x >= %s_MIN );\n" .. "\tassert( x <= %s_MAX );\n" .. "\treturn ( %s ) x;\n" .. "}\n" .. "\n" .. "template< typename T >\n" .. "%s check_%s( T x ) {\n" .. "#pragma GCC diagnostic push // GCC warns even though the optimiser removes the branch\n" .. "#pragma GCC diagnostic ignored \"-Wsign-compare\"\n" .. "\tif( IS_SIGNED( T ) ) assert( x >= %s_MIN );\n" .. "#pragma GCC diagnostic pop\n" .. "\tassert( x <= %s_MAX );\n" .. "\treturn ( %s ) x;\n" .. "}", t, t, t:upper(), t:upper(), t, t, t, t:upper(), t:upper(), t ) end local function codeu( t ) printf( "template< typename T >\n" .. "%s check_%s( T x ) {\n" .. "\tassert( x >= 0 && x <= %s_MAX );\n" .. "\treturn ( %s ) x;\n" .. "}\n" .. "\n" .. "template< typename T >\n" .. "%s clamp_%s( T x ) {\n" .. "\tif( x < 0 ) return 0;\n" .. "\tif( x > %s_MAX ) return %s_MAX;\n" .. "\treturn ( %s ) x;\n" .. "}\n", t, t, t:upper(), t, t, t, t:upper(), t:upper(), t ) end for _, t in ipairs( s ) do codes( t ) end for _, t in ipairs( u ) do codeu( t ) end |