aboutsummaryrefslogtreecommitdiff
path: root/Lib/mzscheme
diff options
context:
space:
mode:
authorAlistair Delva <adelva@google.com>2024-04-10 14:15:29 -0700
committerAlistair Delva <adelva@google.com>2024-04-11 12:58:28 -0700
commitd0f0f90be16c2ac553b5fa08512045273135147a (patch)
tree5d9ebb7a04807ea8a609ddd18b0162bc87530e4b /Lib/mzscheme
parent6ffc1dbf29ba98c4d8aa71ebc9b484e973fe1030 (diff)
downloadswig-master.tar.gz
Change-Id: I47cef2be94299220d80265d949a95b58eee2c23b
Diffstat (limited to 'Lib/mzscheme')
-rw-r--r--Lib/mzscheme/argcargv.i41
-rw-r--r--Lib/mzscheme/mzrun.swg68
-rw-r--r--Lib/mzscheme/std_auto_ptr.i39
-rw-r--r--Lib/mzscheme/std_map.i1130
-rw-r--r--Lib/mzscheme/std_string.i7
-rw-r--r--Lib/mzscheme/std_unique_ptr.i39
-rw-r--r--Lib/mzscheme/std_vector.i3
-rw-r--r--Lib/mzscheme/swigmove.i19
-rw-r--r--Lib/mzscheme/typemaps.i45
9 files changed, 240 insertions, 1151 deletions
diff --git a/Lib/mzscheme/argcargv.i b/Lib/mzscheme/argcargv.i
new file mode 100644
index 000000000..eec1e0d05
--- /dev/null
+++ b/Lib/mzscheme/argcargv.i
@@ -0,0 +1,41 @@
+/* -------------------------------------------------------------
+ * SWIG library containing argc and argv multi-argument typemaps
+ * ------------------------------------------------------------- */
+
+%typemap(in) (int ARGC, char **ARGV) {
+ $1_ltype i, len;
+ Scheme_Object **elems;
+ SWIG_contract_assert($input != (Scheme_Object *)NULL &&
+ $input != scheme_null &&
+ SCHEME_TYPE($input) == scheme_vector_type, "null array");
+ len = SCHEME_VEC_SIZE($input);
+ $1 = len;
+ $2 = ($2_ltype) SWIG_MzScheme_Malloc((size_t)(len+1)*sizeof($*2_ltype), FUNC_NAME);
+ elems = SCHEME_VEC_ELS($input);
+ for (i = 0; i < len; i++) {
+ SWIG_contract_assert(SCHEME_TYPE(elems[i]) == scheme_char_string_type,
+ "elements in array must be strings");
+ $2[i] = ($*2_ltype)SCHEME_STR_VAL(elems[i]);
+ }
+ $2[i] = NULL;
+}
+
+%typemap(typecheck, precedence=SWIG_TYPECHECK_STRING_ARRAY) (int ARGC, char **ARGV) {
+ if ($input != (Scheme_Object *)NULL && $input != scheme_null &&
+ SCHEME_TYPE($input) == scheme_vector_type) {
+ size_t len = SCHEME_VEC_SIZE($input);
+ size_t i;
+ Scheme_Object **elems = SCHEME_VEC_ELS($input);
+ for (i = 0; i < len; i++) {
+ if (SCHEME_TYPE(elems[i]) != scheme_char_string_type) {
+ break;
+ }
+ }
+ /* All elements are strings! */
+ $1 = (i == len);
+ }
+}
+
+%typemap(freearg) (int ARGC, char **ARGV) {
+ SWIG_free((void *)$2);
+}
diff --git a/Lib/mzscheme/mzrun.swg b/Lib/mzscheme/mzrun.swg
index c438c9ce8..8adae46b3 100644
--- a/Lib/mzscheme/mzrun.swg
+++ b/Lib/mzscheme/mzrun.swg
@@ -23,12 +23,15 @@ extern "C" {
SWIG_MzScheme_MustGetPtr(s, type, argnum, flags, FUNC_NAME, argc, argv)
#define SWIG_contract_assert(expr,msg) \
- if (!(expr)) { \
- char *m=(char *) scheme_malloc(strlen(msg)+1000); \
- sprintf(m,"SWIG contract, assertion failed: function=%s, message=%s", \
- (char *) FUNC_NAME,(char *) msg); \
- scheme_signal_error(m); \
- }
+ do { \
+ if (!(expr)) { \
+ size_t len=strlen(msg)+1000; \
+ char *m=(char *) scheme_malloc(len); \
+ SWIG_snprintf2(m, len, "SWIG contract, assertion failed: function=%s, message=%s", \
+ (char *) FUNC_NAME,(char *) msg); \
+ scheme_signal_error(m); \
+ } \
+ } while (0)
/* Runtime API */
#define SWIG_GetModule(clientdata) SWIG_MzScheme_GetModule((Scheme_Env *)(clientdata))
@@ -123,6 +126,7 @@ struct swig_mz_proxy {
Scheme_Type mztype;
swig_type_info *type;
void *object;
+ int own;
};
static Scheme_Type swig_type;
@@ -133,7 +137,7 @@ mz_free_swig(void *p, void *data) {
if (SCHEME_NULLP((Scheme_Object*)p) || SCHEME_TYPE((Scheme_Object*)p) != swig_type)
return;
if (proxy->type) {
- if (proxy->type->clientdata) {
+ if (proxy->type->clientdata && proxy->own) {
((Scheme_Prim *)proxy->type->clientdata)(1, (Scheme_Object **)&proxy);
}
}
@@ -141,42 +145,61 @@ mz_free_swig(void *p, void *data) {
static Scheme_Object *
SWIG_MzScheme_NewPointerObj(void *ptr, swig_type_info *type, int owner) {
- struct swig_mz_proxy *new_proxy;
- new_proxy = (struct swig_mz_proxy *) scheme_malloc(sizeof(struct swig_mz_proxy));
- new_proxy->mztype = swig_type;
- new_proxy->type = type;
- new_proxy->object = ptr;
- if (owner) {
- scheme_add_finalizer(new_proxy, mz_free_swig, NULL);
+ if (ptr) {
+ struct swig_mz_proxy *new_proxy;
+ new_proxy = (struct swig_mz_proxy *) scheme_malloc(sizeof(struct swig_mz_proxy));
+ new_proxy->mztype = swig_type;
+ new_proxy->type = type;
+ new_proxy->object = ptr;
+ new_proxy->own = owner & SWIG_POINTER_OWN;
+ if (new_proxy->own) {
+ scheme_add_finalizer(new_proxy, mz_free_swig, NULL);
+ }
+ return (Scheme_Object *) new_proxy;
+ } else {
+ return scheme_make_null();
}
- return (Scheme_Object *) new_proxy;
}
static int
SWIG_MzScheme_ConvertPtr(Scheme_Object *s, void **result, swig_type_info *type, int flags) {
swig_cast_info *cast;
+ int ret = SWIG_ERROR;
if (SCHEME_NULLP(s)) {
*result = NULL;
return (flags & SWIG_POINTER_NO_NULL) ? SWIG_NullReferenceError : SWIG_OK;
} else if (SCHEME_TYPE(s) == swig_type) {
struct swig_mz_proxy *proxy = (struct swig_mz_proxy *) s;
+
+ if ((flags & SWIG_POINTER_RELEASE) == SWIG_POINTER_RELEASE && !proxy->own) {
+ return SWIG_ERROR_RELEASE_NOT_OWNED;
+ }
+
if (type) {
cast = SWIG_TypeCheckStruct(proxy->type, type);
if (cast) {
int newmemory = 0;
*result = SWIG_TypeCast(cast, proxy->object, &newmemory);
assert(!newmemory); /* newmemory handling not yet implemented */
- return 0;
+ ret = SWIG_OK;
} else {
- return 1;
+ return SWIG_ERROR;
}
} else {
*result = proxy->object;
- return 0;
+ ret = SWIG_OK;
+ }
+
+ if (flags & SWIG_POINTER_DISOWN) {
+ scheme_subtract_finalizer(proxy, mz_free_swig, NULL);
+ proxy->own = 0;
+ }
+ if (flags & SWIG_POINTER_CLEAR) {
+ proxy->object = 0;
}
}
- return 1;
+ return ret;
}
static SWIGINLINE void *
@@ -195,7 +218,8 @@ SWIG_MzScheme_Malloc(size_t size, const char *func_name) {
void *p = malloc(size);
if (p == NULL) {
scheme_signal_error("swig-memory-error");
- } else return p;
+ }
+ return p;
}
static Scheme_Object *
@@ -398,10 +422,10 @@ SWIG_MzScheme_new_scheme_struct (Scheme_Env* env, const char* basename,
int L=strlen(mz_dynload_libpaths[k])+strlen("\\")+strlen(mz_dlopen_libraries[i])+1;
libp=(char *) malloc(L*sizeof(char));
#ifdef __OS_WIN32
- sprintf(libp,"%s\\%s",mz_dynload_libpaths[k],mz_dlopen_libraries[i]);
+ SWIG_snprintf2(libp,L,"%s\\%s",mz_dynload_libpaths[k],mz_dlopen_libraries[i]);
mz_libraries[i]=(void *) LoadLibrary(libp);
#else
- sprintf(libp,"%s/%s",mz_dynload_libpaths[k],mz_dlopen_libraries[i]);
+ SWIG_snprintf2(libp,L,"%s/%s",mz_dynload_libpaths[k],mz_dlopen_libraries[i]);
mz_libraries[i]=(void *) dlopen(libp,RTLD_LAZY);
#endif
if (mz_dynload_debug) {
diff --git a/Lib/mzscheme/std_auto_ptr.i b/Lib/mzscheme/std_auto_ptr.i
new file mode 100644
index 000000000..c61bc8b26
--- /dev/null
+++ b/Lib/mzscheme/std_auto_ptr.i
@@ -0,0 +1,39 @@
+/* -----------------------------------------------------------------------------
+ * std_auto_ptr.i
+ *
+ * SWIG library file for handling std::auto_ptr.
+ * Memory ownership is passed from the std::auto_ptr C++ layer to the proxy
+ * class when returning a std::auto_ptr from a function.
+ * Memory ownership is passed from the proxy class to the std::auto_ptr in the
+ * C++ layer when passed as a parameter to a wrapped function.
+ * ----------------------------------------------------------------------------- */
+
+%define %auto_ptr(TYPE)
+%typemap(in, noblock=1) std::auto_ptr< TYPE > (void *argp = 0, int res = 0) {
+ res = SWIG_ConvertPtr($input, &argp, $descriptor(TYPE *), SWIG_POINTER_RELEASE);
+ if (!SWIG_IsOK(res)) {
+ if (res == SWIG_ERROR_RELEASE_NOT_OWNED) {
+ scheme_signal_error(FUNC_NAME ": cannot release ownership as memory is not owned for argument $argnum of type 'TYPE *'");
+ } else {
+ %argument_fail(res, "TYPE *", $symname, $argnum);
+ }
+ }
+ $1.reset((TYPE *)argp);
+}
+
+%typemap (out) std::auto_ptr< TYPE > %{
+ %set_output(SWIG_NewPointerObj($1.release(), $descriptor(TYPE *), SWIG_POINTER_OWN));
+%}
+
+%typemap(typecheck, precedence=SWIG_TYPECHECK_POINTER, equivalent="TYPE *", noblock=1) std::auto_ptr< TYPE > {
+ void *vptr = 0;
+ int res = SWIG_ConvertPtr($input, &vptr, $descriptor(TYPE *), 0);
+ $1 = SWIG_CheckState(res);
+}
+
+%template() std::auto_ptr< TYPE >;
+%enddef
+
+namespace std {
+ template <class T> class auto_ptr {};
+}
diff --git a/Lib/mzscheme/std_map.i b/Lib/mzscheme/std_map.i
index 1d3eec241..4d312f56d 100644
--- a/Lib/mzscheme/std_map.i
+++ b/Lib/mzscheme/std_map.i
@@ -5,6 +5,7 @@
* ----------------------------------------------------------------------------- */
%include <std_common.i>
+%include <exception.i>
// ------------------------------------------------------------------------
// std::map
@@ -64,7 +65,11 @@ namespace std {
val = scheme_car(val);
x = (T*) SWIG_MustGetPtr(val,$descriptor(T *),$argnum, 0);
}
+%#ifdef __cpp_lib_map_try_emplace
+ (($1_type &)$1).insert_or_assign(*k, *x);
+%#else
(($1_type &)$1)[*k] = *x;
+%#endif
alist = scheme_cdr(alist);
}
} else {
@@ -100,7 +105,11 @@ namespace std {
val = scheme_car(val);
x = (T*) SWIG_MustGetPtr(val,$descriptor(T *),$argnum, 0);
}
+%#ifdef __cpp_lib_map_try_emplace
+ temp.insert_or_assign(*k, *x);
+%#else
temp[*k] = *x;
+%#endif
alist = scheme_cdr(alist);
}
} else {
@@ -242,7 +251,11 @@ namespace std {
throw std::out_of_range("key not found");
}
void __setitem__(const K& key, const T& x) {
+%#ifdef __cpp_lib_map_try_emplace
+ (*self).insert_or_assign(key, x);
+%#else
(*self)[key] = x;
+%#endif
}
void __delitem__(const K& key) throw (std::out_of_range) {
std::map< K, T, C >::iterator i = self->find(key);
@@ -268,1121 +281,4 @@ namespace std {
}
};
-
- // specializations for built-ins
-
- %define specialize_std_map_on_key(K,CHECK,CONVERT_FROM,CONVERT_TO)
-
- template<class T> class map< K, T, C > {
- %typemap(in) map< K, T, C > (std::map< K, T, C >* m) {
- if (SCHEME_NULLP($input)) {
- $1 = std::map< K, T, C >();
- } else if (SCHEME_PAIRP($input)) {
- $1 = std::map< K, T, C >();
- Scheme_Object* alist = $input;
- while (!SCHEME_NULLP(alist)) {
- T* x;
- Scheme_Object *entry, *key, *val;
- entry = scheme_car(alist);
- if (!SCHEME_PAIRP(entry))
- SWIG_exception(SWIG_TypeError,"alist expected");
- key = scheme_car(entry);
- val = scheme_cdr(entry);
- if (!CHECK(key))
- SWIG_exception(SWIG_TypeError,
- "map<" #K "," #T "," #C "> expected");
- if (SWIG_ConvertPtr(val,(void**) &x,
- $descriptor(T *), 0) == -1) {
- if (!SCHEME_PAIRP(val))
- SWIG_exception(SWIG_TypeError,"alist expected");
- val = scheme_car(val);
- x = (T*) SWIG_MustGetPtr(val,$descriptor(T *),$argnum, 0);
- }
- (($1_type &)$1)[CONVERT_FROM(key)] = *x;
- alist = scheme_cdr(alist);
- }
- } else {
- $1 = *(($&1_type)
- SWIG_MustGetPtr($input,$&1_descriptor,$argnum, 0));
- }
- }
- %typemap(in) const map< K, T, C >& (std::map< K, T, C > temp,
- std::map< K, T, C >* m),
- const map< K, T, C >* (std::map< K, T, C > temp,
- std::map< K, T, C >* m) {
- if (SCHEME_NULLP($input)) {
- temp = std::map< K, T, C >();
- $1 = &temp;
- } else if (SCHEME_PAIRP($input)) {
- temp = std::map< K, T, C >();
- $1 = &temp;
- Scheme_Object* alist = $input;
- while (!SCHEME_NULLP(alist)) {
- T* x;
- Scheme_Object *entry, *key, *val;
- entry = scheme_car(alist);
- if (!SCHEME_PAIRP(entry))
- SWIG_exception(SWIG_TypeError,"alist expected");
- key = scheme_car(entry);
- val = scheme_cdr(entry);
- if (!CHECK(key))
- SWIG_exception(SWIG_TypeError,
- "map<" #K "," #T "," #C "> expected");
- if (SWIG_ConvertPtr(val,(void**) &x,
- $descriptor(T *), 0) == -1) {
- if (!SCHEME_PAIRP(val))
- SWIG_exception(SWIG_TypeError,"alist expected");
- val = scheme_car(val);
- x = (T*) SWIG_MustGetPtr(val,$descriptor(T *),$argnum, 0);
- }
- temp[CONVERT_FROM(key)] = *x;
- alist = scheme_cdr(alist);
- }
- } else {
- $1 = ($1_ltype) SWIG_MustGetPtr($input,$1_descriptor,$argnum, 0);
- }
- }
- %typemap(out) map< K, T, C > {
- Scheme_Object* alist = scheme_null;
- for (std::map< K, T, C >::reverse_iterator i=$1.rbegin();
- i!=$1.rend(); ++i) {
- T* val = new T(i->second);
- Scheme_Object* k = CONVERT_TO(i->first);
- Scheme_Object* x = SWIG_NewPointerObj(val,$descriptor(T *), 1);
- Scheme_Object* entry = scheme_make_pair(k,x);
- alist = scheme_make_pair(entry,alist);
- }
- $result = alist;
- }
- %typecheck(SWIG_TYPECHECK_MAP) map< K, T, C > {
- // native sequence?
- if (SCHEME_NULLP($input)) {
- /* an empty sequence can be of any type */
- $1 = 1;
- } else if (SCHEME_PAIRP($input)) {
- // check the first element only
- T* x;
- Scheme_Object* head = scheme_car($input);
- if (SCHEME_PAIRP(head)) {
- Scheme_Object* key = scheme_car(head);
- Scheme_Object* val = scheme_cdr(head);
- if (!CHECK(key)) {
- $1 = 0;
- } else {
- if (SWIG_ConvertPtr(val,(void**) &x,
- $descriptor(T *), 0) != -1) {
- $1 = 1;
- } else if (SCHEME_PAIRP(val)) {
- val = scheme_car(val);
- if (SWIG_ConvertPtr(val,(void**) &x,
- $descriptor(T *), 0) != -1)
- $1 = 1;
- else
- $1 = 0;
- } else {
- $1 = 0;
- }
- }
- } else {
- $1 = 0;
- }
- } else {
- // wrapped map?
- std::map< K, T, C >* m;
- if (SWIG_ConvertPtr($input,(void **) &m,
- $&1_descriptor, 0) != -1)
- $1 = 1;
- else
- $1 = 0;
- }
- }
- %typecheck(SWIG_TYPECHECK_MAP) const map< K, T, C >&,
- const map< K, T, C >* {
- // native sequence?
- if (SCHEME_NULLP($input)) {
- /* an empty sequence can be of any type */
- $1 = 1;
- } else if (SCHEME_PAIRP($input)) {
- // check the first element only
- T* x;
- Scheme_Object* head = scheme_car($input);
- if (SCHEME_PAIRP(head)) {
- Scheme_Object* key = scheme_car(head);
- Scheme_Object* val = scheme_cdr(head);
- if (!CHECK(key)) {
- $1 = 0;
- } else {
- if (SWIG_ConvertPtr(val,(void**) &x,
- $descriptor(T *), 0) != -1) {
- $1 = 1;
- } else if (SCHEME_PAIRP(val)) {
- val = scheme_car(val);
- if (SWIG_ConvertPtr(val,(void**) &x,
- $descriptor(T *), 0) != -1)
- $1 = 1;
- else
- $1 = 0;
- } else {
- $1 = 0;
- }
- }
- } else {
- $1 = 0;
- }
- } else {
- // wrapped map?
- std::map< K, T, C >* m;
- if (SWIG_ConvertPtr($input,(void **) &m,
- $1_descriptor, 0) != -1)
- $1 = 1;
- else
- $1 = 0;
- }
- }
- %rename("length") size;
- %rename("null?") empty;
- %rename("clear!") clear;
- %rename("ref") __getitem__;
- %rename("set!") __setitem__;
- %rename("delete!") __delitem__;
- %rename("has-key?") has_key;
- public:
- typedef size_t size_type;
- typedef ptrdiff_t difference_type;
- typedef K key_type;
- typedef T mapped_type;
- typedef std::pair< const K, T > value_type;
- typedef value_type* pointer;
- typedef const value_type* const_pointer;
- typedef value_type& reference;
- typedef const value_type& const_reference;
-
- map();
- map(const map& other);
-
- unsigned int size() const;
- bool empty() const;
- void clear();
- %extend {
- T& __getitem__(K key) throw (std::out_of_range) {
- std::map< K, T, C >::iterator i = self->find(key);
- if (i != self->end())
- return i->second;
- else
- throw std::out_of_range("key not found");
- }
- void __setitem__(K key, const T& x) {
- (*self)[key] = x;
- }
- void __delitem__(K key) throw (std::out_of_range) {
- std::map< K, T, C >::iterator i = self->find(key);
- if (i != self->end())
- self->erase(i);
- else
- throw std::out_of_range("key not found");
- }
- bool has_key(K key) {
- std::map< K, T, C >::iterator i = self->find(key);
- return i != self->end();
- }
- Scheme_Object* keys() {
- Scheme_Object* result = scheme_null;
- for (std::map< K, T, C >::reverse_iterator i=self->rbegin();
- i!=self->rend(); ++i) {
- Scheme_Object* k = CONVERT_TO(i->first);
- result = scheme_make_pair(k,result);
- }
- return result;
- }
- }
- };
- %enddef
-
- %define specialize_std_map_on_value(T,CHECK,CONVERT_FROM,CONVERT_TO)
- template<class K> class map< K, T, C > {
- %typemap(in) map< K, T, C > (std::map< K, T, C >* m) {
- if (SCHEME_NULLP($input)) {
- $1 = std::map< K, T, C >();
- } else if (SCHEME_PAIRP($input)) {
- $1 = std::map< K, T, C >();
- Scheme_Object* alist = $input;
- while (!SCHEME_NULLP(alist)) {
- K* k;
- Scheme_Object *entry, *key, *val;
- entry = scheme_car(alist);
- if (!SCHEME_PAIRP(entry))
- SWIG_exception(SWIG_TypeError,"alist expected");
- key = scheme_car(entry);
- val = scheme_cdr(entry);
- k = (K*) SWIG_MustGetPtr(key,$descriptor(K *),$argnum, 0);
- if (!CHECK(val)) {
- if (!SCHEME_PAIRP(val))
- SWIG_exception(SWIG_TypeError,"alist expected");
- val = scheme_car(val);
- if (!CHECK(val))
- SWIG_exception(SWIG_TypeError,
- "map<" #K "," #T "," #C "> expected");
- }
- (($1_type &)$1)[*k] = CONVERT_FROM(val);
- alist = scheme_cdr(alist);
- }
- } else {
- $1 = *(($&1_type)
- SWIG_MustGetPtr($input,$&1_descriptor,$argnum, 0));
- }
- }
- %typemap(in) const map< K, T, C >& (std::map< K, T, C > temp,
- std::map< K, T, C >* m),
- const map< K, T, C >* (std::map< K, T, C > temp,
- std::map< K, T, C >* m) {
- if (SCHEME_NULLP($input)) {
- temp = std::map< K, T, C >();
- $1 = &temp;
- } else if (SCHEME_PAIRP($input)) {
- temp = std::map< K, T, C >();
- $1 = &temp;
- Scheme_Object* alist = $input;
- while (!SCHEME_NULLP(alist)) {
- K* k;
- Scheme_Object *entry, *key, *val;
- entry = scheme_car(alist);
- if (!SCHEME_PAIRP(entry))
- SWIG_exception(SWIG_TypeError,"alist expected");
- key = scheme_car(entry);
- val = scheme_cdr(entry);
- k = (K*) SWIG_MustGetPtr(key,$descriptor(K *),$argnum, 0);
- if (!CHECK(val)) {
- if (!SCHEME_PAIRP(val))
- SWIG_exception(SWIG_TypeError,"alist expected");
- val = scheme_car(val);
- if (!CHECK(val))
- SWIG_exception(SWIG_TypeError,
- "map<" #K "," #T "," #C "> expected");
- }
- temp[*k] = CONVERT_FROM(val);
- alist = scheme_cdr(alist);
- }
- } else {
- $1 = ($1_ltype) SWIG_MustGetPtr($input,$1_descriptor,$argnum, 0);
- }
- }
- %typemap(out) map< K, T, C > {
- Scheme_Object* alist = scheme_null;
- for (std::map< K, T, C >::reverse_iterator i=$1.rbegin();
- i!=$1.rend(); ++i) {
- K* key = new K(i->first);
- Scheme_Object* k = SWIG_NewPointerObj(key,$descriptor(K *), 1);
- Scheme_Object* x = CONVERT_TO(i->second);
- Scheme_Object* entry = scheme_make_pair(k,x);
- alist = scheme_make_pair(entry,alist);
- }
- $result = alist;
- }
- %typecheck(SWIG_TYPECHECK_MAP) map< K, T, C > {
- // native sequence?
- if (SCHEME_NULLP($input)) {
- /* an empty sequence can be of any type */
- $1 = 1;
- } else if (SCHEME_PAIRP($input)) {
- // check the first element only
- K* k;
- Scheme_Object* head = scheme_car($input);
- if (SCHEME_PAIRP(head)) {
- Scheme_Object* key = scheme_car(head);
- Scheme_Object* val = scheme_cdr(head);
- if (SWIG_ConvertPtr(val,(void **) &k,
- $descriptor(K *), 0) == -1) {
- $1 = 0;
- } else {
- if (CHECK(val)) {
- $1 = 1;
- } else if (SCHEME_PAIRP(val)) {
- val = scheme_car(val);
- if (CHECK(val))
- $1 = 1;
- else
- $1 = 0;
- } else {
- $1 = 0;
- }
- }
- } else {
- $1 = 0;
- }
- } else {
- // wrapped map?
- std::map< K, T, C >* m;
- if (SWIG_ConvertPtr($input,(void **) &m,
- $&1_descriptor, 0) != -1)
- $1 = 1;
- else
- $1 = 0;
- }
- }
- %typecheck(SWIG_TYPECHECK_MAP) const map< K, T, C >&,
- const map< K, T, C >* {
- // native sequence?
- if (SCHEME_NULLP($input)) {
- /* an empty sequence can be of any type */
- $1 = 1;
- } else if (SCHEME_PAIRP($input)) {
- // check the first element only
- K* k;
- Scheme_Object* head = scheme_car($input);
- if (SCHEME_PAIRP(head)) {
- Scheme_Object* key = scheme_car(head);
- Scheme_Object* val = scheme_cdr(head);
- if (SWIG_ConvertPtr(val,(void **) &k,
- $descriptor(K *), 0) == -1) {
- $1 = 0;
- } else {
- if (CHECK(val)) {
- $1 = 1;
- } else if (SCHEME_PAIRP(val)) {
- val = scheme_car(val);
- if (CHECK(val))
- $1 = 1;
- else
- $1 = 0;
- } else {
- $1 = 0;
- }
- }
- } else {
- $1 = 0;
- }
- } else {
- // wrapped map?
- std::map< K, T, C >* m;
- if (SWIG_ConvertPtr($input,(void **) &m,
- $1_descriptor, 0) != -1)
- $1 = 1;
- else
- $1 = 0;
- }
- }
- %rename("length") size;
- %rename("null?") empty;
- %rename("clear!") clear;
- %rename("ref") __getitem__;
- %rename("set!") __setitem__;
- %rename("delete!") __delitem__;
- %rename("has-key?") has_key;
- public:
- typedef size_t size_type;
- typedef ptrdiff_t difference_type;
- typedef K key_type;
- typedef T mapped_type;
- typedef std::pair< const K, T > value_type;
- typedef value_type* pointer;
- typedef const value_type* const_pointer;
- typedef value_type& reference;
- typedef const value_type& const_reference;
-
- map();
- map(const map& other);
-
- unsigned int size() const;
- bool empty() const;
- void clear();
- %extend {
- T __getitem__(const K& key) throw (std::out_of_range) {
- std::map< K, T, C >::iterator i = self->find(key);
- if (i != self->end())
- return i->second;
- else
- throw std::out_of_range("key not found");
- }
- void __setitem__(const K& key, T x) {
- (*self)[key] = x;
- }
- void __delitem__(const K& key) throw (std::out_of_range) {
- std::map< K, T, C >::iterator i = self->find(key);
- if (i != self->end())
- self->erase(i);
- else
- throw std::out_of_range("key not found");
- }
- bool has_key(const K& key) {
- std::map< K, T, C >::iterator i = self->find(key);
- return i != self->end();
- }
- Scheme_Object* keys() {
- Scheme_Object* result = scheme_null;
- for (std::map< K, T, C >::reverse_iterator i=self->rbegin();
- i!=self->rend(); ++i) {
- K* key = new K(i->first);
- Scheme_Object* k = SWIG_NewPointerObj(key,$descriptor(K *), 1);
- result = scheme_make_pair(k,result);
- }
- return result;
- }
- }
- };
- %enddef
-
- %define specialize_std_map_on_both(K,CHECK_K,CONVERT_K_FROM,CONVERT_K_TO,
- T,CHECK_T,CONVERT_T_FROM,CONVERT_T_TO)
- template<> class map< K, T, C > {
- %typemap(in) map< K, T, C > (std::map< K, T, C >* m) {
- if (SCHEME_NULLP($input)) {
- $1 = std::map< K, T, C >();
- } else if (SCHEME_PAIRP($input)) {
- $1 = std::map< K, T, C >();
- Scheme_Object* alist = $input;
- while (!SCHEME_NULLP(alist)) {
- Scheme_Object *entry, *key, *val;
- entry = scheme_car(alist);
- if (!SCHEME_PAIRP(entry))
- SWIG_exception(SWIG_TypeError,"alist expected");
- key = scheme_car(entry);
- val = scheme_cdr(entry);
- if (!CHECK_K(key))
- SWIG_exception(SWIG_TypeError,
- "map<" #K "," #T "," #C "> expected");
- if (!CHECK_T(val)) {
- if (!SCHEME_PAIRP(val))
- SWIG_exception(SWIG_TypeError,"alist expected");
- val = scheme_car(val);
- if (!CHECK_T(val))
- SWIG_exception(SWIG_TypeError,
- "map<" #K "," #T "," #C "> expected");
- }
- (($1_type &)$1)[CONVERT_K_FROM(key)] =
- CONVERT_T_FROM(val);
- alist = scheme_cdr(alist);
- }
- } else {
- $1 = *(($&1_type)
- SWIG_MustGetPtr($input,$&1_descriptor,$argnum, 0));
- }
- }
- %typemap(in) const map< K, T, C >& (std::map< K, T, C > temp,
- std::map< K, T, C >* m),
- const map< K, T, C >* (std::map< K, T, C > temp,
- std::map< K, T, C >* m) {
- if (SCHEME_NULLP($input)) {
- temp = std::map< K, T, C >();
- $1 = &temp;
- } else if (SCHEME_PAIRP($input)) {
- temp = std::map< K, T, C >();
- $1 = &temp;
- Scheme_Object* alist = $input;
- while (!SCHEME_NULLP(alist)) {
- Scheme_Object *entry, *key, *val;
- entry = scheme_car(alist);
- if (!SCHEME_PAIRP(entry))
- SWIG_exception(SWIG_TypeError,"alist expected");
- key = scheme_car(entry);
- val = scheme_cdr(entry);
- if (!CHECK_K(key))
- SWIG_exception(SWIG_TypeError,
- "map<" #K "," #T "," #C "> expected");
- if (!CHECK_T(val)) {
- if (!SCHEME_PAIRP(val))
- SWIG_exception(SWIG_TypeError,"alist expected");
- val = scheme_car(val);
- if (!CHECK_T(val))
- SWIG_exception(SWIG_TypeError,
- "map<" #K "," #T "," #C "> expected");
- }
- temp[CONVERT_K_FROM(key)] = CONVERT_T_FROM(val);
- alist = scheme_cdr(alist);
- }
- } else {
- $1 = ($1_ltype) SWIG_MustGetPtr($input,$1_descriptor,$argnum, 0);
- }
- }
- %typemap(out) map< K, T, C > {
- Scheme_Object* alist = scheme_null;
- for (std::map< K, T, C >::reverse_iterator i=$1.rbegin();
- i!=$1.rend(); ++i) {
- Scheme_Object* k = CONVERT_K_TO(i->first);
- Scheme_Object* x = CONVERT_T_TO(i->second);
- Scheme_Object* entry = scheme_make_pair(k,x);
- alist = scheme_make_pair(entry,alist);
- }
- $result = alist;
- }
- %typecheck(SWIG_TYPECHECK_MAP) map< K, T, C > {
- // native sequence?
- if (SCHEME_NULLP($input)) {
- /* an empty sequence can be of any type */
- $1 = 1;
- } else if (SCHEME_PAIRP($input)) {
- // check the first element only
- Scheme_Object* head = scheme_car($input);
- if (SCHEME_PAIRP(head)) {
- Scheme_Object* key = scheme_car(head);
- Scheme_Object* val = scheme_cdr(head);
- if (!CHECK_K(key)) {
- $1 = 0;
- } else {
- if (CHECK_T(val)) {
- $1 = 1;
- } else if (SCHEME_PAIRP(val)) {
- val = scheme_car(val);
- if (CHECK_T(val))
- $1 = 1;
- else
- $1 = 0;
- } else {
- $1 = 0;
- }
- }
- } else {
- $1 = 0;
- }
- } else {
- // wrapped map?
- std::map< K, T, C >* m;
- if (SWIG_ConvertPtr($input,(void **) &m,
- $&1_descriptor, 0) != -1)
- $1 = 1;
- else
- $1 = 0;
- }
- }
- %typecheck(SWIG_TYPECHECK_MAP) const map< K, T, C >&,
- const map< K, T, C >* {
- // native sequence?
- if (SCHEME_NULLP($input)) {
- /* an empty sequence can be of any type */
- $1 = 1;
- } else if (SCHEME_PAIRP($input)) {
- // check the first element only
- Scheme_Object* head = scheme_car($input);
- if (SCHEME_PAIRP(head)) {
- Scheme_Object* key = scheme_car(head);
- Scheme_Object* val = scheme_cdr(head);
- if (!CHECK_K(key)) {
- $1 = 0;
- } else {
- if (CHECK_T(val)) {
- $1 = 1;
- } else if (SCHEME_PAIRP(val)) {
- val = scheme_car(val);
- if (CHECK_T(val))
- $1 = 1;
- else
- $1 = 0;
- } else {
- $1 = 0;
- }
- }
- } else {
- $1 = 0;
- }
- } else {
- // wrapped map?
- std::map< K, T, C >* m;
- if (SWIG_ConvertPtr($input,(void **) &m,
- $1_descriptor, 0) != -1)
- $1 = 1;
- else
- $1 = 0;
- }
- }
- %rename("length") size;
- %rename("null?") empty;
- %rename("clear!") clear;
- %rename("ref") __getitem__;
- %rename("set!") __setitem__;
- %rename("delete!") __delitem__;
- %rename("has-key?") has_key;
- public:
- typedef size_t size_type;
- typedef ptrdiff_t difference_type;
- typedef K key_type;
- typedef T mapped_type;
- typedef std::pair< const K, T > value_type;
- typedef value_type* pointer;
- typedef const value_type* const_pointer;
- typedef value_type& reference;
- typedef const value_type& const_reference;
-
- map();
- map(const map& other);
-
- unsigned int size() const;
- bool empty() const;
- void clear();
- %extend {
- T __getitem__(K key) throw (std::out_of_range) {
- std::map< K, T, C >::iterator i = self->find(key);
- if (i != self->end())
- return i->second;
- else
- throw std::out_of_range("key not found");
- }
- void __setitem__(K key, T x) {
- (*self)[key] = x;
- }
- void __delitem__(K key) throw (std::out_of_range) {
- std::map< K, T, C >::iterator i = self->find(key);
- if (i != self->end())
- self->erase(i);
- else
- throw std::out_of_range("key not found");
- }
- bool has_key(K key) {
- std::map< K, T, C >::iterator i = self->find(key);
- return i != self->end();
- }
- Scheme_Object* keys() {
- Scheme_Object* result = scheme_null;
- for (std::map< K, T, C >::reverse_iterator i=self->rbegin();
- i!=self->rend(); ++i) {
- Scheme_Object* k = CONVERT_K_TO(i->first);
- result = scheme_make_pair(k,result);
- }
- return result;
- }
- }
- };
- %enddef
-
-
- specialize_std_map_on_key(bool,SCHEME_BOOLP,
- SCHEME_TRUEP,swig_make_boolean);
- specialize_std_map_on_key(int,SCHEME_INTP,
- SCHEME_INT_VAL,scheme_make_integer_value);
- specialize_std_map_on_key(short,SCHEME_INTP,
- SCHEME_INT_VAL,scheme_make_integer_value);
- specialize_std_map_on_key(long,SCHEME_INTP,
- SCHEME_INT_VAL,scheme_make_integer_value);
- specialize_std_map_on_key(unsigned int,SCHEME_INTP,
- SCHEME_INT_VAL,scheme_make_integer_value);
- specialize_std_map_on_key(unsigned short,SCHEME_INTP,
- SCHEME_INT_VAL,scheme_make_integer_value);
- specialize_std_map_on_key(unsigned long,SCHEME_INTP,
- SCHEME_INT_VAL,scheme_make_integer_value);
- specialize_std_map_on_key(double,SCHEME_REALP,
- scheme_real_to_double,scheme_make_double);
- specialize_std_map_on_key(float,SCHEME_REALP,
- scheme_real_to_double,scheme_make_double);
- specialize_std_map_on_key(std::string,SCHEME_STRINGP,
- swig_scm_to_string,swig_make_string);
-
- specialize_std_map_on_value(bool,SCHEME_BOOLP,
- SCHEME_TRUEP,swig_make_boolean);
- specialize_std_map_on_value(int,SCHEME_INTP,
- SCHEME_INT_VAL,scheme_make_integer_value);
- specialize_std_map_on_value(short,SCHEME_INTP,
- SCHEME_INT_VAL,scheme_make_integer_value);
- specialize_std_map_on_value(long,SCHEME_INTP,
- SCHEME_INT_VAL,scheme_make_integer_value);
- specialize_std_map_on_value(unsigned int,SCHEME_INTP,
- SCHEME_INT_VAL,scheme_make_integer_value);
- specialize_std_map_on_value(unsigned short,SCHEME_INTP,
- SCHEME_INT_VAL,scheme_make_integer_value);
- specialize_std_map_on_value(unsigned long,SCHEME_INTP,
- SCHEME_INT_VAL,scheme_make_integer_value);
- specialize_std_map_on_value(double,SCHEME_REALP,
- scheme_real_to_double,scheme_make_double);
- specialize_std_map_on_value(float,SCHEME_REALP,
- scheme_real_to_double,scheme_make_double);
- specialize_std_map_on_value(std::string,SCHEME_STRINGP,
- swig_scm_to_string,swig_make_string);
-
- specialize_std_map_on_both(bool,SCHEME_BOOLP,
- SCHEME_TRUEP,swig_make_boolean,
- bool,SCHEME_BOOLP,
- SCHEME_TRUEP,swig_make_boolean);
- specialize_std_map_on_both(bool,SCHEME_BOOLP,
- SCHEME_TRUEP,swig_make_boolean,
- int,SCHEME_INTP,
- SCHEME_INT_VAL,scheme_make_integer_value);
- specialize_std_map_on_both(bool,SCHEME_BOOLP,
- SCHEME_TRUEP,swig_make_boolean,
- short,SCHEME_INTP,
- SCHEME_INT_VAL,scheme_make_integer_value);
- specialize_std_map_on_both(bool,SCHEME_BOOLP,
- SCHEME_TRUEP,swig_make_boolean,
- long,SCHEME_INTP,
- SCHEME_INT_VAL,scheme_make_integer_value);
- specialize_std_map_on_both(bool,SCHEME_BOOLP,
- SCHEME_TRUEP,swig_make_boolean,
- unsigned int,SCHEME_INTP,
- SCHEME_INT_VAL,scheme_make_integer_value);
- specialize_std_map_on_both(bool,SCHEME_BOOLP,
- SCHEME_TRUEP,swig_make_boolean,
- unsigned short,SCHEME_INTP,
- SCHEME_INT_VAL,scheme_make_integer_value);
- specialize_std_map_on_both(bool,SCHEME_BOOLP,
- SCHEME_TRUEP,swig_make_boolean,
- unsigned long,SCHEME_INTP,
- SCHEME_INT_VAL,scheme_make_integer_value);
- specialize_std_map_on_both(bool,SCHEME_BOOLP,
- SCHEME_TRUEP,swig_make_boolean,
- double,SCHEME_REALP,
- scheme_real_to_double,scheme_make_double);
- specialize_std_map_on_both(bool,SCHEME_BOOLP,
- SCHEME_TRUEP,swig_make_boolean,
- float,SCHEME_REALP,
- scheme_real_to_double,scheme_make_double);
- specialize_std_map_on_both(bool,SCHEME_BOOLP,
- SCHEME_TRUEP,swig_make_boolean,
- std::string,SCHEME_STRINGP,
- swig_scm_to_string,swig_make_string);
- specialize_std_map_on_both(int,SCHEME_INTP,
- SCHEME_INT_VAL,scheme_make_integer_value,
- bool,SCHEME_BOOLP,
- SCHEME_TRUEP,swig_make_boolean);
- specialize_std_map_on_both(int,SCHEME_INTP,
- SCHEME_INT_VAL,scheme_make_integer_value,
- int,SCHEME_INTP,
- SCHEME_INT_VAL,scheme_make_integer_value);
- specialize_std_map_on_both(int,SCHEME_INTP,
- SCHEME_INT_VAL,scheme_make_integer_value,
- short,SCHEME_INTP,
- SCHEME_INT_VAL,scheme_make_integer_value);
- specialize_std_map_on_both(int,SCHEME_INTP,
- SCHEME_INT_VAL,scheme_make_integer_value,
- long,SCHEME_INTP,
- SCHEME_INT_VAL,scheme_make_integer_value);
- specialize_std_map_on_both(int,SCHEME_INTP,
- SCHEME_INT_VAL,scheme_make_integer_value,
- unsigned int,SCHEME_INTP,
- SCHEME_INT_VAL,scheme_make_integer_value);
- specialize_std_map_on_both(int,SCHEME_INTP,
- SCHEME_INT_VAL,scheme_make_integer_value,
- unsigned short,SCHEME_INTP,
- SCHEME_INT_VAL,scheme_make_integer_value);
- specialize_std_map_on_both(int,SCHEME_INTP,
- SCHEME_INT_VAL,scheme_make_integer_value,
- unsigned long,SCHEME_INTP,
- SCHEME_INT_VAL,scheme_make_integer_value);
- specialize_std_map_on_both(int,SCHEME_INTP,
- SCHEME_INT_VAL,scheme_make_integer_value,
- double,SCHEME_REALP,
- scheme_real_to_double,scheme_make_double);
- specialize_std_map_on_both(int,SCHEME_INTP,
- SCHEME_INT_VAL,scheme_make_integer_value,
- float,SCHEME_REALP,
- scheme_real_to_double,scheme_make_double);
- specialize_std_map_on_both(int,SCHEME_INTP,
- SCHEME_INT_VAL,scheme_make_integer_value,
- std::string,SCHEME_STRINGP,
- swig_scm_to_string,swig_make_string);
- specialize_std_map_on_both(short,SCHEME_INTP,
- SCHEME_INT_VAL,scheme_make_integer_value,
- bool,SCHEME_BOOLP,
- SCHEME_TRUEP,swig_make_boolean);
- specialize_std_map_on_both(short,SCHEME_INTP,
- SCHEME_INT_VAL,scheme_make_integer_value,
- int,SCHEME_INTP,
- SCHEME_INT_VAL,scheme_make_integer_value);
- specialize_std_map_on_both(short,SCHEME_INTP,
- SCHEME_INT_VAL,scheme_make_integer_value,
- short,SCHEME_INTP,
- SCHEME_INT_VAL,scheme_make_integer_value);
- specialize_std_map_on_both(short,SCHEME_INTP,
- SCHEME_INT_VAL,scheme_make_integer_value,
- long,SCHEME_INTP,
- SCHEME_INT_VAL,scheme_make_integer_value);
- specialize_std_map_on_both(short,SCHEME_INTP,
- SCHEME_INT_VAL,scheme_make_integer_value,
- unsigned int,SCHEME_INTP,
- SCHEME_INT_VAL,scheme_make_integer_value);
- specialize_std_map_on_both(short,SCHEME_INTP,
- SCHEME_INT_VAL,scheme_make_integer_value,
- unsigned short,SCHEME_INTP,
- SCHEME_INT_VAL,scheme_make_integer_value);
- specialize_std_map_on_both(short,SCHEME_INTP,
- SCHEME_INT_VAL,scheme_make_integer_value,
- unsigned long,SCHEME_INTP,
- SCHEME_INT_VAL,scheme_make_integer_value);
- specialize_std_map_on_both(short,SCHEME_INTP,
- SCHEME_INT_VAL,scheme_make_integer_value,
- double,SCHEME_REALP,
- scheme_real_to_double,scheme_make_double);
- specialize_std_map_on_both(short,SCHEME_INTP,
- SCHEME_INT_VAL,scheme_make_integer_value,
- float,SCHEME_REALP,
- scheme_real_to_double,scheme_make_double);
- specialize_std_map_on_both(short,SCHEME_INTP,
- SCHEME_INT_VAL,scheme_make_integer_value,
- std::string,SCHEME_STRINGP,
- swig_scm_to_string,swig_make_string);
- specialize_std_map_on_both(long,SCHEME_INTP,
- SCHEME_INT_VAL,scheme_make_integer_value,
- bool,SCHEME_BOOLP,
- SCHEME_TRUEP,swig_make_boolean);
- specialize_std_map_on_both(long,SCHEME_INTP,
- SCHEME_INT_VAL,scheme_make_integer_value,
- int,SCHEME_INTP,
- SCHEME_INT_VAL,scheme_make_integer_value);
- specialize_std_map_on_both(long,SCHEME_INTP,
- SCHEME_INT_VAL,scheme_make_integer_value,
- short,SCHEME_INTP,
- SCHEME_INT_VAL,scheme_make_integer_value);
- specialize_std_map_on_both(long,SCHEME_INTP,
- SCHEME_INT_VAL,scheme_make_integer_value,
- long,SCHEME_INTP,
- SCHEME_INT_VAL,scheme_make_integer_value);
- specialize_std_map_on_both(long,SCHEME_INTP,
- SCHEME_INT_VAL,scheme_make_integer_value,
- unsigned int,SCHEME_INTP,
- SCHEME_INT_VAL,scheme_make_integer_value);
- specialize_std_map_on_both(long,SCHEME_INTP,
- SCHEME_INT_VAL,scheme_make_integer_value,
- unsigned short,SCHEME_INTP,
- SCHEME_INT_VAL,scheme_make_integer_value);
- specialize_std_map_on_both(long,SCHEME_INTP,
- SCHEME_INT_VAL,scheme_make_integer_value,
- unsigned long,SCHEME_INTP,
- SCHEME_INT_VAL,scheme_make_integer_value);
- specialize_std_map_on_both(long,SCHEME_INTP,
- SCHEME_INT_VAL,scheme_make_integer_value,
- double,SCHEME_REALP,
- scheme_real_to_double,scheme_make_double);
- specialize_std_map_on_both(long,SCHEME_INTP,
- SCHEME_INT_VAL,scheme_make_integer_value,
- float,SCHEME_REALP,
- scheme_real_to_double,scheme_make_double);
- specialize_std_map_on_both(long,SCHEME_INTP,
- SCHEME_INT_VAL,scheme_make_integer_value,
- std::string,SCHEME_STRINGP,
- swig_scm_to_string,swig_make_string);
- specialize_std_map_on_both(unsigned int,SCHEME_INTP,
- SCHEME_INT_VAL,scheme_make_integer_value,
- bool,SCHEME_BOOLP,
- SCHEME_TRUEP,swig_make_boolean);
- specialize_std_map_on_both(unsigned int,SCHEME_INTP,
- SCHEME_INT_VAL,scheme_make_integer_value,
- int,SCHEME_INTP,
- SCHEME_INT_VAL,scheme_make_integer_value);
- specialize_std_map_on_both(unsigned int,SCHEME_INTP,
- SCHEME_INT_VAL,scheme_make_integer_value,
- short,SCHEME_INTP,
- SCHEME_INT_VAL,scheme_make_integer_value);
- specialize_std_map_on_both(unsigned int,SCHEME_INTP,
- SCHEME_INT_VAL,scheme_make_integer_value,
- long,SCHEME_INTP,
- SCHEME_INT_VAL,scheme_make_integer_value);
- specialize_std_map_on_both(unsigned int,SCHEME_INTP,
- SCHEME_INT_VAL,scheme_make_integer_value,
- unsigned int,SCHEME_INTP,
- SCHEME_INT_VAL,scheme_make_integer_value);
- specialize_std_map_on_both(unsigned int,SCHEME_INTP,
- SCHEME_INT_VAL,scheme_make_integer_value,
- unsigned short,SCHEME_INTP,
- SCHEME_INT_VAL,scheme_make_integer_value);
- specialize_std_map_on_both(unsigned int,SCHEME_INTP,
- SCHEME_INT_VAL,scheme_make_integer_value,
- unsigned long,SCHEME_INTP,
- SCHEME_INT_VAL,scheme_make_integer_value);
- specialize_std_map_on_both(unsigned int,SCHEME_INTP,
- SCHEME_INT_VAL,scheme_make_integer_value,
- double,SCHEME_REALP,
- scheme_real_to_double,scheme_make_double);
- specialize_std_map_on_both(unsigned int,SCHEME_INTP,
- SCHEME_INT_VAL,scheme_make_integer_value,
- float,SCHEME_REALP,
- scheme_real_to_double,scheme_make_double);
- specialize_std_map_on_both(unsigned int,SCHEME_INTP,
- SCHEME_INT_VAL,scheme_make_integer_value,
- std::string,SCHEME_STRINGP,
- swig_scm_to_string,swig_make_string);
- specialize_std_map_on_both(unsigned short,SCHEME_INTP,
- SCHEME_INT_VAL,scheme_make_integer_value,
- bool,SCHEME_BOOLP,
- SCHEME_TRUEP,swig_make_boolean);
- specialize_std_map_on_both(unsigned short,SCHEME_INTP,
- SCHEME_INT_VAL,scheme_make_integer_value,
- int,SCHEME_INTP,
- SCHEME_INT_VAL,scheme_make_integer_value);
- specialize_std_map_on_both(unsigned short,SCHEME_INTP,
- SCHEME_INT_VAL,scheme_make_integer_value,
- short,SCHEME_INTP,
- SCHEME_INT_VAL,scheme_make_integer_value);
- specialize_std_map_on_both(unsigned short,SCHEME_INTP,
- SCHEME_INT_VAL,scheme_make_integer_value,
- long,SCHEME_INTP,
- SCHEME_INT_VAL,scheme_make_integer_value);
- specialize_std_map_on_both(unsigned short,SCHEME_INTP,
- SCHEME_INT_VAL,scheme_make_integer_value,
- unsigned int,SCHEME_INTP,
- SCHEME_INT_VAL,scheme_make_integer_value);
- specialize_std_map_on_both(unsigned short,SCHEME_INTP,
- SCHEME_INT_VAL,scheme_make_integer_value,
- unsigned short,SCHEME_INTP,
- SCHEME_INT_VAL,scheme_make_integer_value);
- specialize_std_map_on_both(unsigned short,SCHEME_INTP,
- SCHEME_INT_VAL,scheme_make_integer_value,
- unsigned long,SCHEME_INTP,
- SCHEME_INT_VAL,scheme_make_integer_value);
- specialize_std_map_on_both(unsigned short,SCHEME_INTP,
- SCHEME_INT_VAL,scheme_make_integer_value,
- double,SCHEME_REALP,
- scheme_real_to_double,scheme_make_double);
- specialize_std_map_on_both(unsigned short,SCHEME_INTP,
- SCHEME_INT_VAL,scheme_make_integer_value,
- float,SCHEME_REALP,
- scheme_real_to_double,scheme_make_double);
- specialize_std_map_on_both(unsigned short,SCHEME_INTP,
- SCHEME_INT_VAL,scheme_make_integer_value,
- std::string,SCHEME_STRINGP,
- swig_scm_to_string,swig_make_string);
- specialize_std_map_on_both(unsigned long,SCHEME_INTP,
- SCHEME_INT_VAL,scheme_make_integer_value,
- bool,SCHEME_BOOLP,
- SCHEME_TRUEP,swig_make_boolean);
- specialize_std_map_on_both(unsigned long,SCHEME_INTP,
- SCHEME_INT_VAL,scheme_make_integer_value,
- int,SCHEME_INTP,
- SCHEME_INT_VAL,scheme_make_integer_value);
- specialize_std_map_on_both(unsigned long,SCHEME_INTP,
- SCHEME_INT_VAL,scheme_make_integer_value,
- short,SCHEME_INTP,
- SCHEME_INT_VAL,scheme_make_integer_value);
- specialize_std_map_on_both(unsigned long,SCHEME_INTP,
- SCHEME_INT_VAL,scheme_make_integer_value,
- long,SCHEME_INTP,
- SCHEME_INT_VAL,scheme_make_integer_value);
- specialize_std_map_on_both(unsigned long,SCHEME_INTP,
- SCHEME_INT_VAL,scheme_make_integer_value,
- unsigned int,SCHEME_INTP,
- SCHEME_INT_VAL,scheme_make_integer_value);
- specialize_std_map_on_both(unsigned long,SCHEME_INTP,
- SCHEME_INT_VAL,scheme_make_integer_value,
- unsigned short,SCHEME_INTP,
- SCHEME_INT_VAL,scheme_make_integer_value);
- specialize_std_map_on_both(unsigned long,SCHEME_INTP,
- SCHEME_INT_VAL,scheme_make_integer_value,
- unsigned long,SCHEME_INTP,
- SCHEME_INT_VAL,scheme_make_integer_value);
- specialize_std_map_on_both(unsigned long,SCHEME_INTP,
- SCHEME_INT_VAL,scheme_make_integer_value,
- double,SCHEME_REALP,
- scheme_real_to_double,scheme_make_double);
- specialize_std_map_on_both(unsigned long,SCHEME_INTP,
- SCHEME_INT_VAL,scheme_make_integer_value,
- float,SCHEME_REALP,
- scheme_real_to_double,scheme_make_double);
- specialize_std_map_on_both(unsigned long,SCHEME_INTP,
- SCHEME_INT_VAL,scheme_make_integer_value,
- std::string,SCHEME_STRINGP,
- swig_scm_to_string,swig_make_string);
- specialize_std_map_on_both(double,SCHEME_REALP,
- scheme_real_to_double,scheme_make_double,
- bool,SCHEME_BOOLP,
- SCHEME_TRUEP,swig_make_boolean);
- specialize_std_map_on_both(double,SCHEME_REALP,
- scheme_real_to_double,scheme_make_double,
- int,SCHEME_INTP,
- SCHEME_INT_VAL,scheme_make_integer_value);
- specialize_std_map_on_both(double,SCHEME_REALP,
- scheme_real_to_double,scheme_make_double,
- short,SCHEME_INTP,
- SCHEME_INT_VAL,scheme_make_integer_value);
- specialize_std_map_on_both(double,SCHEME_REALP,
- scheme_real_to_double,scheme_make_double,
- long,SCHEME_INTP,
- SCHEME_INT_VAL,scheme_make_integer_value);
- specialize_std_map_on_both(double,SCHEME_REALP,
- scheme_real_to_double,scheme_make_double,
- unsigned int,SCHEME_INTP,
- SCHEME_INT_VAL,scheme_make_integer_value);
- specialize_std_map_on_both(double,SCHEME_REALP,
- scheme_real_to_double,scheme_make_double,
- unsigned short,SCHEME_INTP,
- SCHEME_INT_VAL,scheme_make_integer_value);
- specialize_std_map_on_both(double,SCHEME_REALP,
- scheme_real_to_double,scheme_make_double,
- unsigned long,SCHEME_INTP,
- SCHEME_INT_VAL,scheme_make_integer_value);
- specialize_std_map_on_both(double,SCHEME_REALP,
- scheme_real_to_double,scheme_make_double,
- double,SCHEME_REALP,
- scheme_real_to_double,scheme_make_double);
- specialize_std_map_on_both(double,SCHEME_REALP,
- scheme_real_to_double,scheme_make_double,
- float,SCHEME_REALP,
- scheme_real_to_double,scheme_make_double);
- specialize_std_map_on_both(double,SCHEME_REALP,
- scheme_real_to_double,scheme_make_double,
- std::string,SCHEME_STRINGP,
- swig_scm_to_string,swig_make_string);
- specialize_std_map_on_both(float,SCHEME_REALP,
- scheme_real_to_double,scheme_make_double,
- bool,SCHEME_BOOLP,
- SCHEME_TRUEP,swig_make_boolean);
- specialize_std_map_on_both(float,SCHEME_REALP,
- scheme_real_to_double,scheme_make_double,
- int,SCHEME_INTP,
- SCHEME_INT_VAL,scheme_make_integer_value);
- specialize_std_map_on_both(float,SCHEME_REALP,
- scheme_real_to_double,scheme_make_double,
- short,SCHEME_INTP,
- SCHEME_INT_VAL,scheme_make_integer_value);
- specialize_std_map_on_both(float,SCHEME_REALP,
- scheme_real_to_double,scheme_make_double,
- long,SCHEME_INTP,
- SCHEME_INT_VAL,scheme_make_integer_value);
- specialize_std_map_on_both(float,SCHEME_REALP,
- scheme_real_to_double,scheme_make_double,
- unsigned int,SCHEME_INTP,
- SCHEME_INT_VAL,scheme_make_integer_value);
- specialize_std_map_on_both(float,SCHEME_REALP,
- scheme_real_to_double,scheme_make_double,
- unsigned short,SCHEME_INTP,
- SCHEME_INT_VAL,scheme_make_integer_value);
- specialize_std_map_on_both(float,SCHEME_REALP,
- scheme_real_to_double,scheme_make_double,
- unsigned long,SCHEME_INTP,
- SCHEME_INT_VAL,scheme_make_integer_value);
- specialize_std_map_on_both(float,SCHEME_REALP,
- scheme_real_to_double,scheme_make_double,
- double,SCHEME_REALP,
- scheme_real_to_double,scheme_make_double);
- specialize_std_map_on_both(float,SCHEME_REALP,
- scheme_real_to_double,scheme_make_double,
- float,SCHEME_REALP,
- scheme_real_to_double,scheme_make_double);
- specialize_std_map_on_both(float,SCHEME_REALP,
- scheme_real_to_double,scheme_make_double,
- std::string,SCHEME_STRINGP,
- swig_scm_to_string,swig_make_string);
- specialize_std_map_on_both(std::string,SCHEME_STRINGP,
- swig_scm_to_string,swig_make_string,
- bool,SCHEME_BOOLP,
- SCHEME_TRUEP,swig_make_boolean);
- specialize_std_map_on_both(std::string,SCHEME_STRINGP,
- swig_scm_to_string,swig_make_string,
- int,SCHEME_INTP,
- SCHEME_INT_VAL,scheme_make_integer_value);
- specialize_std_map_on_both(std::string,SCHEME_STRINGP,
- swig_scm_to_string,swig_make_string,
- short,SCHEME_INTP,
- SCHEME_INT_VAL,scheme_make_integer_value);
- specialize_std_map_on_both(std::string,SCHEME_STRINGP,
- swig_scm_to_string,swig_make_string,
- long,SCHEME_INTP,
- SCHEME_INT_VAL,scheme_make_integer_value);
- specialize_std_map_on_both(std::string,SCHEME_STRINGP,
- swig_scm_to_string,swig_make_string,
- unsigned int,SCHEME_INTP,
- SCHEME_INT_VAL,scheme_make_integer_value);
- specialize_std_map_on_both(std::string,SCHEME_STRINGP,
- swig_scm_to_string,swig_make_string,
- unsigned short,SCHEME_INTP,
- SCHEME_INT_VAL,scheme_make_integer_value);
- specialize_std_map_on_both(std::string,SCHEME_STRINGP,
- swig_scm_to_string,swig_make_string,
- unsigned long,SCHEME_INTP,
- SCHEME_INT_VAL,scheme_make_integer_value);
- specialize_std_map_on_both(std::string,SCHEME_STRINGP,
- swig_scm_to_string,swig_make_string,
- double,SCHEME_REALP,
- scheme_real_to_double,scheme_make_double);
- specialize_std_map_on_both(std::string,SCHEME_STRINGP,
- swig_scm_to_string,swig_make_string,
- float,SCHEME_REALP,
- scheme_real_to_double,scheme_make_double);
- specialize_std_map_on_both(std::string,SCHEME_STRINGP,
- swig_scm_to_string,swig_make_string,
- std::string,SCHEME_STRINGP,
- swig_scm_to_string,swig_make_string);
}
diff --git a/Lib/mzscheme/std_string.i b/Lib/mzscheme/std_string.i
index b19e8567a..70673eadf 100644
--- a/Lib/mzscheme/std_string.i
+++ b/Lib/mzscheme/std_string.i
@@ -52,6 +52,13 @@ namespace std {
$result = scheme_make_string($1->c_str());
}
+ %typemap(throws) string {
+ scheme_signal_error("%s: %s", FUNC_NAME, $1.c_str());
+ }
+
+ %typemap(throws) const string & {
+ scheme_signal_error("%s: %s", FUNC_NAME, $1.c_str());
+ }
}
diff --git a/Lib/mzscheme/std_unique_ptr.i b/Lib/mzscheme/std_unique_ptr.i
new file mode 100644
index 000000000..53cf46694
--- /dev/null
+++ b/Lib/mzscheme/std_unique_ptr.i
@@ -0,0 +1,39 @@
+/* -----------------------------------------------------------------------------
+ * std_unique_ptr.i
+ *
+ * SWIG library file for handling std::unique_ptr.
+ * Memory ownership is passed from the std::unique_ptr C++ layer to the proxy
+ * class when returning a std::unique_ptr from a function.
+ * Memory ownership is passed from the proxy class to the std::unique_ptr in the
+ * C++ layer when passed as a parameter to a wrapped function.
+ * ----------------------------------------------------------------------------- */
+
+%define %unique_ptr(TYPE)
+%typemap(in, noblock=1) std::unique_ptr< TYPE > (void *argp = 0, int res = 0) {
+ res = SWIG_ConvertPtr($input, &argp, $descriptor(TYPE *), SWIG_POINTER_RELEASE);
+ if (!SWIG_IsOK(res)) {
+ if (res == SWIG_ERROR_RELEASE_NOT_OWNED) {
+ scheme_signal_error(FUNC_NAME ": cannot release ownership as memory is not owned for argument $argnum of type 'TYPE *'");
+ } else {
+ %argument_fail(res, "TYPE *", $symname, $argnum);
+ }
+ }
+ $1.reset((TYPE *)argp);
+}
+
+%typemap (out) std::unique_ptr< TYPE > %{
+ %set_output(SWIG_NewPointerObj($1.release(), $descriptor(TYPE *), SWIG_POINTER_OWN));
+%}
+
+%typemap(typecheck, precedence=SWIG_TYPECHECK_POINTER, equivalent="TYPE *", noblock=1) std::unique_ptr< TYPE > {
+ void *vptr = 0;
+ int res = SWIG_ConvertPtr($input, &vptr, $descriptor(TYPE *), 0);
+ $1 = SWIG_CheckState(res);
+}
+
+%template() std::unique_ptr< TYPE >;
+%enddef
+
+namespace std {
+ template <class T> class unique_ptr {};
+}
diff --git a/Lib/mzscheme/std_vector.i b/Lib/mzscheme/std_vector.i
index 0ef5edb15..ae886b7b8 100644
--- a/Lib/mzscheme/std_vector.i
+++ b/Lib/mzscheme/std_vector.i
@@ -421,6 +421,9 @@ namespace std {
}
};
%enddef
+ %typemap(throws) std::out_of_range {
+ scheme_signal_error("%s: %s", FUNC_NAME, $1.what());
+ }
specialize_std_vector(bool,SCHEME_BOOLP,SCHEME_TRUEP,\
swig_make_boolean);
diff --git a/Lib/mzscheme/swigmove.i b/Lib/mzscheme/swigmove.i
new file mode 100644
index 000000000..bbfcdcb16
--- /dev/null
+++ b/Lib/mzscheme/swigmove.i
@@ -0,0 +1,19 @@
+/* -----------------------------------------------------------------------------
+ * swigmove.i
+ *
+ * Input typemaps library for implementing full move semantics when passing
+ * parameters by value.
+ * ----------------------------------------------------------------------------- */
+
+%typemap(in, noblock=1) SWIGTYPE MOVE (void *argp = 0, int res = 0) {
+ res = SWIG_ConvertPtr($input, &argp, $&1_descriptor, SWIG_POINTER_RELEASE);
+ if (!SWIG_IsOK(res)) {
+ if (res == SWIG_ERROR_RELEASE_NOT_OWNED) {
+ scheme_signal_error(FUNC_NAME ": cannot release ownership as memory is not owned for argument $argnum of type '$1_type'");
+ } else {
+ %argument_fail(res, "$1_type", $symname, $argnum);
+ }
+ }
+ if (argp == NULL) scheme_signal_error(FUNC_NAME ": swig-type-error (null reference)");
+ SwigValueWrapper< $1_ltype >::reset($1, ($&1_type)argp);
+}
diff --git a/Lib/mzscheme/typemaps.i b/Lib/mzscheme/typemaps.i
index 09bda2cca..7ceffb20e 100644
--- a/Lib/mzscheme/typemaps.i
+++ b/Lib/mzscheme/typemaps.i
@@ -2,6 +2,12 @@
* typemaps.i
* ----------------------------------------------------------------------------- */
+#define %set_output(obj) $result = obj
+#define %set_varoutput(obj) $result = obj
+#define %argument_fail(code, type, name, argn) scheme_wrong_type(FUNC_NAME, type, argn, argc, argv)
+#define %as_voidptr(ptr) (void*)(ptr)
+
+
/* The MzScheme module handles all types uniformly via typemaps. Here
are the definitions. */
@@ -66,9 +72,23 @@
#ifdef __cplusplus
-%typemap(in) SWIGTYPE &, SWIGTYPE && {
+%typemap(in) SWIGTYPE & {
$1 = ($ltype) SWIG_MustGetPtr($input, $descriptor, $argnum, 0);
- if ($1 == NULL) scheme_signal_error("swig-type-error (null reference)");
+ if ($1 == NULL) scheme_signal_error(FUNC_NAME ": swig-type-error (null reference)");
+}
+
+%typemap(in, noblock=1, fragment="<memory>") SWIGTYPE && (void *argp = 0, int res = 0, std::unique_ptr<$*1_ltype> rvrdeleter) {
+ res = SWIG_ConvertPtr($input, &argp, $descriptor, SWIG_POINTER_RELEASE);
+ if (!SWIG_IsOK(res)) {
+ if (res == SWIG_ERROR_RELEASE_NOT_OWNED) {
+ scheme_signal_error(FUNC_NAME ": cannot release ownership as memory is not owned for argument $argnum of type '$1_type'");
+ } else {
+ %argument_fail(res, "$1_type", $symname, $argnum);
+ }
+ }
+ if (argp == NULL) scheme_signal_error(FUNC_NAME ": swig-type-error (null reference)");
+ $1 = ($1_ltype)argp;
+ rvrdeleter.reset($1);
}
%typemap(out) SWIGTYPE &, SWIGTYPE && {
@@ -105,8 +125,8 @@
$1 = ($1_type) SWIG_convert_int($input);
}
-%typemap(out) enum SWIGTYPE "$result = scheme_make_integer_value($1);";
-%typemap(varout) enum SWIGTYPE "$result = scheme_make_integer_value($1);";
+%typemap(out) enum SWIGTYPE "$result = scheme_make_integer_value($1);"
+%typemap(varout) enum SWIGTYPE "$result = scheme_make_integer_value($1);"
/* Pass-by-value */
@@ -127,7 +147,7 @@
#ifdef __cplusplus
{
$&1_ltype resultptr;
- resultptr = new $1_ltype(($1_ltype &) $1);
+ resultptr = new $1_ltype($1);
$result = SWIG_NewPointerObj (resultptr, $&1_descriptor, 1);
}
#else
@@ -143,7 +163,7 @@
#ifdef __cplusplus
{
$&1_ltype resultptr;
- resultptr = new $1_ltype(($1_ltype &) $1);
+ resultptr = new $1_ltype($1);
$result = SWIG_NewPointerObj (resultptr, $&1_descriptor, 0);
}
#else
@@ -187,8 +207,6 @@
s = C_TO_MZ(*$1);
SWIG_APPEND_VALUE(s);
}
-%typemap(in) C_NAME *BOTH = C_NAME *INPUT;
-%typemap(argout) C_NAME *BOTH = C_NAME *OUTPUT;
%typemap(in) C_NAME *INOUT = C_NAME *INPUT;
%typemap(argout) C_NAME *INOUT = C_NAME *OUTPUT;
%enddef
@@ -270,14 +288,18 @@ REF_MAP(float, SCHEME_REALP, scheme_real_to_double,
REF_MAP(double, SCHEME_REALP, scheme_real_to_double,
scheme_make_double, real);
+%typemap(throws) char * {
+ scheme_signal_error("%s: %s", FUNC_NAME, $1);
+}
+
/* Void */
-%typemap(out) void "$result = scheme_void;";
+%typemap(out) void "$result = scheme_void;"
/* Pass through Scheme_Object * */
-%typemap (in) Scheme_Object * "$1=$input;";
-%typemap (out) Scheme_Object * "$result=$1;";
+%typemap (in) Scheme_Object * "$1=$input;"
+%typemap (out) Scheme_Object * "$result=$1;"
%typecheck(SWIG_TYPECHECK_POINTER) Scheme_Object * "$1=1;";
@@ -291,7 +313,6 @@ REF_MAP(double, SCHEME_REALP, scheme_real_to_double,
// $2 = ($2_ltype) temp;
//}
-
/* ------------------------------------------------------------
* Typechecking rules
* ------------------------------------------------------------ */