123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224 |
- /* -----------------------------------------------------------------------------
- * 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.");
- }
- }
|