#include <QBrush>
#include <QColor>
#include <QList>
#include <QPen>
#include "qpen.h"

#include "gen_qpen.h"

extern "C" {
    extern void miqt_exec_callback(void* cb, int argc, void* argv);
}

QPen* QPen_new() {
	return new QPen();
}

QPen* QPen_new2(uintptr_t param1) {
	return new QPen(static_cast<Qt::PenStyle>(param1));
}

QPen* QPen_new3(QColor* color) {
	return new QPen(*color);
}

QPen* QPen_new4(QBrush* brush, double width) {
	return new QPen(*brush, static_cast<qreal>(width));
}

QPen* QPen_new5(QPen* pen) {
	return new QPen(*pen);
}

QPen* QPen_new6(QBrush* brush, double width, uintptr_t s) {
	return new QPen(*brush, static_cast<qreal>(width), static_cast<Qt::PenStyle>(s));
}

QPen* QPen_new7(QBrush* brush, double width, uintptr_t s, uintptr_t c) {
	return new QPen(*brush, static_cast<qreal>(width), static_cast<Qt::PenStyle>(s), static_cast<Qt::PenCapStyle>(c));
}

QPen* QPen_new8(QBrush* brush, double width, uintptr_t s, uintptr_t c, uintptr_t j) {
	return new QPen(*brush, static_cast<qreal>(width), static_cast<Qt::PenStyle>(s), static_cast<Qt::PenCapStyle>(c), static_cast<Qt::PenJoinStyle>(j));
}

void QPen_OperatorAssign(QPen* self, QPen* pen) {
	self->operator=(*pen);
}

void QPen_Swap(QPen* self, QPen* other) {
	self->swap(*other);
}

uintptr_t QPen_Style(QPen* self) {
	Qt::PenStyle ret = const_cast<const QPen*>(self)->style();
	return static_cast<uintptr_t>(ret);
}

void QPen_SetStyle(QPen* self, uintptr_t style) {
	self->setStyle(static_cast<Qt::PenStyle>(style));
}

void QPen_DashPattern(QPen* self, double** _out, size_t* _out_len) {
	QVector<double> ret = const_cast<const QPen*>(self)->dashPattern();
	// Convert QList<> from C++ memory to manually-managed C memory
	double* __out = static_cast<double*>(malloc(sizeof(double) * ret.length()));
	for (size_t i = 0, e = ret.length(); i < e; ++i) {
		__out[i] = ret[i];
	}
	*_out = __out;
	*_out_len = ret.length();
}

void QPen_SetDashPattern(QPen* self, double* pattern, size_t pattern_len) {
	QVector<double> pattern_QList;
	pattern_QList.reserve(pattern_len);
	for(size_t i = 0; i < pattern_len; ++i) {
		pattern_QList.push_back(pattern[i]);
	}
	self->setDashPattern(pattern_QList);
}

double QPen_DashOffset(QPen* self) {
	return const_cast<const QPen*>(self)->dashOffset();
}

void QPen_SetDashOffset(QPen* self, double doffset) {
	self->setDashOffset(static_cast<qreal>(doffset));
}

double QPen_MiterLimit(QPen* self) {
	return const_cast<const QPen*>(self)->miterLimit();
}

void QPen_SetMiterLimit(QPen* self, double limit) {
	self->setMiterLimit(static_cast<qreal>(limit));
}

double QPen_WidthF(QPen* self) {
	return const_cast<const QPen*>(self)->widthF();
}

void QPen_SetWidthF(QPen* self, double width) {
	self->setWidthF(static_cast<qreal>(width));
}

int QPen_Width(QPen* self) {
	return const_cast<const QPen*>(self)->width();
}

void QPen_SetWidth(QPen* self, int width) {
	self->setWidth(static_cast<int>(width));
}

QColor* QPen_Color(QPen* self) {
	QColor ret = const_cast<const QPen*>(self)->color();
	// Copy-construct value returned type into heap-allocated copy
	return static_cast<QColor*>(new QColor(ret));
}

void QPen_SetColor(QPen* self, QColor* color) {
	self->setColor(*color);
}

QBrush* QPen_Brush(QPen* self) {
	QBrush ret = const_cast<const QPen*>(self)->brush();
	// Copy-construct value returned type into heap-allocated copy
	return static_cast<QBrush*>(new QBrush(ret));
}

void QPen_SetBrush(QPen* self, QBrush* brush) {
	self->setBrush(*brush);
}

bool QPen_IsSolid(QPen* self) {
	return const_cast<const QPen*>(self)->isSolid();
}

uintptr_t QPen_CapStyle(QPen* self) {
	Qt::PenCapStyle ret = const_cast<const QPen*>(self)->capStyle();
	return static_cast<uintptr_t>(ret);
}

void QPen_SetCapStyle(QPen* self, uintptr_t pcs) {
	self->setCapStyle(static_cast<Qt::PenCapStyle>(pcs));
}

uintptr_t QPen_JoinStyle(QPen* self) {
	Qt::PenJoinStyle ret = const_cast<const QPen*>(self)->joinStyle();
	return static_cast<uintptr_t>(ret);
}

void QPen_SetJoinStyle(QPen* self, uintptr_t pcs) {
	self->setJoinStyle(static_cast<Qt::PenJoinStyle>(pcs));
}

bool QPen_IsCosmetic(QPen* self) {
	return const_cast<const QPen*>(self)->isCosmetic();
}

void QPen_SetCosmetic(QPen* self, bool cosmetic) {
	self->setCosmetic(cosmetic);
}

bool QPen_OperatorEqual(QPen* self, QPen* p) {
	return const_cast<const QPen*>(self)->operator==(*p);
}

bool QPen_OperatorNotEqual(QPen* self, QPen* p) {
	return const_cast<const QPen*>(self)->operator!=(*p);
}

bool QPen_IsDetached(QPen* self) {
	return self->isDetached();
}

void QPen_Delete(QPen* self) {
	delete self;
}