// Copyright (c) 2024 PaddlePaddle Authors. All Rights Reserved. // // Licensed 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 "paddle/ap/include/axpr/adt.h" #include "paddle/ap/include/axpr/data_type.h" #include "paddle/ap/include/axpr/type.h" namespace ap::axpr { using DataValueImpl = std::variant< #define MAKE_ARG_VALUE_ALTERNATIVE(cpp_type, enum_type) cpp_type, PD_FOR_EACH_DATA_TYPE(MAKE_ARG_VALUE_ALTERNATIVE) adt::Undefined #undef MAKE_ARG_VALUE_ALTERNATIVE >; struct DataValue : public DataValueImpl { using DataValueImpl::DataValueImpl; ADT_DEFINE_VARIANT_METHODS(DataValueImpl); DataType GetType() const { return Match( [](auto impl) -> DataType { return CppDataType{}; }); } Result StaticCastTo(const DataType& dst_type) const { const auto& pattern_match = ::common::Overloaded{ [&](auto arg_type_impl, auto cpp_value_impl) -> Result { using DstT = typename decltype(arg_type_impl)::type; return DataValueStaticCast(cpp_value_impl); }}; return std::visit(pattern_match, dst_type.variant(), this->variant()); } Result ToString() const { return Match([](const auto& impl) -> adt::Result { using T = std::decay_t; if constexpr (std::is_same_v) { return std::to_string(impl); } else if constexpr (std::is_integral_v) { return std::to_string(impl); } else if constexpr (std::is_same_v) { return std::to_string(impl); } else if constexpr (std::is_same_v) { return std::to_string(impl); } else { return adt::errors::NotImplementedError{"DataType NotImplemented."}; } }); } Result GetHashValue() const { using RetT = Result; return Match([](const auto& impl) -> RetT { using T = std::decay_t; if constexpr (std::is_same_v) { return static_cast(std::hash()(impl)); } else if constexpr (std::is_integral_v) { return static_cast(std::hash()(impl)); } else if constexpr (std::is_same_v) { if (std::isnan(impl)) return static_cast(std::hash()("nan")); if (std::isinf(impl)) { return impl > 0 ? static_cast(std::hash()("inf")) : static_cast(std::hash()("-inf")); } return static_cast(std::hash()(impl)); } else if constexpr (std::is_same_v) { if (std::isnan(impl)) return static_cast(std::hash()("nan")); if (std::isinf(impl)) { return impl > 0 ? static_cast(std::hash()("inf")) : static_cast(std::hash()("-inf")); } return static_cast(std::hash()(impl)); } else { return adt::errors::NotImplementedError{"DataType NotImplemented."}; } }); } private: template Result DataValueStaticCast(SrcT v) const { if constexpr (std::is_same_v) { return adt::errors::TypeError{ "static_cast can not cast to 'undefined' type."}; } else if constexpr (std::is_same_v) { return adt::errors::TypeError{ "static_cast can not cast to 'pstring' type."}; } else if constexpr (std::is_same_v) { return adt::errors::TypeError{ "static_cast can not cast from 'undefined' type."}; } else if constexpr (std::is_same_v) { return adt::errors::TypeError{ "static_cast can not cast from 'pstring' type."}; } else { return static_cast(v); } } }; template <> struct TypeImpl : public std::monostate { using value_type = DataValue; const char* Name() const { return "DataValue"; } }; } // namespace ap::axpr