Index: swig/Lib/constraints.i |
=================================================================== |
--- swig/Lib/constraints.i (revision 0) |
+++ swig/Lib/constraints.i (revision 0) |
@@ -0,0 +1,227 @@ |
+/* ----------------------------------------------------------------------------- |
+ * See the LICENSE file for information on copyright, usage and redistribution |
+ * of SWIG, and the README file for authors - http://www.swig.org/release.html. |
+ * |
+ * constraints.i |
+ * |
+ * SWIG constraints library. |
+ * |
+ * SWIG library file containing typemaps for implementing various kinds of |
+ * constraints. Depends upon the SWIG exception library for generating |
+ * errors in a language-independent manner. |
+ * ----------------------------------------------------------------------------- */ |
+ |
+#ifdef AUTODOC |
+%text %{ |
+%include <constraints.i> |
+ |
+This library provides support for applying constraints to function |
+arguments. Using a constraint, you can restrict arguments to be |
+positive numbers, non-NULL pointers, and so on. The following |
+constraints are available : |
+ |
+ Number POSITIVE - Positive number (not zero) |
+ Number NEGATIVE - Negative number (not zero) |
+ Number NONZERO - Nonzero number |
+ Number NONNEGATIVE - Positive number (including zero) |
+ Number NONPOSITIVE - Negative number (including zero) |
+ Pointer NONNULL - Non-NULL pointer |
+ Pointer ALIGN8 - 8-byte aligned pointer |
+ Pointer ALIGN4 - 4-byte aligned pointer |
+ Pointer ALIGN2 - 2-byte aligned pointer |
+ |
+To use the constraints, you need to "apply" them to specific |
+function arguments in your code. This is done using the %apply |
+directive. For example : |
+ |
+ %apply Number NONNEGATIVE { double nonneg }; |
+ double sqrt(double nonneg); // Name of argument must match |
+ |
+ %apply Pointer NONNULL { void *ptr }; |
+ void *malloc(int POSITIVE); // May return a NULL pointer |
+ void free(void *ptr); // May not accept a NULL pointer |
+ |
+Any function argument of the type you specify with the %apply directive |
+will be checked with the appropriate constraint. Multiple types may |
+be specified as follows : |
+ |
+ %apply Pointer NONNULL { void *, Vector *, List *, double *}; |
+ |
+In this case, all of the types listed would be checked for non-NULL |
+pointers. |
+ |
+The common datatypes of int, short, long, unsigned int, unsigned long, |
+unsigned short, unsigned char, signed char, float, and double can be |
+checked without using the %apply directive by simply using the |
+constraint name as the parameter name. For example : |
+ |
+ double sqrt(double NONNEGATIVE); |
+ double log(double POSITIVE); |
+ |
+If you have used typedef to change type-names, you can also do this : |
+ |
+ %apply double { Real }; // Make everything defined for doubles |
+ // work for Reals. |
+ Real sqrt(Real NONNEGATIVE); |
+ Real log(Real POSITIVE); |
+ |
+%} |
+#endif |
+ |
+%include <exception.i> |
+ |
+#ifdef SWIGCSHARP |
+// Required attribute for C# exception handling |
+#define SWIGCSHARPCANTHROW , canthrow=1 |
+#else |
+#define SWIGCSHARPCANTHROW |
+#endif |
+ |
+ |
+// Positive numbers |
+ |
+%typemap(check SWIGCSHARPCANTHROW) |
+ int POSITIVE, |
+ short POSITIVE, |
+ long POSITIVE, |
+ unsigned int POSITIVE, |
+ unsigned short POSITIVE, |
+ unsigned long POSITIVE, |
+ signed char POSITIVE, |
+ unsigned char POSITIVE, |
+ float POSITIVE, |
+ double POSITIVE, |
+ Number POSITIVE |
+{ |
+ if ($1 <= 0) { |
+ SWIG_exception(SWIG_ValueError,"Expected a positive value."); |
+ } |
+} |
+ |
+// Negative numbers |
+ |
+%typemap(check SWIGCSHARPCANTHROW) |
+ int NEGATIVE, |
+ short NEGATIVE, |
+ long NEGATIVE, |
+ unsigned int NEGATIVE, |
+ unsigned short NEGATIVE, |
+ unsigned long NEGATIVE, |
+ signed char NEGATIVE, |
+ unsigned char NEGATIVE, |
+ float NEGATIVE, |
+ double NEGATIVE, |
+ Number NEGATIVE |
+{ |
+ if ($1 >= 0) { |
+ SWIG_exception(SWIG_ValueError,"Expected a negative value."); |
+ } |
+} |
+ |
+// Nonzero numbers |
+ |
+%typemap(check SWIGCSHARPCANTHROW) |
+ int NONZERO, |
+ short NONZERO, |
+ long NONZERO, |
+ unsigned int NONZERO, |
+ unsigned short NONZERO, |
+ unsigned long NONZERO, |
+ signed char NONZERO, |
+ unsigned char NONZERO, |
+ float NONZERO, |
+ double NONZERO, |
+ Number NONZERO |
+{ |
+ if ($1 == 0) { |
+ SWIG_exception(SWIG_ValueError,"Expected a nonzero value."); |
+ } |
+} |
+ |
+// Nonnegative numbers |
+ |
+%typemap(check SWIGCSHARPCANTHROW) |
+ int NONNEGATIVE, |
+ short NONNEGATIVE, |
+ long NONNEGATIVE, |
+ unsigned int NONNEGATIVE, |
+ unsigned short NONNEGATIVE, |
+ unsigned long NONNEGATIVE, |
+ signed char NONNEGATIVE, |
+ unsigned char NONNEGATIVE, |
+ float NONNEGATIVE, |
+ double NONNEGATIVE, |
+ Number NONNEGATIVE |
+{ |
+ if ($1 < 0) { |
+ SWIG_exception(SWIG_ValueError,"Expected a non-negative value."); |
+ } |
+} |
+ |
+// Nonpositive numbers |
+ |
+%typemap(check SWIGCSHARPCANTHROW) |
+ int NONPOSITIVE, |
+ short NONPOSITIVE, |
+ long NONPOSITIVE, |
+ unsigned int NONPOSITIVE, |
+ unsigned short NONPOSITIVE, |
+ unsigned long NONPOSITIVE, |
+ signed char NONPOSITIVE, |
+ unsigned char NONPOSITIVE, |
+ float NONPOSITIVE, |
+ double NONPOSITIVE, |
+ Number NONPOSITIVE |
+{ |
+ if ($1 > 0) { |
+ SWIG_exception(SWIG_ValueError,"Expected a non-positive value."); |
+ } |
+} |
+ |
+// Non-NULL pointer |
+ |
+%typemap(check SWIGCSHARPCANTHROW) |
+ void * NONNULL, |
+ Pointer NONNULL |
+{ |
+ if (!$1) { |
+ SWIG_exception(SWIG_ValueError,"Received a NULL pointer."); |
+ } |
+} |
+ |
+// Aligned pointers |
+ |
+%typemap(check SWIGCSHARPCANTHROW) |
+ void * ALIGN8, |
+ Pointer ALIGN8 |
+{ |
+ unsigned long long tmp; |
+ tmp = (unsigned long long) $1; |
+ if (tmp & 7) { |
+ SWIG_exception(SWIG_ValueError,"Pointer must be 8-byte aligned."); |
+ } |
+} |
+ |
+%typemap(check SWIGCSHARPCANTHROW) |
+ void * ALIGN4, |
+ Pointer ALIGN4 |
+{ |
+ unsigned long long tmp; |
+ tmp = (unsigned long long) $1; |
+ if (tmp & 3) { |
+ SWIG_exception(SWIG_ValueError,"Pointer must be 4-byte aligned."); |
+ } |
+} |
+ |
+%typemap(check SWIGCSHARPCANTHROW) |
+ void * ALIGN2, |
+ Pointer ALIGN2 |
+{ |
+ unsigned long long tmp; |
+ tmp = (unsigned long long) $1; |
+ if (tmp & 1) { |
+ SWIG_exception(SWIG_ValueError,"Pointer must be 2-byte aligned."); |
+ } |
+} |
+ |
+ |