# Copyright (c) 2024 Yuki Kimoto
# MIT License
class R::OP::StringBuffer {
version_from R;
use R::NDArray::StringBuffer;
use R::OP;
use StringBuffer;
use R::OP::String;
# Class Methods
static method c : R::NDArray::StringBuffer ($data : object of StringBuffer|StringBuffer[]|R::NDArray::StringBuffer|string|string[]|R::NDArray::String, $dim : int[] = undef) {
if ($data) {
if ($data is_type StringBuffer) {
$data = [(StringBuffer)$data];
}
elsif ($data is_type StringBuffer[]) {
# Do nothing
}
elsif ($data is_type R::NDArray::StringBuffer) {
unless ($dim) {
$dim = $data->(R::NDArray::StringBuffer)->dim;
}
$data = $data->(R::NDArray::StringBuffer)->data;
}
elsif ($data is_type string) {
$data = [StringBuffer->new((string)$data)];
}
elsif ($data is_type string[]) {
$data = R::OP::String->c((string[])$data)->to_string_buffer_ndarray->data;
}
elsif ($data is_type R::NDArray::String) {
unless ($dim) {
$dim = $data->(R::NDArray::String)->dim;
}
$data = $data->(R::NDArray::String)->to_string_buffer_ndarray->data;
}
else {
die "The type of the data \$data must be StringBuffer, StringBuffer[], R::NDArray::StringBuffer, string, string[], R::NDArray::String if defined.";
}
}
my $ndarray = R::NDArray::StringBuffer->new({dim => $dim, data => $data});
return $ndarray;
}
precompile static method push : void ($x_ndarray : R::NDArray::StringBuffer, $y_ndarray : R::NDArray::String) {
unless ($x_ndarray) {
die "The n-dimensional array \$x_ndarray must be defined.";
}
unless ($y_ndarray) {
die "The n-dimensional array \$y_ndarray must be defined.";
}
unless ($y_ndarray->is_scalar) {
my $equals_dim = R::OP->equals_dim($x_ndarray, $y_ndarray);
unless ($equals_dim) {
die "The dimensions of \$x_ndarray must be the same as the dimensions of \$y_ndarray.";
}
}
my $length = $x_ndarray->length;
my $x_dim = $x_ndarray->dim;
my $x_data = $x_ndarray->data;
my $y_data = $y_ndarray->data;
if ($y_ndarray->is_scalar) {
for (my $i = 0; $i < $length; $i++) {
eval { $x_data->[$i]->push($y_data->[0]); }
}
}
else {
for (my $i = 0; $i < $length; $i++) {
eval { $x_data->[$i]->push($y_data->[$i]); }
}
}
}
precompile static method eq : R::NDArray::Int ($x_ndarray : R::NDArray::StringBuffer, $y_ndarray : R::NDArray::StringBuffer) {
unless ($x_ndarray) {
die "The n-dimensional array \$x_ndarray must be defined.";
}
unless ($y_ndarray) {
die "The n-dimensional array \$y_ndarray must be defined.";
}
my $equals_dim = R::OP->equals_dim($x_ndarray, $y_ndarray);
unless ($equals_dim) {
die "The dimensions of \$x_ndarray must be the same as the dimensions of \$y_ndarray.";
}
my $length = $x_ndarray->length;
my $x_dim = $x_ndarray->dim;
my $ret_ndarray = R::OP::Int->c(undef, $x_dim);
my $ret_data = $ret_ndarray->data;
my $x_data = $x_ndarray->data;
my $y_data = $y_ndarray->data;
for (my $i = 0; $i < $length; $i++) {
my $cmp = $x_ndarray->elem_cmp($x_data, $i, $y_data, $i);
$ret_data->[$i] = $cmp == 0;
}
return $ret_ndarray;
}
precompile static method ne : R::NDArray::Int ($x_ndarray : R::NDArray::StringBuffer, $y_ndarray : R::NDArray::StringBuffer) {
unless ($x_ndarray) {
die "The n-dimensional array \$x_ndarray must be defined.";
}
unless ($y_ndarray) {
die "The n-dimensional array \$y_ndarray must be defined.";
}
my $equals_dim = R::OP->equals_dim($x_ndarray, $y_ndarray);
unless ($equals_dim) {
die "The dimensions of \$x_ndarray must be the same as the dimensions of \$y_ndarray.";
}
my $length = $x_ndarray->length;
my $x_dim = $x_ndarray->dim;
my $ret_ndarray = R::OP::Int->c(undef, $x_dim);
my $ret_data = $ret_ndarray->data;
my $x_data = $x_ndarray->data;
my $y_data = $y_ndarray->data;
for (my $i = 0; $i < $length; $i++) {
my $cmp = $x_ndarray->elem_cmp($x_data, $i, $y_data, $i);
$ret_data->[$i] = $cmp != 0;
}
return $ret_ndarray;
}
precompile static method gt : R::NDArray::Int ($x_ndarray : R::NDArray::StringBuffer, $y_ndarray : R::NDArray::StringBuffer) {
unless ($x_ndarray) {
die "The n-dimensional array \$x_ndarray must be defined.";
}
unless ($y_ndarray) {
die "The n-dimensional array \$y_ndarray must be defined.";
}
my $equals_dim = R::OP->equals_dim($x_ndarray, $y_ndarray);
unless ($equals_dim) {
die "The dimensions of \$x_ndarray must be the same as the dimensions of \$y_ndarray.";
}
my $length = $x_ndarray->length;
my $x_dim = $x_ndarray->dim;
my $ret_ndarray = R::OP::Int->c(undef, $x_dim);
my $ret_data = $ret_ndarray->data;
my $x_data = $x_ndarray->data;
my $y_data = $y_ndarray->data;
for (my $i = 0; $i < $length; $i++) {
my $cmp = $x_ndarray->elem_cmp($x_data, $i, $y_data, $i);
$ret_data->[$i] = $cmp > 0;
}
return $ret_ndarray;
}
precompile static method ge : R::NDArray::Int ($x_ndarray : R::NDArray::StringBuffer, $y_ndarray : R::NDArray::StringBuffer) {
unless ($x_ndarray) {
die "The n-dimensional array \$x_ndarray must be defined.";
}
unless ($y_ndarray) {
die "The n-dimensional array \$y_ndarray must be defined.";
}
my $equals_dim = R::OP->equals_dim($x_ndarray, $y_ndarray);
unless ($equals_dim) {
die "The dimensions of \$x_ndarray must be the same as the dimensions of \$y_ndarray.";
}
my $length = $x_ndarray->length;
my $x_dim = $x_ndarray->dim;
my $ret_ndarray = R::OP::Int->c(undef, $x_dim);
my $ret_data = $ret_ndarray->data;
my $x_data = $x_ndarray->data;
my $y_data = $y_ndarray->data;
for (my $i = 0; $i < $length; $i++) {
my $cmp = $x_ndarray->elem_cmp($x_data, $i, $y_data, $i);
$ret_data->[$i] = $cmp >= 0;
}
return $ret_ndarray;
}
precompile static method lt : R::NDArray::Int ($x_ndarray : R::NDArray::StringBuffer, $y_ndarray : R::NDArray::StringBuffer) {
unless ($x_ndarray) {
die "The n-dimensional array \$x_ndarray must be defined.";
}
unless ($y_ndarray) {
die "The n-dimensional array \$y_ndarray must be defined.";
}
my $equals_dim = R::OP->equals_dim($x_ndarray, $y_ndarray);
unless ($equals_dim) {
die "The dimensions of \$x_ndarray must be the same as the dimensions of \$y_ndarray.";
}
my $length = $x_ndarray->length;
my $x_dim = $x_ndarray->dim;
my $ret_ndarray = R::OP::Int->c(undef, $x_dim);
my $ret_data = $ret_ndarray->data;
my $x_data = $x_ndarray->data;
my $y_data = $y_ndarray->data;
for (my $i = 0; $i < $length; $i++) {
my $cmp = $x_ndarray->elem_cmp($x_data, $i, $y_data, $i);
$ret_data->[$i] = $cmp < 0;
}
return $ret_ndarray;
}
precompile static method le : R::NDArray::Int ($x_ndarray : R::NDArray::StringBuffer, $y_ndarray : R::NDArray::StringBuffer) {
unless ($x_ndarray) {
die "The n-dimensional array \$x_ndarray must be defined.";
}
unless ($y_ndarray) {
die "The n-dimensional array \$y_ndarray must be defined.";
}
my $equals_dim = R::OP->equals_dim($x_ndarray, $y_ndarray);
unless ($equals_dim) {
die "The dimensions of \$x_ndarray must be the same as the dimensions of \$y_ndarray.";
}
my $length = $x_ndarray->length;
my $x_dim = $x_ndarray->dim;
my $ret_ndarray = R::OP::Int->c(undef, $x_dim);
my $ret_data = $ret_ndarray->data;
my $x_data = $x_ndarray->data;
my $y_data = $y_ndarray->data;
for (my $i = 0; $i < $length; $i++) {
my $cmp = $x_ndarray->elem_cmp($x_data, $i, $y_data, $i);
$ret_data->[$i] = $cmp <= 0;
}
return $ret_ndarray;
}
static method rep : R::NDArray::StringBuffer ($x_ndarray : R::NDArray::StringBuffer, $times : int) {
return (R::NDArray::StringBuffer)R::OP->rep($x_ndarray, $times);
}
static method rep_length : R::NDArray::StringBuffer ($x_ndarray : R::NDArray::StringBuffer, $length : int) {
return (R::NDArray::StringBuffer)R::OP->rep_length($x_ndarray, $length);
}
}