/*************************************************************************/ /* typed_array.h */ /*************************************************************************/ /* This file is part of: */ /* GODOT ENGINE */ /* https://godotengine.org */ /*************************************************************************/ /* Copyright (c) 2007-2021 Juan Linietsky, Ariel Manzur. */ /* Copyright (c) 2014-2021 Godot Engine contributors (cf. AUTHORS.md). */ /* */ /* Permission is hereby granted, free of charge, to any person obtaining */ /* a copy of this software and associated documentation files (the */ /* "Software"), to deal in the Software without restriction, including */ /* without limitation the rights to use, copy, modify, merge, publish, */ /* distribute, sublicense, and/or sell copies of the Software, and to */ /* permit persons to whom the Software is furnished to do so, subject to */ /* the following conditions: */ /* */ /* The above copyright notice and this permission notice shall be */ /* included in all copies or substantial portions of the Software. */ /* */ /* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */ /* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */ /* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/ /* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */ /* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */ /* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */ /* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ /*************************************************************************/ #ifndef TYPED_ARRAY_H #define TYPED_ARRAY_H #include "core/variant/array.h" #include "core/variant/method_ptrcall.h" #include "core/variant/variant.h" template class TypedArray : public Array { public: template _FORCE_INLINE_ void operator=(const TypedArray &p_array) { static_assert(__is_base_of(T, U)); _assign(p_array); } _FORCE_INLINE_ void operator=(const Array &p_array) { _assign(p_array); } _FORCE_INLINE_ TypedArray(const Variant &p_variant) : Array(Array(p_variant), Variant::OBJECT, T::get_class_static(), Variant()) { } _FORCE_INLINE_ TypedArray(const Array &p_array) : Array(p_array, Variant::OBJECT, T::get_class_static(), Variant()) { } _FORCE_INLINE_ TypedArray() { set_typed(Variant::OBJECT, T::get_class_static(), Variant()); } }; //specialization for the rest of variant types #define MAKE_TYPED_ARRAY(m_type, m_variant_type) \ template <> \ class TypedArray : public Array { \ public: \ _FORCE_INLINE_ void operator=(const Array &p_array) { \ _assign(p_array); \ } \ _FORCE_INLINE_ TypedArray(const Variant &p_variant) : \ Array(Array(p_variant), m_variant_type, StringName(), Variant()) { \ } \ _FORCE_INLINE_ TypedArray(const Array &p_array) : \ Array(p_array, m_variant_type, StringName(), Variant()) { \ } \ _FORCE_INLINE_ TypedArray() { \ set_typed(m_variant_type, StringName(), Variant()); \ } \ }; MAKE_TYPED_ARRAY(bool, Variant::BOOL) MAKE_TYPED_ARRAY(uint8_t, Variant::INT) MAKE_TYPED_ARRAY(int8_t, Variant::INT) MAKE_TYPED_ARRAY(uint16_t, Variant::INT) MAKE_TYPED_ARRAY(int16_t, Variant::INT) MAKE_TYPED_ARRAY(uint32_t, Variant::INT) MAKE_TYPED_ARRAY(int32_t, Variant::INT) MAKE_TYPED_ARRAY(uint64_t, Variant::INT) MAKE_TYPED_ARRAY(int64_t, Variant::INT) MAKE_TYPED_ARRAY(float, Variant::FLOAT) MAKE_TYPED_ARRAY(double, Variant::FLOAT) MAKE_TYPED_ARRAY(String, Variant::STRING) MAKE_TYPED_ARRAY(Vector2, Variant::VECTOR2) MAKE_TYPED_ARRAY(Vector2i, Variant::VECTOR2I) MAKE_TYPED_ARRAY(Rect2, Variant::RECT2) MAKE_TYPED_ARRAY(Rect2i, Variant::RECT2I) MAKE_TYPED_ARRAY(Vector3, Variant::VECTOR3) MAKE_TYPED_ARRAY(Vector3i, Variant::VECTOR3I) MAKE_TYPED_ARRAY(Transform2D, Variant::TRANSFORM2D) MAKE_TYPED_ARRAY(Plane, Variant::PLANE) MAKE_TYPED_ARRAY(Quaternion, Variant::QUATERNION) MAKE_TYPED_ARRAY(AABB, Variant::AABB) MAKE_TYPED_ARRAY(Basis, Variant::BASIS) MAKE_TYPED_ARRAY(Transform3D, Variant::TRANSFORM3D) MAKE_TYPED_ARRAY(Color, Variant::COLOR) MAKE_TYPED_ARRAY(StringName, Variant::STRING_NAME) MAKE_TYPED_ARRAY(NodePath, Variant::NODE_PATH) MAKE_TYPED_ARRAY(RID, Variant::RID) MAKE_TYPED_ARRAY(Callable, Variant::CALLABLE) MAKE_TYPED_ARRAY(Signal, Variant::SIGNAL) MAKE_TYPED_ARRAY(Dictionary, Variant::DICTIONARY) MAKE_TYPED_ARRAY(Array, Variant::ARRAY) MAKE_TYPED_ARRAY(Vector, Variant::PACKED_BYTE_ARRAY) MAKE_TYPED_ARRAY(Vector, Variant::PACKED_INT32_ARRAY) MAKE_TYPED_ARRAY(Vector, Variant::PACKED_INT64_ARRAY) MAKE_TYPED_ARRAY(Vector, Variant::PACKED_FLOAT32_ARRAY) MAKE_TYPED_ARRAY(Vector, Variant::PACKED_FLOAT64_ARRAY) MAKE_TYPED_ARRAY(Vector, Variant::PACKED_STRING_ARRAY) MAKE_TYPED_ARRAY(Vector, Variant::PACKED_VECTOR2_ARRAY) MAKE_TYPED_ARRAY(Vector, Variant::PACKED_VECTOR3_ARRAY) MAKE_TYPED_ARRAY(Vector, Variant::PACKED_COLOR_ARRAY) template struct PtrToArg> { _FORCE_INLINE_ static TypedArray convert(const void *p_ptr) { return TypedArray(*reinterpret_cast(p_ptr)); } typedef Array EncodeT; _FORCE_INLINE_ static void encode(TypedArray p_val, void *p_ptr) { *(Array *)p_ptr = p_val; } }; template struct PtrToArg &> { typedef Array EncodeT; _FORCE_INLINE_ static TypedArray convert(const void *p_ptr) { return TypedArray(*reinterpret_cast(p_ptr)); } }; template struct GetTypeInfo> { static const Variant::Type VARIANT_TYPE = Variant::ARRAY; static const GodotTypeInfo::Metadata METADATA = GodotTypeInfo::METADATA_NONE; static inline PropertyInfo get_class_info() { return PropertyInfo(Variant::ARRAY, String(), PROPERTY_HINT_ARRAY_TYPE, T::get_class_static()); } }; template struct GetTypeInfo &> { static const Variant::Type VARIANT_TYPE = Variant::ARRAY; static const GodotTypeInfo::Metadata METADATA = GodotTypeInfo::METADATA_NONE; static inline PropertyInfo get_class_info() { return PropertyInfo(Variant::ARRAY, String(), PROPERTY_HINT_ARRAY_TYPE, T::get_class_static()); } }; #define MAKE_TYPED_ARRAY_INFO(m_type, m_variant_type) \ template <> \ struct GetTypeInfo> { \ static const Variant::Type VARIANT_TYPE = Variant::ARRAY; \ static const GodotTypeInfo::Metadata METADATA = GodotTypeInfo::METADATA_NONE; \ static inline PropertyInfo get_class_info() { \ return PropertyInfo(Variant::ARRAY, String(), PROPERTY_HINT_ARRAY_TYPE, Variant::get_type_name(m_variant_type)); \ } \ }; \ template <> \ struct GetTypeInfo &> { \ static const Variant::Type VARIANT_TYPE = Variant::ARRAY; \ static const GodotTypeInfo::Metadata METADATA = GodotTypeInfo::METADATA_NONE; \ static inline PropertyInfo get_class_info() { \ return PropertyInfo(Variant::ARRAY, String(), PROPERTY_HINT_ARRAY_TYPE, Variant::get_type_name(m_variant_type)); \ } \ }; MAKE_TYPED_ARRAY_INFO(bool, Variant::BOOL) MAKE_TYPED_ARRAY_INFO(uint8_t, Variant::INT) MAKE_TYPED_ARRAY_INFO(int8_t, Variant::INT) MAKE_TYPED_ARRAY_INFO(uint16_t, Variant::INT) MAKE_TYPED_ARRAY_INFO(int16_t, Variant::INT) MAKE_TYPED_ARRAY_INFO(uint32_t, Variant::INT) MAKE_TYPED_ARRAY_INFO(int32_t, Variant::INT) MAKE_TYPED_ARRAY_INFO(uint64_t, Variant::INT) MAKE_TYPED_ARRAY_INFO(int64_t, Variant::INT) MAKE_TYPED_ARRAY_INFO(float, Variant::FLOAT) MAKE_TYPED_ARRAY_INFO(double, Variant::FLOAT) MAKE_TYPED_ARRAY_INFO(String, Variant::STRING) MAKE_TYPED_ARRAY_INFO(Vector2, Variant::VECTOR2) MAKE_TYPED_ARRAY_INFO(Vector2i, Variant::VECTOR2I) MAKE_TYPED_ARRAY_INFO(Rect2, Variant::RECT2) MAKE_TYPED_ARRAY_INFO(Rect2i, Variant::RECT2I) MAKE_TYPED_ARRAY_INFO(Vector3, Variant::VECTOR3) MAKE_TYPED_ARRAY_INFO(Vector3i, Variant::VECTOR3I) MAKE_TYPED_ARRAY_INFO(Transform2D, Variant::TRANSFORM2D) MAKE_TYPED_ARRAY_INFO(Plane, Variant::PLANE) MAKE_TYPED_ARRAY_INFO(Quaternion, Variant::QUATERNION) MAKE_TYPED_ARRAY_INFO(AABB, Variant::AABB) MAKE_TYPED_ARRAY_INFO(Basis, Variant::BASIS) MAKE_TYPED_ARRAY_INFO(Transform3D, Variant::TRANSFORM3D) MAKE_TYPED_ARRAY_INFO(Color, Variant::COLOR) MAKE_TYPED_ARRAY_INFO(StringName, Variant::STRING_NAME) MAKE_TYPED_ARRAY_INFO(NodePath, Variant::NODE_PATH) MAKE_TYPED_ARRAY_INFO(RID, Variant::RID) MAKE_TYPED_ARRAY_INFO(Callable, Variant::CALLABLE) MAKE_TYPED_ARRAY_INFO(Signal, Variant::SIGNAL) MAKE_TYPED_ARRAY_INFO(Dictionary, Variant::DICTIONARY) MAKE_TYPED_ARRAY_INFO(Array, Variant::ARRAY) MAKE_TYPED_ARRAY_INFO(Vector, Variant::PACKED_BYTE_ARRAY) MAKE_TYPED_ARRAY_INFO(Vector, Variant::PACKED_INT32_ARRAY) MAKE_TYPED_ARRAY_INFO(Vector, Variant::PACKED_INT64_ARRAY) MAKE_TYPED_ARRAY_INFO(Vector, Variant::PACKED_FLOAT32_ARRAY) MAKE_TYPED_ARRAY_INFO(Vector, Variant::PACKED_FLOAT64_ARRAY) MAKE_TYPED_ARRAY_INFO(Vector, Variant::PACKED_STRING_ARRAY) MAKE_TYPED_ARRAY_INFO(Vector, Variant::PACKED_VECTOR2_ARRAY) MAKE_TYPED_ARRAY_INFO(Vector, Variant::PACKED_VECTOR3_ARRAY) MAKE_TYPED_ARRAY_INFO(Vector, Variant::PACKED_COLOR_ARRAY) #endif // TYPED_ARRAY_H