package org.overture.codegen.vdm2jml.predgen.info; import org.overture.codegen.vdm2jml.JmlGenerator; import org.overture.codegen.vdm2jml.runtime.V2J; import org.overture.codegen.vdm2jml.util.NameGen; public class MapInfo extends AbstractCollectionInfo { public static final String IS_MAP_METHOD = "isMap"; public static final String IS_INJECTIVE_MAP_METHOD = "isInjMap"; public static final String GET_DOM_METHOD = "getDom"; public static final String GET_RNG_METHOD = "getRng"; private AbstractTypeInfo domType; private AbstractTypeInfo rngType; private boolean injective; public MapInfo(boolean optional, AbstractTypeInfo domType, AbstractTypeInfo rngType, boolean injective) { super(optional); this.domType = domType; this.rngType = rngType; this.injective = injective; } @Override public String consElementCheck(String enclosingClass, String javaRootPackage, String arg, NameGen nameGen, String iteVar) { String domArg = consSubjectCheckExtraArg(V2J.class.getSimpleName(), GET_DOM_METHOD, arg, iteVar); String rngArg = consSubjectCheckExtraArg(V2J.class.getSimpleName(), GET_RNG_METHOD, arg, iteVar); String domCheck = domType.consCheckExp(enclosingClass, javaRootPackage, domArg, nameGen); String rngCheck = rngType.consCheckExp(enclosingClass, javaRootPackage, rngArg, nameGen); StringBuilder sb = new StringBuilder(); sb.append(domCheck); sb.append(JmlGenerator.JML_AND); sb.append(rngCheck); return sb.toString(); } @Override public String consCollectionCheck(String arg) { // e.g. (V2J.isMap(m) && (\forall int i; 0 <= i && i < VDM2JML.size(m); Utils.is_nat(VDM2JML.getDom(i,m)) && // Utils.is_nat(VDM2JML.getRng(i,m)))); return consSubjectCheck(V2J.class.getSimpleName(), injective ? IS_INJECTIVE_MAP_METHOD : IS_MAP_METHOD, arg); } }