package mp.code;
import java.io.IOException;
/**
* A class holding utility functions, as well as functions which are specific
* to this language's glue and don't necessarily have a counterpart in the
* broader CodeMP API.
*/
public final class Extensions {
/**
* Hashes the given {@link String} using CodeMP's hashing algorithm (xxh3).
* @param input the string to hash
* @return the hash
*/
public static native long hash(String input);
/**
* Drive the underlying library's asynchronous event loop. In other words, tells
* it what thread to use. You usually want to call this during initialisation.
*
* Passing false will have the native library manage threads, but it may fail to
* work with some more advanced features.
*
* You may alternatively call this with true, in a separate and dedicated Java thread;
* it will remain active in the background and act as event loop. Assign it like this:
*
new Thread(() -> Extensions.drive(true)).start();
* @param block true if it should use the current thread
*/
public static native void drive(boolean block);
/**
* Configures the tracing subscriber for the native logs.
* Do not call this unless you want to see the native library's logs.
* @param path where to output this, null to use stdout
* @param debug whether to run it in debug mode
*/
public static native void setupTracing(String path, boolean debug);
private static boolean loaded = false;
static synchronized void loadLibraryIfNotPresent() {
if(loaded) return;
try {
String os = System.getProperty("os.name").toLowerCase();
String filename;
if(os.startsWith("windows")) {
filename = "/natives/codemp.dll";
} else if(os.startsWith("mac")) {
filename = "/natives/libcodemp.dylib";;
} else filename = "/natives/libcodemp.so";
cz.adamh.utils.NativeUtils.loadLibraryFromJar(filename);
loaded = true;
} catch(IOException e) {
throw new RuntimeException(e);
}
}
static {
Extensions.loadLibraryIfNotPresent();
}
}