Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
please sonar
[simgrid.git] / src / bindings / java / jmsg_rngstream.cpp
1 /* Functions related to the RngStream Java port                         */
2
3 /* Copyright (c) 2007-2015. The SimGrid Team.
4  * All rights reserved.                                                     */
5
6 /* This program is free software; you can redistribute it and/or modify it
7  * under the terms of the license (GNU LGPL) which comes with this package. */
8
9 #include <xbt/sysdep.h>
10
11 #include "jmsg_rngstream.h"
12 #include "jxbt_utilities.h"
13
14 SG_BEGIN_DECL()
15
16 jfieldID jrngstream_bind;
17
18 RngStream jrngstream_to_native(JNIEnv *env, jobject jrngstream) {
19   RngStream rngstream = (RngStream)(intptr_t)env->GetLongField(jrngstream, jrngstream_bind);
20   if (!rngstream) {
21     jxbt_throw_notbound(env, "rngstream", jrngstream);
22     return nullptr;
23   }
24   return rngstream;
25 }
26
27 JNIEXPORT void JNICALL Java_org_simgrid_msg_RngStream_nativeInit(JNIEnv *env, jclass cls) {
28   jclass class_RngStream = env->FindClass("org/simgrid/msg/RngStream");
29
30   jrngstream_bind = jxbt_get_jfield(env, class_RngStream, "bind", "J");
31 }
32
33 JNIEXPORT void JNICALL Java_org_simgrid_msg_RngStream_create(JNIEnv *env, jobject jrngstream, jstring jname) {
34   const char *name = env->GetStringUTFChars(jname, 0);
35   RngStream rngstream = RngStream_CreateStream(name);
36   //Bind the RngStream object
37   env->SetLongField(jrngstream, jrngstream_bind, (intptr_t)rngstream);
38
39   env->ReleaseStringUTFChars(jname, name);
40 }
41
42 JNIEXPORT void JNICALL Java_org_simgrid_msg_RngStream_nativeFinalize(JNIEnv *env, jobject jrngstream) {
43   RngStream rngstream = jrngstream_to_native(env, jrngstream);
44   RngStream_DeleteStream(&rngstream);
45   env->SetLongField(jrngstream, jrngstream_bind, (intptr_t)nullptr);
46 }
47
48 JNIEXPORT jboolean JNICALL
49 Java_org_simgrid_msg_RngStream_setPackageSeed(JNIEnv *env, jobject jrngstream, jintArray jseed) {
50
51   if (jseed == nullptr) {
52     jxbt_throw_null(env, xbt_strdup("seed argument is null"));
53     return JNI_FALSE;
54   }
55
56   jint buffer[6];
57   env->GetIntArrayRegion(jseed, 0, 6, buffer);
58
59   // The C API expects unsigned long which are wider than int on LP64.
60   // We need to convert:
61   unsigned long seed[6];
62   for (int i = 0; i != 6; ++i)
63     seed[i] = buffer[i];
64
65   int result = RngStream_SetPackageSeed(seed);
66   return result == -1 ? JNI_FALSE : JNI_TRUE;
67 }
68
69 JNIEXPORT void JNICALL Java_org_simgrid_msg_RngStream_resetStart(JNIEnv *env, jobject jrngstream) {
70   RngStream rngstream = jrngstream_to_native(env, jrngstream);
71   if (!rngstream)
72     return;
73
74   RngStream_ResetStartStream(rngstream);
75 }
76
77 JNIEXPORT void JNICALL Java_org_simgrid_msg_RngStream_resetStartSubstream(JNIEnv *env, jobject jrngstream) {
78   RngStream rngstream = jrngstream_to_native(env, jrngstream);
79   if (!rngstream)
80     return;
81
82   RngStream_ResetStartSubstream(rngstream);
83 }
84
85 JNIEXPORT void JNICALL Java_org_simgrid_msg_RngStream_resetNextSubstream(JNIEnv *env, jobject jrngstream) {
86   RngStream rngstream = jrngstream_to_native(env, jrngstream);
87   if (!rngstream)
88     return;
89
90   RngStream_ResetNextSubstream(rngstream);
91 }
92
93 JNIEXPORT void JNICALL Java_org_simgrid_msg_RngStream_setAntithetic(JNIEnv *env, jobject jrngstream, jboolean ja) {
94   RngStream rngstream = jrngstream_to_native(env, jrngstream);
95   if (!rngstream)
96     return;
97
98   if (ja == JNI_TRUE) {
99     RngStream_SetAntithetic(rngstream,-1);
100   }
101   else {
102     RngStream_SetAntithetic(rngstream,0);
103   }
104 }
105
106 JNIEXPORT jboolean JNICALL Java_org_simgrid_msg_RngStream_setSeed(JNIEnv *env, jobject jrngstream, jintArray jseed) {
107   jint buffer[6];
108
109   env->GetIntArrayRegion(jseed, 0, 6, buffer);
110
111   RngStream rngstream = jrngstream_to_native(env, jrngstream);
112   if (!rngstream)
113     return JNI_FALSE;
114
115   // The C API expects unsigned long which are wider than int on LP64.
116   // We need to convert:
117   unsigned long seed[6];
118   for (int i = 0; i != 6; ++i)
119     seed[i] = buffer[i];
120
121   int result = RngStream_SetSeed(rngstream, seed);
122
123   return result == -1 ? JNI_FALSE : JNI_TRUE;
124 }
125
126 JNIEXPORT void JNICALL Java_org_simgrid_msg_RngStream_advanceState(JNIEnv *env, jobject jrngstream, jint e, jint g) {
127   RngStream rngstream = jrngstream_to_native(env, jrngstream);
128   if (!rngstream)
129     return;
130
131   RngStream_AdvanceState(rngstream, (long)e, (long)g);
132 }
133
134 JNIEXPORT jdouble JNICALL Java_org_simgrid_msg_RngStream_randU01(JNIEnv *env, jobject jrngstream) {
135   RngStream rngstream = jrngstream_to_native(env, jrngstream);
136   if (!rngstream)
137     return 0;
138
139   return (jdouble)RngStream_RandU01(rngstream);
140 }
141
142 JNIEXPORT jint JNICALL Java_org_simgrid_msg_RngStream_randInt(JNIEnv *env, jobject jrngstream, jint i, jint j) {
143   RngStream rngstream = jrngstream_to_native(env, jrngstream);
144   if (!rngstream)
145     return 0;
146
147   return (jint)RngStream_RandInt(rngstream, (int)i, (int)j);
148 }
149
150 SG_END_DECL()