#pragma once
#include <cstring>
#include "function/aggregate_function.h"
namespace lbug {
namespace function {
struct BaseCountFunction {
struct CountState : public AggregateState {
inline uint32_t getStateSize() const override { return sizeof(*this); }
inline void writeToVector(common::ValueVector* outputVector, uint64_t pos) override {
uint64_t countCopy;
memcpy(&countCopy, reinterpret_cast<const uint8_t*>(this) + COUNT_OFFSET,
sizeof(countCopy));
memcpy(outputVector->getData() + pos * outputVector->getNumBytesPerValue(), &countCopy,
outputVector->getNumBytesPerValue());
}
uint64_t count = 0;
};
static constexpr size_t COUNT_OFFSET = sizeof(void*);
static_assert(sizeof(AggregateState) == sizeof(void*),
"AggregateState base is expected to hold only a vptr");
static inline void addToCount(uint8_t* state_, uint64_t delta) {
uint64_t countCopy;
memcpy(&countCopy, state_ + COUNT_OFFSET, sizeof(countCopy));
countCopy += delta;
memcpy(state_ + COUNT_OFFSET, &countCopy, sizeof(countCopy));
}
static inline uint64_t getCount(const uint8_t* state_) {
uint64_t countCopy;
memcpy(&countCopy, state_ + COUNT_OFFSET, sizeof(countCopy));
return countCopy;
}
static std::unique_ptr<AggregateState> initialize() {
auto state = std::make_unique<CountState>();
return state;
}
static void combine(uint8_t* state_, uint8_t* otherState_,
common::InMemOverflowBuffer* ) {
addToCount(state_, getCount(otherState_));
}
static void finalize(uint8_t* ) {}
};
} }