FFI-C
view release on metacpan or search on metacpan
lib/FFI/C/ArrayDef.pm view on Meta::CPAN
package FFI::C::ArrayDef;
use strict;
use warnings;
use 5.008001;
use Ref::Util qw( is_blessed_ref is_ref is_plain_arrayref );
use FFI::C::Array;
use Sub::Install ();
use Sub::Util ();
use Scalar::Util qw( refaddr );
use base qw( FFI::C::Def );
our @CARP_NOT = qw( FFI::C );
# ABSTRACT: Array data definition for FFI
our $VERSION = '0.15'; # VERSION
sub new
{
my $self = shift->SUPER::new(@_);
my %args = %{ delete $self->{args} };
my $member;
my $count = 0;
my @members = @{ delete $args{members} || [] };
if(@members == 1)
{
($member) = @members;
}
elsif(@members == 2)
{
($member, $count) = @members;
}
else
{
Carp::croak("The members argument should be a struct/union type and an optional element count");
}
if(my $def = $self->ffi->def('FFI::C::Def', $member))
{
$member = $def;
}
Carp::croak("Canot nest an array def inside of itself") if refaddr($member) == refaddr($self);
Carp::croak("Illegal member")
unless defined $member && is_blessed_ref($member) && $member->isa("FFI::C::Def");
Carp::croak("The element count must be a positive integer")
if defined $count && $count !~ /^[1-9]*[0-9]$/;
$self->{size} = $member->size * $count;
$self->{align} = $member->align;
$self->{members}->{member} = $member;
$self->{members}->{count} = $count;
Carp::carp("Unknown argument: $_") for sort keys %args;
if($self->class)
{
# not handled by the superclass:
# 3. Any nested cdefs must have Perl classes.
( run in 0.869 second using v1.01-cache-2.11-cpan-39bf76dae61 )