@SuppressWarnings({"unchecked", "restriction"})
  public FixMessagePool(
      FixPoolFactory<FixMessage> fixPoolFactory, int poolSize, boolean useDefault) {

    if (fixPoolFactory == null) {
      fixPoolFactory = this;
    }
    int currentSize = 1;
    while (currentSize < poolSize) {
      currentSize = currentSize << 1;
    }
    poolSize = currentSize;
    fixMessageArr = new FixMessageContainer[poolSize];
    for (int i = 0; i < poolSize; i++) {
      fixMessageArr[i] = new FixMessageContainer<FixMessage>(fixPoolFactory.create(useDefault));
    }
    mask = poolSize - 1;
    objectPutPosition = poolSize;
    BASE_ADDR = NativeBytes.UNSAFE.arrayBaseOffset(FixMessageContainer[].class);
    ARR_INDEX = NativeBytes.UNSAFE.arrayIndexScale(FixMessageContainer[].class);
    TAIL_ADJUSTMENT = 31 - Integer.numberOfLeadingZeros((int) ARR_INDEX);
  }