summaryrefslogtreecommitdiff
path: root/Lib/carrays.i
diff options
context:
space:
mode:
authorDave Beazley <dave-swig@dabeaz.com>2002-11-30 22:01:28 +0000
committerDave Beazley <dave-swig@dabeaz.com>2002-11-30 22:01:28 +0000
commit12a43edc2df8853e8e0315f742e57be88f0c4269 (patch)
treee3237f5f8c0a67c9bfa9bb5d6d095a739a49e4b2 /Lib/carrays.i
parent5fcae5eb66d377e1c3f81da7465c44a62295a72b (diff)
downloadswig-12a43edc2df8853e8e0315f742e57be88f0c4269.tar.gz
The great merge
git-svn-id: https://swig.svn.sourceforge.net/svnroot/swig/trunk/SWIG@4141 626c5289-ae23-0410-ae9c-e8d60b6d4f22
Diffstat (limited to 'Lib/carrays.i')
-rw-r--r--Lib/carrays.i132
1 files changed, 132 insertions, 0 deletions
diff --git a/Lib/carrays.i b/Lib/carrays.i
new file mode 100644
index 000000000..f5cb2e681
--- /dev/null
+++ b/Lib/carrays.i
@@ -0,0 +1,132 @@
+/* -----------------------------------------------------------------------------
+ * carrays.i
+ *
+ * Author(s): David Beazley (beazley@cs.uchicago.edu)
+ *
+ * This library file contains macros that can be used to manipulate simple
+ * pointers as arrays.
+ *
+ * $Header$
+ * ----------------------------------------------------------------------------- */
+
+/* -----------------------------------------------------------------------------
+ * %array_functions(TYPE,NAME)
+ *
+ * Generates functions for creating and accessing elements of a C array
+ * (as pointers). Creates the following functions:
+ *
+ * TYPE *new_NAME(int nelements)
+ * void delete_NAME(TYPE *);
+ * TYPE NAME_getitem(TYPE *, int index);
+ * void NAME_setitem(TYPE *, int index, TYPE value);
+ *
+ * ----------------------------------------------------------------------------- */
+
+%define %array_functions(TYPE,NAME)
+%{
+static TYPE *new_##NAME(int nelements) { %}
+#if __cplusplus
+%{ return new TYPE[nelements]; %}
+#else
+%{ return (TYPE *) calloc(nelements,sizeof(TYPE)); %}
+#endif
+%{}
+
+static void delete_##NAME(TYPE *ary) { %}
+#if __cplusplus
+%{ delete [] ary; %}
+#else
+%{ free(ary); %}
+#endif
+%{}
+
+static TYPE NAME##_getitem(TYPE *ary, int index) {
+ return ary[index];
+}
+static void NAME##_setitem(TYPE *ary, int index, TYPE value) {
+ ary[index] = value;
+}
+%}
+
+TYPE *new_##NAME(int nelements);
+void delete_##NAME(TYPE *ary);
+TYPE NAME##_getitem(TYPE *ary, int index);
+void NAME##_setitem(TYPE *ary, int index, TYPE value);
+
+%enddef
+
+
+/* -----------------------------------------------------------------------------
+ * %array_class(TYPE,NAME)
+ *
+ * Generates a class wrapper around a C array. The class has the following
+ * interface:
+ *
+ * struct NAME {
+ * NAME(int nelements, TYPE value = 0);
+ * ~NAME();
+ * TYPE getitem(int index);
+ * void setitem(int index, TYPE value);
+ * TYPE * cast();
+ * static NAME *frompointer(TYPE *t);
+ * }
+ *
+ * ----------------------------------------------------------------------------- */
+
+%define %array_class(TYPE,NAME)
+%{
+typedef TYPE NAME;
+%}
+typedef struct NAME {
+ /* Put language specific enhancements here */
+
+#if SWIGPYTHON
+ %rename(__getitem__) getitem;
+ %rename(__setitem__) setitem;
+#endif
+} NAME;
+
+%extend NAME {
+
+#if __cplusplus
+NAME(int nelements) {
+ return new TYPE[nelements];
+}
+~NAME() {
+ delete [] self;
+}
+#else
+NAME(int nelements) {
+ return (TYPE *) calloc(nelements,sizeof(TYPE));
+}
+~NAME() {
+ free(self);
+}
+#endif
+
+TYPE getitem(int index) {
+ return self[index];
+}
+void setitem(int index, TYPE value) {
+ self[index] = value;
+}
+TYPE * cast() {
+ return self;
+}
+static NAME *frompointer(TYPE *t) {
+ return (NAME *) t;
+}
+
+};
+
+%types(NAME = TYPE);
+
+%enddef
+
+
+
+
+
+
+
+