Make M*LIB stricter for INIT_MOVE operator:
* either the default INIT_MOVE operator works ('=')
* either an INIT_MOVE method is defined
* or it is disabled.
As a consequence, fix usage of testobj_t and mpz_t in the repository
The emulation layer of INIT_MOVE using INIT_SET+CLEAR is removed:
it wasn't working correctly with the local memory context
(INIT_MOVE doesn't need any local memory context to work,
whereas INIT_SET/CLEAR does)
Remove macro M_DO_INIT_MOVE as it is now useless and uses M_CALL_INIT_MOVE.
The INIT_MOVE default method no longer sets the old 'src' to '0':
it was useless (it doesn't catch any error) and complicates compiler parsing.
Fix POD & A1 & CSTR & classic oplists definition (missing INIT_MOVE operators).
This commit is contained in:
1 parent
3a39ce5a4a
commit
d548117538
19 files changed
+126
-157
No files matched your search
@@ -356,7 +356,7 @@ Here is another example with a complete type (with proper initialization & clear
|
||||
#include <stdio.h>
|
||||
#include <gmp.h>
|
||||
#include "m-array.h"
|
||||
ARRAY_DEF(array_mpz, mpz_t, (INIT(mpz_init), INIT_SET(mpz_init_set), SET(mpz_set), CLEAR(mpz_clear)) )
|
||||
ARRAY_DEF(array_mpz, mpz_t, (INIT(mpz_init), INIT_SET(mpz_init_set), SET(mpz_set), CLEAR(mpz_clear), INIT_MOVE(M_COPY_A1_DEFAULT)) )
|
||||
int main(void) {
|
||||
array_mpz_t array ; /* array_mpz_t has been define above */
|
||||
array_mpz_init(array); /* All type needs to be initialized */
|
||||
@@ -401,7 +401,7 @@ We can also write the same example shorter:
|
||||
|
||||
// Register the oplist of a mpz_t.
|
||||
#define M_OPL_mpz_t() (INIT(mpz_init), INIT_SET(mpz_init_set), \
|
||||
SET(mpz_set), CLEAR(mpz_clear))
|
||||
SET(mpz_set), CLEAR(mpz_clear), INIT_MOVE(M_COPY_A1_DEFAULT))
|
||||
// Define an instance of an array of mpz_t (both type and function)
|
||||
ARRAY_DEF(array_mpz, mpz_t)
|
||||
// Register the oplist of the created instance of array of mpz_t
|
||||
@@ -786,7 +786,7 @@ void mpz_clear(mpz_t z); // Destructor of the object z
|
||||
A basic oplist will be:
|
||||
|
||||
```C
|
||||
(INIT(mpz_init),SET(mpz_set),INIT_SET(mpz_init_set),CLEAR(mpz_clear),TYPE(mpz_t))
|
||||
(INIT(mpz_init),SET(mpz_set),INIT_SET(mpz_init_set),CLEAR(mpz_clear), INIT_MOVE(M_COPY_A1_DEFAULT),TYPE(mpz_t))
|
||||
```
|
||||
|
||||
Much more complete oplist can be built for this type however, enabling much more powerful generation:
|
||||
@@ -803,7 +803,7 @@ Example:
|
||||
|
||||
```C
|
||||
#define M_OPL_mpz_t() (INIT(mpz_init),SET(mpz_set), \
|
||||
INIT_SET(mpz_init_set),CLEAR(mpz_clear),TYPE(mpz_t))
|
||||
INIT_SET(mpz_init_set),CLEAR(mpz_clear), INIT_MOVE(M_COPY_A1_DEFAULT),TYPE(mpz_t))
|
||||
```
|
||||
|
||||
This can simplify a lot `OPLIST` usage and it is recommended.
|
||||
@@ -841,7 +841,7 @@ The API Adaptation to use shall be embedded in the `OPLIST` definition.
|
||||
For example:
|
||||
|
||||
```C
|
||||
(INIT(API_0(mpz_init)), SET(API_0(mpz_set)), INIT_SET(API_0(mpz_init_set)), CLEAR(API_0(mpz_clear)))
|
||||
(INIT(API_0(mpz_init)), SET(API_0(mpz_set)), INIT_SET(API_0(mpz_init_set)), CLEAR(API_0(mpz_clear)), INIT_MOVE(M_COPY_A1_DEFAULT))
|
||||
```
|
||||
|
||||
The default adaptation is API_0 (i.e. no adaptation between operator interface and method interface).
|
||||
@@ -1174,6 +1174,11 @@ perl -i -e 's/;/;\n/g' test-file.i
|
||||
cc -std=c99 -c -Wall test-file.i
|
||||
```
|
||||
|
||||
If you get the error "assignment to expression with array type", it means that the library
|
||||
tries using the default '=' operator to set an object which is not compatible:
|
||||
give the right method to the needed operator (usually `INIT_MOVE` or `INIT_SET`) in its oplist
|
||||
or use the proper oplist of the type.
|
||||
|
||||
If there is a warning reported by the compiler in the generated code,
|
||||
then there is definitely an **error** you should fix (except if it reports
|
||||
shadowed variables), in particular cast evolving pointers.
|
||||
@@ -1311,6 +1316,8 @@ and you shall use a typedef as an intermediary named type for such types.
|
||||
|
||||
The output parameters are listed fist, then the input/output parameters and finally the input parameters.
|
||||
|
||||
The oplist shall also provide the `INIT_MOVE` operator if the default instance (aka '=' operator) is not working for this type (for example for array of size 1, in which case the method `M_COPY_A1_DEFAULT` is likely to work), or disable the operator.
|
||||
|
||||
This generic interface is specified as follow:
|
||||
|
||||
##### `void name_init(name_t container)`
|
||||
@@ -1773,7 +1780,7 @@ Example:
|
||||
#define MPZ_OUT_STR(stream, x) mpz_out_str(stream, 0, x)
|
||||
LIST_DEF(list_mpz, mpz_t, \
|
||||
(INIT(mpz_init), INIT_SET(mpz_init_set), SET(mpz_set), \
|
||||
CLEAR(mpz_clear), OUT_STR(MPZ_OUT_STR)))
|
||||
CLEAR(mpz_clear), INIT_MOVE(M_COPY_A1_DEFAULT), OUT_STR(MPZ_OUT_STR)))
|
||||
|
||||
int main(void) {
|
||||
list_mpz_t a;
|
||||
@@ -1973,7 +1980,7 @@ Example:
|
||||
#define MPZ_OUT_STR(stream, x) mpz_out_str(stream, 0, x)
|
||||
LIST_DUAL_PUSH_DEF(list_mpz, mpz_t, \
|
||||
(INIT(mpz_init), INIT_SET(mpz_init_set), SET(mpz_set), \
|
||||
CLEAR(mpz_clear), OUT_STR(MPZ_OUT_STR)))
|
||||
CLEAR(mpz_clear), INIT_MOVE(M_COPY_A1_DEFAULT), OUT_STR(MPZ_OUT_STR)))
|
||||
|
||||
int main(void) {
|
||||
list_mpz_t a;
|
||||
@@ -2132,7 +2139,7 @@ Example:
|
||||
#define MPZ_OUT_STR(stream, x) mpz_out_str(stream, 0, x)
|
||||
ARRAY_DEF(array_mpz, mpz_t, \
|
||||
(INIT(mpz_init), INIT_SET(mpz_init_set), SET(mpz_set), \
|
||||
CLEAR(mpz_clear), OUT_STR(MPZ_OUT_STR)))
|
||||
CLEAR(mpz_clear), INIT_MOVE(M_COPY_A1_DEFAULT), OUT_STR(MPZ_OUT_STR)))
|
||||
|
||||
int main(void) {
|
||||
array_mpz_t a;
|
||||
@@ -2339,7 +2346,7 @@ Example:
|
||||
#include "m-deque.h"
|
||||
|
||||
DEQUE_DEF(deque_mpz, mpz_t, \
|
||||
(INIT(mpz_init), INIT_SET(mpz_init_set), SET(mpz_set), CLEAR(mpz_clear)))
|
||||
(INIT(mpz_init), INIT_SET(mpz_init_set), SET(mpz_set), CLEAR(mpz_clear), INIT_MOVE(M_COPY_A1_DEFAULT)))
|
||||
|
||||
int main(void) {
|
||||
deque_mpz_t a;
|
||||
|
||||
Reference in new issue
Block a user