// Path: jbbvm/bbvm-core/src/main/java/me/wener/bbvm/dev/Resource.java
// public interface Resource extends AutoCloseable, Wrapper {
//     int getHandler();
// 
//     ResourceManager getManager();
// 
//     /**
//      * Destroy this resource
//      */
//     @Override
//     void close();
// }
// 
// Path: jbbvm/bbvm-core/src/main/java/me/wener/bbvm/dev/ResourceManager.java
// public interface ResourceManager<M extends ResourceManager, R extends Resource> {
//     R getResource(int handler) throws ResourceMissingException;
// 
//     /**
//      * Close this resource, if the resource is not exists may not throw an exception
//      */
//     default R close(int handler) {
//         try {
//             R resource = getResource(handler);
//             resource.close();
//         } catch (ResourceMissingException e) {
//             // ignored
//         } catch (Exception e) {
//             Throwables.propagate(e);
//         }
// 
//         return null;
//     }
// 
//     @SuppressWarnings("unchecked")
//     default M reset() {
//         // If this resources do not need to reset
//         return (M) this;
//     }
// 
//     default R create() {
//         throw new UnsupportedOperationException();
//     }
// 
//     String getType();
// 
// }
// 
// Path: jbbvm/bbvm-core/src/main/java/me/wener/bbvm/util/IsInt.java
// public interface IsInt {
//     int asInt();
// }


import me.wener.bbvm.dev.Resource;
import me.wener.bbvm.dev.ResourceManager;
import me.wener.bbvm.util.IsInt;
package me.wener.bbvm.vm;


/**
 * @author wener
 * @since 15/12/15
 */
public interface Value<T extends Value> {
    T set(int v);

    int get();

    default T set(IsInt v) {
        return set(v.asInt());
    }

    default T set(float v) {
        return set(Float.floatToRawIntBits(v));
    }

    default float getFloat() {
        return Float.intBitsToFloat(get());
    }

    default String getString() {
        return getVm().getString(get());
    }

    /**
     * @param def Default value if getString return null
     */
    default String getString(String def) {
        String s = getString();
        return s == null ? def : s;
    }

    default <M extends ResourceManager<M, R>, R extends Resource> R get(M manager) {
        return manager.getResource(get());
    }

    @SuppressWarnings("unchecked")
// Path: jbbvm/bbvm-core/src/main/java/me/wener/bbvm/dev/Resource.java
// public interface Resource extends AutoCloseable, Wrapper {
//     int getHandler();
// 
//     ResourceManager getManager();
// 
//     /**
//      * Destroy this resource
//      */
//     @Override
//     void close();
// }
// 
// Path: jbbvm/bbvm-core/src/main/java/me/wener/bbvm/dev/ResourceManager.java
// public interface ResourceManager<M extends ResourceManager, R extends Resource> {
//     R getResource(int handler) throws ResourceMissingException;
// 
//     /**
//      * Close this resource, if the resource is not exists may not throw an exception
//      */
//     default R close(int handler) {
//         try {
//             R resource = getResource(handler);
//             resource.close();
//         } catch (ResourceMissingException e) {
//             // ignored
//         } catch (Exception e) {
//             Throwables.propagate(e);
//         }
// 
//         return null;
//     }
// 
//     @SuppressWarnings("unchecked")
//     default M reset() {
//         // If this resources do not need to reset
//         return (M) this;
//     }
// 
//     default R create() {
//         throw new UnsupportedOperationException();
//     }
// 
//     String getType();
// 
// }
// 
// Path: jbbvm/bbvm-core/src/main/java/me/wener/bbvm/util/IsInt.java
// public interface IsInt {
//     int asInt();
// }


// Path: jbbvm/bbvm-core/src/main/java/me/wener/bbvm/vm/Value.java
import me.wener.bbvm.dev.Resource;
import me.wener.bbvm.dev.ResourceManager;
import me.wener.bbvm.util.IsInt;

package me.wener.bbvm.vm;


/**
 * @author wener
 * @since 15/12/15
 */
public interface Value<T extends Value> {
    T set(int v);

    int get();

    default T set(IsInt v) {
        return set(v.asInt());
    }

    default T set(float v) {
        return set(Float.floatToRawIntBits(v));
    }

    default float getFloat() {
        return Float.intBitsToFloat(get());
    }

    default String getString() {
        return getVm().getString(get());
    }

    /**
     * @param def Default value if getString return null
     */
    default String getString(String def) {
        String s = getString();
        return s == null ? def : s;
    }

    default <M extends ResourceManager<M, R>, R extends Resource> R get(M manager) {
        return manager.getResource(get());
    }

    @SuppressWarnings("unchecked")
    default T set(String v) {