template INLINE int64 DataReaderInternal::getCompressedNanoTimeDividedBy()

in src/dxapi/native/tickdb/data_reader.cpp [662:695]


template <int64 N> INLINE int64 DataReaderInternal::getCompressedNanoTimeDividedBy()
{
    byte    header = getByte();
    int64   lowBits = header & 0x1F;

    switch ((TimestampGranularity)(header >> 5) /* scale */) {
    case TimestampGranularity::MILLIS:
        return (((_loadLE<uint64>(bytes(5))  & BYTEMASK_L(5)) << 5) + lowBits) * (TIME_NANOS_PER_MILLISECOND / N) + COMPRESSED_TIMESTAMP_BASE_NS / N;

    case TimestampGranularity::SECONDS:
        return ((_loadLE<uint32>(bytes(4)) << 5) + lowBits) * (TIME_NANOS_PER_SECOND / N) + COMPRESSED_TIMESTAMP_BASE_NS / N;

    case TimestampGranularity::TEN_SECONDS:
        return (((_loadLE<uint32>(bytes(3))  & BYTEMASK_L(3)) << 5) + lowBits) * ((TIME_NANOS_PER_SECOND * 10) / N) + COMPRESSED_TIMESTAMP_BASE_NS / N;

    case TimestampGranularity::HOURS:
        return ((_loadLE<uint16>(bytes(2)) << 5) + lowBits) * (TIME_NANOS_PER_HOUR / N) + COMPRESSED_TIMESTAMP_BASE_NS / N;

    case TimestampGranularity::NANOS:
        return ((((_loadLE<uint64>(bytes(7)) & BYTEMASK_L(7)) << 5) + lowBits) + COMPRESSED_TIMESTAMP_BASE_MS) / N;

    case TimestampGranularity::LONG_NANOS:
        return (((_loadLE<uint64>(bytes(8)) << 5) + lowBits) + COMPRESSED_TIMESTAMP_BASE_MS ) / N;

    case TimestampGranularity::SPECIAL:
        if (0 == lowBits) {
            return TIMESTAMP_NULL;
        }
        // fall through
    default:
    case TimestampGranularity::INVALID:
        THROW_DBGLOG("getCompressedTimestamp() : Invalid timestamp data");
    }
}