public int writeTo()

in core/src/main/java/org/apache/iceberg/variants/PrimitiveWrapper.java [127:240]


  public int writeTo(ByteBuffer outBuffer, int offset) {
    Preconditions.checkArgument(
        outBuffer.order() == ByteOrder.LITTLE_ENDIAN, "Invalid byte order: big endian");
    switch (type()) {
      case NULL:
        outBuffer.put(offset, NULL_HEADER);
        return 1;
      case BOOLEAN_TRUE:
        outBuffer.put(offset, TRUE_HEADER);
        return 1;
      case BOOLEAN_FALSE:
        outBuffer.put(offset, FALSE_HEADER);
        return 1;
      case INT8:
        outBuffer.put(offset, INT8_HEADER);
        outBuffer.put(offset + 1, (Byte) value);
        return 2;
      case INT16:
        outBuffer.put(offset, INT16_HEADER);
        outBuffer.putShort(offset + 1, (Short) value);
        return 3;
      case INT32:
        outBuffer.put(offset, INT32_HEADER);
        outBuffer.putInt(offset + 1, (Integer) value);
        return 5;
      case INT64:
        outBuffer.put(offset, INT64_HEADER);
        outBuffer.putLong(offset + 1, (Long) value);
        return 9;
      case FLOAT:
        outBuffer.put(offset, FLOAT_HEADER);
        outBuffer.putFloat(offset + 1, (Float) value);
        return 5;
      case DOUBLE:
        outBuffer.put(offset, DOUBLE_HEADER);
        outBuffer.putDouble(offset + 1, (Double) value);
        return 9;
      case DATE:
        outBuffer.put(offset, DATE_HEADER);
        outBuffer.putInt(offset + 1, (Integer) value);
        return 5;
      case TIMESTAMPTZ:
        outBuffer.put(offset, TIMESTAMPTZ_HEADER);
        outBuffer.putLong(offset + 1, (Long) value);
        return 9;
      case TIMESTAMPNTZ:
        outBuffer.put(offset, TIMESTAMPNTZ_HEADER);
        outBuffer.putLong(offset + 1, (Long) value);
        return 9;
      case DECIMAL4:
        BigDecimal decimal4 = (BigDecimal) value;
        outBuffer.put(offset, DECIMAL4_HEADER);
        outBuffer.put(offset + 1, (byte) decimal4.scale());
        outBuffer.putInt(offset + 2, decimal4.unscaledValue().intValueExact());
        return 6;
      case DECIMAL8:
        BigDecimal decimal8 = (BigDecimal) value;
        outBuffer.put(offset, DECIMAL8_HEADER);
        outBuffer.put(offset + 1, (byte) decimal8.scale());
        outBuffer.putLong(offset + 2, decimal8.unscaledValue().longValueExact());
        return 10;
      case DECIMAL16:
        BigDecimal decimal16 = (BigDecimal) value;
        byte padding = (byte) (decimal16.signum() < 0 ? 0xFF : 0x00);
        byte[] bytes = decimal16.unscaledValue().toByteArray();
        outBuffer.put(offset, DECIMAL16_HEADER);
        outBuffer.put(offset + 1, (byte) decimal16.scale());
        for (int i = 0; i < 16; i += 1) {
          if (i < bytes.length) {
            // copy the big endian value and convert to little endian
            outBuffer.put(offset + 2 + i, bytes[bytes.length - i - 1]);
          } else {
            // pad with 0x00 or 0xFF depending on the sign
            outBuffer.put(offset + 2 + i, padding);
          }
        }
        return 18;
      case BINARY:
        ByteBuffer binary = (ByteBuffer) value;
        outBuffer.put(offset, BINARY_HEADER);
        outBuffer.putInt(offset + 1, binary.remaining());
        VariantUtil.writeBufferAbsolute(outBuffer, offset + 5, binary);
        return 5 + binary.remaining();
      case STRING:
        // TODO: use short string when possible
        if (null == buffer) {
          this.buffer = ByteBuffer.wrap(((String) value).getBytes(StandardCharsets.UTF_8));
        }

        outBuffer.put(offset, STRING_HEADER);
        outBuffer.putInt(offset + 1, buffer.remaining());
        VariantUtil.writeBufferAbsolute(outBuffer, offset + 5, buffer);
        return 5 + buffer.remaining();
      case TIME:
        outBuffer.put(offset, TIME_HEADER);
        outBuffer.putLong(offset + 1, (Long) value);
        return 9;
      case TIMESTAMPTZ_NANOS:
        outBuffer.put(offset, TIMESTAMPTZ_NANOS_HEADER);
        outBuffer.putLong(offset + 1, (Long) value);
        return 9;
      case TIMESTAMPNTZ_NANOS:
        outBuffer.put(offset, TIMESTAMPNTZ_NANOS_HEADER);
        outBuffer.putLong(offset + 1, (Long) value);
        return 9;
      case UUID:
        outBuffer.put(offset, UUID_HEADER);
        VariantUtil.writeBufferAbsolute(
            outBuffer, offset + 1, UUIDUtil.convertToByteBuffer((UUID) value));
        return 17;
    }

    throw new UnsupportedOperationException("Unsupported primitive type: " + type());
  }