Home | History | Annotate | Download | only in 2.0.11
      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 
    225