// Cyphesis Online RPG Server and AI Engine // Copyright (C) 2000 Alistair Riddoch // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software Foundation, // Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA // $Id: Py_Oplist.cpp,v 1.31 2007-04-01 20:55:27 alriddoch Exp $ #include "Py_Operation.h" #include "Py_Oplist.h" static PyObject* Oplist_append(PyOplist * self, PyOperation * op) { #ifndef NDEBUG if (self->ops == NULL) { PyErr_SetString(PyExc_AssertionError, "NULL Oplist in Oplist.append"); return NULL; } #endif // NDEBUG if (PyOperation_Check(op)) { self->ops->push_back(op->operation); } else if (PyOplist_Check(op)) { PyOplist * opl = (PyOplist*)op; OpVector::const_iterator Iend = opl->ops->end(); for (OpVector::const_iterator I = opl->ops->begin(); I != Iend; ++I) { self->ops->push_back(*I); } } else if ((PyObject*)op != Py_None) { PyErr_SetString(PyExc_TypeError, "Append must be an op or message"); return NULL; } Py_INCREF(Py_None); return Py_None; } static PyMethodDef Oplist_methods[] = { {"append", (PyCFunction)Oplist_append, METH_O}, {NULL, NULL} /* sentinel */ }; static void Oplist_dealloc(PyOplist *self) { if (self->ops != NULL) { delete self->ops; } PyObject_Free(self); } static PyObject * Oplist_getattr(PyOplist *self, char *name) { return Py_FindMethod(Oplist_methods, (PyObject *)self, name); } static PyObject * Oplist_num_add(PyOplist *self, PyObject *other) { #ifndef NDEBUG if (self->ops == NULL) { PyErr_SetString(PyExc_AssertionError, "NULL Oplist in Oplist.num_add"); return NULL; } #endif // NDEBUG if (other == Py_None) { Py_INCREF(self); return (PyObject*)self; } if (PyOplist_Check(other)) { PyOplist * opl = (PyOplist*)other; PyOplist * res = newPyOplist(); if (res == NULL) { return NULL; } res->ops = new OpVector(*self->ops); OpVector::const_iterator Iend = opl->ops->end(); for (OpVector::const_iterator I = opl->ops->begin(); I != Iend; ++I) { res->ops->push_back(*I); } return (PyObject*)res; } if (PyOperation_Check(other)) { PyOperation * op = (PyOperation*)other; #ifndef NDEBUG if (!op->operation.isValid()) { PyErr_SetString(PyExc_AssertionError, "NULL Operation in other of Oplist.num_add"); } #endif // NDEBUG PyOplist * res = newPyOplist(); if (res == NULL) { return NULL; } res->ops = new OpVector(*self->ops); // res->ops->merge(*self->ops); res->ops->push_back(op->operation); return (PyObject*)res; } return NULL; } static int Oplist_num_coerce(PyObject ** self, PyObject ** other) { //if (*other == Py_None) { Py_INCREF(*self); Py_INCREF(*other); return 0; //} //return -1; } #if PY_MINOR_VERSION < 5 #define lenfunc inquiry #endif #if PY_VERSION_HEX < 0x02050000 typedef int Py_ssize_t; #endif static Py_ssize_t Oplist_seq_length(PyOplist * self) { #ifndef NDEBUG if (self->ops == NULL) { PyErr_SetString(PyExc_AssertionError,"Invalid Oplist in Oplist.seq_length"); return 0; } #endif // NDEBUG return self->ops->size(); } #if PY_MINOR_VERSION < 5 #define lenfunc inquiry #endif static PyMappingMethods Oplist_as_mapping = { (lenfunc)Oplist_seq_length, /* mp_length */ NULL, NULL }; static PySequenceMethods Oplist_as_sequence = { (lenfunc)Oplist_seq_length, /* sq_length */ NULL, /* sq_concat */ NULL, /* sq_repeat */ NULL, /* sq_item */ NULL, /* sq_slice */ NULL, /* sq_ass_item */ NULL /* sq_ass_slice */ }; static PyNumberMethods Oplist_as_number = { (binaryfunc)Oplist_num_add, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, Oplist_num_coerce, 0, 0, 0, 0, 0 }; PyTypeObject PyOplist_Type = { PyObject_HEAD_INIT(&PyType_Type) 0, /*ob_size*/ "Oplist", /*tp_name*/ sizeof(PyOplist), /*tp_basicsize*/ 0, /*tp_itemsize*/ /* methods */ (destructor)Oplist_dealloc, /*tp_dealloc*/ 0, /*tp_print*/ (getattrfunc)Oplist_getattr, /*tp_getattr*/ 0, /*tp_setattr*/ 0, /*tp_compare*/ 0, /*tp_repr*/ &Oplist_as_number, /*tp_as_number*/ &Oplist_as_sequence, /*tp_as_sequence*/ &Oplist_as_mapping, /*tp_as_mapping*/ 0, /*tp_hash*/ }; PyOplist * newPyOplist() { PyOplist * self; self = PyObject_NEW(PyOplist, &PyOplist_Type); if (self == NULL) { return NULL; } return self; }