blob: c7f5d60579cd598a228e2c2e7c64d95753553a46 [file] [log] [blame]
/*******************************************************************************
* Copyright 2011 See AUTHORS file.
*
* 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.badlogic.gdx.physics.bullet;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.utils.Disposable;
public class BulletBase implements Disposable {
private long cPointer;
protected boolean swigCMemOwn;
private boolean disposed;
protected boolean destroyed;
public final String className;
private int refCount;
protected BulletBase(final String className, long cPtr, boolean cMemoryOwn) {
this.className = className;
swigCMemOwn = cMemoryOwn;
cPointer = cPtr;
}
/** Obtains a reference to this object, call release to free the reference. */
public void obtain() {
refCount++;
}
/** Release a previously obtained reference, causing the object to be disposed when this was the last reference. */
public void release() {
if (--refCount <= 0 && Bullet.useRefCounting)
dispose();
}
/** @return Whether this instance is obtained using the {@link #obtain()} method. */
public boolean isObtained() {
return refCount > 0;
}
protected void construct() {
destroyed = false;
}
protected void reset(long cPtr, boolean cMemoryOwn) {
if (!destroyed)
destroy();
swigCMemOwn = cMemoryOwn;
cPointer = cPtr;
construct();
}
@Override
public boolean equals(Object obj) {
return (obj instanceof BulletBase) && (((BulletBase)obj).cPointer == this.cPointer);
}
@Override
public int hashCode() {
return (int)cPointer;
}
/** @return The memory location (pointer) of this instance. */
public long getCPointer() {
return cPointer;
}
/** Take ownership of the native instance, causing the native object to be deleted when this object gets out of scope. */
public void takeOwnership() {
swigCMemOwn = true;
}
/** Release ownership of the native instance, causing the native object NOT to be deleted when this object gets out of scope. */
public void releaseOwnership() {
swigCMemOwn = false;
}
/** @return True if the native is destroyed when this object gets out of scope, false otherwise. */
public boolean hasOwnership() {
return swigCMemOwn;
}
/** Deletes the bullet object this class encapsulates. Do not call directly, instead use the {@link #dispose()} method. */
protected void delete() {
cPointer = 0;
}
@Override
public void dispose () {
if (refCount > 0 && Bullet.useRefCounting && Bullet.enableLogging)
Gdx.app.error("Bullet", "Disposing "+toString()+" while it still has "+refCount+" references.");
disposed = true;
delete();
}
/** @return Whether the {@link #dispose()} method of this instance is called. */
public boolean isDisposed() {
return disposed;
}
@Override
public String toString () {
return className+"("+cPointer+","+swigCMemOwn+")";
}
protected void destroy() {
try {
if (destroyed && Bullet.enableLogging)
Gdx.app.error("Bullet", "Already destroyed "+toString());
destroyed = true;
if (swigCMemOwn && !disposed) {
if (Bullet.enableLogging)
Gdx.app.error("Bullet", "Disposing "+toString()+" due to garbage collection.");
dispose();
}
} catch(Throwable e) {
Gdx.app.error("Bullet", "Exception while destroying "+toString(), e);
}
}
@Override
protected void finalize() throws Throwable {
if (!destroyed && Bullet.enableLogging)
Gdx.app.error("Bullet", "The "+className+" class does not override the finalize method.");
super.finalize();
}
}