lib/beaver/mlir/string_ref.ex
defmodule Beaver.MLIR.StringRef do
@moduledoc """
This module defines functions working with MLIR #{__MODULE__ |> Module.split() |> List.last()}.
"""
require Beaver.MLIR.CAPI
alias Beaver.MLIR.CAPI
use Kinda.ResourceKind,
forward_module: Beaver.Native
@doc """
Create a Elixir owned C string from a Elixir bitstring and create a StringRef from it. StringRef will keep a reference to the C string to prevent it from being garbage collected by BEAM.
"""
def create(value) when is_atom(value) do
value |> Atom.to_string() |> create()
end
def create(value) when is_binary(value) do
c_string = Beaver.Native.c_string(value)
CAPI.mlirStringRefCreateFromCString(c_string)
|> Beaver.Native.bag(c_string)
end
@doc """
Converts an `StringRef` to a string.
"""
def to_string(%__MODULE__{} = string_ref) do
%{ref: ref} =
string_ref
|> CAPI.beaverStringRefGetData()
CAPI.beaver_raw_resource_c_string_to_term_charlist(ref)
|> Beaver.Native.check!()
|> List.to_string()
end
end