9fe98544961ed36d1c0c6a6ce5076867572a8120
[blender.git] / source / gameengine / VideoTexture / PyTypeList.cpp
1 /*
2 -----------------------------------------------------------------------------
3 This source file is part of blendTex library
4
5 Copyright (c) 2007 The Zdeno Ash Miklas
6
7 This program is free software; you can redistribute it and/or modify it under
8 the terms of the GNU Lesser General Public License as published by the Free Software
9 Foundation; either version 2 of the License, or (at your option) any later
10 version.
11
12 This program is distributed in the hope that it will be useful, but WITHOUT
13 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
14 FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
15
16 You should have received a copy of the GNU Lesser General Public License along with
17 this program; if not, write to the Free Software Foundation, Inc., 59 Temple
18 Place - Suite 330, Boston, MA 02111-1307, USA, or go to
19 http://www.gnu.org/copyleft/lesser.txt.
20 -----------------------------------------------------------------------------
21 */
22
23 /** \file gameengine/VideoTexture/PyTypeList.cpp
24  *  \ingroup bgevideotex
25  */
26
27 #include "PyTypeList.h"
28
29 #include <memory>
30 #include <vector>
31
32 #include "PyObjectPlus.h"
33
34 /// destructor
35 PyTypeList::~PyTypeList()
36 {
37         // if list exists
38         if (m_list.get() != NULL)
39                 for (PyTypeListType::iterator it = m_list->begin(); it != m_list->end(); ++it)
40                         delete *it;
41 }
42
43 /// check, if type is in list
44 bool PyTypeList::in (PyTypeObject *type)
45 {
46         // if list exists
47         if (m_list.get() != NULL)
48                 // iterate items in list
49                 for (PyTypeListType::iterator it = m_list->begin(); it != m_list->end(); ++it)
50                         // if item is found, return with success
51                         if ((*it)->getType() == type) return true;
52         // otherwise return not found
53         return false;
54 }
55
56 /// add type to list
57 void PyTypeList::add (PyTypeObject *type, const char * name)
58 {
59         // if list doesn't exist, create it
60         if (m_list.get() == NULL) 
61                 m_list.reset(new PyTypeListType());
62         if (!in(type))
63                 // add new item to list
64                 m_list->push_back(new PyTypeListItem(type, name));
65 }
66
67 /// prepare types
68 bool PyTypeList::ready (void)
69 {
70         // if list exists
71         if (m_list.get() != NULL)
72                 // iterate items in list
73                 for (PyTypeListType::iterator it = m_list->begin(); it != m_list->end(); ++it)
74                         // if preparation failed, report it
75                         if (PyType_Ready((*it)->getType()) < 0) return false;
76         // success
77         return true;
78 }
79
80 /// register types to module
81 void PyTypeList::reg(PyObject *module)
82 {
83         // if list exists
84         if (m_list.get() != NULL)
85                 // iterate items in list
86                 for (PyTypeListType::iterator it = m_list->begin(); it != m_list->end(); ++it)
87                 {
88                         // increase ref count
89                         Py_INCREF((*it)->getType());
90                         // add type to module
91                         PyModule_AddObject(module, (char*)(*it)->getName(), (PyObject *)(*it)->getType());
92                 }
93 }