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

#ifndef __CPP__INCLUDED__RPerl__Algorithm_h
#define __CPP__INCLUDED__RPerl__Algorithm_h 0.010_000

// [[[ INCLUDES & OO INHERITANCE INCLUDES ]]]
#include <RPerl.cpp>  // -> RPerl.h -> (rperltypes_mode.h; rperloperations.h; rperltypes.h; HelperFunctions.cpp)
#include <RPerl/CompileUnit/Module/Class.cpp> // no non-system inheritance, only inherit from base class

# ifdef __PERL__TYPES

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

// [[[ CONSTANTS ]]]
const SV* RPerl__Algorithm__TIME_BEST = (const SV*) newSVpv("<<< UNKNOWN >>>", 0);
const SV* RPerl__Algorithm__TIME_AVERAGE = (const SV*) newSVpv("<<< UNKNOWN >>>", 0);
const SV* RPerl__Algorithm__TIME_WORST = (const SV*) newSVpv("<<< UNKNOWN >>>", 0);
const SV* RPerl__Algorithm__SPACE_WORST = (const SV*) newSVpv("<<< UNKNOWN >>>", 0);

// [[[ OO INHERITANCE ]]]
class RPerl__Algorithm : public RPerl__CompileUnit__Module__Class__CPP {
public:
    // [[[ OO PROPERTIES ]]]
    SV* foo = newSVpv("<<< DEFAULT, ALGORITHM >>>", 0);

    // [[[ OO METHODS ]]]

    // <<< OO PROPERTIES, ACCESSORS & MUTATORS >>>
    SV* get_foo() { return SvREFCNT_inc(this->foo); }
    void set_foo(SV* foo_new) { this->foo = foo_new; }

    // <<< CONSTRUCTOR & DESTRUCTOR >>>
    RPerl__Algorithm() {}
    ~RPerl__Algorithm() {}

    // <<< CLASS NAME REPORTER >>>
    virtual SV* myclassname() { return newSVpv("RPerl::Algorithm", 0); }

    // <<< CONSTANTS, SHIMS >>>
    SV* TIME_BEST() { return RPerl__Algorithm__TIME_BEST; }
    SV* TIME_AVERAGE() { return RPerl__Algorithm__TIME_AVERAGE; }
    SV* TIME_WORST() { return RPerl__Algorithm__TIME_WORST; }
    SV* SPACE_WORST() { return RPerl__Algorithm__SPACE_WORST; }

    // <<< USER-DEFINED METHODS >>>
    void inherited_Algorithm(SV* person);
    SV* inherited_Algorithm_foo_get();
    void inherited_Algorithm_foo_set(SV* foo_new);
};  // end of class

// [[[ OO SUBCLASSES ]]]
#define RPerl__Algorithm_rawptr RPerl__Algorithm*
typedef std::unique_ptr<RPerl__Algorithm> RPerl__Algorithm_ptr;
typedef std::vector<RPerl__Algorithm_ptr> RPerl__Algorithm_arrayref;
typedef std::unordered_map<string, RPerl__Algorithm_ptr> RPerl__Algorithm_hashref;
typedef std::unordered_map<string, RPerl__Algorithm_ptr>::iterator RPerl__Algorithm_hashref_iterator;

// [[[ SUBROUTINES ]]]
SV* RPerl__Algorithm__uninherited_Algorithm(SV* person);

// <<< SHIM MACROS >>>
#define uninherited_Algorithm(person) RPerl__Algorithm__uninherited_Algorithm(person)

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

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

# elif defined __CPP__TYPES

Purposefully_die_from_a_compile-time_error,_due_to____CPP__TYPES_being_defined.__We_need_to_define_only___PERL__TYPES_in_this_file!

# else

Purposefully_die_from_a_compile-time_error,_due_to_neither___PERL__TYPES_nor___CPP__TYPES_being_defined.__We_need_to_define_only___PERL__TYPES_in_this_file!

# endif

#endif