Changeset 36:fc2bc404fdb5 in rrlib_rtti_conversion
- Timestamp:
- 04.05.2020 23:27:27 (4 years ago)
- Branch:
- 17.03
- Children:
- 37:5bfa1458cd2c, 38:ae1ecd302f54
- Phase:
- public
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
defined_conversions.cpp
r32 r36 377 377 auto index_parameter = operation.GetParameterValue(); 378 378 unsigned int index = index_parameter ? (*index_parameter.Get<unsigned int>()) : 0; 379 auto result = tTypedConstPointer(source_object.GetRawDataPointer(), operation.GetCustomData(). computation_types[0]).GetVectorElement(index);379 auto result = tTypedConstPointer(source_object.GetRawDataPointer(), operation.GetCustomData().ComputationTypes()[0]).GetVectorElement(index); 380 380 if (!result) 381 381 { … … 389 389 auto index_parameter = operation.GetParameterValue(); 390 390 unsigned int index = index_parameter ? (*index_parameter.Get<unsigned int>()) : 0; 391 auto intermediate = tTypedConstPointer(source_object.GetRawDataPointer(), operation.GetCustomData(). computation_types[0]).GetVectorElement(index);391 auto intermediate = tTypedConstPointer(source_object.GetRawDataPointer(), operation.GetCustomData().ComputationTypes()[0]).GetVectorElement(index); 392 392 if (!intermediate) 393 393 { … … 399 399 virtual void OnCompile(const tConversionOption& conversion_option, tCustomOperationData& custom_data) const 400 400 { 401 custom_data. computation_types[0] = conversion_option.source_type;402 while (!(custom_data. computation_types[0].IsListType() || custom_data.computation_types[0].IsArray()))403 { 404 custom_data. computation_types[0] = GetUnderlyingTypeOperationsAreInheritedFrom(custom_data.computation_types[0]);405 if (!custom_data. computation_types[0])401 custom_data.ComputationTypes()[0] = conversion_option.source_type; 402 while (!(custom_data.ComputationTypes()[0].IsListType() || custom_data.ComputationTypes()[0].IsArray())) 403 { 404 custom_data.ComputationTypes()[0] = GetUnderlyingTypeOperationsAreInheritedFrom(custom_data.ComputationTypes()[0]); 405 if (!custom_data.ComputationTypes()[0]) 406 406 { 407 407 throw std::runtime_error("Source type must be list or array"); … … 434 434 static void FirstConversionFunction(const tTypedConstPointer& source_object_original, const tTypedPointer& destination_object_original, const tCurrentConversionOperation& operation) 435 435 { 436 tTypedConstPointer source_object = tTypedConstPointer(source_object_original.GetRawDataPointer(), operation.GetCustomData(). computation_types[0]);436 tTypedConstPointer source_object = tTypedConstPointer(source_object_original.GetRawDataPointer(), operation.GetCustomData().ComputationTypes()[0]); 437 437 const tType& source_type = source_object.GetType(); 438 438 tType destination_type = destination_object_original.GetType(); … … 650 650 virtual void OnCompile(const tConversionOption& conversion_option, tCustomOperationData& custom_data) const 651 651 { 652 custom_data. computation_types[0] = conversion_option.source_type;653 while (!(custom_data. computation_types[0].IsListType() || custom_data.computation_types[0].IsArray()))654 { 655 custom_data. computation_types[0] = GetUnderlyingTypeOperationsAreInheritedFrom(custom_data.computation_types[0]);656 if (!custom_data. computation_types[0])652 custom_data.ComputationTypes()[0] = conversion_option.source_type; 653 while (!(custom_data.ComputationTypes()[0].IsListType() || custom_data.ComputationTypes()[0].IsArray())) 654 { 655 custom_data.ComputationTypes()[0] = GetUnderlyingTypeOperationsAreInheritedFrom(custom_data.ComputationTypes()[0]); 656 if (!custom_data.ComputationTypes()[0]) 657 657 { 658 658 throw std::runtime_error("Source type must be list or array"); … … 694 694 static void FinalConversionFunction(const tTypedConstPointer& source_object, const tTypedPointer& destination_object, const tCurrentConversionOperation& operation) 695 695 { 696 const tType& source_type = operation.GetCustomData(). computation_types[0];696 const tType& source_type = operation.GetCustomData().ComputationTypes()[0]; 697 697 const tType source_element_type = source_type.GetElementType(); 698 698 size_t size = source_type.GetArraySize(); … … 722 722 virtual void OnCompile(const tConversionOption& conversion_option, tCustomOperationData& custom_data) const 723 723 { 724 custom_data. computation_types[0] = conversion_option.source_type;725 while (!custom_data. computation_types[0].IsArray())726 { 727 custom_data. computation_types[0] = GetUnderlyingTypeOperationsAreInheritedFrom(custom_data.computation_types[0]);728 if (!custom_data. computation_types[0])724 custom_data.ComputationTypes()[0] = conversion_option.source_type; 725 while (!custom_data.ComputationTypes()[0].IsArray()) 726 { 727 custom_data.ComputationTypes()[0] = GetUnderlyingTypeOperationsAreInheritedFrom(custom_data.ComputationTypes()[0]); 728 if (!custom_data.ComputationTypes()[0]) 729 729 { 730 730 throw std::runtime_error("Source type must be array"); … … 825 825 static void FirstConversionFunction(const tTypedConstPointer& source_object, const tTypedPointer& destination_object, const tCurrentConversionOperation& operation) 826 826 { 827 size_t size = tTypedConstPointer(source_object.GetRawDataPointer(), operation.GetCustomData(). computation_types[0]).GetVectorSize();827 size_t size = tTypedConstPointer(source_object.GetRawDataPointer(), operation.GetCustomData().ComputationTypes()[0]).GetVectorSize(); 828 828 operation.Continue(tTypedConstPointer(&size), destination_object); 829 829 } … … 831 831 static void FinalConversionFunction(const tTypedConstPointer& source_object, const tTypedPointer& destination_object, const tCurrentConversionOperation& operation) 832 832 { 833 (*destination_object.Get<size_t>()) = tTypedConstPointer(source_object.GetRawDataPointer(), operation.GetCustomData(). computation_types[0]).GetVectorSize();833 (*destination_object.Get<size_t>()) = tTypedConstPointer(source_object.GetRawDataPointer(), operation.GetCustomData().ComputationTypes()[0]).GetVectorSize(); 834 834 } 835 835 836 836 virtual void OnCompile(const tConversionOption& conversion_option, tCustomOperationData& custom_data) const 837 837 { 838 custom_data. computation_types[0] = conversion_option.source_type;839 while (!custom_data. computation_types[0].IsListType())840 { 841 custom_data. computation_types[0] = GetUnderlyingTypeOperationsAreInheritedFrom(custom_data.computation_types[0]);842 if (!custom_data. computation_types[0])838 custom_data.ComputationTypes()[0] = conversion_option.source_type; 839 while (!custom_data.ComputationTypes()[0].IsListType()) 840 { 841 custom_data.ComputationTypes()[0] = GetUnderlyingTypeOperationsAreInheritedFrom(custom_data.ComputationTypes()[0]); 842 if (!custom_data.ComputationTypes()[0]) 843 843 { 844 844 throw std::runtime_error("Source type must be list"); … … 952 952 { 953 953 auto& custom_data = operation.GetCustomData(); 954 const tType source_type = custom_data. computation_types[0];955 const tType destination_type = custom_data. computation_types[1];954 const tType source_type = custom_data.ComputationTypes()[0]; 955 const tType destination_type = custom_data.ComputationTypes()[1]; 956 956 const tType element_type = source_type.GetElementType(); 957 957 size_t element_size = element_type.GetSize(); … … 978 978 { 979 979 const std::vector<bool>* source = source_object.GetUnchecked<std::vector<bool>>(); 980 const tType destination_type = operation.GetCustomData(). computation_types[1];980 const tType destination_type = operation.GetCustomData().ComputationTypes()[1]; 981 981 size_t destination_elements = destination_type.GetArraySize(); 982 982 … … 995 995 { 996 996 auto& custom_data = operation.GetCustomData(); 997 const tType destination_type = custom_data. computation_types[1];997 const tType destination_type = custom_data.ComputationTypes()[1]; 998 998 const tType element_type = destination_type.GetElementType(); 999 tTypedConstPointer source_object(source_object_original.GetRawDataPointer(), custom_data. computation_types[0]);999 tTypedConstPointer source_object(source_object_original.GetRawDataPointer(), custom_data.ComputationTypes()[0]); 1000 1000 1001 1001 size_t copy_elements = std::min(source_object.GetVectorSize(), destination_type.GetArraySize()); … … 1063 1063 virtual void OnCompile(const tConversionOption& conversion_option, tCustomOperationData& custom_data) const 1064 1064 { 1065 custom_data. computation_types[0] = GetSupportedType(conversion_option.source_type, true);1066 custom_data. computation_types[1] = GetSupportedType(conversion_option.destination_type, true);1065 custom_data.ComputationTypes()[0] = GetSupportedType(conversion_option.source_type, true); 1066 custom_data.ComputationTypes()[1] = GetSupportedType(conversion_option.destination_type, true); 1067 1067 } 1068 1068 -
tRegisteredConversionOperation.h
r32 r36 99 99 { 100 100 typedef void (*tConversionFunction)(const tTypedConstPointer& source_object, const tTypedPointer& destination_object, const tCurrentConversionOperation& operation); 101 typedef tType tTypeArray[2]; 102 typedef const tType tConstTypeArray[2]; 101 103 102 104 union 103 105 { 104 106 tConversionFunction conversion_function; 105 rrlib::rtti::tType computation_types[2];107 void* raw_pointers[2] = { nullptr, nullptr }; 106 108 }; 107 109 108 tCustomOperationData() 109 { 110 memset(this, 0, sizeof(tCustomOperationData)); 110 /*! 111 * \return Array of two non-initialized types 112 */ 113 tTypeArray& ComputationTypes() 114 { 115 return reinterpret_cast<tTypeArray&>(raw_pointers); 116 } 117 tConstTypeArray& ComputationTypes() const 118 { 119 return reinterpret_cast<tConstTypeArray&>(raw_pointers); 111 120 } 112 121 };
Note: See TracChangeset
for help on using the changeset viewer.