/*
 * Copyright (c) Huawei Technologies Co., Ltd. 2021-2021. All rights reserved.
 * Description: registry dictionary functions
 */

#include "dictionaryfunctions.h"
#include "vector/vector.h"
#include "codegen/context_helper.h"

using namespace omniruntime::vec;
using namespace std;

namespace omniruntime::codegen::function {
extern DLLEXPORT int32_t GetIntFromDictionaryVector(int64_t dictionaryVectorAddr, int32_t index)
{
    auto dictionaryVectorPtr =
        reinterpret_cast<vec::Vector<vec::DictionaryContainer<int32_t>> *>(dictionaryVectorAddr);
    return dictionaryVectorPtr->GetValue(index);
}

extern DLLEXPORT int8_t GetByteFromDictionaryVector(int64_t dictionaryVectorAddr, int32_t index)
{
    auto dictionaryVectorPtr =
        reinterpret_cast<vec::Vector<vec::DictionaryContainer<int8_t>> *>(dictionaryVectorAddr);
    return dictionaryVectorPtr->GetValue(index);
}

extern DLLEXPORT int16_t GetShortFromDictionaryVector(int64_t dictionaryVectorAddr, int32_t index)
{
    auto dictionaryVectorPtr =
        reinterpret_cast<vec::Vector<vec::DictionaryContainer<int16_t>> *>(dictionaryVectorAddr);
    return dictionaryVectorPtr->GetValue(index);
}

extern DLLEXPORT int64_t GetLongFromDictionaryVector(int64_t dictionaryVectorAddr, int32_t index)
{
    auto dictionaryVectorPtr =
        reinterpret_cast<vec::Vector<vec::DictionaryContainer<int64_t>> *>(dictionaryVectorAddr);
    return dictionaryVectorPtr->GetValue(index);
}

extern DLLEXPORT double GetDoubleFromDictionaryVector(int64_t dictionaryVectorAddr, int32_t index)
{
    auto dictionaryVectorPtr =
        reinterpret_cast<vec::Vector<vec::DictionaryContainer<double>> *>(dictionaryVectorAddr);
    return dictionaryVectorPtr->GetValue(index);
}

extern DLLEXPORT bool GetBooleanFromDictionaryVector(int64_t dictionaryVectorAddr, int32_t index)
{
    auto dictionaryVectorPtr =
        reinterpret_cast<vec::Vector<vec::DictionaryContainer<bool>> *>(dictionaryVectorAddr);
    return dictionaryVectorPtr->GetValue(index);
}

extern DLLEXPORT uint8_t *GetVarcharFromDictionaryVector(int64_t dictionaryVectorAddr, int32_t index,
    int32_t *lengthPtr)
{
    auto dictionaryVectorPtr =
        reinterpret_cast<vec::Vector<vec::DictionaryContainer<std::string_view>> *>(dictionaryVectorAddr);
    auto stringView = dictionaryVectorPtr->GetValue(index);
    int32_t length = stringView.length();
    *lengthPtr = length;
    return (uint8_t *)stringView.data();
}

extern DLLEXPORT void GetDecimalFromDictionaryVector(int64_t dictionaryVectorAddr, int32_t index, int32_t outPrecision,
    int32_t outScale, int64_t *outHighPtr, uint64_t *outLowPtr)
{
    auto dictionaryVectorPtr =
        reinterpret_cast<vec::Vector<vec::DictionaryContainer<type::Decimal128>> *>(dictionaryVectorAddr);
    auto value = dictionaryVectorPtr->GetValue(index);
    *outLowPtr = value.LowBits();
    *outHighPtr = value.HighBits();
}
}