/* Copyright (c) 2007 Timothy Wall, All Rights Reserved
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*/
package com.sun.jna;
/** Type representing a type-safe native pointer.
* Derived classes may override the {@link NativeMapped#fromNative} method,
* which should instantiate a new object (or look up an existing one)
* of the appropriate type.
*/
public abstract class PointerType implements NativeMapped {
private Pointer pointer;
/** The default constructor wraps a NULL pointer. */
protected PointerType() {
this.pointer = Pointer.NULL;
}
/** This constructor is typically used by {@link #fromNative} if generating
* a new object instance.
*/
protected PointerType(Pointer p) {
this.pointer = p;
}
/** All <code>PointerType</code> classes represent a native {@link Pointer}.
*/
public Class nativeType() {
return Pointer.class;
}
/** Convert this object to its native type (a {@link Pointer}). */
public Object toNative() {
return getPointer();
}
/** Returns the associated native {@link Pointer}. */
public Pointer getPointer() {
return pointer;
}
public void setPointer(Pointer p) {
this.pointer = p;
}
/** The default implementation simply creates a new instance of the class
* and assigns its pointer field. Override if you need different behavior,
* such as ensuring a single {@link PointerType} instance for each unique
* {@link Pointer} value, or instantiating a different {@link PointerType}
* subclass.
*/
public Object fromNative(Object nativeValue, FromNativeContext context) {
// Always pass along null pointer values
if (nativeValue == null) {
return null;
}
try {
PointerType pt = (PointerType)getClass().newInstance();
pt.pointer = (Pointer)nativeValue;
return pt;
}
catch (InstantiationException e) {
throw new IllegalArgumentException("Can't instantiate " + getClass());
}
catch (IllegalAccessException e) {
throw new IllegalArgumentException("Not allowed to instantiate " + getClass());
}
}
/** The hash code for a <code>PointerType</code> is the same as that for
* its pointer.
*/
public int hashCode() {
return pointer != null ? pointer.hashCode() : 0;
}
/** Instances of <code>PointerType</code> with identical pointers compare
* equal by default.
*/
public boolean equals(Object o) {
if (o == this) return true;
if (o instanceof PointerType) {
Pointer p = ((PointerType)o).getPointer();
if (pointer == null)
return p == null;
return pointer.equals(p);
}
return false;
}
}