%module{Slic3r::XS};

%{
#include <myinit.h>
#include "ExtrusionEntity.hpp"
%}

%name{Slic3r::ExtrusionLoop} class ExtrusionLoop {
    ~ExtrusionLoop();
    SV* arrayref()
        %code{% RETVAL = THIS->polygon.to_AV(); %};
    SV* pp()
        %code{% RETVAL = THIS->polygon.to_SV_pureperl(); %};
    void reverse()
        %code{% THIS->polygon.reverse(); %};
    ExtrusionPath* split_at_index(int index)
        %code{% const char* CLASS = "Slic3r::ExtrusionPath"; RETVAL = THIS->split_at_index(index); %};
    ExtrusionPath* split_at_first_point()
        %code{% const char* CLASS = "Slic3r::ExtrusionPath"; RETVAL = THIS->split_at_first_point(); %};
    bool make_counter_clockwise();
    Point* first_point()
        %code{% const char* CLASS = "Slic3r::Point"; RETVAL = THIS->first_point(); %};
    Point* last_point()
        %code{% const char* CLASS = "Slic3r::Point"; RETVAL = THIS->last_point(); %};
%{

ExtrusionLoop*
_new(CLASS, polygon_sv, role, height, flow_spacing)
    char*           CLASS;
    SV*             polygon_sv;
    ExtrusionRole   role;
    double          height;
    double          flow_spacing;
    CODE:
        RETVAL = new ExtrusionLoop ();
        RETVAL->polygon.from_SV_check(polygon_sv);
        RETVAL->role            = role;
        RETVAL->height          = height;
        RETVAL->flow_spacing    = flow_spacing;
    OUTPUT:
        RETVAL

Polygon*
ExtrusionLoop::polygon(...)
    PREINIT:
        const char* CLASS = "Slic3r::Polygon::Ref";
    CODE:
        if (items > 1) {
            THIS->polygon.from_SV_check( ST(1) );
        }
        RETVAL = &(THIS->polygon);
    OUTPUT:
        RETVAL

ExtrusionRole
ExtrusionLoop::role(...)
    CODE:
        if (items > 1) {
            THIS->role = (ExtrusionRole)SvUV(ST(1));
        }
        RETVAL = THIS->role;
    OUTPUT:
        RETVAL

double
ExtrusionLoop::height(...)
    CODE:
        if (items > 1) {
            THIS->height = (double)SvNV(ST(1));
        }
        RETVAL = THIS->height;
    OUTPUT:
        RETVAL

double
ExtrusionLoop::flow_spacing(...)
    CODE:
        if (items > 1) {
            THIS->flow_spacing = (double)SvNV(ST(1));
        }
        RETVAL = THIS->flow_spacing;
    OUTPUT:
        RETVAL

%}
};
