/* $Id: papi_atkstateset.c,v 1.9.2.3 2007/03/23 06:02:20 marcusva Exp $
*
* Copyright (c) 2006, Marcus von Appen
* All rights reserved.
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* * Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
#include "papi.h"
#include "papi_private.h"
/* Forward declarations. */
static PyObject* _atkstateset_new (PyTypeObject *type, PyObject *args,
PyObject *kwds);
static int _atkstateset_init (PyAtkStateSet *self, PyObject *args,
PyObject *kwds);
static void _atkstateset_dealloc (PyAtkStateSet *self);
static PyObject* _atkstateset_is_empty (PyAtkStateSet *self);
static PyObject* _atkstateset_add_state (PyAtkStateSet *self, PyObject *args);
static PyObject* _atkstateset_add_states (PyAtkStateSet *self, PyObject *args);
static PyObject* _atkstateset_clear_states (PyAtkStateSet *self);
static PyObject* _atkstateset_contains_state (PyAtkStateSet *self,
PyObject *args);
static PyObject* _atkstateset_contains_states (PyAtkStateSet *self,
PyObject *args);
static PyObject* _atkstateset_remove_state (PyAtkStateSet *self,
PyObject *args);
static PyObject* _atkstateset_and_sets (PyAtkStateSet *self, PyObject *args);
static PyObject* _atkstateset_or_sets (PyAtkStateSet *self, PyObject *args);
static PyObject* _atkstateset_xor_sets (PyAtkStateSet *self, PyObject *args);
/**
* Methods, which are bound to the PyAtkStateSet type.
*/
static PyMethodDef _atkstateset_methods[] =
{
{ "add_state", (PyCFunction) _atkstateset_add_state, METH_VARARGS,
"S.add_state (state) -> bool\n\n"
"Adds a new state to the AtkStateSet.\n\n"
"Add a new state for the specified type to the current state set,\n"
"if it is not already present." },
{ "add_states", (PyCFunction) _atkstateset_add_states, METH_VARARGS,
"S.add_states (states) -> bool\n\n"
"Add the states for the specified types to the current state set." },
{ "clear_states", (PyCFunction) _atkstateset_clear_states, METH_NOARGS,
"S.clear_states () -> None\n\n"
"Removes all states from the state set." },
{ "contains_state", (PyCFunction) _atkstateset_contains_state,
METH_VARARGS,
"S.contains_state (state) -> bool\n\n"
"Checks whether the state for the specified type is in the set." },
{ "contains_states", (PyCFunction) _atkstateset_contains_states,
METH_VARARGS,
"S.contains_states (states) -> bool\n\n"
"Checks whether the states for all the specified types are in the\n"
"set." },
{ "remove_state", (PyCFunction) _atkstateset_remove_state, METH_VARARGS,
"S.remove_state (state) -> None\n\n"
"Removes the state for the specified type from the state set." },
{ "and_sets", (PyCFunction) _atkstateset_and_sets, METH_VARARGS,
"S.and_sets (set) -> AtkStateSet\n\n"
"Constructs the intersection of the two sets.\n\n"
"Constructs the intersection of the two sets, returning None if the\n"
"intersection is empty." },
{ "or_sets", (PyCFunction) _atkstateset_or_sets, METH_VARARGS,
"S.or_sets (set) -> AtkStateSet\n\n"
"Constructs the union of the two sets." },
{ "xor_sets", (PyCFunction) _atkstateset_xor_sets, METH_VARARGS,
"S.xor_sets (set) -> AtkStateSet\n\n"
"Constructs the exclusive-or of the two sets.\n\n"
"The set returned by this operation contains the states in exactly\n"
"one of the two sets or None if empty." },
{ NULL, NULL, 0, NULL }
};
/**
* Getters and setters of the AtkStateSet.
*/
static PyGetSetDef _atkstateset_getsets[] =
{
{ "is_empty", (getter) _atkstateset_is_empty, NULL,
"Indicates, whether the state set is empty, i.e. has no states set.",
NULL },
{ NULL, NULL, NULL, NULL, NULL }
};
/**
* PyAtkStateSet wrapper type, that encapsulates the AtkStateSet.
*/
PyTypeObject PyAtkStateSet_Type =
{
PyObject_HEAD_INIT(NULL)
0,
"papi.AtkStateSet", /* tp_name */
sizeof (PyAtkStateSet), /* tp_basicsize */
0, /* tp_itemsize */
(destructor) _atkstateset_dealloc, /* tp_dealloc */
0, /* tp_print */
0, /* tp_getattr */
0, /* tp_setattr */
0, /* tp_compare */
0, /* 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 | Py_TPFLAGS_BASETYPE, /* tp_flags */
"ATK accessibility stateset", /* tp_doc */
0, /* tp_traverse */
0, /* tp_clear */
0, /* tp_richcompare */
0, /* tp_weaklistoffset */
0, /* tp_iter */
0, /* tp_iternext */
_atkstateset_methods, /* tp_methods */
0, /* tp_members */
_atkstateset_getsets, /* tp_getset */
0, /* tp_base */
0, /* tp_dict */
0, /* tp_descr_get */
0, /* tp_descr_set */
0, /* tp_dictoffset */
(initproc) _atkstateset_init, /* tp_init */
0, /* tp_alloc */
_atkstateset_new, /* tp_new */
0, /* tp_free */
0, /* tp_is_gc */
0, /* tp_bases */
0, /* tp_mro */
0, /* tp_cache */
0, /* tp_subclasses */
0, /* tp_weaklist */
0 /* tp_del */
};
/**
* Creates a new PyAtkStateSet.
*/
static PyObject*
_atkstateset_new (PyTypeObject *type, PyObject *args, PyObject *kwds)
{
PyAtkStateSet *self;
debug ("_atkstateset_new\n");
self = (PyAtkStateSet *) type->tp_alloc (type, 0);
return (PyObject *) self;
}
/**
* Initializes the PyAtkStateSet members, such as the AtkStateSet.
*/
static int
_atkstateset_init (PyAtkStateSet *self, PyObject *args, PyObject *kwds)
{
debug ("_atkstateset_init\n");
if (!self->obj)
self->obj = atk_state_set_new ();
return 0;
}
/**
* Deallocates the PyAtkStateSet and its members.
*/
static void
_atkstateset_dealloc (PyAtkStateSet *self)
{
debug ("_atkstateset_dealloc\n");
if (self->obj)
g_object_unref (self->obj);
self->ob_type->tp_free ((PyObject *) self);
}
/**
* Wrapper for atk_state_set_is_empty().
*/
static PyObject*
_atkstateset_is_empty (PyAtkStateSet *self)
{
debug ("atkstateset_is_empty\n");
if (atk_state_set_is_empty (ATKSTATESET (self)))
Py_RETURN_TRUE;
Py_RETURN_FALSE;
}
/**
* Wrapper for atk_state_set_add_state().
*/
static PyObject*
_atkstateset_add_state (PyAtkStateSet *self, PyObject *args)
{
AtkStateType val;
debug ("_atkstateset_add_state\n");
if (!PyArg_ParseTuple (args, "i:add_state", &val))
return NULL;
if (atk_state_set_add_state (ATKSTATESET (self), val))
Py_RETURN_TRUE;
Py_RETURN_FALSE;
}
/**
* Wrapper for atk_state_set_add_states().
*/
static PyObject*
_atkstateset_add_states (PyAtkStateSet *self, PyObject *args)
{
int i;
int amount;
gboolean islist = FALSE;
gboolean istuple = FALSE;
AtkStateType *types = NULL;
PyObject *val;
debug ("_atkstateset_add_states\n");
if (!PyArg_ParseTuple (args, "O:add_states", &val))
return NULL;
istuple = PyTuple_Check (val);
if (!istuple)
islist = PyList_Check (val);
if (!islist && !istuple)
return NULL;
amount = (islist) ? PyList_Size (val) : PyTuple_Size (val);
types = PyMem_New (AtkStateType, amount);
if (!types)
return PyErr_NoMemory ();
if (islist)
for (i = 0; i < amount; i++)
types[i] = PyInt_AsLong (PyList_GetItem (val, i));
else
for (i = 0; i < amount; i++)
types[i] = PyInt_AsLong (PyTuple_GetItem (val, i));
atk_state_set_add_states (ATKSTATESET (self), types, amount);
PyMem_Free (types);
Py_RETURN_NONE;
}
/**
* Wrapper for atk_state_set_clear_states().
*/
static PyObject*
_atkstateset_clear_states (PyAtkStateSet *self)
{
debug ("_atkstateset_clear_states\n");
atk_state_set_clear_states (ATKSTATESET (self));
Py_RETURN_NONE;
}
/**
* Wrapper for atk_state_set_contains_state().
*/
static PyObject*
_atkstateset_contains_state (PyAtkStateSet *self, PyObject *args)
{
AtkStateType val;
debug ("_atkstateset_contains_state\n");
if (!PyArg_ParseTuple (args, "i:contains_state", &val))
return NULL;
if (atk_state_set_contains_state (ATKSTATESET (self), val))
Py_RETURN_TRUE;
Py_RETURN_FALSE;
}
/**
* Wrapper for atk_state_set_contains_states().
*/
static PyObject*
_atkstateset_contains_states (PyAtkStateSet *self, PyObject *args)
{
int i;
int amount;
gboolean islist = FALSE;
gboolean istuple = FALSE;
AtkStateType *types = NULL;
PyObject *val;
gboolean ret;
debug ("_atkstateset_contains_states\n");
if (!PyArg_ParseTuple (args, "O:contains_states", &val))
return NULL;
istuple = PyTuple_Check (val);
if (!istuple)
islist = PyList_Check (val);
if (!islist && !istuple)
return NULL;
amount = (islist) ? PyList_Size (val) : PyTuple_Size (val);
types = PyMem_New (AtkStateType, amount);
if (!types)
return PyErr_NoMemory ();
if (islist)
for (i = 0; i < amount; i++)
types[i] = PyInt_AsLong (PyList_GetItem (val, i));
else
for (i = 0; i < amount; i++)
types[i] = PyInt_AsLong (PyTuple_GetItem (val, i));
ret = atk_state_set_contains_states (ATKSTATESET (self), types, amount);
PyMem_Free (types);
if (ret)
Py_RETURN_TRUE;
Py_RETURN_FALSE;
}
/**
* Wrapper for atk_state_set_remove_state().
*/
static PyObject*
_atkstateset_remove_state (PyAtkStateSet *self, PyObject *args)
{
AtkStateType val;
debug ("_atkstateset_remove_state\n");
if (!PyArg_ParseTuple (args, "i:remove_state", &val))
return NULL;
if (atk_state_set_remove_state (ATKSTATESET (self), val))
Py_RETURN_TRUE;
Py_RETURN_FALSE;
}
/**
* Wrapper for atk_state_set_and_sets().
*/
static PyObject*
_atkstateset_and_sets (PyAtkStateSet *self, PyObject *args)
{
PyObject *val;
AtkStateSet *result;
PyAtkStateSet *retval;
debug ("_atkstateset_and_sets\n");
if (!PyArg_ParseTuple (args, "O:and_sets", &val))
return NULL;
if (!PyObject_TypeCheck (val, &PyAtkStateSet_Type))
{
PyErr_SetString (PyExc_TypeError, "parameter must be an AtkStateSet");
return NULL;
}
retval = PyObject_New (PyAtkStateSet, &PyAtkStateSet_Type);
result = atk_state_set_and_sets (ATKSTATESET (self), ATKSTATESET (val));
retval->obj = result;
return (PyObject *) retval;
}
/**
* Wrapper for atk_state_set_or_sets().
*/
static PyObject*
_atkstateset_or_sets (PyAtkStateSet *self, PyObject *args)
{
PyObject *val;
AtkStateSet *result;
PyAtkStateSet *retval;
debug ("_atkstateset_or_sets\n");
if (!PyArg_ParseTuple (args, "O:or_sets", &val))
return NULL;
if (!PyObject_TypeCheck (val, &PyAtkStateSet_Type))
{
PyErr_SetString (PyExc_TypeError, "parameter must be an AtkStateSet");
return NULL;
}
result = atk_state_set_or_sets (ATKSTATESET (self), ATKSTATESET (val));
if (result)
{
retval = PyObject_New (PyAtkStateSet, &PyAtkStateSet_Type);
retval->obj = result;
return (PyObject *) retval;
}
Py_RETURN_NONE;
}
/**
* Wrapper for atk_state_set_xor_sets().
*/
static PyObject*
_atkstateset_xor_sets (PyAtkStateSet *self, PyObject *args)
{
PyObject *val;
AtkStateSet *result;
PyAtkStateSet *retval;
debug ("_atkstateset_xor_sets\n");
if (!PyArg_ParseTuple (args, "O:or_sets", &val))
return NULL;
if (!PyObject_TypeCheck (val, &PyAtkStateSet_Type))
{
PyErr_SetString (PyExc_TypeError, "parameter must be an AtkStateSet");
return NULL;
}
retval = PyObject_New (PyAtkStateSet, &PyAtkStateSet_Type);
result = atk_state_set_xor_sets (ATKSTATESET (self), ATKSTATESET (val));
retval->obj = result;
return (PyObject *) retval;
}
syntax highlighted by Code2HTML, v. 0.9.1