%module{Slic3r::XS};

%{
#include <xsinit.h>
#include "libslic3r/Extruder.hpp"
%}

%name{Slic3r::Extruder} class Extruder {
    Extruder(unsigned int id, StaticPrintConfig* config)
        %code%{ RETVAL = new Extruder (id, dynamic_cast<GCodeConfig*>(config)); %};
    ~Extruder();
    void reset();
    double extrude(double dE);
    double retract(double length, double restart_extra);
    double unretract();
    double e_per_mm(double mm3_per_mm);
    double extruded_volume();
    double used_filament();
    
    unsigned int id()
        %code%{ RETVAL = THIS->id; %};
    
    double E()
        %code%{ RETVAL = THIS->E; %};
    double set_E(double val)
        %code%{ RETVAL = THIS->E = val; %};
    double absolute_E()
        %code%{ RETVAL = THIS->absolute_E; %};
    double set_absolute_E(double val)
        %code%{ RETVAL = THIS->absolute_E = val; %};
    double retracted()
        %code%{ RETVAL = THIS->retracted; %};
    double set_retracted(double val)
        %code%{ RETVAL = THIS->retracted = val; %};
    double restart_extra()
        %code%{ RETVAL = THIS->restart_extra; %};
    double set_restart_extra(double val)
        %code%{ RETVAL = THIS->restart_extra = val; %};
    double e_per_mm3()
        %code%{ RETVAL = THIS->e_per_mm3; %};
    double retract_speed_mm_min()
        %code%{ RETVAL = THIS->retract_speed_mm_min; %};
    
    double filament_diameter();
    double filament_density();
    double filament_cost();
    double extrusion_multiplier();
    double retract_length();
    double retract_lift();
    int retract_speed();
    double retract_restart_extra();
    double retract_length_toolchange();
    double retract_restart_extra_toolchange();
};
