view PyParameterDescriptor.cpp @ 101:28d22109991c

Text tweaks
author Chris Cannam <cannam@all-day-breakfast.com>
date Fri, 01 Feb 2019 18:07:02 +0000
parents c1e4f706ca9a
children
line wrap: on
line source
/*

 * Vampy : This plugin is a wrapper around the Vamp plugin API.
 * It allows for writing Vamp plugins in Python.

 * Centre for Digital Music, Queen Mary University of London.
 * Copyright (C) 2008-2009 Gyorgy Fazekas, QMUL. (See Vamp sources 
 * for licence information.)

*/

#include <Python.h>
#include "PyParameterDescriptor.h"
#include "vamp-sdk/Plugin.h"
#include <string>
#include "PyTypeInterface.h"

using namespace std;
using namespace Vamp;
using Vamp::Plugin;

/*			 ParameterDescriptor Object's Methods 					*/ 
//these objects have no callable methods

/*		   PyParameterDescriptor methods implementing protocols   	*/ 
// these functions are called by the interpreter automatically

/* New ParameterDescriptor object */ 
static PyObject *
ParameterDescriptor_new(PyTypeObject *type, PyObject *args, PyObject *kw)
{

	ParameterDescriptorObject *self = 
	(ParameterDescriptorObject*)type->tp_alloc(type, 0);
	
	if (self == NULL) return NULL;
    self->dict = PyDict_New();
	if (self->dict == NULL) return NULL;

	/// allow copying objects
    if (args && PyTuple_Size(args) == 1) {
		PyObject* arg = PyTuple_GET_ITEM(args,0);
		if (PyParameterDescriptor_CheckExact(arg))
			PyDict_Merge(self->dict,PyParameterDescriptor_AS_DICT(arg),0);
		else if (PyDict_CheckExact(arg)) 
			PyDict_Merge(self->dict,arg,0);
		else {
			PyErr_SetString(PyExc_TypeError, 
			"Object takes zero or one ParameterDescriptor or dictionary arguments.");
			return NULL; 
		}
	}
	return (PyObject *) self;
}


/* DESTRUCTOR: delete type object */
static void
ParameterDescriptorObject_dealloc(ParameterDescriptorObject *self)
{
	Py_XDECREF(self->dict);
	PyObject_Del(self);
}


/* Set attributes */
static int
ParameterDescriptor_setattr(ParameterDescriptorObject *self, char *name, PyObject *v)
{
	if (v == NULL) {
		int rv = PyDict_DelItemString(self->dict, name);
		if (rv < 0)
			PyErr_SetString(PyExc_AttributeError,"non-existing ParameterDescriptor attribute");
		return rv;
	}
	else
		return PyDict_SetItemString(self->dict, name, v);
}


/* Get attributes */
static PyObject *
ParameterDescriptor_getattr(ParameterDescriptorObject *self, char *name)
{
	if (self->dict != NULL) {
		PyObject *v = PyDict_GetItemString(self->dict, name);
		if (v != NULL) 
		{
			Py_INCREF(v);
			return v;
		}
		PyErr_SetString(PyExc_AttributeError,"non-existing ParameterDescriptor attribute");
	}
	return NULL;
}


/* String representation */
static PyObject *
ParameterDescriptor_repr(PyObject *self)
{
	ParameterDescriptorObject* v = (ParameterDescriptorObject*)self;
	if (v->dict) return PyDict_Type.tp_repr((PyObject *)v->dict);
	else return PyString_FromString("ParameterDescriptor()");
}

#define ParameterDescriptor_alloc PyType_GenericAlloc
#define ParameterDescriptor_free PyObject_Del

PyTypeObject ParameterDescriptor_Type = {
	PyObject_HEAD_INIT(NULL)
	0,						/*ob_size*/
	"vampy.ParameterDescriptor",/*tp_name*/
	sizeof(ParameterDescriptorObject),	/*tp_basicsize*/
	0,						/*tp_itemsize*/
	(destructor)ParameterDescriptorObject_dealloc, /*tp_dealloc*/
	0,						/*tp_print*/
	(getattrfunc)ParameterDescriptor_getattr, /*tp_getattr*/
	(setattrfunc)ParameterDescriptor_setattr, /*tp_setattr*/
	0,						/*tp_compare*/
	ParameterDescriptor_repr,			/*tp_repr*/
	0,						/*tp_as_number*/
	0,						/*tp_as_sequence*/
	0,						/*tp_as_mapping*/
	0,						/*tp_hash*/
	0,                      /*tp_call*/
    0,                      /*tp_str*/
    0,                      /*tp_getattro*/
    0,                      /*tp_setattro*/
    0,                      /*tp_as_buffer*/
    Py_TPFLAGS_DEFAULT,     /*tp_flags*/
    0,                      /*tp_doc*/
    0,                      /*tp_traverse*/
    0,                      /*tp_clear*/
    0,                      /*tp_richcompare*/
    0,                      /*tp_weaklistoffset*/
    0,                      /*tp_iter*/
    0,                      /*tp_iternext*/
    0,				        /*tp_methods*/ //TypeObject Methods
    0,                      /*tp_members*/
    0,                      /*tp_getset*/
    0,                      /*tp_base*/
    0,                      /*tp_dict*/
    0,                      /*tp_descr_get*/
    0,                      /*tp_descr_set*/
    0,                      /*tp_dictoffset*/
    0,                      /*tp_init*/
    ParameterDescriptor_alloc,/*tp_alloc*/
    ParameterDescriptor_new,/*tp_new*/
    ParameterDescriptor_free,/*tp_free*/
    0,                      /*tp_is_gc*/
};

/*		  		 	  PyParameterDescriptor C++ API    				*/