macro the hell out of enums

This commit is contained in:
2026-06-04 12:55:03 -03:00
parent f2db7450ba
commit 80e6682114
2 changed files with 45 additions and 3 deletions

View File

@@ -17,6 +17,19 @@
CARBON_JNI_EXCEPTION_CHECK()\
return env->GetStaticObjectField(clazz, id);\
}
// EM = enum mapper
#define CARBON_EM_DEFINE(classpath) const char* enumClassPath = classpath;\
jclass clazz = env->FindClass(enumClassPath);\
CARBON_JNI_EXCEPTION_CHECK();
#define CARBON_EM_SWITCH(block) switch (a) { block }
#define CARBON_EM_CASE(ecase) case ecase: {\
jfieldID id = env->GetFieldID(clazz, #ecase, enumClassPath);\
CARBON_JNI_EXCEPTION_CHECK();\
return env->GetStaticObjectField(clazz, id);\
}
#define CARBON_CLASSPATH(jvtype) "Lorg/neoflock/NeoNucleus/" #jvtype
#define CARBON_EM_FROM(jvtype) return Carbon_FromEnum<jvtype>(env, CARBON_CLASSPATH(jvtype), a);
// codename for NN JNI is Carbon because i needed something better than NN JNI
bool Carbon::PointerBacked::SetPointer(JNIEnv * env, jobject obj, void* ptr) {
@@ -85,7 +98,7 @@ jobject Carbon::Map::To_nn_Exit(JNIEnv* env, nn_Exit a) {
}
return NULL;
}
nn_Exit From_nn_Exit(JNIEnv* env, jobject a) {
nn_Exit Carbon::Map::From_nn_Exit(JNIEnv* env, jobject a) {
jclass clazz = env->FindClass("org/neoflock/NeoNucleus/nn_Exit");
jmethodID ordMID = env->GetMethodID(clazz, "ordinal", "()I");
jint value = env->CallIntMethod(a, ordMID);
@@ -102,12 +115,13 @@ jobject Carbon::Map::To_nn_ComputerState(JNIEnv* env, nn_ComputerState a) {
CARBON_MAP_TO_NN_COMPUTERSTATE(NN_BLACKOUT)
CARBON_MAP_TO_NN_COMPUTERSTATE(NN_CHARCH)
}
return NULL;
}
nn_Exit From_nn_ComputerState(JNIEnv* env, jobject a) {
nn_ComputerState Carbon::Map::From_nn_ComputerState(JNIEnv* env, jobject a) {
jclass clazz = env->FindClass("org/neoflock/NeoNucleus/nn_ComputerState");
jmethodID ordMID = env->GetMethodID(clazz, "ordinal", "()I");
jint value = env->CallIntMethod(a, ordMID);
return (nn_Exit) value;
return (nn_ComputerState) value;
}
jobject Carbon::Map::To_nn_Architecture(JNIEnv* env, nn_Architecture a) {
jclass clazz = env->FindClass("org/neoflock/NeoNucleus/nn_Architecture");
@@ -130,6 +144,31 @@ jobject Carbon::Map::To_nn_Architecture(JNIEnv* env, nn_Architecture a) {
printf("return\n");
return obj;
}
jobject Carbon::Map::To_nn_EnvironmentAction(JNIEnv *env, nn_EnvironmentAction a)
{
CARBON_EM_DEFINE("Lorg/neoflock/NeoNucleus/nn_EnvironmentAction");
CARBON_EM_SWITCH(
CARBON_EM_CASE(NN_ENV_DRAWENERGY)
CARBON_EM_CASE(NN_ENV_POWERON)
CARBON_EM_CASE(NN_ENV_POWEROFF)
CARBON_EM_CASE(NN_ENV_CRASHED)
CARBON_EM_CASE(NN_ENV_BEEP)
CARBON_EM_CASE(NN_ENV_BEEPMORSE)
)
return NULL;
}
template <typename T> T Carbon_FromEnum(JNIEnv* env, const char* classpath, jobject a) {
jclass clazz = env->FindClass(classpath);
jmethodID ordMID = env->GetMethodID(clazz, "ordinal", "()I");
jint value = env->CallIntMethod(a, ordMID);
return (T) value;
}
nn_EnvironmentAction Carbon::Map::From_nn_EnvironmentAction(JNIEnv* env, jobject a)
{ CARBON_EM_FROM(nn_EnvironmentAction); }
namespace Carbon::Exceptions {
CARBON_EXCEPTION_FUNC(ThrowNullPtr, "java/lang/NullPointerException");
}

View File

@@ -24,11 +24,14 @@ namespace Carbon {
bool ResetPointer(JNIEnv * env, jobject obj);
}
namespace Map {
//template <typename T> T FromEnum(JNIEnv* env, const char* classpath, T a);
jobject To_nn_Exit(JNIEnv* env, nn_Exit a);
nn_Exit From_nn_Exit(JNIEnv* env, jobject a);
jobject To_nn_ComputerState(JNIEnv* env, nn_ComputerState a);
nn_ComputerState From_nn_ComputerState(JNIEnv* env, jobject a);
jobject To_nn_Architecture(JNIEnv* env, nn_Architecture a);
nn_EnvironmentAction From_nn_EnvironmentAction(JNIEnv* env, jobject a);
jobject To_nn_EnvironmentAction(JNIEnv* env, nn_EnvironmentAction a);
}
typedef struct JavaObjectTarget { // i might lowkey drop this struct