Intertangle-API-Kiwisolver

 view release on metacpan or  search on metacpan

inc/symbolics.pl  view on Meta::CPAN

#!/usr/bin/env perl
# PODNAME: symbolics.pl
# ABSTRACT: Extract operators and generate XS for dispatching to operators

use FindBin;
use lib "$FindBin::Bin/../lib";

use Modern::Perl;
use File::Spec;
use Alien::Kiwisolver;
use List::UtilsBy qw(nsort_by);

my $namespace = "Intertangle::API::Kiwisolver";

my @types = (
	"double",
	"const Constraint&",
	"const Expression&",
	"const Term&",
	"const Variable&",
);
my %type_order = map { $types[$_] => $_ } 0..@types-1;

my %ops_cpp_to_perl = (
	'2-'  => { cpp => '-',  overload => '-',   name => '_op_minus'   },
	'2+'  => { cpp => '+',  overload => '+',   name => '_op_add'     },
	'2*'  => { cpp => '*',  overload => '*',   name => '_op_mult'    },
	'2/'  => { cpp => '/',  overload => '/',   name => '_op_div'     },
	'2>=' => { cpp => '>=', overload => '>=',  name => '_op_num_ge'  },
	'2==' => { cpp => '==', overload => '==',  name => '_op_num_eq'  },
	'2<=' => { cpp => '<=', overload => '<=',  name => '_op_num_le'  },
	'1-' =>  { cpp => '-',  overload => 'neg', name => '_op_neg'     },
	'2|' =>  { cpp => '|',  overload => '|',   name => '_op_or'      },
);

sub type_to_kiwi_CPP {
	my ($type) = @_;
	return $type if($type eq 'double');
	$type =~ s/(?:const )?(\w+)(?:\&)?/kiwi::$1/r;
}

sub type_to_Perl_NS {
	my ($type) = @_;
	return $type if($type eq 'double');
	$type =~ s/const (\w+)&/${namespace}::$1/r;
};

sub read_symbolic_h {
	my $symbolics_h = File::Spec->catfile(
		Alien::Kiwisolver->new->dist_dir,
		qw(include kiwi symbolics.h)
	);
	open(my $symbolics_fh, '<', $symbolics_h);

	my $operator_func = qr,
		(?<ReturnType> \w+)
		\s+
		operator
		(?<Operator> [-|*/+<>=]+)
		\(
			\s*
			(?<ParamsString> [^)]* )
			\s*
		\)
	,x;
	my $param = qr, (?<Type> ([\w\s*&]+)+ ) \s+ (?<Name> \w+),x;

	my @operators;



( run in 1.277 second using v1.01-cache-2.11-cpan-39bf76dae61 )