////use strict; use warnings;
using std::cout; using std::cerr; using std::endl;
#ifndef __CPP__INCLUDED__RPerl__DataStructure__Array_h
#define __CPP__INCLUDED__RPerl__DataStructure__Array_h 0.004_200
#include <rperltypes_mode.h> // for definitions of __PERL__TYPES or __CPP__TYPES
// [[[ SUB-TYPES BEFORE INCLUDES ]]]
#include <RPerl/DataStructure/Array/SubTypes.cpp> // -> SubTypes.h
// for type-checking subroutines & macros
#include <RPerl/HelperFunctions.cpp> // -> HelperFunctions.h
// [[[ DATA TYPES ]]]
#include <RPerl/DataType/Integer.cpp>
#include <RPerl/DataType/Number.cpp>
#include <RPerl/DataType/String.cpp>
// [[[ GENERAL MACROS ]]]
#define VECTOR_RESIZE_NOSHRINK(my_vector, my_size) ((my_vector.size() < my_size) ? my_vector.resize((size_t)(my_size)) : (void)0) // do grow but don't shrink
// [[[ TYPE-CHECKING MACROS ]]]
#define arrayref_CHECK(possible_arrayref) \
(not(SvOK(possible_arrayref)) ? \
croak("\nERROR EAVRV00, TYPE-CHECKING MISMATCH, CPPOPS_PERLTYPES & CPPOPS_CPPTYPES:\narrayref value expected but undefined/null value found,\ncroaking") : \
(not(SvAROKp(possible_arrayref)) ? \
croak("\nERROR EAVRV01, TYPE-CHECKING MISMATCH, CPPOPS_PERLTYPES & CPPOPS_CPPTYPES:\narrayref value expected but non-arrayref value found,\ncroaking") : \
(void)0))
#define arrayref_CHECKTRACE(possible_arrayref, variable_name, subroutine_name) \
(not(SvOK(possible_arrayref)) ? \
croak("\nERROR EAVRV00, TYPE-CHECKING MISMATCH, CPPOPS_PERLTYPES & CPPOPS_CPPTYPES:\narrayref value expected but undefined/null value found,\nin variable %s from subroutine %s,\ncroaking", variable_name, subroutine_name) : \
(not(SvAROKp(possible_arrayref)) ? \
croak("\nERROR EAVRV01, TYPE-CHECKING MISMATCH, CPPOPS_PERLTYPES & CPPOPS_CPPTYPES:\narrayref value expected but non-arrayref value found,\nin variable %s from subroutine %s,\ncroaking", variable_name, subroutine_name) : \
(void)0))
// [[[ TYPEDEFS ]]]
typedef std::vector<integer> integer_arrayref;
typedef std::vector<integer>::iterator integer_arrayref_iterator;
typedef std::vector<integer>::const_iterator integer_arrayref_const_iterator;
typedef std::vector<number> number_arrayref;
typedef std::vector<number>::iterator number_arrayref_iterator;
typedef std::vector<number>::const_iterator number_arrayref_const_iterator;
typedef std::vector<string> string_arrayref;
typedef std::vector<string>::iterator string_arrayref_iterator;
typedef std::vector<string>::const_iterator string_arrayref_const_iterator;
// [[[ TYPE-CHECKING SUBROUTINES ]]]
void integer_arrayref_CHECK(SV* possible_integer_arrayref);
void integer_arrayref_CHECKTRACE(SV* possible_integer_arrayref, const char* variable_name, const char* subroutine_name);
void number_arrayref_CHECK(SV* possible_number_arrayref);
void number_arrayref_CHECKTRACE(SV* possible_number_arrayref, const char* variable_name, const char* subroutine_name);
void string_arrayref_CHECK(SV* possible_string_arrayref);
void string_arrayref_CHECKTRACE(SV* possible_string_arrayref, const char* variable_name, const char* subroutine_name);
// [[[ OPERATIONS & DATA TYPES REPORTER ]]]
# ifdef __PERL__TYPES
SV* RPerl__DataStructure__Array__MODE_ID() { return(newSViv(1)); } // CPPOPS_PERLTYPES is 1
# elif defined __CPP__TYPES
integer RPerl__DataStructure__Array__MODE_ID() { return 2; } // CPPOPS_CPPTYPES is 2
# else
Purposefully_die_from_a_compile-time_error,_due_to_neither___PERL__TYPES_nor___CPP__TYPES_being_defined.__We_need_to_define_exactly_one!
# endif
// [[[ TYPEMAP PACK/UNPACK FOR __CPP__TYPES ]]]
# ifdef __CPP__TYPES
integer_arrayref XS_unpack_integer_arrayref(SV* input_avref);
void XS_pack_integer_arrayref(SV* output_avref, integer_arrayref input_vector);
number_arrayref XS_unpack_number_arrayref(SV* input_avref);
void XS_pack_number_arrayref(SV* output_avref, number_arrayref input_vector);
string_arrayref XS_unpack_string_arrayref(SV* input_avref);
void XS_pack_string_arrayref(SV* output_avref, string_arrayref input_vector);
# endif
// [[[ STRINGIFY ]]]
# ifdef __PERL__TYPES
//void integer_arrayref_to_string(SV* input_avref);
SV* integer_arrayref_to_string(SV* input_avref);
SV* number_arrayref_to_string(SV* input_avref);
SV* string_arrayref_to_string(SV* input_avref);
# elif defined __CPP__TYPES
string integer_arrayref_to_string(integer_arrayref input_vector);
string number_arrayref_to_string(number_arrayref input_vector);
string string_arrayref_to_string(string_arrayref input_vector);
# endif
// [[[ TYPE TESTING ]]]
# ifdef __PERL__TYPES
//void integer_arrayref__typetest0(SV* lucky_integers);
SV* integer_arrayref__typetest0(SV* lucky_integers);
//void integer_arrayref__typetest1(SV* my_size);
SV* integer_arrayref__typetest1(SV* my_size);
SV* number_arrayref__typetest0(SV* lucky_numbers);
SV* number_arrayref__typetest1(SV* my_size);
SV* string_arrayref__typetest0(SV* people);
SV* string_arrayref__typetest1(SV* my_size);
# elif defined __CPP__TYPES
string integer_arrayref__typetest0(integer_arrayref lucky_integers);
integer_arrayref integer_arrayref__typetest1(integer my_size);
string number_arrayref__typetest0(number_arrayref lucky_numbers);
number_arrayref number_arrayref__typetest1(integer my_size);
string string_arrayref__typetest0(string_arrayref people);
string_arrayref string_arrayref__typetest1(integer my_size);
# endif
#endif