forwardable -i <> =
{
  @spec 
  {
    length (forwardable _) -> (int);
    is_empty -a (forwardable _) -> (ulong);
  }
  [local]
  {
    make_iterator (pulong64 -w access_code, forwardable _);
    has_next -a (forwardable _, ulong64 access_code) -> (ulong);
    next_iterator (pulong64 -&w access_code, forwardable _);
    delete_iterator (pulong64 -&w, forwardable _);

    "get_current";
  }
};

hash_table <key, value> =
{
  @spec
  {
    set (hash_table -&w _, key _, value _);
    set (hash_table -&w _, ulong64 access_code, value _);

    get (pvalue -w _, hash_table _, key _) -> (ulong);
    contains -a (hash_table _, key _) -> (ulong);

    get (pvalue -w _, hash_table _, pulong64 access_code) -> (ulong);
    contains -a (pulong64 -w access_code, hash_table _, key _) -> (ulong);

    length (hash_table _) -> (int);
    is_empty -a (hash_table _) -> (ulong);
  }
};