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.util;
  
  import com.actiontech.dble.config.util.ConfigException;
  
  /**
   * @author mycat
   */
  public final class IntegerUtil {
      private IntegerUtil() {
      }
  
      static final byte[] MIN_VALUE = "-2147483648".getBytes();
      static final int[] SIZE_TABLE = {9, 99, 999, 9999, 99999, 999999, 9999999, 99999999, 999999999, Integer.MAX_VALUE};
      static final byte[] DIGIT_TENS = {'0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '1', '1', '1', '1', '1', '1',
              '1', '1', '1', '1', '2', '2', '2', '2', '2', '2', '2', '2', '2', '2', '3', '3', '3', '3', '3', '3', '3',
              '3', '3', '3', '4', '4', '4', '4', '4', '4', '4', '4', '4', '4', '5', '5', '5', '5', '5', '5', '5', '5',
              '5', '5', '6', '6', '6', '6', '6', '6', '6', '6', '6', '6', '7', '7', '7', '7', '7', '7', '7', '7', '7',
              '7', '8', '8', '8', '8', '8', '8', '8', '8', '8', '8', '9', '9', '9', '9', '9', '9', '9', '9', '9', '9'};
      static final byte[] DIGIT_ONES = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5',
              '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6',
              '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7',
              '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8',
              '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9'};
      static final byte[] DIGITS = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f', 'g',
              'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z'};
  
      public static byte[] toBytes(int i) {
          if (i == Integer.MIN_VALUE) {
              return MIN_VALUE;
          }
          int size = (i < 0) ? stringSize(-i) + 1 : stringSize(i);
          byte[] buf = new byte[size];
          getBytes(i, size, buf);
          return buf;
      }
  
      static int stringSize(int x) {
          for (int i = 0; ; i++) {
              if (x <= SIZE_TABLE[i]) {
                  return i + 1;
              }
          }
      }
  
      static void getBytes(int i, int index, byte[] buf) {
          int q, r;
          int charPos = index;
          byte sign = 0;
  
          if (i < 0) {
              sign = '-';
              i = -i;
          }
  
          // Generate two digits per iteration
          while (i >= 65536) {
              q = i / 100;
              // really: r = i - (q * 100);
              r = i - ((q << 6) + (q << 5) + (q << 2));
              i = q;
              buf[--charPos] = DIGIT_ONES[r];
              buf[--charPos] = DIGIT_TENS[r];
          }
  
          // Fall thru to fast mode for smaller numbers
          // assert(i <= 65536, i);
          for (; ; ) {
              q = (i * 52429) >>> (16 + 3);
              r = i - ((q << 3) + (q << 1)); // r = i-(q*10) ...
              buf[--charPos] = DIGITS[r];
              i = q;
              if (i == 0) {
                  break;
              }
          }
          if (sign != 0) {
              buf[--charPos] = sign;
          }
      }
  
      public static int parseInt(String intStr) {
          try {
              if (!StringUtil.isBlank(intStr)) {
                  return Integer.parseInt(intStr);
              }
          } catch (NumberFormatException e) {
              throw new ConfigException("incorrect integer value: '" + intStr + "'");
          }
          throw new ConfigException("incorrect integer value: 'null'");
      }
  
  }
  