Logo AND Algorithmique Numérique Distribuée

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