/*
 * Class:     com_asakusafw_m3bp_mirror_jni_InputReaderMirrorImpl
 * Method:    close0
 * Signature: (J)V
 */
JNIEXPORT void JNICALL Java_com_asakusafw_m3bp_mirror_jni_InputReaderMirrorImpl_close0
(JNIEnv *env, jclass clazz, jlong _self) {
    try {
        InputReaderMirror *self = (InputReaderMirror *) _self;
        delete self;
    } catch (JavaException &e) {
        e.rethrow(env);
    } catch (std::exception &e) {
        handle_native_exception(env, e);
    }
}
/*
 * Class:     com_asakusafw_m3bp_mirror_jni_FlowGraphMirrorImpl
 * Method:    addEdge0
 * Signature: (JJJ)V
 */
JNIEXPORT void JNICALL Java_com_asakusafw_m3bp_mirror_jni_FlowGraphMirrorImpl_addEdge0
(JNIEnv *env, jclass clazz, jlong _self, jlong _upstream, jlong _downstream) {
    try {
        FlowGraphMirror *self = (FlowGraphMirror *) _self;
        OutputPortMirror *upstream = (OutputPortMirror *) _upstream;
        InputPortMirror *downstream = (InputPortMirror *) _downstream;
        self->edge(upstream, downstream);
    } catch (JavaException &e) {
        e.rethrow(env);
    } catch (std::exception &e) {
        handle_native_exception(env, e);
    }
}
/*
 * Class:     com_asakusafw_m3bp_mirror_jni_InputReaderMirrorImpl
 * Method:    hasKey0
 * Signature: (J)Z
 */
JNIEXPORT jboolean JNICALL Java_com_asakusafw_m3bp_mirror_jni_InputReaderMirrorImpl_hasKey0
(JNIEnv *env, jclass clazz, jlong _self) {
    try {
        InputReaderMirror *self = (InputReaderMirror *) _self;
        return self->has_key();
    } catch (JavaException &e) {
        e.rethrow(env);
        return false;
    } catch (std::exception &e) {
        handle_native_exception(env, e);
        return false;
    }
}
/*
 * Class:     com_asakusafw_m3bp_mirror_jni_FlowGraphMirrorImpl
 * Method:    addVertex0
 * Signature: (JLjava/lang/String;)J
 */
JNIEXPORT jlong JNICALL Java_com_asakusafw_m3bp_mirror_jni_FlowGraphMirrorImpl_addVertex0
(JNIEnv *env, jclass clazz, jlong _self, jstring _name) {
    try {
        FlowGraphMirror *self = (FlowGraphMirror *) _self;
        const char *name = env->GetStringUTFChars(_name, 0);
        VertexMirror *vertex = self->vertex(std::string(name));
        env->ReleaseStringUTFChars(_name, name);
        return to_pointer(vertex);
    } catch (JavaException &e) {
        e.rethrow(env);
        return 0;
    } catch (std::exception &e) {
        handle_native_exception(env, e);
        return 0;
    }
}
/*
 * Class:     com_asakusafw_m3bp_mirror_jni_InputReaderMirrorImpl
 * Method:    getInputBufferFragment0
 * Signature: (JZ[J)V
 */
JNIEXPORT void JNICALL Java_com_asakusafw_m3bp_mirror_jni_InputReaderMirrorImpl_getInputBufferFragment0
(JNIEnv *env, jclass clazz, jlong _self, jboolean is_key, jlongArray results) {
    try {
        jlong array[com_asakusafw_m3bp_mirror_jni_InputReaderMirrorImpl_VALUES_SIZE];
        InputReaderMirror *self = (InputReaderMirror *) _self;
        std::tuple<const void *, const void *, m3bp::size_type> buffer;
        if (is_key) {
            buffer = self->key_buffer();
        } else {
            buffer = self->value_buffer();
        }
        array[com_asakusafw_m3bp_mirror_jni_InputReaderMirrorImpl_INDEX_BUFFER_PTR] = (jlong) std::get<0>(buffer);
        array[com_asakusafw_m3bp_mirror_jni_InputReaderMirrorImpl_INDEX_OFFSET_TABLE_PTR] = (jlong) std::get<1>(buffer);
        array[com_asakusafw_m3bp_mirror_jni_InputReaderMirrorImpl_INDEX_RECORD_COUNT] = (jlong) std::get<2>(buffer);
        env->SetLongArrayRegion(results, 0, com_asakusafw_m3bp_mirror_jni_InputReaderMirrorImpl_VALUES_SIZE, &array[0]);
    } catch (JavaException &e) {
        e.rethrow(env);
    } catch (std::exception &e) {
        handle_native_exception(env, e);
    }
}