static

in gflog-core/src/main/java/com/epam/deltix/gflog/core/util/Formatting.java [195:251]


    static {
        final int prePadding = 2 * DOUBLE_CACHE_LINE_SIZE; // for alignment
        final int postPadding = DOUBLE_CACHE_LINE_SIZE;

        final int ulongMultiplierTableSpace = ULONG_MULTIPLIER_TABLE.length * SIZE_OF_LONG;
        final int uintMultiplierTableSpace = UINT_MULTIPLIER_TABLE.length * SIZE_OF_INT;
        final int uintLengthTableSpace = UINT_LENGTH_TABLE.length;
        final int digitsTableSpace = 100 * SIZE_OF_SHORT;

        final int monthToDaysTableSpace = MONTH_TO_DAYS_TABLE.length * SIZE_OF_SHORT;
        final int monthToDaysLeapTableSpace = MONTH_TO_DAYS_LEAP_TABLE.length * SIZE_OF_SHORT;

        final int daysToMonthTableSpace = DAYS_TO_MONTH_TABLE.length;
        final int daysToMonthLeapTableSpace = DAYS_TO_MONTH_LEAP_TABLE.length;

        final int memorySpace = prePadding +
                ulongMultiplierTableSpace + uintMultiplierTableSpace + align(uintLengthTableSpace, SIZE_OF_SHORT) +
                digitsTableSpace +
                monthToDaysTableSpace + monthToDaysLeapTableSpace +
                daysToMonthTableSpace + daysToMonthLeapTableSpace +
                postPadding;

        final Buffer buffer = UnsafeBuffer.allocateDirectedAlignedPadded(memorySpace, DOUBLE_CACHE_LINE_SIZE);
        final long memoryAddress = buffer.address();

        BUFFER_REFERENCE = buffer;

        ADDRESS_OF_ULONG_MULTIPLIER_TABLE = align(memoryAddress + DOUBLE_CACHE_LINE_SIZE, DOUBLE_CACHE_LINE_SIZE);
        ADDRESS_OF_UINT_MULTIPLIER_TABLE = ADDRESS_OF_ULONG_MULTIPLIER_TABLE + ulongMultiplierTableSpace;
        ADDRESS_OF_UINT_LENGTH_TABLE = ADDRESS_OF_UINT_MULTIPLIER_TABLE + uintMultiplierTableSpace;
        ADDRESS_OF_DIGITS_TABLE = align(ADDRESS_OF_UINT_LENGTH_TABLE + uintLengthTableSpace, SIZE_OF_SHORT);
        ADDRESS_OF_DAYS_TO_MONTH_TABLE = ADDRESS_OF_DIGITS_TABLE + digitsTableSpace;
        ADDRESS_OF_DAYS_TO_MONTH_LEAP_TABLE = ADDRESS_OF_DAYS_TO_MONTH_TABLE + daysToMonthTableSpace;
        ADDRESS_OF_MONTH_TO_DAYS_TABLE = ADDRESS_OF_DAYS_TO_MONTH_LEAP_TABLE + daysToMonthLeapTableSpace;
        ADDRESS_OF_MONTH_TO_DAYS_LEAP_TABLE = ADDRESS_OF_MONTH_TO_DAYS_TABLE + monthToDaysTableSpace;

        UNSAFE.copyMemory(ULONG_MULTIPLIER_TABLE, ARRAY_LONG_BASE_OFFSET, null, ADDRESS_OF_ULONG_MULTIPLIER_TABLE, ulongMultiplierTableSpace);
        UNSAFE.copyMemory(UINT_MULTIPLIER_TABLE, ARRAY_INT_BASE_OFFSET, null, ADDRESS_OF_UINT_MULTIPLIER_TABLE, uintMultiplierTableSpace);
        UNSAFE.copyMemory(UINT_LENGTH_TABLE, ARRAY_BYTE_BASE_OFFSET, null, ADDRESS_OF_UINT_LENGTH_TABLE, uintLengthTableSpace);

        UNSAFE.copyMemory(DAYS_TO_MONTH_TABLE, ARRAY_BYTE_BASE_OFFSET, null, ADDRESS_OF_DAYS_TO_MONTH_TABLE, daysToMonthTableSpace);
        UNSAFE.copyMemory(DAYS_TO_MONTH_LEAP_TABLE, ARRAY_BYTE_BASE_OFFSET, null, ADDRESS_OF_DAYS_TO_MONTH_LEAP_TABLE, daysToMonthLeapTableSpace);

        UNSAFE.copyMemory(MONTH_TO_DAYS_TABLE, ARRAY_SHORT_BASE_OFFSET, null, ADDRESS_OF_MONTH_TO_DAYS_TABLE, monthToDaysTableSpace);
        UNSAFE.copyMemory(MONTH_TO_DAYS_LEAP_TABLE, ARRAY_SHORT_BASE_OFFSET, null, ADDRESS_OF_MONTH_TO_DAYS_LEAP_TABLE, monthToDaysLeapTableSpace);

        for (int i = 0; i < 10; i++) {
            for (int j = 0; j < 10; j++) {
                final int index = (10 * i + j) * SIZE_OF_SHORT;

                final int firstDigit = i + '0';
                final int secondDigit = j + '0';

                UNSAFE.putShort(ADDRESS_OF_DIGITS_TABLE + index, makeShort(firstDigit, secondDigit));
            }
        }
    }