package org.infinispan.compat;
import org.infinispan.commons.marshall.Marshaller;
import org.infinispan.context.Flag;
/**
* A type converter for cached keys and values. Given a key and value type,
* implementations of this interface convert instances of those types into
* target key and value type instances respectively.
*
* @param <K> cached key type
* @param <V> cached value type
* @param <KT> target key type
* @param <VT> target value type
*/
public interface TypeConverter<K, V, KT, VT> {
// The reason this interface takes both key and value types into account
// is because given a key type, implementations can make clever decisions
// on how to convert value types into target value types, as seen in
// boxValue and unboxValue method definitions.
/**
* Covert a instance of cached key type into an instance of target key type.
*
* @param key cached key instance to convert
* @return a converted key instance into target key type
*/
KT boxKey(K key);
/**
* Covert a instance of cached key type into an instance of target key type.
*
* @param value cached value instance to convert
* @return a converted value instance into target value type
*/
VT boxValue(V value);
/**
* Convert back an instance of the target key type into an instance of
* the cached key type.
*
* @param target target key type instance to convert back
* @return an instance of the cached key type
*/
K unboxKey(KT target);
/**
* Convert back an instance of the target value type into an instance of
* the cached value type.
*
* @param target target value type instance to convert back
* @return an instance of the cached value type
*/
V unboxValue(VT target);
/**
* Indicates whether this type converter supports a particular type of
* operation. This is used to route type conversion according to the origin
* of the invocation
*
* @return true if operations with this flag should be routed to this type
* converter, false otherwise
*/
boolean supportsInvocation(Flag flag);
/**
* Marshaller to be used by the type converter to marshall/unmarshall contents.
*
* @param marshaller marshaller instance to be used.
*/
void setMarshaller(Marshaller marshaller);
}