All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.bugvm.objc.RunnableAsObjCBlockMarshaler Maven / Gradle / Ivy

There is a newer version: 1.2.9
Show newest version
/*
 * Copyright (C) 2014 RoboVM AB
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package com.bugvm.objc;

import com.bugvm.objc.annotation.Block;
import com.bugvm.rt.bro.Struct;
import com.bugvm.rt.bro.annotation.Bridge;
import com.bugvm.rt.bro.annotation.Callback;
import com.bugvm.rt.bro.annotation.Marshaler;
import com.bugvm.rt.bro.annotation.MarshalsPointer;
import com.bugvm.rt.bro.annotation.Pointer;

/**
 * Marshals {@link Runnable} instances. The ObjCBlockPlugin compiler plugin will
 * automatically use this as {@link Marshaler} for {@link Block} annotated
 * {@link Runnable} types. Also used as template for other auto-generated 
 * marshaler classes for other {@link Block} annotated types.
 */
public class RunnableAsObjCBlockMarshaler implements Runnable {

    private static ObjCBlock.Wrapper WRAPPER = 
            new ObjCBlock.Wrapper(RunnableAsObjCBlockMarshaler.class);
    
    private ObjCBlock objCBlock;
    
    private RunnableAsObjCBlockMarshaler(ObjCBlock objCBlock) {
        this.objCBlock = objCBlock;
    }
    
    @MarshalsPointer
    public static Runnable toObject(Class cls, long handle, long flags) {
        if (handle == 0L) {
            return null;
        }
        ObjCBlock block = Struct.toStruct(ObjCBlock.class, handle);
        if (block.hasObject()) {
            return (Runnable) block.object();
        }
        return new RunnableAsObjCBlockMarshaler(block);
    }
    
    @MarshalsPointer
    public static long toNative(Runnable o, long flags) {
        if (o == null) {
            return 0L;
        }
        if (o instanceof RunnableAsObjCBlockMarshaler) {
            return ((RunnableAsObjCBlockMarshaler) o).objCBlock.getHandle();
        }
        // TODO: Retain if returned from callback?
        return WRAPPER.toObjCBlock(o).getHandle();
    }
    
    // The box()/unbox() methods are used as template methods for auto-generated
    // marshalers so they must be here even if this RunnableAsObjCBlockMarshaler
    // doesn't need them.
    
    private static Boolean box(boolean v) {
        return Boolean.valueOf(v);
    }
    private static Byte box(byte v) {
        return Byte.valueOf(v);
    }
    private static Short box(short v) {
        return Short.valueOf(v);
    }
    private static Character box(char v) {
        return Character.valueOf(v);
    }
    private static Integer box(int v) {
        return Integer.valueOf(v);
    }
    private static Long box(long v) {
        return Long.valueOf(v);
    }
    private static Float box(float v) {
        return Float.valueOf(v);
    }
    private static Double box(double v) {
        return Double.valueOf(v);
    }
    private static boolean unbox(Boolean v) {
        return v.booleanValue();
    }
    private static byte unbox(Byte v) {
        return v.byteValue();
    }
    private static short unbox(Short v) {
        return v.shortValue();
    }
    private static char unbox(Character v) {
        return v.charValue();
    }
    private static int unbox(Integer v) {
        return v.intValue();
    }
    private static long unbox(Long v) {
        return v.longValue();
    }
    private static float unbox(Float v) {
        return v.floatValue();
    }
    private static double unbox(Double v) {
        return v.doubleValue();
    }
    
    public void run() {
        invoke(objCBlock.invoke(), objCBlock);
    }
    
    @Bridge(dynamic = true)
    private static native void invoke(@Pointer long target, ObjCBlock block);
    
    @Callback
    private static void invoked(ObjCBlock block) {
        ((Runnable) block.object()).run();
    }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy