use types; // Converts any [types::signed] to a string in a given base. The return value is // statically allocated and will be overwritten on subsequent calls; see // [strings::dup] to duplicate the result. export fn signedtosb(n: types::signed, b: base) const str = { return match (n) { i: int => itosb(i, b), i: i8 => i8tosb(i, b), i: i16 => i16tosb(i, b), i: i32 => i32tosb(i, b), i: i64 => i64tosb(i, b), }; }; // Converts any [types::signed] to a string in base 10. The return value is // statically allocated and will be overwritten on subsequent calls; see // [strings::dup] to duplicate the result. export fn signedtos(n: types::signed) const str = signedtosb(n, base::DEC); // Converts any [types::unsigned] to a string in a given base. The return value // is statically allocated and will be overwritten on subsequent calls; see // [strings::dup] to duplicate the result. export fn unsignedtosb(n: types::unsigned, b: base) const str = { return match (n) { u: size => ztosb(u, b), u: uint => utosb(u, b), u: u8 => u8tosb(u, b), u: u16 => u16tosb(u, b), u: u32 => u32tosb(u, b), u: u64 => u64tosb(u, b), }; }; // Converts any [types::unsigned] to a string in base 10. The return value is // statically allocated and will be overwritten on subsequent calls; see // [strings::dup] to duplicate the result. export fn unsignedtos(n: types::unsigned) const str = unsignedtosb(n, base::DEC); // Converts any [types::integer] to a string in a given base, which must be 2, // 8, 10, or 16. The return value is statically allocated and will be // overwritten on subsequent calls; see [strings::dup] to duplicate the result. export fn integertosb(n: types::integer, b: base) const str = { return match (n) { s: types::signed => signedtosb(s, b), u: types::unsigned => unsignedtosb(u, b), }; }; // Converts any [types::integer] to a string in base 10. The return value is // statically allocated and will be overwritten on subsequent calls; see // [strings::dup] to duplicate the result. export fn integertos(n: types::integer) const str = integertosb(n, base::DEC); // Converts any [types::floating] to a string in a given base. The return value // is statically allocated and will be overwritten on subsequent calls; see // [strings::dup] to duplicate the result. export fn floatingtosb(n: types::floating, b: base) const str = { abort(); // TODO }; // Converts any [types::floating] to a string in base 10. The return value is // statically allocated and will be overwritten on subsequent calls; see // [strings::dup] to duplicate the result. export fn floatingtos(n: types::floating) const str = floatingtosb(n, base::DEC); // Converts any [types::numeric] to a string in a given base. The return value // is statically allocated and will be overwritten on subsequent calls; see // [strings::dup] to duplicate the result. export fn numerictosb(n: types::numeric, b: base) const str = { return match (n) { i: types::integer => integertosb(i, b), f: types::floating => floatingtosb(f, b), }; }; // Converts any [types::numeric] to a string in base 10. The return value is // statically allocated and will be overwritten on subsequent calls; see // [strings::dup] to duplicate the result. export fn numerictos(n: types::numeric) const str = numerictosb(n, base::DEC); @test fn numeric() void = { const cases: [_]types::numeric = [ 42u8, 1337u16, 1337u32, 1337u64, 42i8, -42i8, 1337i16, -1337i16, 1337i32, -1337i32, 1337i64, -1337i64, 1337i, -1337i, 1337u, -1337i, ]; const expected = [ "42", "1337", "1337", "1337", "42", "-42", "1337", "-1337", "1337", "-1337", "1337", "-1337", "1337", "-1337", "1337", "-1337", ]; for (let i = 0z; i < len(cases); i += 1) { assert(numerictos(cases[i]) == expected[i]); }; };