/*
* Created on Jun 25, 2011
*/
package org.lwjgl.util.mapped;
import java.nio.ByteBuffer;
/**
* @author Riven
*/
public class MappedObject
{
public MappedObject()
{
//
}
// these fields are not assignable/writable by user-code
public long baseAddress;
public long viewAddress;
public int stride;
public int align;
/**
* Holds the value of sizeof of the sub-type of this MappedObject
*
* The behavior of this (transformed) method does not follow the normal Java behavior.
* Vec2.SIZEOF will yield 8 (2 floats)
* Vec3.SIZEOF will yield 12 (3 floats)
* This (required) notation might cause compiler warnings, which can be suppressed with @SuppressWarnings("static-access").
* Using Java 5.0's static-import on this method will break functionality.
*/
// any method that calls these field will have its call-site modified
public static int SIZEOF = -1; // 'final' per subtype
public int view; // read/write
public final void next()
{
this.viewAddress += this.stride;
}
/**
* Creates a MappedObject instance, mapping the memory region of the specified direct ByteBuffer.
*
* The behavior of this (transformed) method does not follow the normal Java behavior.
* Vec2.map(buffer) will return a mapped Vec2 instance.
* Vec3.map(buffer) will return a mapped Vec3 instance.
* This (required) notation might cause compiler warnings, which can be suppressed with @SuppressWarnings("static-access").
* Using Java 5.0's static-import on this method will break functionality.
*/
@SuppressWarnings("unused")
public static T map(ByteBuffer bb)
{
// any method that calls this method will have its call-site modified
throw new InternalError("type not registered");
}
@SuppressWarnings("unused")
public static T map(long address, int capacity)
{
// any method that calls this method will have its call-site modified
throw new InternalError("type not registered");
}
/**
* Creates a MappedObject instance, mapping the memory region of an allocated direct ByteBuffer with a capacity of elementCount*SIZEOF
*
* The behavior of this (transformed) method does not follow the normal Java behavior.
* Vec2.malloc(int) will return a mapped Vec2 instance.
* Vec3.malloc(int) will return a mapped Vec3 instance.
* This (required) notation might cause compiler warnings, which can be suppressed with @SuppressWarnings("static-access").
* Using Java 5.0's static-import on this method will break functionality.
*/
@SuppressWarnings("unused")
public static T malloc(int elementCount)
{
// any method that calls this method will have its call-site modified
throw new InternalError("type not registered");
}
/**
* Creates an identical new MappedObject instance, comparable to the
* contract of ByteBuffer.duplicate()
*/
public final T dup()
{
// any method that calls this method will have its call-site modified
throw new InternalError("type not registered");
}
/**
* Creates a new MappedObject instance, with a base offset equal to
* the offset of the current view, comparable to the contract of ByteBuffer.slice()
*/
public final T slice()
{
// any method that calls this method will have its call-site modified
throw new InternalError("type not registered");
}
public final void runViewConstructor()
{
// any method that calls this method will have its call-site modified
throw new InternalError("type not registered");
}
/**
* Copies and amount of SIZEOF bytes, from the current
* mapped object, to the specified mapped object.
*/
@SuppressWarnings("unused")
public final void copyTo(T target)
{
// any method that calls this method will have its call-site modified
throw new InternalError("type not registered");
}
/**
* Copies and amount of SIZEOF*instances bytes, from the
* current mapped object, to the specified mapped object.
*/
@SuppressWarnings("unused")
public final void copyRange(T target, int instances)
{
// any method that calls this method will have its call-site modified
throw new InternalError("type not registered");
}
/**
* Creates an Iterable that will step through
* elementCount views, leaving the view at
* the last valid value.
*
* For convenience you are encouraged to static-import this specific method:
* import static org.lwjgl.util.mapped.MappedObject.foreach;
*/
public static MappedForeach foreach(T mapped, int elementCount)
{
return new MappedForeach(mapped, elementCount);
}
/**
* Configures a newly initiated mapped object with the specified stride and offset.
* @throws IllegalStateException if view is not at index 0
*/
public static final T configure(T mapped, int stride, int offset)
{
if (mapped.baseAddress != mapped.viewAddress)
throw new IllegalStateException("view must be zero");
if (offset < 0)
throw new IllegalStateException("offset must not be negative: " + offset);
if (offset % mapped.align != 0)
throw new IllegalStateException("offset not a multiple of alignment: " + offset);
if (stride < mapped.stride)
throw new IllegalStateException("new stride must not be smaller than current stride: " + stride);
if (stride % mapped.align != 0)
throw new IllegalStateException("stride not a multiple of alignment: " + stride);
mapped.baseAddress += offset;
mapped.viewAddress += offset;
mapped.stride = stride;
return mapped;
}
ByteBuffer preventGC;
public ByteBuffer backingByteBuffer()
{
return this.preventGC;
}
}