/* SPDX-FileCopyrightText: 2023 Blender Authors * * SPDX-License-Identifier: GPL-2.0-or-later */ #pragma once /** \file * \ingroup fn * * A DataType describes what type of data a multi-function gets as input, outputs or mutates. * Currently, only individual elements or vectors of elements are supported. Adding more data types * is possible when necessary. */ #include "BLI_cpp_type.hh" #include "BLI_struct_equality_utils.hh" namespace blender::fn::multi_function { class DataType { public: enum Category { Single, Vector, }; private: Category category_; const CPPType *type_; DataType(Category category, const CPPType &type) : category_(category), type_(&type) {} public: DataType() = default; static DataType ForSingle(const CPPType &type) { return DataType(Single, type); } static DataType ForVector(const CPPType &type) { return DataType(Vector, type); } template static DataType ForSingle() { return DataType::ForSingle(CPPType::get()); } template static DataType ForVector() { return DataType::ForVector(CPPType::get()); } bool is_single() const { return category_ == Single; } bool is_vector() const { return category_ == Vector; } Category category() const { return category_; } const CPPType &single_type() const { BLI_assert(this->is_single()); return *type_; } const CPPType &vector_base_type() const { BLI_assert(this->is_vector()); return *type_; } BLI_STRUCT_EQUALITY_OPERATORS_2(DataType, category_, type_) std::string to_string() const { switch (category_) { case Single: return type_->name(); case Vector: return type_->name() + " Vector"; } BLI_assert(false); return ""; } uint64_t hash() const { return get_default_hash(*type_, category_); } }; } // namespace blender::fn::multi_function