package org.jerlang.stdlib.binary;
import org.jerlang.erts.Erlang;
import org.jerlang.erts.erlang.Error;
import org.jerlang.type.Binary;
import org.jerlang.type.Integer;
import org.jerlang.type.List;
import org.jerlang.type.Term;
import org.jerlang.type.Tuple;
public class BinaryBinToList {
private BinaryBinToList() {
}
public static Term dispatch(List params) {
Binary subject = params.head().toBinary();
switch (params.length()) {
case 1:
return bin_to_list_1(subject);
case 2:
params = params.tail();
Tuple part = params.head().toTuple();
return bin_to_list_2(subject, part);
case 3:
params = params.tail();
Integer pos = params.head().toInteger();
params = params.tail();
Integer len = params.head().toInteger();
return bin_to_list_3(subject, pos, len);
default:
throw Error.badarg;
}
}
/**
* The same as `bin_to_list(Subject,{0,byte_size(Subject)})`.
*
* http://www.erlang.org/doc/man/binary.html#bin_to_list-1
*/
public static List bin_to_list_1(Binary subject) {
return bin_to_list_2(subject, Tuple.of(Integer.ZERO, Erlang.byte_size(subject)));
}
/**
* Converts Subject to a list of byte()s,
* each representing the value of one byte.
* The part() denotes which part of the binary() to convert.
*
* http://www.erlang.org/doc/man/binary.html#bin_to_list-2
*/
public static List bin_to_list_2(Binary subject, Tuple part) {
int pos = part.element(1).toInteger().toInt();
int len = part.element(1).toInteger().toInt();
return subject.toList(pos, len);
}
/**
* The same as `bin_to_list(Subject,{Pos,Len})`.
*
* http://www.erlang.org/doc/man/binary.html#bin_to_list-3
*/
public static List bin_to_list_3(Binary subject, Integer pos, Integer len) {
return bin_to_list_2(subject, Tuple.of(pos, len));
}
}