Library of Assembled Shared Sources
pyobject_casters.h
Go to the documentation of this file.
1/** @file
2 * @author Bram de Greve (bram@cocamware.com)
3 * @author Tom De Muer (tom@cocamware.com)
4 *
5 * *** BEGIN LICENSE INFORMATION ***
6 *
7 * The contents of this file are subject to the Common Public Attribution License
8 * Version 1.0 (the "License"); you may not use this file except in compliance with
9 * the License. You may obtain a copy of the License at
10 * http://lass.sourceforge.net/cpal-license. The License is based on the
11 * Mozilla Public License Version 1.1 but Sections 14 and 15 have been added to cover
12 * use of software over a computer network and provide for limited attribution for
13 * the Original Developer. In addition, Exhibit A has been modified to be consistent
14 * with Exhibit B.
15 *
16 * Software distributed under the License is distributed on an "AS IS" basis, WITHOUT
17 * WARRANTY OF ANY KIND, either express or implied. See the License for the specific
18 * language governing rights and limitations under the License.
19 *
20 * The Original Code is LASS - Library of Assembled Shared Sources.
21 *
22 * The Initial Developer of the Original Code is Bram de Greve and Tom De Muer.
23 * The Original Developer is the Initial Developer.
24 *
25 * All portions of the code written by the Initial Developer are:
26 * Copyright (C) 2004-2011 the Initial Developer.
27 * All Rights Reserved.
28 *
29 * Contributor(s):
30 *
31 * Alternatively, the contents of this file may be used under the terms of the
32 * GNU General Public License Version 2 or later (the GPL), in which case the
33 * provisions of GPL are applicable instead of those above. If you wish to allow use
34 * of your version of this file only under the terms of the GPL and not to allow
35 * others to use your version of this file under the CPAL, indicate your decision by
36 * deleting the provisions above and replace them with the notice and other
37 * provisions required by the GPL License. If you do not delete the provisions above,
38 * a recipient may use your version of this file under either the CPAL or the GPL.
39 *
40 * *** END LICENSE INFORMATION ***
41 */
42
43#ifndef LASS_GUARDIAN_OF_INCLUSION_UTIL_PYOBJECT_CASTERS_H
44#define LASS_GUARDIAN_OF_INCLUSION_UTIL_PYOBJECT_CASTERS_H
45
46#include "python_common.h"
47#include "../meta/select.h"
48
49namespace lass
50{
51namespace python
52{
53
54struct Caster
55{
56};
57
58template<typename T>
59struct IsACaster
60{
61 typedef lass::meta::False TValue;
62};
63template <typename T>
64struct NoCast : public Caster
65{
66 typedef T TSelf;
67 typedef T TTarget;
68 static TTarget cast(TSelf iArg) { return iArg; }
69};
70template <>
71struct NoCast<void> : public Caster
72{
73 typedef void TSelf;
74 typedef void TTarget;
75 static TTarget cast(void) {}
76};
77
78////
79template <typename T>
80struct PointerCast : public Caster
81{
82 typedef T TSelf;
83 typedef T* TPointer;
84 typedef TPointer TTarget;
85 static TSelf cast(TTarget iArg) { return *iArg; }
86};
87
88template<typename T>
89struct PointerCast<T&> : public Caster
90{
91 typedef T& TSelf;
92 typedef T* TPointer;
93 typedef TPointer TTarget;
94 static TSelf cast(TTarget iArg) { return *iArg; }
95};
96template<typename T>
97struct PointerCast<const T&> : public Caster
98{
99 typedef T& TSelf;
100 typedef T* TPointer;
101 typedef TPointer TTarget;
102 static TSelf cast(TTarget iArg) { return *iArg; }
103};
104template<typename T>
105struct PointerCast<T*> : public Caster
106{
107 typedef T* TSelf;
108 typedef T* TPointer;
109 typedef TPointer TTarget;
110 static TSelf cast(TTarget iArg) { return iArg; }
111};
112template<typename T>
113struct PointerCast<const T*> : public Caster
114{
115 typedef const T* TSelf;
116 typedef const T* TPointer;
117 typedef TPointer TTarget;
118 static TSelf cast(TTarget iArg) { return iArg; }
119};
120
121////
122
123template <typename T>
124struct CopyCast : public Caster
125{
126 typedef T TSelf;
127 typedef T TCopy;
128 typedef TCopy TTarget;
129 static TSelf cast(TTarget iArg) { return TSelf(iArg); }
130};
131
132template<typename T>
133struct CopyCast<T&> : public Caster
134{
135 typedef T& TSelf;
136 typedef T TCopy;
137 typedef TCopy TTarget;
138 static TSelf cast(TTarget iArg) { return TSelf(iArg); }
139};
140template<typename T>
141struct CopyCast<const T&> : public Caster
142{
143 typedef T& TSelf;
144 typedef T TCopy;
145 typedef TCopy TTarget;
146 static TSelf cast(TTarget iArg) { return TSelf(iArg); }
147};
148template<typename T>
149struct CopyCast<T*> : public Caster
150{
151 typedef T* TSelf;
152 typedef T TCopy;
153 typedef TCopy TTarget;
154};
155template<typename T>
156struct CopyCast<const T*> : public Caster
157{
158 typedef const T* TSelf;
159 typedef const T TCopy;
160 typedef TCopy TTarget;
161};
162/////////
163template<typename T>
164struct IsACaster<PointerCast<T> >
165{
166 typedef lass::meta::True TValue;
167};
168template<typename T>
169struct IsACaster<CopyCast<T> >
170{
171 typedef lass::meta::True TValue;
172};
173
174template< typename T>
175struct OwnerCaster
176{
177 typedef typename lass::meta::Select< typename IsACaster<T>::TValue , T, NoCast<T> >::Type TCaster;
178};
179
180}
181
182}
183
184#endif
Comprehensive C++ to Python binding library.
Library for Assembled Shared Sources.
Definition config.h:53