// [[[ HEADER ]]]
using std::cout;  using std::cerr;  using std::endl;

#ifndef __CPP__INCLUDED__RPerl_h
#define __CPP__INCLUDED__RPerl_h 0.002_000

// [[[ INCLUDES ]]]
#include <rperltypes_mode.h>  // for default definitions of __PERL__TYPES or __CPP__TYPES
#include <rperloperations.h>  // for operations
#include <rperltypes.h>  // for data types and structures
#include <RPerl/HelperFunctions.cpp>  // -> HelperFunctions.h

# ifdef __PERL__TYPES

// [[[<<< BEGIN PERL TYPES >>>]]]
// [[[<<< BEGIN PERL TYPES >>>]]]
// [[[<<< BEGIN PERL TYPES >>>]]]

// [[[ SUBROUTINES, EARLY ]]]
int RPerl__diag(SV* message);

// [[[ OO INHERITANCE ]]]
class RPerl {  // no inheritance
public:
// [[[ OO METHODS ]]]
    // DEV NOTE: 'static' keyword with early-declared & separately-defined RPerl__diag() allows calling RPerl::diag() in C++
    static int diag(SV* message) { return RPerl__diag(message); };
};

// [[[ SUBROUTINES ]]]

// <<< OPERATIONS & DATA TYPES REPORTER >>>
SV* RPerl__MODE_ID() { return(newSViv(1)); }  // CPPOPS_PERLTYPES is 1

// [[[<<< END PERL TYPES >>>]]]
// [[[<<< END PERL TYPES >>>]]]
// [[[<<< END PERL TYPES >>>]]]

# elif defined __CPP__TYPES

// [[[<<< BEGIN CPP TYPES >>>]]]
// [[[<<< BEGIN CPP TYPES >>>]]]
// [[[<<< BEGIN CPP TYPES >>>]]]

// [[[ SUBROUTINES, EARLY ]]]
integer RPerl__diag(string message);
integer RPerl__verbose(string message);
integer RPerl__warning(string message);

// [[[ OO INHERITANCE ]]]
class RPerl {  // no inheritance
public:
// [[[ OO METHODS ]]]
    // DEV NOTE: 'static' keyword with early-declared & separately-defined RPerl__*() allows calling RPerl::*() in C++
    static integer diag(string message) { return RPerl__diag(message); };
    static integer verbose(string message) { return RPerl__verbose(message); };
    static integer warning(string message) { return RPerl__warning(message); };
};

// [[[ OO CLASS PROPERTIES SPECIAL ]]]

// DEV NOTE, CORRELATION #rp032: NEED UPGRADE: properly determine whether to use DBL_EPSILON or FLT_EPSILON below
#define RPerl__EPSILON DBL_EPSILON
//#define RPerl__EPSILON FLT_EPSILON

// [[[ SUBROUTINES ]]]

// <<< OPERATIONS & DATA TYPES REPORTER >>>
integer RPerl__MODE_ID() { return 2; }  // CPPOPS_CPPTYPES is 2

// [[[<<< END CPP TYPES >>>]]]
// [[[<<< END CPP TYPES >>>]]]
// [[[<<< END CPP TYPES >>>]]]

# 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

#endif