/*
* Copyright 2015 Ben Manes. All Rights Reserved.
*
* 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.github.benmanes.caffeine.cache;
import java.lang.ref.ReferenceQueue;
import javax.lang.model.element.Modifier;
import com.google.common.base.CaseFormat;
import com.squareup.javapoet.ClassName;
import com.squareup.javapoet.FieldSpec;
import com.squareup.javapoet.ParameterSpec;
import com.squareup.javapoet.ParameterizedTypeName;
import com.squareup.javapoet.TypeName;
import com.squareup.javapoet.TypeVariableName;
/**
* Shared constants for a code generation specification.
*
* @author ben.manes@gmail.com (Ben Manes)
*/
public final class Specifications {
public static final String PACKAGE_NAME = Specifications.class.getPackage().getName();
public static final String RETIRED_STRONG_KEY = "RETIRED_STRONG_KEY";
public static final String RETIRED_WEAK_KEY = "RETIRED_WEAK_KEY";
public static final String DEAD_STRONG_KEY = "DEAD_STRONG_KEY";
public static final String DEAD_WEAK_KEY = "DEAD_WEAK_KEY";
public static final TypeVariableName kTypeVar = TypeVariableName.get("K");
public static final TypeVariableName vTypeVar = TypeVariableName.get("V");
public static final TypeName kRefQueueType = ParameterizedTypeName.get(
ClassName.get(ReferenceQueue.class), kTypeVar);
public static final TypeName vRefQueueType = ParameterizedTypeName.get(
ClassName.get(ReferenceQueue.class), vTypeVar);
public static final ClassName nodeType = ClassName.get(PACKAGE_NAME, "Node");
public static final TypeName lookupKeyType = ParameterizedTypeName.get(ClassName.get(
PACKAGE_NAME + ".References", "LookupKeyReference"), kTypeVar);
public static final TypeName referenceKeyType = ParameterizedTypeName.get(
ClassName.get(PACKAGE_NAME + ".References", "WeakKeyReference"), kTypeVar);
public static final TypeName rawReferenceKeyType = ParameterizedTypeName.get(
ClassName.get(PACKAGE_NAME + ".References", "WeakKeyReference"), ClassName.get(Object.class));
public static final ParameterSpec keySpec = ParameterSpec.builder(kTypeVar, "key").build();
public static final ParameterSpec keyRefSpec =
ParameterSpec.builder(Object.class, "keyReference").build();
public static final ParameterSpec keyRefQueueSpec =
ParameterSpec.builder(kRefQueueType, "keyReferenceQueue").build();
public static final ParameterSpec valueSpec = ParameterSpec.builder(vTypeVar, "value").build();
public static final ParameterSpec valueRefQueueSpec =
ParameterSpec.builder(vRefQueueType, "valueReferenceQueue").build();
public static final TypeName NODE = ParameterizedTypeName.get(nodeType, kTypeVar, vTypeVar);
public static final TypeName UNSAFE_ACCESS =
ClassName.get("com.github.benmanes.caffeine.base", "UnsafeAccess");
public static final ParameterSpec BUILDER_PARAM = ParameterSpec.builder(ParameterizedTypeName.get(
ClassName.get(PACKAGE_NAME, "Caffeine"), kTypeVar, vTypeVar), "builder").build();
public static final TypeName BOUNDED_LOCAL_CACHE = ParameterizedTypeName.get(
ClassName.get(PACKAGE_NAME, "BoundedLocalCache"), kTypeVar, vTypeVar);
public static final TypeName CACHE_LOADER = ParameterizedTypeName.get(
ClassName.get(PACKAGE_NAME, "CacheLoader"), TypeVariableName.get("? super K"), vTypeVar);
public static final ParameterSpec CACHE_LOADER_PARAM =
ParameterSpec.builder(CACHE_LOADER, "cacheLoader").build();
public static final TypeName REMOVAL_LISTENER = ParameterizedTypeName.get(
ClassName.get(PACKAGE_NAME, "RemovalListener"), kTypeVar, vTypeVar);
public static final TypeName STATS_COUNTER =
ClassName.get(PACKAGE_NAME + ".stats", "StatsCounter");
public static final TypeName TICKER = ClassName.get(PACKAGE_NAME, "Ticker");
public static final TypeName ACCESS_ORDER_DEQUE = ParameterizedTypeName.get(
ClassName.get(PACKAGE_NAME, "AccessOrderDeque"), NODE);
public static final TypeName WRITE_ORDER_DEQUE = ParameterizedTypeName.get(
ClassName.get(PACKAGE_NAME, "WriteOrderDeque"), NODE);
public static final ClassName WRITE_QUEUE_TYPE =
ClassName.get(PACKAGE_NAME, "MpscGrowableArrayQueue");
public static final TypeName WRITE_QUEUE = ParameterizedTypeName.get(
WRITE_QUEUE_TYPE, ClassName.get(Runnable.class));
public static final TypeName EXPIRY = ParameterizedTypeName.get(
ClassName.get(PACKAGE_NAME, "Expiry"), kTypeVar, vTypeVar);
public static final TypeName TIMER_WHEEL = ParameterizedTypeName.get(
ClassName.get(PACKAGE_NAME, "TimerWheel"), kTypeVar, vTypeVar);
public static final TypeName FREQUENCY_SKETCH = ParameterizedTypeName.get(
ClassName.get(PACKAGE_NAME, "FrequencySketch"), kTypeVar);
private Specifications() {}
/** Returns the offset constant to this variable. */
public static String offsetName(String varName) {
return CaseFormat.LOWER_CAMEL.to(CaseFormat.UPPER_UNDERSCORE, varName) + "_OFFSET";
}
/** Creates a public static field with an Unsafe address offset. */
public static FieldSpec newFieldOffset(String className, String varName) {
String name = offsetName(varName);
return FieldSpec
.builder(long.class, name, Modifier.PROTECTED, Modifier.STATIC, Modifier.FINAL)
.initializer("$T.objectFieldOffset($T.class, $S)", UNSAFE_ACCESS,
ClassName.bestGuess(className), varName).build();
}
}