string type conversions

Legend:

  • copy - get a freshly allocated copy of the 'from' data
  • alias - reuse the 'from' data, without allocation
  • stream - get individual values from the string, without allocation
  • st - the input string

from string

  • string -> []u8: alias with transmute([]u8)st
  • string -> string: copy with strings.clone(st)
  • string -> cstring: copy with strings.clone_to_cstring(st)
  • string -> cstring: alias with strings.unsafe_string_to_cstring(st)
  • string -> []rune: stream with for rune in st { ... }
  • string -> []rune: copy with utf8.string_to_runes(st)
  • string -> [^]u8: alias with raw_data(st)

from cstring

  • cstring -> string: alias with string(st)
  • cstring -> [^]u8: alias with transmute([^]u8)st

from "string literal"

  • "string literal" -> string: alias with string(st) or newstr : string = st
  • "string literal" -> cstring: alias with cstring(st) or newstr : cstring = st

from []u8

  • []u8 -> string: alias with transmute(string)st
  • []u8 -> string: alias with string(st) unless a slice literal
  • []u8 -> [^]u8: alias with raw_data(st)

from []rune

  • []rune -> string: copy with utf8.runes_to_string(st)

from [^]u8

  • [^]u8 -> cstring: alias with cstring(st)

from [^]u8, int

  • [^]u8, int -> string: alias with strings.string_from_ptr(ptr, length)

lang/strings.odin covers this in greater detail, with tests.