blob: cdfa3473f5a914f8aeef092616f53e6b7f1b63e4 [file] [log] [blame]
#pragma once
#include <cstddef>
#include "RPCType.hpp"
namespace thd {
struct Scalar {
Scalar() {}
Scalar(const Scalar& other) = delete;
Scalar(Scalar&& other) = delete;
virtual ~Scalar() {}
virtual size_t elementSize() const = 0;
virtual void* data() = 0;
virtual const void* data() const = 0;
virtual RPCType type() const = 0;
virtual Scalar* clone() const = 0;
};
template<typename real>
struct ScalarWrapper : Scalar {
ScalarWrapper() {}
ScalarWrapper(real value) : _value(value) {}
virtual ~ScalarWrapper() {}
virtual size_t elementSize() const override {
return sizeof(real);
}
virtual void* data() override {
return &_value;
}
virtual const void* data() const override {
return &_value;
}
virtual RPCType type() const override {
return type_traits<real>::type;
}
virtual ScalarWrapper* clone() const override {
return new ScalarWrapper(value());
}
real value() const {
return _value;
}
private:
real _value;
};
using FloatScalar = ScalarWrapper<double>;
using IntScalar = ScalarWrapper<int64_t>;
} // namespace thd