// Path: src/util/Generic.java
// public class Generic {
//     public static String extractGeneric(String str){
//         return str.substring(str.indexOf("<") +1, str.indexOf(">")).trim();
//     }
// 
//     public static  String[] extractPair(String str) {
//         str = str.substring(str.indexOf("<") +1, str.indexOf(">")).trim();
//         String[] kv = str.split(",");
//         return new String[]{kv[0].trim(), kv[1].trim()};
//     }
// 
//     public static String stripGeneric(String str){
//         int index = str.indexOf("<");
//         if (index == -1){
//             return str;
//         }
//         return str.substring(0, index);
//     }
// }
// 
// Path: src/util/PointerTest.java
// public class PointerTest {
// 
//     private static final List<String> BWAPI4_INTERFACES = Arrays.asList("Client", "Game", "AIModule" ,"Event", "Race", "Error", "Order");
// 
//     private static boolean testCls(String cls){
//         return BWAPI4_INTERFACES.contains(cls) || cls.endsWith("set") ||  cls.endsWith("Type") || cls.startsWith("BWTA");
//     }
// 
//     public static String test(String cls) {
//         return test(cls, true);
//     }
// 
// 
//     public static String test(String cls, boolean print) {
//         if (CJavaPipeline.isBWAPI3()) {
//             return (print ? cls : "" )+ "*";
//         }
//         return (print ? cls : "" ) + (testCls(cls) ? "*" : "");
//     }
// 
// }
// 
// Path: src/util/StringUtils.java
// public class StringUtils {
//     public static String capitalize(final String line) {
//        return Character.toUpperCase(line.charAt(0)) + line.substring(1);
//     }
// }


import util.Generic;
import util.PointerTest;
import util.StringUtils;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
    public String getPackageName() {
        return packageName;
    }

    public String getPackageName(String javaRetType) {
        if (packageName.equals("bwta") && (javaRetType.equals("Position") || javaRetType.equals("Unit") || javaRetType.equals("Pair") || javaRetType.equals("TilePosition"))) {
            return "bwapi";
        }
        return packageName;
    }

    public void setPackageName(String packageName) {
        this.packageName = packageName;
    }

    public String toCType(String javaType) {
        String result = javaToCType.get(javaType);
        return result != null ? result : "REF";
    }

    public String toCPair(String javaType) {
        if (javaType.startsWith("Pair")) {
            String[] pair = Generic.extractPair(javaType);
            return "std::pair<" + javaObjectToPrimitive(prefixPackageNameAndAddPointerIfNeeded(pair[0])) + ", " + javaObjectToPrimitive(prefixPackageNameAndAddPointerIfNeeded(pair[1])) + ">";
        }
        return javaType;
    }

    public String prefixPackageNameAndAddPointerIfNeeded(String javaType) {
        if (isBWTA(javaType)) {
// Path: src/util/Generic.java
// public class Generic {
//     public static String extractGeneric(String str){
//         return str.substring(str.indexOf("<") +1, str.indexOf(">")).trim();
//     }
// 
//     public static  String[] extractPair(String str) {
//         str = str.substring(str.indexOf("<") +1, str.indexOf(">")).trim();
//         String[] kv = str.split(",");
//         return new String[]{kv[0].trim(), kv[1].trim()};
//     }
// 
//     public static String stripGeneric(String str){
//         int index = str.indexOf("<");
//         if (index == -1){
//             return str;
//         }
//         return str.substring(0, index);
//     }
// }
// 
// Path: src/util/PointerTest.java
// public class PointerTest {
// 
//     private static final List<String> BWAPI4_INTERFACES = Arrays.asList("Client", "Game", "AIModule" ,"Event", "Race", "Error", "Order");
// 
//     private static boolean testCls(String cls){
//         return BWAPI4_INTERFACES.contains(cls) || cls.endsWith("set") ||  cls.endsWith("Type") || cls.startsWith("BWTA");
//     }
// 
//     public static String test(String cls) {
//         return test(cls, true);
//     }
// 
// 
//     public static String test(String cls, boolean print) {
//         if (CJavaPipeline.isBWAPI3()) {
//             return (print ? cls : "" )+ "*";
//         }
//         return (print ? cls : "" ) + (testCls(cls) ? "*" : "");
//     }
// 
// }
// 
// Path: src/util/StringUtils.java
// public class StringUtils {
//     public static String capitalize(final String line) {
//        return Character.toUpperCase(line.charAt(0)) + line.substring(1);
//     }
// }


// Path: src/generator/JavaContext.java
import util.Generic;
import util.PointerTest;
import util.StringUtils;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;

    public String getPackageName() {
        return packageName;
    }

    public String getPackageName(String javaRetType) {
        if (packageName.equals("bwta") && (javaRetType.equals("Position") || javaRetType.equals("Unit") || javaRetType.equals("Pair") || javaRetType.equals("TilePosition"))) {
            return "bwapi";
        }
        return packageName;
    }

    public void setPackageName(String packageName) {
        this.packageName = packageName;
    }

    public String toCType(String javaType) {
        String result = javaToCType.get(javaType);
        return result != null ? result : "REF";
    }

    public String toCPair(String javaType) {
        if (javaType.startsWith("Pair")) {
            String[] pair = Generic.extractPair(javaType);
            return "std::pair<" + javaObjectToPrimitive(prefixPackageNameAndAddPointerIfNeeded(pair[0])) + ", " + javaObjectToPrimitive(prefixPackageNameAndAddPointerIfNeeded(pair[1])) + ">";
        }
        return javaType;
    }

    public String prefixPackageNameAndAddPointerIfNeeded(String javaType) {
        if (isBWTA(javaType)) {
            return PointerTest.test("BWTA::" + javaType);