// Path: hppc-template-processor/src/main/java/com/carrotsearch/hppc/generator/IntrinsicMethod.java
// public interface IntrinsicMethod {
//   void invoke(
//       Matcher m,
//       StringBuilder sb,
//       TemplateOptions templateOptions,
//       String genericCast,
//       ArrayList<String> params);
// }
// 
// Path: hppc-template-processor/src/main/java/com/carrotsearch/hppc/generator/TemplateOptions.java
// public class TemplateOptions {
//   public static final String TEMPLATE_FILE_TOKEN = "__TEMPLATE_SOURCE__";
// 
//   private boolean ignore;
// 
//   public Type ktype;
//   public Type vtype;
// 
//   public Path templateFile;
// 
//   public TemplateOptions(Type ktype) {
//     this(ktype, null);
//   }
// 
//   public TemplateOptions(Type ktype, Type vtype) {
//     this.ktype = ktype;
//     this.vtype = vtype;
//   }
// 
//   public void setIgnored(boolean ignore) {
//     this.ignore = ignore;
//   }
// 
//   public boolean isIgnored() {
//     return ignore;
//   }
// 
//   public boolean isKTypeAnyOf(String... typeNames) {
//     for (String type : typeNames) {
//       Type t = Type.valueOf(type);
//       if (ktype == t) {
//         return true;
//       }
//     }
//     return false;
//   }
// 
//   public boolean isKTypePrimitive() {
//     return ktype != Type.GENERIC;
//   }
// 
//   public boolean isVTypePrimitive() {
//     return getVType() != Type.GENERIC;
//   }
// 
//   public boolean isKTypeGeneric() {
//     return ktype == Type.GENERIC;
//   }
// 
//   public boolean isVTypeGeneric() {
//     return getVType() == Type.GENERIC;
//   }
// 
//   public boolean isAllGeneric() {
//     return isKTypeGeneric() && isVTypeGeneric();
//   }
// 
//   public boolean isAnyPrimitive() {
//     return isKTypePrimitive() || isVTypePrimitive();
//   }
// 
//   public boolean isAnyGeneric() {
//     return isKTypeGeneric() || (hasVType() && isVTypeGeneric());
//   }
// 
//   public boolean hasVType() {
//     return vtype != null;
//   }
// 
//   public boolean hasKType() {
//     return true;
//   }
// 
//   public Type getKType() {
//     if (!hasKType()) {
//       throw new IllegalArgumentException("Template does not specify KType.");
//     }
//     return ktype;
//   }
// 
//   public Type getVType() {
//     if (!hasVType()) {
//       throw new IllegalArgumentException("Template does not specify VType.");
//     }
//     return vtype;
//   }
// 
//   /*
//    * Returns the current time in ISO format.
//    */
//   public String getTimeNow() {
//     SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ", Locale.ROOT);
//     return format.format(new Date());
//   }
// 
//   public String getTemplateFile() {
//     return templateFile.getFileName().toString();
//   }
// 
//   public String getGeneratedAnnotation() {
//     return String.format(
//         Locale.ROOT,
//         "@com.carrotsearch.hppc.Generated(\n" + "    date = \"%s\",\n" + "    value = \"%s\")",
//         getTimeNow(),
//         TEMPLATE_FILE_TOKEN);
//   }
// }
// 
// Path: hppc-template-processor/src/main/java/com/carrotsearch/hppc/generator/Type.java
// public enum Type {
//   GENERIC,
//   BYTE,
//   CHAR,
//   SHORT,
//   INT,
//   FLOAT,
//   LONG,
//   DOUBLE;
// 
//   public String getBoxedType() {
//     if (this == GENERIC) {
//       return "Object";
//     } else {
//       String boxed = name().toLowerCase(Locale.ROOT);
//       return Character.toUpperCase(boxed.charAt(0)) + boxed.substring(1);
//     }
//   }
// 
//   public String getType() {
//     if (this == GENERIC) {
//       return "Object";
//     } else {
//       return name().toLowerCase(Locale.ROOT);
//     }
//   }
// 
//   public boolean isGeneric() {
//     return this == GENERIC;
//   }
// }


import com.carrotsearch.hppc.generator.IntrinsicMethod;
import com.carrotsearch.hppc.generator.TemplateOptions;
import com.carrotsearch.hppc.generator.Type;
import java.util.ArrayList;
import java.util.Locale;
import java.util.regex.Matcher;
    templateCast = inferTemplateCastName(m, templateOptions, templateCast);

    Type type;
    switch (templateCast) {
      case "KType":
        if (!templateOptions.hasKType()) {
          throw new RuntimeException(
              format(
                  "Template cast requires %s but the template does not have it: %s",
                  templateCast, m.group()));
        }
        type = templateOptions.getKType();
        break;
      case "VType":
        if (!templateOptions.hasVType()) {
          throw new RuntimeException(
              format(
                  "Template cast requires %s but the template does not have it: %s",
                  templateCast, m.group()));
        }
        type = templateOptions.getVType();
        break;
      default:
        throw new RuntimeException(
            format("Ukrecognized template cast to %s in: %s", templateCast, m.group()));
    }
    return type;
  }

  protected static String inferTemplateCastName(
// Path: hppc-template-processor/src/main/java/com/carrotsearch/hppc/generator/IntrinsicMethod.java
// public interface IntrinsicMethod {
//   void invoke(
//       Matcher m,
//       StringBuilder sb,
//       TemplateOptions templateOptions,
//       String genericCast,
//       ArrayList<String> params);
// }
// 
// Path: hppc-template-processor/src/main/java/com/carrotsearch/hppc/generator/TemplateOptions.java
// public class TemplateOptions {
//   public static final String TEMPLATE_FILE_TOKEN = "__TEMPLATE_SOURCE__";
// 
//   private boolean ignore;
// 
//   public Type ktype;
//   public Type vtype;
// 
//   public Path templateFile;
// 
//   public TemplateOptions(Type ktype) {
//     this(ktype, null);
//   }
// 
//   public TemplateOptions(Type ktype, Type vtype) {
//     this.ktype = ktype;
//     this.vtype = vtype;
//   }
// 
//   public void setIgnored(boolean ignore) {
//     this.ignore = ignore;
//   }
// 
//   public boolean isIgnored() {
//     return ignore;
//   }
// 
//   public boolean isKTypeAnyOf(String... typeNames) {
//     for (String type : typeNames) {
//       Type t = Type.valueOf(type);
//       if (ktype == t) {
//         return true;
//       }
//     }
//     return false;
//   }
// 
//   public boolean isKTypePrimitive() {
//     return ktype != Type.GENERIC;
//   }
// 
//   public boolean isVTypePrimitive() {
//     return getVType() != Type.GENERIC;
//   }
// 
//   public boolean isKTypeGeneric() {
//     return ktype == Type.GENERIC;
//   }
// 
//   public boolean isVTypeGeneric() {
//     return getVType() == Type.GENERIC;
//   }
// 
//   public boolean isAllGeneric() {
//     return isKTypeGeneric() && isVTypeGeneric();
//   }
// 
//   public boolean isAnyPrimitive() {
//     return isKTypePrimitive() || isVTypePrimitive();
//   }
// 
//   public boolean isAnyGeneric() {
//     return isKTypeGeneric() || (hasVType() && isVTypeGeneric());
//   }
// 
//   public boolean hasVType() {
//     return vtype != null;
//   }
// 
//   public boolean hasKType() {
//     return true;
//   }
// 
//   public Type getKType() {
//     if (!hasKType()) {
//       throw new IllegalArgumentException("Template does not specify KType.");
//     }
//     return ktype;
//   }
// 
//   public Type getVType() {
//     if (!hasVType()) {
//       throw new IllegalArgumentException("Template does not specify VType.");
//     }
//     return vtype;
//   }
// 
//   /*
//    * Returns the current time in ISO format.
//    */
//   public String getTimeNow() {
//     SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ", Locale.ROOT);
//     return format.format(new Date());
//   }
// 
//   public String getTemplateFile() {
//     return templateFile.getFileName().toString();
//   }
// 
//   public String getGeneratedAnnotation() {
//     return String.format(
//         Locale.ROOT,
//         "@com.carrotsearch.hppc.Generated(\n" + "    date = \"%s\",\n" + "    value = \"%s\")",
//         getTimeNow(),
//         TEMPLATE_FILE_TOKEN);
//   }
// }
// 
// Path: hppc-template-processor/src/main/java/com/carrotsearch/hppc/generator/Type.java
// public enum Type {
//   GENERIC,
//   BYTE,
//   CHAR,
//   SHORT,
//   INT,
//   FLOAT,
//   LONG,
//   DOUBLE;
// 
//   public String getBoxedType() {
//     if (this == GENERIC) {
//       return "Object";
//     } else {
//       String boxed = name().toLowerCase(Locale.ROOT);
//       return Character.toUpperCase(boxed.charAt(0)) + boxed.substring(1);
//     }
//   }
// 
//   public String getType() {
//     if (this == GENERIC) {
//       return "Object";
//     } else {
//       return name().toLowerCase(Locale.ROOT);
//     }
//   }
// 
//   public boolean isGeneric() {
//     return this == GENERIC;
//   }
// }


// Path: hppc-template-processor/src/main/java/com/carrotsearch/hppc/generator/intrinsics/AbstractIntrinsicMethod.java
import com.carrotsearch.hppc.generator.IntrinsicMethod;
import com.carrotsearch.hppc.generator.TemplateOptions;
import com.carrotsearch.hppc.generator.Type;
import java.util.ArrayList;
import java.util.Locale;
import java.util.regex.Matcher;

    templateCast = inferTemplateCastName(m, templateOptions, templateCast);

    Type type;
    switch (templateCast) {
      case "KType":
        if (!templateOptions.hasKType()) {
          throw new RuntimeException(
              format(
                  "Template cast requires %s but the template does not have it: %s",
                  templateCast, m.group()));
        }
        type = templateOptions.getKType();
        break;
      case "VType":
        if (!templateOptions.hasVType()) {
          throw new RuntimeException(
              format(
                  "Template cast requires %s but the template does not have it: %s",
                  templateCast, m.group()));
        }
        type = templateOptions.getVType();
        break;
      default:
        throw new RuntimeException(
            format("Ukrecognized template cast to %s in: %s", templateCast, m.group()));
    }
    return type;
  }

  protected static String inferTemplateCastName(
      Matcher m, TemplateOptions templateOptions, String templateCast) {