Alt-Math-Prime-FastSieve-Inline
view release on metacpan or search on metacpan
inc/Inline.pm view on Meta::CPAN
}
else {
croak M02_usage();
}
$o->glue;
}
#==============================================================================
# Run time version of import (public method)
#==============================================================================
sub bind {
local ($/, $") = ("\n", ' '); local ($\, $,);
my ($code, @config);
my $o;
my ($pkg, $script) = caller;
my $class = shift;
croak M03_usage_bind() unless $class eq 'Inline';
$CONFIG{$pkg}{template} ||= $default_config;
my $language_id = shift or croak M03_usage_bind();
croak M03_usage_bind()
unless ($language_id =~ /^\S+$/ and $language_id !~ /\n/);
$code = shift or croak M03_usage_bind();
@config = @_;
my $next = 0;
for (@config) {
next if $next++ % 2;
croak M03_usage_bind() if /[\s\n]/;
}
$o = bless {}, $class;
$o->{INLINE}{version} = $VERSION;
$o->{API}{pkg} = $pkg;
$o->{API}{script} = $script;
$o->{API}{language_id} = $language_id;
$o->receive_code($code);
$o->{CONFIG} = handle_language_config(@config);
$o->glue;
inc/Inline.pm view on Meta::CPAN
# This is broken ????????????????????????????????????????????????????
$usage .= <<END if defined $Inline::languages;
Supported languages:
${\ join(', ', sort keys %$Inline::languages)}
END
return $usage;
}
sub M03_usage_bind {
my $usage = <<END;
Invalid usage of the Inline->bind() function. Valid usages are:
Inline->bind(language => "source-string", config-pair-list);
Inline->bind(language => "source-file", config-pair-list);
Inline->bind(language => [source-line-list], config-pair-list);
END
$usage .= <<END if defined $Inline::languages;
Supported languages:
${\ join(', ', sort keys %$Inline::languages)}
END
return $usage;
}
inc/Inline/C.pm view on Meta::CPAN
require FindBin;
$file = File::Spec->catfile($FindBin::Bin,"typemap");
if ( -f $file ) {
push(@{$o->{ILSM}{MAKEFILE}{TYPEMAPS}}, $file);
}
}
}
#==============================================================================
# This routine parses XS typemap files to get a list of valid types to create
# bindings to. This code is mostly hacked out of Larry Wall's xsubpp program.
#==============================================================================
sub get_types {
my (%type_kind, %proto_letter, %input_expr, %output_expr);
my $o = shift;
local $_;
croak "No typemaps specified for Inline C code"
unless @{$o->{ILSM}{MAKEFILE}{TYPEMAPS}};
my $proto_re = "[" . quotemeta('\$%&*@;') . "]";
foreach my $typemap (@{$o->{ILSM}{MAKEFILE}{TYPEMAPS}}) {
inc/Inline/C.pm view on Meta::CPAN
#==============================================================================
# Generate the XS glue code (piece together lots of snippets)
#==============================================================================
sub xs_generate {
my $o = shift;
return join '', (
$o->xs_includes,
$o->xs_struct_macros,
$o->xs_code,
$o->xs_struct_code,
$o->xs_bindings,
$o->xs_boot,
);
}
sub xs_includes {
my $o = shift;
return $o->{ILSM}{AUTO_INCLUDE};
}
sub xs_struct_macros {
inc/Inline/C.pm view on Meta::CPAN
my $o = shift;
if (defined $o->{ILSM}{XS}{BOOT} and $o->{ILSM}{XS}{BOOT}) {
return <<END;
BOOT:
$o->{ILSM}{XS}{BOOT}
END
}
return '';
}
sub xs_bindings {
my $o = shift;
my $dir = $o->{API}{directory};
if ($o->{CONFIG}{_TESTING}) {
my $file = "$dir/void_test";
if (! -f $file) {
warn "$file: $!" if !open(TEST_FH, '>', $file);
warn "$file: $!" if !close(TEST_FH);
}
}
inc/Inline/CPP.pm view on Meta::CPAN
#============================================================================
# Intercept xs_generate and create the typemap file
#============================================================================
sub xs_generate {
my $o = shift;
$o->write_typemap;
return $o->SUPER::xs_generate;
}
#============================================================================
# Return bindings for functions and classes
#============================================================================
sub xs_bindings {
my $o = shift;
# What is modfname, and why are we taking it from a slice but not using it?
my ($pkg, $module) = @{$o->{API}}{qw(pkg module)};
my $data = $o->{ILSM}{parser}{data};
my @XS;
warn "Warning: No Inline C++ functions or classes bound to Perl\n"
. "Check your C++ for Inline compatibility.\n\n"
if !defined $data->{classes} && !defined $data->{functions} && $^W;
inc/Inline/CPP/Parser/RecDescent.pm view on Meta::CPAN
};
$thisparser->{data}{smod}{const} = 0;
}
operator: rtype(?) 'operator' /\(\)|[^()]+/ '(' <leftop: arg ',' arg>(s?) ')'
{
# print "Found operator: $item[1][0] operator $item[3]\n";
{name=> "operator $item[3]", args => $item[5], ret => $item[1][0]}
}
# By adding smod, we allow 'const' member functions. This would also bind to
# incorrect C++ with the word 'static' after the argument list, but we don't
# care at all because such code would never be compiled successfully.
# By adding init, we allow constructors to initialize references. Again, we'll
# allow them anywhere, but our goal is not to enforce c++ standards -- that's
# the compiler's job.
method_imp: smod(?) ';' { \0 }
| smod(?) '=' <commit> '0' ';' { \1 }
| smod(?) initlist(?) code_block { \0 }
| smod(?) '=' '0' code_block { \0 }
inc/Inline/CPP/Parser/RecDescent.pm view on Meta::CPAN
UOP: '~' | '!' | '-' | '*' | '&'
TYPE: IDENTIFIER
all: /.*/
END
}
#============================================================================
# Generate typemap code for the classes and structs we bind to. This allows
# functions declared after a class to return or accept class objects as
# parameters.
#============================================================================
$TYPEMAP_KIND = 'O_Inline_CPP_Class';
sub typemap {
my ($parser, $typename) = @_;
# print "Inline::CPP::Parser::RecDescent::typemap(): typename=$typename\n";
lib/Math/Prime/FastSieve.pm view on Meta::CPAN
numbers.
=head3 primes()
This is a regular function (ie, not an object method).
Pass a positive integer as its parameter. Returns a reference to an
array of all prime numbers C<2 .. $n>.
This function is implemented in C++ using Inline::CPP, which in turn
binds it to Perl via XS. The method used is the Sieve of Eratosthenes.
The sieve is one of the fastest known methods of generating a list of
primes up to C<$n>.
This implementation makes several optimizations beyond the cannonical
Sieve, including:
=over 4
=item * Uses a bit vector as a sieve: A memory optimization that allows
the sieve to scale well without consuming so much memory that your
t/04unique_sieves.t view on Meta::CPAN
## no critic(RCS,VERSION,explicit,Module,ProhibitMagicNumbers)
use strict;
use warnings;
use Test::More;
use Math::Prime::FastSieve qw( primes );
# A test in Inline::CPP v0.33_009 looked like one object instance might be
# binding to another object instance's data. This test is to verify that's
# not happening here.
note('Testing that multiple sieve objects bind properly.');
# Build a list of sieve sizes and number of primes in a given sieve.
my %quantities;
foreach my $sieve_size ( 0, 2, 3, 5, 7, 11, 13, 17, 19, 23 ) {
$quantities{$sieve_size} = scalar @{ primes($sieve_size) };
}
# Instantiate a bunch of sieve objects.
my %sieves =
map { ( $quantities{$_}, new_ok( 'Math::Prime::FastSieve::Sieve', [$_] ) ) }
keys %quantities;
# Verify that the accessor $obj->count_sieve() is binding to the correct
# object.
foreach my $quantity ( sort { $a <=> $b } keys %sieves ) {
is( $sieves{$quantity}->count_sieve(),
$quantity, "Sieve object holding [$quantity] primes correctly bound." );
}
done_testing();
( run in 0.901 second using v1.01-cache-2.11-cpan-2398b32b56e )