2 * Licensed under the Apache License, Version 2.0 (the "License");
3 * you may not use this file except in compliance with the License.
4 * You may obtain a copy of the License at
6 * http://www.apache.org/licenses/LICENSE-2.0
8 * Unless required by applicable law or agreed to in writing, software
9 * distributed under the License is distributed on an "AS IS" BASIS,
10 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
11 * See the License for the specific language governing permissions and
12 * limitations under the License.
22 extern jobjectArray fromPySequence(jclass cls, PyObject *sequence);
23 extern PyObject *PyErr_SetJavaError();
25 extern PyTypeObject *PY_TYPE(JArrayObject);
26 extern PyTypeObject *PY_TYPE(JArrayString);
27 extern PyTypeObject *PY_TYPE(JArrayBool);
28 extern PyTypeObject *PY_TYPE(JArrayByte);
29 extern PyTypeObject *PY_TYPE(JArrayChar);
30 extern PyTypeObject *PY_TYPE(JArrayDouble);
31 extern PyTypeObject *PY_TYPE(JArrayFloat);
32 extern PyTypeObject *PY_TYPE(JArrayInt);
33 extern PyTypeObject *PY_TYPE(JArrayLong);
34 extern PyTypeObject *PY_TYPE(JArrayShort);
39 #include "java/lang/Object.h"
42 template<typename T> class JArray : public java::lang::Object {
46 explicit JArray<T>(jobject obj) : java::lang::Object(obj) {
47 length = this$ ? env->getArrayLength((jobjectArray) this$) : 0;
49 JArray<T>(const JArray<T>& obj) : java::lang::Object(obj) {
54 JArray<T>(PyObject *sequence) : java::lang::Object(fromPySequence(T::initializeClass(), sequence)) {
55 length = this$ ? env->getArrayLength((jobjectArray) this$) : 0;
58 JArray<T>(jclass cls, PyObject *sequence) : java::lang::Object(fromPySequence(cls, sequence)) {
59 length = this$ ? env->getArrayLength((jobjectArray) this$) : 0;
62 PyObject *toSequence(PyObject *(*wrapfn)(const T&))
67 PyObject *list = PyList_New(length);
69 for (int i = 0; i < length; i++)
70 PyList_SET_ITEM(list, i, (*wrapfn)((*this)[i]));
75 PyObject *get(int n, PyObject *(*wrapfn)(const T&))
82 if (n >= 0 && n < length)
83 return (*wrapfn)((*this)[n]);
86 PyErr_SetString(PyExc_IndexError, "index out of range");
92 return T(env->getObjectArrayElement((jobjectArray) this$, n));
96 template<> class JArray<jobject> : public java::lang::Object {
100 JArray<jobject>(jclass cls, int n) : java::lang::Object(env->get_vm_env()->NewObjectArray(n, cls, NULL)) {
101 length = env->getArrayLength((jobjectArray) this$);
104 JArray<jobject>(jobject obj) : java::lang::Object(obj) {
105 length = this$ ? env->getArrayLength((jobjectArray) this$) : 0;
108 JArray<jobject>(const JArray& obj) : java::lang::Object(obj) {
113 JArray<jobject>(jclass cls, PyObject *sequence) : java::lang::Object(fromPySequence(cls, sequence)) {
114 length = this$ ? env->getArrayLength((jobjectArray) this$) : 0;
117 PyObject *toSequence(PyObject *(*wrapfn)(const jobject&))
119 return toSequence(0, length, wrapfn);
122 PyObject *toSequence(int lo, int hi, PyObject *(*wrapfn)(const jobject&))
127 if (lo < 0) lo = length + lo;
129 else if (lo > length) lo = length;
130 if (hi < 0) hi = length + hi;
132 else if (hi > length) hi = length;
133 if (lo > hi) lo = hi;
135 PyObject *list = PyList_New(hi - lo);
138 wrapfn = java::lang::t_Object::wrap_jobject;
140 for (int i = lo; i < hi; i++) {
141 jobject jobj = env->getObjectArrayElement((jobjectArray) this$, i);
142 PyObject *obj = (*wrapfn)(jobj);
144 PyList_SET_ITEM(list, i - lo, obj);
150 PyObject *get(int n, PyObject *(*wrapfn)(const jobject&))
157 if (n >= 0 && n < length)
160 wrapfn = java::lang::t_Object::wrap_jobject;
163 env->getObjectArrayElement((jobjectArray) this$, n);
165 return (*wrapfn)(jobj);
169 PyErr_SetString(PyExc_IndexError, "index out of range");
173 int set(int n, PyObject *obj)
180 if (n >= 0 && n < length)
182 if (!PyObject_TypeCheck(obj, &PY_TYPE(JObject)))
184 PyErr_SetObject(PyExc_TypeError, obj);
188 jobject jobj = ((t_JObject *) obj)->object.this$;
191 env->setObjectArrayElement((jobjectArray) this$, n, jobj);
195 PyErr_SetJavaError();
206 PyErr_SetString(PyExc_IndexError, "index out of range");
210 PyObject *wrap(PyObject *(*wrapfn)(const jobject&));
213 jobject operator[](int n) {
214 return (jobject) env->getObjectArrayElement((jobjectArray) this$, n);
218 template<> class JArray<jstring> : public java::lang::Object {
222 JArray<jstring>(jobject obj) : java::lang::Object(obj) {
223 length = this$ ? env->getArrayLength((jobjectArray) this$) : 0;
226 JArray<jstring>(const JArray& obj) : java::lang::Object(obj) {
230 JArray<jstring>(int n) : java::lang::Object(env->get_vm_env()->NewObjectArray(n, env->findClass("java/lang/String"), NULL)) {
231 length = env->getArrayLength((jobjectArray) this$);
235 JArray<jstring>(PyObject *sequence) : java::lang::Object(env->get_vm_env()->NewObjectArray(PySequence_Length(sequence), env->findClass("java/lang/String"), NULL)) {
236 length = env->getArrayLength((jobjectArray) this$);
238 for (int i = 0; i < length; i++) {
239 PyObject *obj = PySequence_GetItem(sequence, i);
244 jstring str = env->fromPyString(obj);
247 if (PyErr_Occurred())
250 env->setObjectArrayElement((jobjectArray) this$, i, str);
251 env->get_vm_env()->DeleteLocalRef(str);
255 PyObject *toSequence()
257 return toSequence(0, length);
260 PyObject *toSequence(int lo, int hi)
265 if (lo < 0) lo = length + lo;
267 else if (lo > length) lo = length;
268 if (hi < 0) hi = length + hi;
270 else if (hi > length) hi = length;
271 if (lo > hi) lo = hi;
273 PyObject *list = PyList_New(hi - lo);
275 for (int i = lo; i < hi; i++) {
276 jstring str = (jstring)
277 env->getObjectArrayElement((jobjectArray) this$, i);
278 PyObject *obj = env->fromJString(str, 1);
280 PyList_SET_ITEM(list, i - lo, obj);
293 if (n >= 0 && n < length)
295 jstring str = (jstring)
296 env->getObjectArrayElement((jobjectArray) this$, n);
297 PyObject *obj = env->fromJString(str, 1);
303 PyErr_SetString(PyExc_IndexError, "index out of range");
307 int set(int n, PyObject *obj)
314 if (n >= 0 && n < length)
316 jstring str = env->fromPyString(obj);
318 if (PyErr_Occurred())
321 env->setObjectArrayElement((jobjectArray) this$, n, str);
326 PyErr_SetString(PyExc_IndexError, "index out of range");
330 PyObject *wrap() const;
333 jstring operator[](int n) {
334 return (jstring) env->getObjectArrayElement((jobjectArray) this$, n);
338 template<> class JArray<jboolean> : public java::lang::Object {
342 class arrayElements {
348 arrayElements(jbooleanArray array) {
350 elts = env->get_vm_env()->GetBooleanArrayElements(array, &isCopy);
352 virtual ~arrayElements() {
353 env->get_vm_env()->ReleaseBooleanArrayElements(array, elts, 0);
355 operator jboolean *() {
360 arrayElements elements() {
361 return arrayElements((jbooleanArray) this$);
364 JArray<jboolean>(jobject obj) : java::lang::Object(obj) {
365 length = this$ ? env->getArrayLength((jarray) this$) : 0;
368 JArray<jboolean>(const JArray& obj) : java::lang::Object(obj) {
372 JArray<jboolean>(int n) : java::lang::Object(env->get_vm_env()->NewBooleanArray(n)) {
373 length = env->getArrayLength((jarray) this$);
377 JArray<jboolean>(PyObject *sequence) : java::lang::Object(env->get_vm_env()->NewBooleanArray(PySequence_Length(sequence))) {
378 length = env->getArrayLength((jarray) this$);
379 arrayElements elts = elements();
380 jboolean *buf = (jboolean *) elts;
382 for (int i = 0; i < length; i++) {
383 PyObject *obj = PySequence_GetItem(sequence, i);
388 if (obj == Py_True || obj == Py_False)
390 buf[i] = (jboolean) (obj == Py_True);
395 PyErr_SetObject(PyExc_TypeError, obj);
402 PyObject *toSequence()
404 return toSequence(0, length);
407 PyObject *toSequence(int lo, int hi)
412 if (lo < 0) lo = length + lo;
414 else if (lo > length) lo = length;
415 if (hi < 0) hi = length + hi;
417 else if (hi > length) hi = length;
418 if (lo > hi) lo = hi;
420 PyObject *list = PyList_New(hi - lo);
421 arrayElements elts = elements();
422 jboolean *buf = (jboolean *) elts;
424 for (int i = lo; i < hi; i++) {
425 jboolean value = buf[i];
426 PyObject *obj = value ? Py_True : Py_False;
429 PyList_SET_ITEM(list, i - lo, obj);
442 if (n >= 0 && n < length)
443 Py_RETURN_BOOL(elements()[n]);
446 PyErr_SetString(PyExc_IndexError, "index out of range");
450 int set(int n, PyObject *obj)
457 if (n >= 0 && n < length)
459 elements()[n] = (jboolean) PyObject_IsTrue(obj);
464 PyErr_SetString(PyExc_IndexError, "index out of range");
468 PyObject *wrap() const;
471 jboolean operator[](int n) {
472 JNIEnv *vm_env = env->get_vm_env();
474 jboolean *elts = (jboolean *)
475 vm_env->GetPrimitiveArrayCritical((jarray) this$, &isCopy);
476 jboolean value = elts[n];
478 vm_env->ReleasePrimitiveArrayCritical((jarray) this$, elts, 0);
484 template<> class JArray<jbyte> : public java::lang::Object {
488 class arrayElements {
494 arrayElements(jbyteArray array) {
496 elts = env->get_vm_env()->GetByteArrayElements(array, &isCopy);
498 virtual ~arrayElements() {
499 env->get_vm_env()->ReleaseByteArrayElements(array, elts, 0);
506 arrayElements elements() {
507 return arrayElements((jbyteArray) this$);
510 JArray<jbyte>(jobject obj) : java::lang::Object(obj) {
511 length = this$ ? env->getArrayLength((jarray) this$) : 0;
514 JArray<jbyte>(const JArray& obj) : java::lang::Object(obj) {
518 JArray<jbyte>(int n) : java::lang::Object(env->get_vm_env()->NewByteArray(n)) {
519 length = env->getArrayLength((jarray) this$);
523 JArray<jbyte>(PyObject *sequence) : java::lang::Object(env->get_vm_env()->NewByteArray(PySequence_Length(sequence))) {
524 length = env->getArrayLength((jarray) this$);
525 arrayElements elts = elements();
526 jbyte *buf = (jbyte *) elts;
528 if (PyString_Check(sequence))
529 memcpy(buf, PyString_AS_STRING(sequence), length);
531 for (int i = 0; i < length; i++) {
532 PyObject *obj = PySequence_GetItem(sequence, i);
537 if (PyString_Check(obj) && (PyString_GET_SIZE(obj) == 1))
539 buf[i] = (jbyte) PyString_AS_STRING(obj)[0];
542 else if (PyInt_CheckExact(obj))
544 buf[i] = (jbyte) PyInt_AS_LONG(obj);
549 PyErr_SetObject(PyExc_TypeError, obj);
561 PyObject *toSequence()
563 return toSequence(0, length);
566 PyObject *toSequence(int lo, int hi)
571 if (lo < 0) lo = length + lo;
573 else if (lo > length) lo = length;
574 if (hi < 0) hi = length + hi;
576 else if (hi > length) hi = length;
577 if (lo > hi) lo = hi;
579 arrayElements elts = elements();
580 jbyte *buf = (jbyte *) elts;
581 PyObject *tuple = PyTuple_New(hi - lo);
583 for (int i = 0; i < hi - lo; i++)
584 PyTuple_SET_ITEM(tuple, i, PyInt_FromLong(buf[lo + i]));
589 PyObject *to_string_()
594 arrayElements elts = elements();
595 jbyte *buf = (jbyte *) elts;
597 return PyString_FromStringAndSize((char *) buf, length);
607 if (n >= 0 && n < length)
609 jbyte b = (*this)[n];
610 return PyInt_FromLong(b);
614 PyErr_SetString(PyExc_IndexError, "index out of range");
618 int set(int n, PyObject *obj)
625 if (n >= 0 && n < length)
627 if (!PyInt_CheckExact(obj))
629 PyErr_SetObject(PyExc_TypeError, obj);
633 elements()[n] = (jbyte) PyInt_AS_LONG(obj);
638 PyErr_SetString(PyExc_IndexError, "index out of range");
642 PyObject *wrap() const;
645 jbyte operator[](int n) {
646 JNIEnv *vm_env = env->get_vm_env();
648 jbyte *elts = (jbyte *)
649 vm_env->GetPrimitiveArrayCritical((jarray) this$, &isCopy);
650 jbyte value = elts[n];
652 vm_env->ReleasePrimitiveArrayCritical((jarray) this$, elts, 0);
658 template<> class JArray<jchar> : public java::lang::Object {
662 class arrayElements {
668 arrayElements(jcharArray array) {
670 elts = env->get_vm_env()->GetCharArrayElements(array, &isCopy);
672 virtual ~arrayElements() {
673 env->get_vm_env()->ReleaseCharArrayElements(array, elts, 0);
680 arrayElements elements() {
681 return arrayElements((jcharArray) this$);
684 JArray<jchar>(jobject obj) : java::lang::Object(obj) {
685 length = this$ ? env->getArrayLength((jarray) this$) : 0;
688 JArray<jchar>(const JArray& obj) : java::lang::Object(obj) {
692 JArray<jchar>(int n) : java::lang::Object(env->get_vm_env()->NewCharArray(n)) {
693 length = env->getArrayLength((jarray) this$);
697 JArray<jchar>(PyObject *sequence) : java::lang::Object(env->get_vm_env()->NewCharArray(PySequence_Length(sequence))) {
698 length = env->getArrayLength((jarray) this$);
699 arrayElements elts = elements();
700 jchar *buf = (jchar *) elts;
702 if (PyUnicode_Check(sequence))
704 if (sizeof(Py_UNICODE) == sizeof(jchar))
705 memcpy(buf, PyUnicode_AS_UNICODE(sequence),
706 length * sizeof(jchar));
709 Py_UNICODE *pchars = PyUnicode_AS_UNICODE(sequence);
710 for (int i = 0; i < length; i++)
711 buf[i] = (jchar) pchars[i];
715 for (int i = 0; i < length; i++) {
716 PyObject *obj = PySequence_GetItem(sequence, i);
721 if (PyUnicode_Check(obj) && (PyUnicode_GET_SIZE(obj) == 1))
723 buf[i] = (jchar) PyUnicode_AS_UNICODE(obj)[0];
728 PyErr_SetObject(PyExc_TypeError, obj);
735 PyObject *toSequence()
737 return toSequence(0, length);
740 PyObject *toSequence(int lo, int hi)
745 if (lo < 0) lo = length + lo;
747 else if (lo > length) lo = length;
748 if (hi < 0) hi = length + hi;
750 else if (hi > length) hi = length;
751 if (lo > hi) lo = hi;
753 arrayElements elts = elements();
754 jchar *buf = (jchar *) elts;
756 if (sizeof(Py_UNICODE) == sizeof(jchar))
757 return PyUnicode_FromUnicode((const Py_UNICODE *) buf + lo,
761 PyObject *string = PyUnicode_FromUnicode(NULL, hi - lo);
762 Py_UNICODE *pchars = PyUnicode_AS_UNICODE(string);
764 for (int i = lo; i < hi; i++)
765 pchars[i - lo] = (Py_UNICODE) buf[i];
778 if (n >= 0 && n < length)
780 jchar c = (*this)[n];
782 if (sizeof(Py_UNICODE) == sizeof(jchar))
783 return PyUnicode_FromUnicode((const Py_UNICODE *) &c, 1);
786 PyObject *string = PyUnicode_FromUnicode(NULL, 1);
787 Py_UNICODE *pchars = PyUnicode_AS_UNICODE(string);
789 pchars[0] = (Py_UNICODE) c;
796 PyErr_SetString(PyExc_IndexError, "index out of range");
800 int set(int n, PyObject *obj)
807 if (n >= 0 && n < length)
809 if (!PyUnicode_Check(obj))
811 PyErr_SetObject(PyExc_TypeError, obj);
814 if (PyUnicode_GET_SIZE(obj) != 1)
816 PyErr_SetObject(PyExc_ValueError, obj);
820 elements()[n] = (jchar) PyUnicode_AS_UNICODE(obj)[0];
825 PyErr_SetString(PyExc_IndexError, "index out of range");
829 PyObject *wrap() const;
832 jchar operator[](int n) {
833 JNIEnv *vm_env = env->get_vm_env();
835 jchar *elts = (jchar *)
836 vm_env->GetPrimitiveArrayCritical((jarray) this$, &isCopy);
837 jchar value = elts[n];
839 vm_env->ReleasePrimitiveArrayCritical((jarray) this$, elts, 0);
845 template<> class JArray<jdouble> : public java::lang::Object {
849 class arrayElements {
855 arrayElements(jdoubleArray array) {
857 elts = env->get_vm_env()->GetDoubleArrayElements(array, &isCopy);
859 virtual ~arrayElements() {
860 env->get_vm_env()->ReleaseDoubleArrayElements(array, elts, 0);
862 operator jdouble *() {
867 arrayElements elements() {
868 return arrayElements((jdoubleArray) this$);
871 JArray<jdouble>(jobject obj) : java::lang::Object(obj) {
872 length = this$ ? env->getArrayLength((jarray) this$) : 0;
875 JArray<jdouble>(const JArray& obj) : java::lang::Object(obj) {
879 JArray<jdouble>(int n) : java::lang::Object(env->get_vm_env()->NewDoubleArray(n)) {
880 length = env->getArrayLength((jarray) this$);
884 JArray<jdouble>(PyObject *sequence) : java::lang::Object(env->get_vm_env()->NewDoubleArray(PySequence_Length(sequence))) {
885 length = env->getArrayLength((jarray) this$);
886 arrayElements elts = elements();
887 jdouble *buf = (jdouble *) elts;
889 for (int i = 0; i < length; i++) {
890 PyObject *obj = PySequence_GetItem(sequence, i);
895 if (PyFloat_Check(obj))
897 buf[i] = (jdouble) PyFloat_AS_DOUBLE(obj);
902 PyErr_SetObject(PyExc_TypeError, obj);
909 PyObject *toSequence()
911 return toSequence(0, length);
914 PyObject *toSequence(int lo, int hi)
919 if (lo < 0) lo = length + lo;
921 else if (lo > length) lo = length;
922 if (hi < 0) hi = length + hi;
924 else if (hi > length) hi = length;
925 if (lo > hi) lo = hi;
927 PyObject *list = PyList_New(hi - lo);
928 arrayElements elts = elements();
929 jdouble *buf = (jdouble *) elts;
931 for (int i = lo; i < hi; i++)
932 PyList_SET_ITEM(list, i - lo, PyFloat_FromDouble((double) buf[i]));
944 if (n >= 0 && n < length)
945 return PyFloat_FromDouble((double) (*this)[n]);
948 PyErr_SetString(PyExc_IndexError, "index out of range");
952 int set(int n, PyObject *obj)
959 if (n >= 0 && n < length)
961 if (!PyFloat_Check(obj))
963 PyErr_SetObject(PyExc_TypeError, obj);
967 elements()[n] = (jdouble) PyFloat_AS_DOUBLE(obj);
972 PyErr_SetString(PyExc_IndexError, "index out of range");
976 PyObject *wrap() const;
979 jdouble operator[](int n) {
980 JNIEnv *vm_env = env->get_vm_env();
982 jdouble *elts = (jdouble *)
983 vm_env->GetPrimitiveArrayCritical((jarray) this$, &isCopy);
984 jdouble value = elts[n];
986 vm_env->ReleasePrimitiveArrayCritical((jarray) this$, elts, 0);
992 template<> class JArray<jfloat> : public java::lang::Object {
996 class arrayElements {
1002 arrayElements(jfloatArray array) {
1003 this->array = array;
1004 elts = env->get_vm_env()->GetFloatArrayElements(array, &isCopy);
1006 virtual ~arrayElements() {
1007 env->get_vm_env()->ReleaseFloatArrayElements(array, elts, 0);
1009 operator jfloat *() {
1014 arrayElements elements() {
1015 return arrayElements((jfloatArray) this$);
1018 JArray<jfloat>(jobject obj) : java::lang::Object(obj) {
1019 length = this$ ? env->getArrayLength((jarray) this$) : 0;
1022 JArray<jfloat>(const JArray& obj) : java::lang::Object(obj) {
1023 length = obj.length;
1026 JArray<jfloat>(int n) : java::lang::Object(env->get_vm_env()->NewFloatArray(n)) {
1027 length = env->getArrayLength((jarray) this$);
1031 JArray<jfloat>(PyObject *sequence) : java::lang::Object(env->get_vm_env()->NewFloatArray(PySequence_Length(sequence))) {
1032 length = env->getArrayLength((jarray) this$);
1033 arrayElements elts = elements();
1034 jfloat *buf = (jfloat *) elts;
1036 for (int i = 0; i < length; i++) {
1037 PyObject *obj = PySequence_GetItem(sequence, i);
1042 if (PyFloat_Check(obj))
1044 buf[i] = (jfloat) PyFloat_AS_DOUBLE(obj);
1049 PyErr_SetObject(PyExc_TypeError, obj);
1056 PyObject *toSequence()
1058 return toSequence(0, length);
1061 PyObject *toSequence(int lo, int hi)
1066 if (lo < 0) lo = length + lo;
1068 else if (lo > length) lo = length;
1069 if (hi < 0) hi = length + hi;
1071 else if (hi > length) hi = length;
1072 if (lo > hi) lo = hi;
1074 PyObject *list = PyList_New(hi - lo);
1075 arrayElements elts = elements();
1076 jfloat *buf = (jfloat *) elts;
1078 for (int i = lo; i < hi; i++)
1079 PyList_SET_ITEM(list, i - lo, PyFloat_FromDouble((double) buf[i]));
1084 PyObject *get(int n)
1091 if (n >= 0 && n < length)
1092 return PyFloat_FromDouble((double) (*this)[n]);
1095 PyErr_SetString(PyExc_IndexError, "index out of range");
1099 int set(int n, PyObject *obj)
1106 if (n >= 0 && n < length)
1108 if (!PyFloat_Check(obj))
1110 PyErr_SetObject(PyExc_TypeError, obj);
1114 elements()[n] = (jfloat) PyFloat_AS_DOUBLE(obj);
1119 PyErr_SetString(PyExc_IndexError, "index out of range");
1123 PyObject *wrap() const;
1126 jfloat operator[](int n) {
1127 JNIEnv *vm_env = env->get_vm_env();
1128 jboolean isCopy = 0;
1129 jfloat *elts = (jfloat *)
1130 vm_env->GetPrimitiveArrayCritical((jarray) this$, &isCopy);
1131 jfloat value = elts[n];
1133 vm_env->ReleasePrimitiveArrayCritical((jarray) this$, elts, 0);
1139 template<> class JArray<jint> : public java::lang::Object {
1143 class arrayElements {
1149 arrayElements(jintArray array) {
1150 this->array = array;
1151 elts = env->get_vm_env()->GetIntArrayElements(array, &isCopy);
1153 virtual ~arrayElements() {
1154 env->get_vm_env()->ReleaseIntArrayElements(array, elts, 0);
1161 arrayElements elements() {
1162 return arrayElements((jintArray) this$);
1165 JArray<jint>(jobject obj) : java::lang::Object(obj) {
1166 length = this$ ? env->getArrayLength((jarray) this$) : 0;
1169 JArray<jint>(const JArray& obj) : java::lang::Object(obj) {
1170 length = obj.length;
1173 JArray<jint>(int n) : java::lang::Object(env->get_vm_env()->NewIntArray(n)) {
1174 length = env->getArrayLength((jarray) this$);
1178 JArray<jint>(PyObject *sequence) : java::lang::Object(env->get_vm_env()->NewIntArray(PySequence_Length(sequence))) {
1179 length = env->getArrayLength((jarray) this$);
1180 arrayElements elts = elements();
1181 jint *buf = (jint *) elts;
1183 for (int i = 0; i < length; i++) {
1184 PyObject *obj = PySequence_GetItem(sequence, i);
1189 if (PyInt_Check(obj))
1191 buf[i] = (jint) PyInt_AS_LONG(obj);
1196 PyErr_SetObject(PyExc_TypeError, obj);
1203 PyObject *toSequence()
1205 return toSequence(0, length);
1208 PyObject *toSequence(int lo, int hi)
1213 if (lo < 0) lo = length + lo;
1215 else if (lo > length) lo = length;
1216 if (hi < 0) hi = length + hi;
1218 else if (hi > length) hi = length;
1219 if (lo > hi) lo = hi;
1221 PyObject *list = PyList_New(hi - lo);
1222 arrayElements elts = elements();
1223 jint *buf = (jint *) elts;
1225 for (int i = lo; i < hi; i++)
1226 PyList_SET_ITEM(list, i - lo, PyInt_FromLong(buf[i]));
1231 PyObject *get(int n)
1238 if (n >= 0 && n < length)
1239 return PyInt_FromLong((*this)[n]);
1242 PyErr_SetString(PyExc_IndexError, "index out of range");
1246 int set(int n, PyObject *obj)
1253 if (n >= 0 && n < length)
1255 if (!PyInt_Check(obj))
1257 PyErr_SetObject(PyExc_TypeError, obj);
1261 elements()[n] = (jint) PyInt_AS_LONG(obj);
1266 PyErr_SetString(PyExc_IndexError, "index out of range");
1270 PyObject *wrap() const;
1273 jint operator[](int n) {
1274 JNIEnv *vm_env = env->get_vm_env();
1275 jboolean isCopy = 0;
1276 jint *elts = (jint *)
1277 vm_env->GetPrimitiveArrayCritical((jarray) this$, &isCopy);
1278 jint value = elts[n];
1280 vm_env->ReleasePrimitiveArrayCritical((jarray) this$, elts, 0);
1286 template<> class JArray<jlong> : public java::lang::Object {
1290 class arrayElements {
1296 arrayElements(jlongArray array) {
1297 this->array = array;
1298 elts = env->get_vm_env()->GetLongArrayElements(array, &isCopy);
1300 virtual ~arrayElements() {
1301 env->get_vm_env()->ReleaseLongArrayElements(array, elts, 0);
1303 operator jlong *() {
1308 arrayElements elements() {
1309 return arrayElements((jlongArray) this$);
1312 JArray<jlong>(jobject obj) : java::lang::Object(obj) {
1313 length = this$ ? env->getArrayLength((jarray) this$) : 0;
1316 JArray<jlong>(const JArray& obj) : java::lang::Object(obj) {
1317 length = obj.length;
1320 JArray<jlong>(int n) : java::lang::Object(env->get_vm_env()->NewLongArray(n)) {
1321 length = env->getArrayLength((jarray) this$);
1325 JArray<jlong>(PyObject *sequence) : java::lang::Object(env->get_vm_env()->NewLongArray(PySequence_Length(sequence))) {
1326 length = env->getArrayLength((jarray) this$);
1327 arrayElements elts = elements();
1328 jlong *buf = (jlong *) elts;
1330 for (int i = 0; i < length; i++) {
1331 PyObject *obj = PySequence_GetItem(sequence, i);
1336 if (PyLong_Check(obj))
1338 buf[i] = (jlong) PyLong_AsLongLong(obj);
1343 PyErr_SetObject(PyExc_TypeError, obj);
1350 PyObject *toSequence()
1352 return toSequence(0, length);
1355 PyObject *toSequence(int lo, int hi)
1360 if (lo < 0) lo = length + lo;
1362 else if (lo > length) lo = length;
1363 if (hi < 0) hi = length + hi;
1365 else if (hi > length) hi = length;
1366 if (lo > hi) lo = hi;
1368 PyObject *list = PyList_New(hi - lo);
1369 arrayElements elts = elements();
1370 jlong *buf = (jlong *) elts;
1372 for (int i = lo; i < hi; i++)
1373 PyList_SET_ITEM(list, i - lo, PyLong_FromLongLong((long long) buf[i]));
1378 PyObject *get(int n)
1385 if (n >= 0 && n < length)
1386 return PyLong_FromLongLong((long long) (*this)[n]);
1389 PyErr_SetString(PyExc_IndexError, "index out of range");
1393 int set(int n, PyObject *obj)
1400 if (n >= 0 && n < length)
1402 if (!PyLong_Check(obj))
1404 PyErr_SetObject(PyExc_TypeError, obj);
1408 elements()[n] = (jlong) PyLong_AsLongLong(obj);
1413 PyErr_SetString(PyExc_IndexError, "index out of range");
1417 PyObject *wrap() const;
1420 jlong operator[](long n) {
1421 JNIEnv *vm_env = env->get_vm_env();
1422 jboolean isCopy = 0;
1423 jlong *elts = (jlong *)
1424 vm_env->GetPrimitiveArrayCritical((jarray) this$, &isCopy);
1425 jlong value = elts[n];
1427 vm_env->ReleasePrimitiveArrayCritical((jarray) this$, elts, 0);
1433 template<> class JArray<jshort> : public java::lang::Object {
1437 class arrayElements {
1443 arrayElements(jshortArray array) {
1444 this->array = array;
1445 elts = env->get_vm_env()->GetShortArrayElements(array, &isCopy);
1447 virtual ~arrayElements() {
1448 env->get_vm_env()->ReleaseShortArrayElements(array, elts, 0);
1450 operator jshort *() {
1455 arrayElements elements() {
1456 return arrayElements((jshortArray) this$);
1459 JArray<jshort>(jobject obj) : java::lang::Object(obj) {
1460 length = this$ ? env->getArrayLength((jarray) this$) : 0;
1463 JArray<jshort>(const JArray& obj) : java::lang::Object(obj) {
1464 length = obj.length;
1467 JArray<jshort>(int n) : java::lang::Object(env->get_vm_env()->NewShortArray(n)) {
1468 length = env->getArrayLength((jarray) this$);
1472 JArray<jshort>(PyObject *sequence) : java::lang::Object(env->get_vm_env()->NewShortArray(PySequence_Length(sequence))) {
1473 length = env->getArrayLength((jarray) this$);
1474 arrayElements elts = elements();
1475 jshort *buf = (jshort *) elts;
1477 for (int i = 0; i < length; i++) {
1478 PyObject *obj = PySequence_GetItem(sequence, i);
1483 if (PyInt_Check(obj))
1485 buf[i] = (jshort) PyInt_AS_LONG(obj);
1490 PyErr_SetObject(PyExc_TypeError, obj);
1497 PyObject *toSequence()
1499 return toSequence(0, length);
1502 PyObject *toSequence(int lo, int hi)
1507 if (lo < 0) lo = length + lo;
1509 else if (lo > length) lo = length;
1510 if (hi < 0) hi = length + hi;
1512 else if (hi > length) hi = length;
1513 if (lo > hi) lo = hi;
1515 PyObject *list = PyList_New(hi - lo);
1516 arrayElements elts = elements();
1517 jshort *buf = (jshort *) elts;
1519 for (int i = lo; i < hi; i++)
1520 PyList_SET_ITEM(list, i - lo, PyInt_FromLong(buf[i]));
1525 PyObject *get(int n)
1532 if (n >= 0 && n < length)
1533 return PyInt_FromLong((long) (*this)[n]);
1536 PyErr_SetString(PyExc_IndexError, "index out of range");
1540 int set(int n, PyObject *obj)
1547 if (n >= 0 && n < length)
1549 if (!PyInt_Check(obj))
1551 PyErr_SetObject(PyExc_TypeError, obj);
1555 elements()[n] = (jshort) PyInt_AS_LONG(obj);
1560 PyErr_SetString(PyExc_IndexError, "index out of range");
1564 PyObject *wrap() const;
1567 jshort operator[](int n) {
1568 JNIEnv *vm_env = env->get_vm_env();
1569 jboolean isCopy = 0;
1570 jshort *elts = (jshort *)
1571 vm_env->GetPrimitiveArrayCritical((jarray) this$, &isCopy);
1572 jshort value = elts[n];
1574 vm_env->ReleasePrimitiveArrayCritical((jarray) this$, elts, 0);
1582 template<typename T> class t_JArray {
1587 static PyObject *wrap_Object(const JArray<T>& array)
1590 return array.wrap();
1598 #endif /* _JArray_H */