/**
  * Unpacks the caseless match data. Called from {@link #getCaselessMatches(int)} to lazily
  * initialize.
  */
 private void initCaselessMatches() {
   caselessMatches = new IntCharSet[maximumCodePoint + 1];
   int[] members = new int[caselessMatchPartitionSize];
   for (int index = 0; index < caselessMatchPartitions.length(); ) {
     IntCharSet partition = new IntCharSet();
     for (int n = 0; n < caselessMatchPartitionSize; ++n) {
       int c = caselessMatchPartitions.codePointAt(index);
       index += Character.charCount(c);
       members[n] = c;
       if (c > 0) partition.add(c); // ignore trailing zero padding
     }
     if (partition.containsElements()) {
       for (int n = 0; n < caselessMatchPartitionSize; ++n) {
         if (members[n] > 0) caselessMatches[members[n]] = partition;
       }
     }
   }
 }
 /**
  * Unpacks data for the selected Unicode version, populating {@link #propertyValueIntervals}.
  *
  * @param propertyValues The list of property values, in same order as the packed data
  *     corresponding to them, in the given intervals, for the selected Unicode version.
  * @param intervals The packed character intervals corresponding to and in the same order as the
  *     given propertyValues, for the selected Unicode version.
  * @param propertyValueAliases Key/value pairs mapping property value aliases to property values,
  *     for the selected Unicode version.
  * @param maximumCodePoint The maximum code point for the selected Unicode version.
  * @param caselessMatchPartitions The packed caseless match partition data for the selected
  *     Unicode version
  * @param caselessMatchPartitionSize The partition data record length (the maximum number of
  *     elements in a caseless match partition) for the selected Unicode version.
  */
 private void bind(
     String[] propertyValues,
     String[] intervals,
     String[] propertyValueAliases,
     int maximumCodePoint,
     String caselessMatchPartitions,
     int caselessMatchPartitionSize) {
   // IntCharSet caselessMatches[] is lazily initialized - don't unpack here
   this.caselessMatchPartitions = caselessMatchPartitions;
   this.caselessMatchPartitionSize = caselessMatchPartitionSize;
   this.maximumCodePoint = maximumCodePoint;
   for (int n = 0; n < propertyValues.length; ++n) {
     String propertyValue = propertyValues[n];
     String propertyIntervals = intervals[n];
     IntCharSet set = new IntCharSet();
     for (int index = 0; index < propertyIntervals.length(); ) {
       int start = propertyIntervals.codePointAt(index);
       index += Character.charCount(start);
       int end = propertyIntervals.codePointAt(index);
       index += Character.charCount(end);
       set.add(new Interval(start, end));
     }
     propertyValueIntervals.put(propertyValue, set);
     if (2 == propertyValue.length()) {
       String singleLetter = propertyValue.substring(0, 1);
       IntCharSet singleLetterPropValueSet = propertyValueIntervals.get(singleLetter);
       if (null == singleLetterPropValueSet) {
         singleLetterPropValueSet = new IntCharSet();
         propertyValueIntervals.put(singleLetter, singleLetterPropValueSet);
       }
       singleLetterPropValueSet.add(set);
     }
   }
   for (int n = 0; n < propertyValueAliases.length; n += 2) {
     String alias = propertyValueAliases[n];
     String propertyValue = propertyValueAliases[n + 1];
     IntCharSet targetSet = propertyValueIntervals.get(propertyValue);
     if (null != targetSet) {
       propertyValueIntervals.put(alias, targetSet);
     }
   }
   bindInvariantIntervals();
 }