wxWidgets/wxPython/include/wx/wxPython/twoitem.h
Robin Dunn 57ffa5851d Redo (again) how the stock objects are initialized in wxPython.
Factor out the wxPyTwoIntItem_helper template function so it can be
used in other extension modules.


git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@39008 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
2006-05-04 02:03:39 +00:00

53 lines
1.6 KiB
C++

////////////////////////////////////////////////////////////////////////////
// Name: twoitem.h
// Purpose: A template function to help with converting a python object
// to some wx class that takes two integer value parameters.
// Factored out of wxPython_int.h
//
// Author: Robin Dunn
//
// Created: 25-April-2006
// RCS-ID: $Id$
// Copyright: (c) 2006 by Total Control Software
// Licence: wxWindows license
/////////////////////////////////////////////////////////////////////////////
#ifndef __twoitem_h__
#define __twoitem_h__
template<class T>
bool wxPyTwoIntItem_helper(PyObject* source, T** obj, const wxChar* name)
{
// If source is an object instance then it may already be the right type
if (wxPySwigInstance_Check(source)) {
T* ptr;
if (! wxPyConvertSwigPtr(source, (void **)&ptr, name))
goto error;
*obj = ptr;
return true;
}
// otherwise a 2-tuple of integers is expected
else if (PySequence_Check(source) && PyObject_Length(source) == 2) {
PyObject* o1 = PySequence_GetItem(source, 0);
PyObject* o2 = PySequence_GetItem(source, 1);
if (!PyNumber_Check(o1) || !PyNumber_Check(o2)) {
Py_DECREF(o1);
Py_DECREF(o2);
goto error;
}
**obj = T(PyInt_AsLong(o1), PyInt_AsLong(o2));
Py_DECREF(o1);
Py_DECREF(o2);
return true;
}
error:
wxString msg;
msg.Printf(wxT("Expected a 2-tuple of integers or a %s object."), name);
PyErr_SetString(PyExc_TypeError, msg.mb_str());
return false;
}
#endif