content: /*
   * Copyright (C) 2016-2023 ActionTech.
   * based on code by MyCATCopyrightHolder Copyright (c) 2013, OpenCloudDB/MyCAT.
   * License: http://www.gnu.org/licenses/gpl.html GPL version 2 or higher.
   */
  package com.actiontech.dble.backend.mysql;
  
  import java.nio.ByteBuffer;
  
  /**
   * @author mycat
   */
  public final class BufferUtil {
      private BufferUtil() {
      }
  
      public static void writeUB2(ByteBuffer buffer, int i) {
          buffer.put((byte) (i & 0xff));
          buffer.put((byte) (i >>> 8));
      }
  
      public static void writeUB3(ByteBuffer buffer, int i) {
          buffer.put((byte) (i & 0xff));
          buffer.put((byte) (i >>> 8));
          buffer.put((byte) (i >>> 16));
      }
  
      public static void writeInt(ByteBuffer buffer, int i) {
          buffer.put((byte) (i & 0xff));
          buffer.put((byte) (i >>> 8));
          buffer.put((byte) (i >>> 16));
          buffer.put((byte) (i >>> 24));
      }
  
      public static void writeFloat(ByteBuffer buffer, float f) {
          writeInt(buffer, Float.floatToIntBits(f));
      }
  
      public static void writeUB4(ByteBuffer buffer, long l) {
          buffer.put((byte) (l & 0xff));
          buffer.put((byte) (l >>> 8));
          buffer.put((byte) (l >>> 16));
          buffer.put((byte) (l >>> 24));
      }
  
      public static void writeLong(ByteBuffer buffer, long l) {
          buffer.put((byte) (l & 0xff));
          buffer.put((byte) (l >>> 8));
          buffer.put((byte) (l >>> 16));
          buffer.put((byte) (l >>> 24));
          buffer.put((byte) (l >>> 32));
          buffer.put((byte) (l >>> 40));
          buffer.put((byte) (l >>> 48));
          buffer.put((byte) (l >>> 56));
      }
  
      public static void writeDouble(ByteBuffer buffer, double d) {
          writeLong(buffer, Double.doubleToLongBits(d));
      }
  
      public static void writeLength(ByteBuffer buffer, long l) {
          if (l < 251) {
              buffer.put((byte) l);
          } else if (l < 0x10000L) {
              buffer.put((byte) 252);
              writeUB2(buffer, (int) l);
          } else if (l < 0x1000000L) {
              buffer.put((byte) 253);
              writeUB3(buffer, (int) l);
          } else {
              buffer.put((byte) 254);
              writeLong(buffer, l);
          }
      }
  
      public static void writeWithNull(ByteBuffer buffer, byte[] src) {
          buffer.put(src);
          buffer.put((byte) 0);
      }
  
      public static void writeWithLength(ByteBuffer buffer, byte[] src) {
          int length = src.length;
          if (length < 251) {
              buffer.put((byte) length);
          } else if (length < 0x10000L) {
              buffer.put((byte) 252);
              writeUB2(buffer, length);
          } else if (length < 0x1000000L) {
              buffer.put((byte) 253);
              writeUB3(buffer, length);
          } else {
              buffer.put((byte) 254);
              writeLong(buffer, length);
          }
          buffer.put(src);
      }
  
      public static void writeWithLength(ByteBuffer buffer, byte[] src, byte nullValue) {
          if (src == null) {
              buffer.put(nullValue);
          } else {
              writeWithLength(buffer, src);
          }
      }
  
      public static int getLength(long length) {
          if (length < 251) {
              return 1;
          } else if (length < 0x10000L) {
              return 3;
          } else if (length < 0x1000000L) {
              return 4;
          } else {
              return 9;
          }
      }
  
      public static int getLength(byte[] src) {
          int length = src.length;
          if (length < 251) {
              return 1 + length;
          } else if (length < 0x10000L) {
              return 3 + length;
          } else if (length < 0x1000000L) {
              return 4 + length;
          } else {
              return 9 + length;
          }
      }
  
  }
  