#!/usr/bin/env perl

use warnings;
use strict;

use Test::More;
use Test::Deep;

# build and load subroutines
use OpenMP::Simple;
use OpenMP::Environment;

use Inline (
    C                 => 'DATA',
    with              => qw/OpenMP::Simple/,
);

my $env = OpenMP::Environment->new();

my $aref_orig = [
  [ 1 .. 25 ],
  [ 1 .. 25 ],
  [ 1 .. 25 ],
  [ 1 .. 25 ],
  [ 1 .. 25 ],
  [ 1 .. 25 ],
  [ 1 .. 25 ],
  [ 1 .. 25 ],
  [ 1 .. 25 ],
  [ 1 .. 25 ],
];

my $expected = [qw/1 2 3 4 5 6 7 8 9 10/];

foreach my $thread_count (qw/1 4 8/) {
  $env->omp_num_threads($thread_count);
  my $ele_count = omp_elements_count($aref_orig);
  is $ele_count, scalar @$aref_orig;

  my $row_count = omp_elements_row_count($aref_orig);
  is $row_count, scalar @$aref_orig;

  my $col_count = omp_elements_col_count($aref_orig);
  is $col_count, scalar @{$aref_orig->[0]};
}

done_testing;

__DATA__
__C__

/* Custom driver */
int omp_elements_count(SV *ARRAY) {

  /* boilerplate - updates number of threads to use with what's in $ENV{OMP_NUM_THREADS} */
  PerlOMP_UPDATE_WITH_ENV__NUM_THREADS

  int count = PerlOMP_1D_Array_NUM_ELEMENTS(ARRAY);

  return count;
}

int omp_elements_row_count(SV *ARRAY) {

  /* boilerplate - updates number of threads to use with what's in $ENV{OMP_NUM_THREADS} */
  PerlOMP_UPDATE_WITH_ENV__NUM_THREADS

  int count = PerlOMP_2D_AoA_NUM_ROWS(ARRAY);

  return count;
}

int omp_elements_col_count(SV *ARRAY) {

  /* boilerplate - updates number of threads to use with what's in $ENV{OMP_NUM_THREADS} */
  PerlOMP_UPDATE_WITH_ENV__NUM_THREADS

  int count = PerlOMP_2D_AoA_NUM_COLS(ARRAY);

  return count;
}

