codepointsToUtf16CodeUnits function

List<int> codepointsToUtf16CodeUnits(
  1. List<int> codepoints, [
  2. int offset = 0,
  3. int? length,
  4. int? replacementCodepoint = UNICODE_REPLACEMENT_CHARACTER_CODEPOINT,
])

Encode code points as UTF16 code units.

Implementation

List<int> codepointsToUtf16CodeUnits(List<int> codepoints,
    [int offset = 0,
    int? length,
    int? replacementCodepoint = UNICODE_REPLACEMENT_CHARACTER_CODEPOINT]) {
  var listRange = ListRange(codepoints, offset, length);
  //var encodedLength = 0;
  for (var value in listRange) {
    if ((value >= 0 && value < UNICODE_UTF16_RESERVED_LO) ||
        (value > UNICODE_UTF16_RESERVED_HI && value <= UNICODE_PLANE_ONE_MAX)) {
      //encodedLength++;
    } else if (value > UNICODE_PLANE_ONE_MAX &&
        value <= UNICODE_VALID_RANGE_MAX) {
      //encodedLength += 2;
    } else {
      //encodedLength++;
    }
  }

  var codeUnitsBuffer = <int>[];

  for (var value in listRange) {
    if ((value >= 0 && value < UNICODE_UTF16_RESERVED_LO) ||
        (value > UNICODE_UTF16_RESERVED_HI && value <= UNICODE_PLANE_ONE_MAX)) {
      codeUnitsBuffer.add(value);
    } else if (value > UNICODE_PLANE_ONE_MAX &&
        value <= UNICODE_VALID_RANGE_MAX) {
      var base = value - UNICODE_UTF16_OFFSET;
      codeUnitsBuffer.add(UNICODE_UTF16_SURROGATE_UNIT_0_BASE +
          ((base & UNICODE_UTF16_HI_MASK) >> 10));
      codeUnitsBuffer.add(
          UNICODE_UTF16_SURROGATE_UNIT_1_BASE + (base & UNICODE_UTF16_LO_MASK));
    } else if (replacementCodepoint != null) {
      codeUnitsBuffer.add(replacementCodepoint);
    } else {
      throw ArgumentError('Invalid encoding');
    }
  }
  return codeUnitsBuffer;
}