// Path: src/main/java/net/kimleo/rec/common/Pair.java
// public class Pair<K, V> {
//     public final K first;
//     public final V second;
// 
// 
//     public Pair(K first, V second) {
//         this.first = first;
//         this.second = second;
//     }
// 
//     public K getFirst() {
//         return first;
//     }
// 
//     public V getSecond() {
//         return second;
//     }
// 
// }
// 
// Path: src/main/java/net/kimleo/rec/v2/accessor/lexer/Lexer.java
// public class Lexer {
//     public static final Pattern PADDING_PATTERN = Pattern.compile("\\{(\\d+)}");
// 
// 
//     public static Pair<Map<String, Integer>, Integer> buildFieldMapPair(String... fields) {
//         final Map<String, Integer> accessorMap = new LinkedHashMap<>();
//         final Pair<List<FieldType>, Integer> lex = lex(fields);
//         final List<FieldType> accessors = lex.getFirst();
//         final Integer leastCapacity = lex.getSecond();
//         boolean reversed = buildFieldMaps(accessorMap, accessors, 0, 1);
// 
//         if (reversed) {
//             buildFieldMaps(accessorMap, reversed(accessors), -1,-1);
//         }
// 
//         return new Pair<>(accessorMap, leastCapacity);
//     }
// 
//     private static boolean buildFieldMaps(Map<String, Integer> accessorMap,
//                                           Iterable<FieldType> accessors,
//                                           int index, int factor) {
//         boolean reversed = false;
//         for (FieldType accessor : accessors) {
//             if (accessor instanceof FieldNameToken) {
//                 accessorMap.put(((FieldNameToken) accessor).getName(), index);
//                 index += factor;
//             } else if (accessor instanceof PaddingToken) {
//                 index += factor * ((PaddingToken) accessor).getSize();
//             } else if (accessor instanceof PlaceholderToken) {
//                 reversed = true;
//                 break;
//             }
//         }
//         return reversed;
//     }
// 
//     public static Pair<List<FieldType>, Integer> lex(String[] fields) {
// 
//         int segmentSize = 1;
//         int currentSegmentSize = 0;
//         ArrayList<FieldType> accessors = new ArrayList<>();
//         for (String field : fields) {
//             if (field.trim().startsWith("{")) {
//                 Matcher matcher = PADDING_PATTERN.matcher(field);
//                 if (matcher.matches()) {
//                     int amount = Integer.parseInt(matcher.group(1));
//                     currentSegmentSize += amount;
//                     accessors.add(new PaddingToken(amount));
//                 } else {
//                     throw new UnsupportedOperationException("Unknown format for padding: " + field);
//                 }
//             } else if ("...".equals(field.trim())) {
//                 accessors.add(new PlaceholderToken(field.trim()));
//                 segmentSize = Math.max(currentSegmentSize, segmentSize);
//                 currentSegmentSize = 0;
//             } else {
//                 accessors.add(new FieldNameToken(field.trim()));
//                 currentSegmentSize++;
//             }
//         }
// 
//         return new Pair<>(accessors, Math.max(currentSegmentSize, segmentSize));
//     }
// }
// 
// Path: src/main/java/net/kimleo/rec/common/concept/Accessible.java
// public interface Accessible<T> {
//     T get(int index);
// 
//     int size();
// 
// }
// 
// Path: src/main/java/net/kimleo/rec/common/exception/Assert.java
// public static void assertTrue(boolean test) {
//     if (!test) {
//         throw new AssertionError("Expected to be true, but got false.");
//     }
// }


import net.kimleo.rec.common.Pair;
import net.kimleo.rec.v2.accessor.lexer.Lexer;
import net.kimleo.rec.common.concept.Accessible;
import java.util.Map;
import static net.kimleo.rec.common.exception.Assert.assertTrue;
package net.kimleo.rec.v2.accessor;




public class Accessor<T> {

    private final Map<String, Integer> fieldMap;
    private final Integer leastCapacity;

    public Accessor(String[] fields) {
// Path: src/main/java/net/kimleo/rec/common/Pair.java
// public class Pair<K, V> {
//     public final K first;
//     public final V second;
// 
// 
//     public Pair(K first, V second) {
//         this.first = first;
//         this.second = second;
//     }
// 
//     public K getFirst() {
//         return first;
//     }
// 
//     public V getSecond() {
//         return second;
//     }
// 
// }
// 
// Path: src/main/java/net/kimleo/rec/v2/accessor/lexer/Lexer.java
// public class Lexer {
//     public static final Pattern PADDING_PATTERN = Pattern.compile("\\{(\\d+)}");
// 
// 
//     public static Pair<Map<String, Integer>, Integer> buildFieldMapPair(String... fields) {
//         final Map<String, Integer> accessorMap = new LinkedHashMap<>();
//         final Pair<List<FieldType>, Integer> lex = lex(fields);
//         final List<FieldType> accessors = lex.getFirst();
//         final Integer leastCapacity = lex.getSecond();
//         boolean reversed = buildFieldMaps(accessorMap, accessors, 0, 1);
// 
//         if (reversed) {
//             buildFieldMaps(accessorMap, reversed(accessors), -1,-1);
//         }
// 
//         return new Pair<>(accessorMap, leastCapacity);
//     }
// 
//     private static boolean buildFieldMaps(Map<String, Integer> accessorMap,
//                                           Iterable<FieldType> accessors,
//                                           int index, int factor) {
//         boolean reversed = false;
//         for (FieldType accessor : accessors) {
//             if (accessor instanceof FieldNameToken) {
//                 accessorMap.put(((FieldNameToken) accessor).getName(), index);
//                 index += factor;
//             } else if (accessor instanceof PaddingToken) {
//                 index += factor * ((PaddingToken) accessor).getSize();
//             } else if (accessor instanceof PlaceholderToken) {
//                 reversed = true;
//                 break;
//             }
//         }
//         return reversed;
//     }
// 
//     public static Pair<List<FieldType>, Integer> lex(String[] fields) {
// 
//         int segmentSize = 1;
//         int currentSegmentSize = 0;
//         ArrayList<FieldType> accessors = new ArrayList<>();
//         for (String field : fields) {
//             if (field.trim().startsWith("{")) {
//                 Matcher matcher = PADDING_PATTERN.matcher(field);
//                 if (matcher.matches()) {
//                     int amount = Integer.parseInt(matcher.group(1));
//                     currentSegmentSize += amount;
//                     accessors.add(new PaddingToken(amount));
//                 } else {
//                     throw new UnsupportedOperationException("Unknown format for padding: " + field);
//                 }
//             } else if ("...".equals(field.trim())) {
//                 accessors.add(new PlaceholderToken(field.trim()));
//                 segmentSize = Math.max(currentSegmentSize, segmentSize);
//                 currentSegmentSize = 0;
//             } else {
//                 accessors.add(new FieldNameToken(field.trim()));
//                 currentSegmentSize++;
//             }
//         }
// 
//         return new Pair<>(accessors, Math.max(currentSegmentSize, segmentSize));
//     }
// }
// 
// Path: src/main/java/net/kimleo/rec/common/concept/Accessible.java
// public interface Accessible<T> {
//     T get(int index);
// 
//     int size();
// 
// }
// 
// Path: src/main/java/net/kimleo/rec/common/exception/Assert.java
// public static void assertTrue(boolean test) {
//     if (!test) {
//         throw new AssertionError("Expected to be true, but got false.");
//     }
// }


// Path: src/main/java/net/kimleo/rec/v2/accessor/Accessor.java
import net.kimleo.rec.common.Pair;
import net.kimleo.rec.v2.accessor.lexer.Lexer;
import net.kimleo.rec.common.concept.Accessible;
import java.util.Map;
import static net.kimleo.rec.common.exception.Assert.assertTrue;

package net.kimleo.rec.v2.accessor;




public class Accessor<T> {

    private final Map<String, Integer> fieldMap;
    private final Integer leastCapacity;

    public Accessor(String[] fields) {
        Pair<Map<String, Integer>, Integer> fieldMapPair = Lexer.buildFieldMapPair(fields);