diff options
| author | Shritesh Bhattarai <shritesh@shritesh.com> | 2019-04-04 20:36:31 -0500 |
|---|---|---|
| committer | Andrew Kelley <andrew@ziglang.org> | 2019-04-05 11:11:04 -0400 |
| commit | 6cc2d3938e81f1c5db9cf94db90fda11b026422a (patch) | |
| tree | 8d4171fa74513793d9d5200ad60616f216182ae6 /std | |
| parent | 3cce56af99657e85f50b0fd3d7bdb539794cef59 (diff) | |
| download | zig-6cc2d3938e81f1c5db9cf94db90fda11b026422a.tar.gz zig-6cc2d3938e81f1c5db9cf94db90fda11b026422a.zip | |
support comptime_int in formatInt{,Value}
Diffstat (limited to 'std')
| -rw-r--r-- | std/fmt.zig | 39 |
1 files changed, 28 insertions, 11 deletions
diff --git a/std/fmt.zig b/std/fmt.zig index a323ec6383..6402271563 100644 --- a/std/fmt.zig +++ b/std/fmt.zig @@ -271,11 +271,7 @@ fn formatValue( const T = @typeOf(value); switch (@typeId(T)) { builtin.TypeId.Float => return formatFloatValue(value, fmt, context, Errors, output), - builtin.TypeId.Int => return formatIntValue(value, fmt, context, Errors, output), - builtin.TypeId.ComptimeInt => { - const Int = math.IntFittingRange(value, value); - return formatIntValue(Int(value), fmt, context, Errors, output); - }, + builtin.TypeId.Int, builtin.TypeId.ComptimeInt => return formatIntValue(value, fmt, context, Errors, output), else => comptime unreachable, } } @@ -290,13 +286,20 @@ pub fn formatIntValue( comptime var radix = 10; comptime var uppercase = false; comptime var width = 0; + + const int_value = if (@typeOf(value) == comptime_int) blk: { + const Int = math.IntFittingRange(value, value); + break :blk Int(value); + } else + value; + if (fmt.len > 0) { switch (fmt[0]) { 'c' => { - if (@typeOf(value).bit_count <= 8) { + if (@typeOf(int_value).bit_count <= 8) { if (fmt.len > 1) @compileError("Unknown format character: " ++ []u8{fmt[1]}); - return formatAsciiChar(u8(value), context, Errors, output); + return formatAsciiChar(u8(int_value), context, Errors, output); } }, 'b' => { @@ -323,7 +326,7 @@ pub fn formatIntValue( } if (fmt.len > 1) width = comptime (parseUnsigned(usize, fmt[1..], 10) catch unreachable); } - return formatInt(value, radix, uppercase, width, context, Errors, output); + return formatInt(int_value, radix, uppercase, width, context, Errors, output); } fn formatFloatValue( @@ -686,10 +689,16 @@ pub fn formatInt( comptime Errors: type, output: fn (@typeOf(context), []const u8) Errors!void, ) Errors!void { - if (@typeOf(value).is_signed) { - return formatIntSigned(value, base, uppercase, width, context, Errors, output); + const int_value = if (@typeOf(value) == comptime_int) blk: { + const Int = math.IntFittingRange(value, value); + break :blk Int(value); + } else + value; + + if (@typeOf(int_value).is_signed) { + return formatIntSigned(int_value, base, uppercase, width, context, Errors, output); } else { - return formatIntUnsigned(value, base, uppercase, width, context, Errors, output); + return formatIntUnsigned(int_value, base, uppercase, width, context, Errors, output); } } @@ -1432,3 +1441,11 @@ test "fmt.hexToBytes" { try hexToBytes(pb[0..], test_hex_str); try testFmt(test_hex_str, "{X}", pb); } + +test "fmt.formatIntValue with comptime_int" { + const value: comptime_int = 123456789123456789; + + var buf = try std.Buffer.init(std.debug.global_allocator, ""); + try formatIntValue(value, "", &buf, @typeOf(std.Buffer.append).ReturnType.ErrorSet, std.Buffer.append); + assert(mem.eql(u8, buf.toSlice(), "123456789123456789")); +} |
