Mercurial > mm7
comparison lib/swig/swigwin-2.0.11/Lib/constraints.i @ 1899:b3009adc0e2f
Adding swig, gitignore, hgignore
author | Nomad |
---|---|
date | Mon, 21 Oct 2013 10:42:27 +0200 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
1867:eb580660bbbb | 1899:b3009adc0e2f |
---|---|
1 /* ----------------------------------------------------------------------------- | |
2 * constraints.i | |
3 * | |
4 * SWIG constraints library. | |
5 * | |
6 * SWIG library file containing typemaps for implementing various kinds of | |
7 * constraints. Depends upon the SWIG exception library for generating | |
8 * errors in a language-independent manner. | |
9 * ----------------------------------------------------------------------------- */ | |
10 | |
11 #ifdef AUTODOC | |
12 %text %{ | |
13 %include <constraints.i> | |
14 | |
15 This library provides support for applying constraints to function | |
16 arguments. Using a constraint, you can restrict arguments to be | |
17 positive numbers, non-NULL pointers, and so on. The following | |
18 constraints are available : | |
19 | |
20 Number POSITIVE - Positive number (not zero) | |
21 Number NEGATIVE - Negative number (not zero) | |
22 Number NONZERO - Nonzero number | |
23 Number NONNEGATIVE - Positive number (including zero) | |
24 Number NONPOSITIVE - Negative number (including zero) | |
25 Pointer NONNULL - Non-NULL pointer | |
26 Pointer ALIGN8 - 8-byte aligned pointer | |
27 Pointer ALIGN4 - 4-byte aligned pointer | |
28 Pointer ALIGN2 - 2-byte aligned pointer | |
29 | |
30 To use the constraints, you need to "apply" them to specific | |
31 function arguments in your code. This is done using the %apply | |
32 directive. For example : | |
33 | |
34 %apply Number NONNEGATIVE { double nonneg }; | |
35 double sqrt(double nonneg); // Name of argument must match | |
36 | |
37 %apply Pointer NONNULL { void *ptr }; | |
38 void *malloc(int POSITIVE); // May return a NULL pointer | |
39 void free(void *ptr); // May not accept a NULL pointer | |
40 | |
41 Any function argument of the type you specify with the %apply directive | |
42 will be checked with the appropriate constraint. Multiple types may | |
43 be specified as follows : | |
44 | |
45 %apply Pointer NONNULL { void *, Vector *, List *, double *}; | |
46 | |
47 In this case, all of the types listed would be checked for non-NULL | |
48 pointers. | |
49 | |
50 The common datatypes of int, short, long, unsigned int, unsigned long, | |
51 unsigned short, unsigned char, signed char, float, and double can be | |
52 checked without using the %apply directive by simply using the | |
53 constraint name as the parameter name. For example : | |
54 | |
55 double sqrt(double NONNEGATIVE); | |
56 double log(double POSITIVE); | |
57 | |
58 If you have used typedef to change type-names, you can also do this : | |
59 | |
60 %apply double { Real }; // Make everything defined for doubles | |
61 // work for Reals. | |
62 Real sqrt(Real NONNEGATIVE); | |
63 Real log(Real POSITIVE); | |
64 | |
65 %} | |
66 #endif | |
67 | |
68 %include <exception.i> | |
69 | |
70 #ifdef SWIGCSHARP | |
71 // Required attribute for C# exception handling | |
72 #define SWIGCSHARPCANTHROW , canthrow=1 | |
73 #else | |
74 #define SWIGCSHARPCANTHROW | |
75 #endif | |
76 | |
77 | |
78 // Positive numbers | |
79 | |
80 %typemap(check SWIGCSHARPCANTHROW) | |
81 int POSITIVE, | |
82 short POSITIVE, | |
83 long POSITIVE, | |
84 unsigned int POSITIVE, | |
85 unsigned short POSITIVE, | |
86 unsigned long POSITIVE, | |
87 signed char POSITIVE, | |
88 unsigned char POSITIVE, | |
89 float POSITIVE, | |
90 double POSITIVE, | |
91 Number POSITIVE | |
92 { | |
93 if ($1 <= 0) { | |
94 SWIG_exception(SWIG_ValueError,"Expected a positive value."); | |
95 } | |
96 } | |
97 | |
98 // Negative numbers | |
99 | |
100 %typemap(check SWIGCSHARPCANTHROW) | |
101 int NEGATIVE, | |
102 short NEGATIVE, | |
103 long NEGATIVE, | |
104 unsigned int NEGATIVE, | |
105 unsigned short NEGATIVE, | |
106 unsigned long NEGATIVE, | |
107 signed char NEGATIVE, | |
108 unsigned char NEGATIVE, | |
109 float NEGATIVE, | |
110 double NEGATIVE, | |
111 Number NEGATIVE | |
112 { | |
113 if ($1 >= 0) { | |
114 SWIG_exception(SWIG_ValueError,"Expected a negative value."); | |
115 } | |
116 } | |
117 | |
118 // Nonzero numbers | |
119 | |
120 %typemap(check SWIGCSHARPCANTHROW) | |
121 int NONZERO, | |
122 short NONZERO, | |
123 long NONZERO, | |
124 unsigned int NONZERO, | |
125 unsigned short NONZERO, | |
126 unsigned long NONZERO, | |
127 signed char NONZERO, | |
128 unsigned char NONZERO, | |
129 float NONZERO, | |
130 double NONZERO, | |
131 Number NONZERO | |
132 { | |
133 if ($1 == 0) { | |
134 SWIG_exception(SWIG_ValueError,"Expected a nonzero value."); | |
135 } | |
136 } | |
137 | |
138 // Nonnegative numbers | |
139 | |
140 %typemap(check SWIGCSHARPCANTHROW) | |
141 int NONNEGATIVE, | |
142 short NONNEGATIVE, | |
143 long NONNEGATIVE, | |
144 unsigned int NONNEGATIVE, | |
145 unsigned short NONNEGATIVE, | |
146 unsigned long NONNEGATIVE, | |
147 signed char NONNEGATIVE, | |
148 unsigned char NONNEGATIVE, | |
149 float NONNEGATIVE, | |
150 double NONNEGATIVE, | |
151 Number NONNEGATIVE | |
152 { | |
153 if ($1 < 0) { | |
154 SWIG_exception(SWIG_ValueError,"Expected a non-negative value."); | |
155 } | |
156 } | |
157 | |
158 // Nonpositive numbers | |
159 | |
160 %typemap(check SWIGCSHARPCANTHROW) | |
161 int NONPOSITIVE, | |
162 short NONPOSITIVE, | |
163 long NONPOSITIVE, | |
164 unsigned int NONPOSITIVE, | |
165 unsigned short NONPOSITIVE, | |
166 unsigned long NONPOSITIVE, | |
167 signed char NONPOSITIVE, | |
168 unsigned char NONPOSITIVE, | |
169 float NONPOSITIVE, | |
170 double NONPOSITIVE, | |
171 Number NONPOSITIVE | |
172 { | |
173 if ($1 > 0) { | |
174 SWIG_exception(SWIG_ValueError,"Expected a non-positive value."); | |
175 } | |
176 } | |
177 | |
178 // Non-NULL pointer | |
179 | |
180 %typemap(check SWIGCSHARPCANTHROW) | |
181 void * NONNULL, | |
182 Pointer NONNULL | |
183 { | |
184 if (!$1) { | |
185 SWIG_exception(SWIG_ValueError,"Received a NULL pointer."); | |
186 } | |
187 } | |
188 | |
189 // Aligned pointers | |
190 | |
191 %typemap(check SWIGCSHARPCANTHROW) | |
192 void * ALIGN8, | |
193 Pointer ALIGN8 | |
194 { | |
195 unsigned long long tmp; | |
196 tmp = (unsigned long long) $1; | |
197 if (tmp & 7) { | |
198 SWIG_exception(SWIG_ValueError,"Pointer must be 8-byte aligned."); | |
199 } | |
200 } | |
201 | |
202 %typemap(check SWIGCSHARPCANTHROW) | |
203 void * ALIGN4, | |
204 Pointer ALIGN4 | |
205 { | |
206 unsigned long long tmp; | |
207 tmp = (unsigned long long) $1; | |
208 if (tmp & 3) { | |
209 SWIG_exception(SWIG_ValueError,"Pointer must be 4-byte aligned."); | |
210 } | |
211 } | |
212 | |
213 %typemap(check SWIGCSHARPCANTHROW) | |
214 void * ALIGN2, | |
215 Pointer ALIGN2 | |
216 { | |
217 unsigned long long tmp; | |
218 tmp = (unsigned long long) $1; | |
219 if (tmp & 1) { | |
220 SWIG_exception(SWIG_ValueError,"Pointer must be 2-byte aligned."); | |
221 } | |
222 } | |
223 | |
224 |