public int encode_size(Erlang.Object o)
{
if (o is Erlang.Atom) return 1 + 2 + o.atomValue().Length;
else if (o is Erlang.Boolean) return 1 + 2 + (o.boolValue()
? Erlang.Boolean.s_true.atomValue().Length
: Erlang.Boolean.s_false.atomValue().Length);
else if (o is Erlang.Binary) return 5 + o.binaryValue().Length;
else if (o is Erlang.Long)
{
long l = o.longValue();
if ((l & 0xff) == l) return 2;
else if ((l <= OtpExternal.erlMax) && (l >= OtpExternal.erlMin)) return 5;
return long_arity(l);
}
else if (o is Erlang.Byte) return 1 + 1;
else if (o is Erlang.Double) return 9;
else if (o is Erlang.String)
{
string l = o.stringValue();
if (l.Length == 0) return 1;
if (l.Length < 0xffff) return 2 + l.Length;
return 1 + 4 + 2 * l.Length;
}
else if (o is Erlang.List)
{
Erlang.List l = o.listValue();
if (l.arity() == 0)
return 1;
int sz = 5;
for (int i = 0; i < l.arity(); i++)
sz += encode_size(l[i]);
return sz;
}
else if (o is Erlang.Tuple)
{
Erlang.Tuple l = o.tupleValue();
int sz = 1 + (l.arity() < 0xff ? 1 : 4);
for (int i = 0; i < l.arity(); i++)
sz += encode_size(l[i]);
return sz;
}
else if (o is Erlang.Pid)
{
Erlang.Pid p = o.pidValue();
return 1 + (1 + 2 + p.node().Length) + 4 + 4 + 1;
}
else if (o is Erlang.Ref)
{
Erlang.Ref p = o.refValue();
int[] ids = p.ids();
return 1 + (1 + 2 + p.node().Length) + 1 + 4 * ids.Length;
}
else if (o is Erlang.Port)
{
Erlang.Port p = o.portValue();
return 1 + (1 + 2 + p.node().Length) + 4 + 1;
}
else
throw new Erlang.Exception("Unknown encode size for object: " + o.ToString());
}