blob: df292855b69afcbf170e1ac5f9834ca7dfaca550 [file] [log] [blame]
// Licensed to the Apache Software Foundation (ASF) under one
// or more contributor license agreements. See the NOTICE file
// distributed with this work for additional information
// regarding copyright ownership. The ASF licenses this file
// to you under the Apache License, Version 2.0 (the
// "License"); you may not use this file except in compliance
// with the License. You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing,
// software distributed under the License is distributed on an
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
// KIND, either express or implied. See the License for the
// specific language governing permissions and limitations
// under the License.
#pragma once
#include <vector>
#include "arrow/util/macros.h"
#include "arrow/util/logging.h"
#include "gandiva/llvm_includes.h"
namespace gandiva {
/// \brief Tracks validity/value builders in LLVM.
class GANDIVA_EXPORT LValue {
public:
explicit LValue(llvm::Value* data, llvm::Value* length = NULLPTR,
llvm::Value* validity = NULLPTR)
: data_(data), length_(length), validity_(validity) {}
virtual ~LValue() = default;
llvm::Value* data() { return data_; }
llvm::Value* length() { return length_; }
llvm::Value* validity() { return validity_; }
void set_data(llvm::Value* data) { data_ = data; }
// Append the params required when passing this as a function parameter.
virtual void AppendFunctionParams(std::vector<llvm::Value*>* params) {
params->push_back(data_);
if (length_ != NULLPTR) {
params->push_back(length_);
}
}
private:
llvm::Value* data_;
llvm::Value* length_;
llvm::Value* validity_;
};
class GANDIVA_EXPORT DecimalLValue : public LValue {
public:
DecimalLValue(llvm::Value* data, llvm::Value* validity, llvm::Value* precision,
llvm::Value* scale)
: LValue(data, NULLPTR, validity), precision_(precision), scale_(scale) {}
llvm::Value* precision() { return precision_; }
llvm::Value* scale() { return scale_; }
void AppendFunctionParams(std::vector<llvm::Value*>* params) override {
LValue::AppendFunctionParams(params);
params->push_back(precision_);
params->push_back(scale_);
}
private:
llvm::Value* precision_;
llvm::Value* scale_;
};
} // namespace gandiva