/*
* Copyright 2015 MiLaboratory.com
*
* 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.milaboratory.core.alignment;
import java.util.Arrays;
/**
* AlignmentCache - class which is providing cached array for {@link com.milaboratory.core.alignment.BandedLinearAligner}.
*
* <p>This cache helps to avoid creating new alignment array every time banded alignment is performed.</p>
*/
public final class AlignmentCache {
private AlignmentCache() {
}
static {
if (System.getProperty("enableAlignmentCache") != null)
enable();
}
/**
* CachedArray Provider
*/
private static final ThreadLocal<CachedArrayProvider> local = new ThreadLocal<CachedArrayProvider>() {
@Override
protected CachedArrayProvider initialValue() {
return new CachedArrayProvider();
}
};
/**
* Flag which is indicating whether AlignemntCache is on or off
*/
private static boolean enabled = false;
/**
* Maximum number of CachedArrays in AlignemtnCache
*/
private static int limit = 20;
/**
* Enables CachedArray system
*/
public static void enable() {
enabled = true;
}
/**
* Returns available CachedIntArray if AlignemntCache is on or creates new CachedIntArray otherwise
*
* @return CachedIntArray
*/
public static CachedIntArray get() {
if (enabled)
return local.get().get();
else
return new CachedIntArray();
}
/**
* Release CacheIntArray
*/
public static void release() {
if (enabled)
local.get().release();
}
private static final class CachedArrayProvider {
int pointer = 0;
CachedIntArray[] arrays = new CachedIntArray[3];
public CachedIntArray get() {
if (arrays.length == pointer) {
if (limit < pointer)
throw new RuntimeException("Too many caches.");
arrays = Arrays.copyOf(arrays, pointer + 2);
}
CachedIntArray cia;
if ((cia = arrays[pointer]) == null)
cia = arrays[pointer] = new CachedIntArray();
++pointer;
return cia;
}
public void release() {
if (--pointer < 0)
throw new IllegalStateException("All caches already released.");
}
}
}