26#ifndef PDI_SCALAR_DATATYPE_H_
27#define PDI_SCALAR_DATATYPE_H_
33#include <pdi/pdi_fwd.h>
34#include <pdi/datatype.h>
43 struct Shared_enabler;
58 std::function<
void* (
void*,
const void* ) > m_copy;
61 std::function<void (
void* ) > m_destroy;
64 static std::shared_ptr<Scalar_datatype>
const cv_type_for_v;
69 if constexpr ( std::is_integral<T>::value ) {
70 if constexpr ( std::is_signed<T>::value ) {
71 return Scalar_kind::SIGNED;
73 return Scalar_kind::UNSIGNED;
74 }
else if constexpr ( std::is_floating_point<T>::value ) {
75 return Scalar_kind::FLOAT;
77 return Scalar_kind::UNKNOWN;
82 static constexpr auto kind_of_v = kind_of<std::remove_cv_t<T>>();
85 static constexpr auto const& type_for_v = cv_type_for_v<std::remove_cv_t<T>>;
113 bool operator== (
const Datatype& )
const override;
142 Scalar_datatype ( Scalar_kind kind,
size_t size,
size_t align,
size_t dense_size, std::function<
void* (
void*,
const void* ) > copy, std::function<
void (
void* ) > destroy,
const Attributes_map& attributes = {} );
172 static std::shared_ptr<Scalar_datatype>
make (
Scalar_kind kind,
size_t size,
size_t align,
size_t dense_size, std::function<
void* (
void*,
const void* ) > copy, std::function<
void (
void* ) > destroy,
const Attributes_map& attributes = {} );
177extern template std::shared_ptr<Scalar_datatype>
const Scalar_datatype::cv_type_for_v<uint8_t>;
179extern template std::shared_ptr<Scalar_datatype>
const Scalar_datatype::cv_type_for_v<uint16_t>;
181extern template std::shared_ptr<Scalar_datatype>
const Scalar_datatype::cv_type_for_v<uint32_t>;
183extern template std::shared_ptr<Scalar_datatype>
const Scalar_datatype::cv_type_for_v<uint64_t>;
185extern template std::shared_ptr<Scalar_datatype>
const Scalar_datatype::cv_type_for_v<int8_t>;
187extern template std::shared_ptr<Scalar_datatype>
const Scalar_datatype::cv_type_for_v<int16_t>;
189extern template std::shared_ptr<Scalar_datatype>
const Scalar_datatype::cv_type_for_v<int32_t>;
191extern template std::shared_ptr<Scalar_datatype>
const Scalar_datatype::cv_type_for_v<int64_t>;
193extern template std::shared_ptr<Scalar_datatype>
const Scalar_datatype::cv_type_for_v<bool>;
195extern template std::shared_ptr<Scalar_datatype>
const Scalar_datatype::cv_type_for_v<float>;
197extern template std::shared_ptr<Scalar_datatype>
const Scalar_datatype::cv_type_for_v<double>;
A Datatype is a Datatype_template that accepts no argument.
Definition: datatype.h:49
Definition: scalar_datatype.h:41
Datatype_sptr densify() const override
Creates a new datatype as the dense copy of this one.
void * data_from_dense_copy(void *to, const void *from) const override
Creates a sparse deep copy of dense data.
void destroy_data(void *ptr) const override
Delete data whose type is described by the Datatype.
size_t alignment() const override
Returns the required alignment for a type.
Scalar_kind kind() const
Interpretation of the content.
std::string debug_string() const override
Returns the datatype yaml representation as a string.
void * data_to_dense_copy(void *to, const void *from) const override
Creates a dense deep copy of data.
size_t buffersize() const override
Computes the data size of a type, including potentially unused memory from a sparse type.
static std::shared_ptr< Scalar_datatype > make(Scalar_kind kind, size_t size, const Attributes_map &attributes={})
Creates new scalar datatype.
bool dense() const override
Indicate if the datatype is dense or not.
static std::shared_ptr< Scalar_datatype > make(Scalar_kind kind, size_t size, size_t align, size_t dense_size, std::function< void *(void *, const void *) > copy, std::function< void(void *) > destroy, const Attributes_map &attributes={})
Creates new scalar datatype.
static std::shared_ptr< Scalar_datatype > make(Scalar_kind kind, size_t size, size_t align, const Attributes_map &attributes={})
Creates new scalar datatype.
bool simple() const override
Tells if data can be copied as bytes (if type is dense) and doesn't need a destroyer.
size_t datasize() const override
Computes the data size of a type, excluding potentially unused memory from a sparse type.
Datatype_sptr evaluate(Context &) const override
Creates a new datatype by resolving the value of all metadata references.
Definition: array_datatype.h:38
const auto UNDEF_TYPE
Definition: scalar_datatype.h:175
std::unordered_map< std::string, Expression > Attributes_map
Definition: datatype_template.h:40
Scalar_kind
Different possible interpretations for a scalar.
Definition: pdi_fwd.h:101
std::shared_ptr< const Datatype > Datatype_sptr
Definition: pdi_fwd.h:78