#include <QEasingCurve>
#include <QList>
#include <QPointF>
#include <qeasingcurve.h>
#include "gen_qeasingcurve.h"

#ifdef __cplusplus
extern "C" {
#endif

#ifdef __cplusplus
} /* extern C */
#endif

QEasingCurve* QEasingCurve_new() {
	return new QEasingCurve();
}

QEasingCurve* QEasingCurve_new2(QEasingCurve* other) {
	return new QEasingCurve(*other);
}

QEasingCurve* QEasingCurve_new3(int type) {
	return new QEasingCurve(static_cast<QEasingCurve::Type>(type));
}

void QEasingCurve_operatorAssign(QEasingCurve* self, QEasingCurve* other) {
	self->operator=(*other);
}

void QEasingCurve_swap(QEasingCurve* self, QEasingCurve* other) {
	self->swap(*other);
}

bool QEasingCurve_operatorEqual(const QEasingCurve* self, QEasingCurve* other) {
	return (*self == *other);
}

bool QEasingCurve_operatorNotEqual(const QEasingCurve* self, QEasingCurve* other) {
	return (*self != *other);
}

double QEasingCurve_amplitude(const QEasingCurve* self) {
	qreal _ret = self->amplitude();
	return static_cast<double>(_ret);
}

void QEasingCurve_setAmplitude(QEasingCurve* self, double amplitude) {
	self->setAmplitude(static_cast<qreal>(amplitude));
}

double QEasingCurve_period(const QEasingCurve* self) {
	qreal _ret = self->period();
	return static_cast<double>(_ret);
}

void QEasingCurve_setPeriod(QEasingCurve* self, double period) {
	self->setPeriod(static_cast<qreal>(period));
}

double QEasingCurve_overshoot(const QEasingCurve* self) {
	qreal _ret = self->overshoot();
	return static_cast<double>(_ret);
}

void QEasingCurve_setOvershoot(QEasingCurve* self, double overshoot) {
	self->setOvershoot(static_cast<qreal>(overshoot));
}

void QEasingCurve_addCubicBezierSegment(QEasingCurve* self, QPointF* c1, QPointF* c2, QPointF* endPoint) {
	self->addCubicBezierSegment(*c1, *c2, *endPoint);
}

void QEasingCurve_addTCBSegment(QEasingCurve* self, QPointF* nextPoint, double t, double c, double b) {
	self->addTCBSegment(*nextPoint, static_cast<qreal>(t), static_cast<qreal>(c), static_cast<qreal>(b));
}

struct miqt_array /* of QPointF* */  QEasingCurve_toCubicSpline(const QEasingCurve* self) {
	QList<QPointF> _ret = self->toCubicSpline();
	// Convert QList<> from C++ memory to manually-managed C memory
	QPointF** _arr = static_cast<QPointF**>(malloc(sizeof(QPointF*) * _ret.length()));
	for (size_t i = 0, e = _ret.length(); i < e; ++i) {
		_arr[i] = new QPointF(_ret[i]);
	}
	struct miqt_array _out;
	_out.len = _ret.length();
	_out.data = static_cast<void*>(_arr);
	return _out;
}

int QEasingCurve_type(const QEasingCurve* self) {
	QEasingCurve::Type _ret = self->type();
	return static_cast<int>(_ret);
}

void QEasingCurve_setType(QEasingCurve* self, int type) {
	self->setType(static_cast<QEasingCurve::Type>(type));
}

double QEasingCurve_valueForProgress(const QEasingCurve* self, double progress) {
	qreal _ret = self->valueForProgress(static_cast<qreal>(progress));
	return static_cast<double>(_ret);
}

void QEasingCurve_delete(QEasingCurve* self) {
	delete self;
}