@@ -17,7 +17,7 @@ unsafe impl cxx::ExternType for TypeDesc {
1717
1818#[ cxx:: bridge( namespace = oiio_ffi) ]
1919mod ffi {
20- #[ derive( Debug , Clone , Copy , PartialEq , Eq ) ]
20+ #[ derive( Debug , Clone , Copy , PartialEq , Eq , PartialOrd , Ord ) ]
2121 #[ repr( u32 ) ]
2222 pub enum BaseType {
2323 UNKNOWN = 0 ,
@@ -39,7 +39,7 @@ mod ffi {
3939 LASTBASE = 16 ,
4040 }
4141
42- #[ derive( Debug , Clone , Copy , PartialEq , Eq ) ]
42+ #[ derive( Debug , Clone , Copy , PartialEq , Eq , PartialOrd , Ord ) ]
4343 #[ repr( u32 ) ]
4444 pub enum Aggregate {
4545 SCALAR = 1 ,
@@ -50,7 +50,7 @@ mod ffi {
5050 MATRIX44 = 16 ,
5151 }
5252
53- #[ derive( Debug , Clone , Copy , PartialEq , Eq ) ]
53+ #[ derive( Debug , Clone , Copy , PartialEq , Eq , PartialOrd , Ord ) ]
5454 #[ repr( u32 ) ]
5555 pub enum VecSemantics {
5656 NOSEMANTICS = 0 ,
@@ -150,7 +150,7 @@ mod ffi {
150150
151151 fn typedesc_lt ( typedesc : & TypeDesc , x : & TypeDesc ) -> bool ;
152152
153- fn typedesc_basetype_merge_2 ( a : TypeDesc , b : TypeDesc ) -> BaseType ;
153+ fn typedesc_basetype_merge ( a : TypeDesc , b : TypeDesc ) -> BaseType ;
154154
155155 fn typedesc_basetype_merge_3 ( a : TypeDesc , b : TypeDesc , c : TypeDesc ) -> BaseType ;
156156
@@ -725,5 +725,155 @@ mod tests {
725725
726726 }
727727 }
728+
729+ #[ test]
730+ fn test_typedesc_unarray_success(
731+ btype in basetypes( ) ,
732+ agg in aggregates( ) ,
733+ semantics in vecsemantics( ) ,
734+ arraylen in i32 :: MIN ..i32 :: MAX
735+ ) {
736+ let mut result = typedesc_new( btype, agg, semantics, arraylen) ;
737+ typedesc_unarray( & mut result) ;
738+
739+ prop_assert_eq!( result. arraylen, 0 ) ;
740+ }
741+
742+ #[ test]
743+ fn test_typedesc_lt_success(
744+ btype_a in basetypes( ) ,
745+ agg_a in aggregates( ) ,
746+ semantics_a in vecsemantics( ) ,
747+ arraylen_a in i32 :: MIN ..i32 :: MAX ,
748+ btype_b in basetypes( ) ,
749+ agg_b in aggregates( ) ,
750+ semantics_b in vecsemantics( ) ,
751+ arraylen_b in i32 :: MIN ..i32 :: MAX ,
752+ ) {
753+ let typedesc_a = typedesc_new( btype_a, agg_a, semantics_a, arraylen_a) ;
754+ let typedesc_b = typedesc_new( btype_b, agg_b, semantics_b, arraylen_b) ;
755+
756+ if btype_a != btype_b {
757+ prop_assert_eq!( typedesc_lt( & typedesc_a, & typedesc_b) , btype_a < btype_b) ;
758+ } else if agg_a != agg_b {
759+ prop_assert_eq!( typedesc_lt( & typedesc_a, & typedesc_b) , agg_a < agg_b) ;
760+ } else if arraylen_a != arraylen_b {
761+ prop_assert_eq!( typedesc_lt( & typedesc_a, & typedesc_b) , arraylen_a < arraylen_b) ;
762+ } else if semantics_a != semantics_b {
763+ prop_assert_eq!( typedesc_lt( & typedesc_a, & typedesc_b) , semantics_a < semantics_b) ;
764+ } else {
765+ prop_assert_eq!( typedesc_lt( & typedesc_a, & typedesc_b) , false ) ;
766+ }
767+ }
768+
769+ #[ test]
770+ fn test_typedesc_basetype_merge_success(
771+ mut btype_a in basetypes( ) ,
772+ agg_a in aggregates( ) ,
773+ semantics_a in vecsemantics( ) ,
774+ arraylen_a in i32 :: MIN ..i32 :: MAX ,
775+ mut btype_b in basetypes( ) ,
776+ agg_b in aggregates( ) ,
777+ semantics_b in vecsemantics( ) ,
778+ arraylen_b in i32 :: MIN ..i32 :: MAX ,
779+ ) {
780+ let typedesc_a = typedesc_new( btype_a, agg_a, semantics_a, arraylen_a) ;
781+ let typedesc_b = typedesc_new( btype_b, agg_b, semantics_b, arraylen_b) ;
782+ let result = typedesc_basetype_merge( typedesc_a, typedesc_b) ;
783+
784+ if btype_a == btype_b {
785+ prop_assert_eq!( result, btype_a) ;
786+ prop_assert_eq!( result, btype_b) ;
787+ } else if btype_a == BaseType :: UNKNOWN {
788+ prop_assert_eq!( result, btype_b) ;
789+ } else if btype_b == BaseType :: UNKNOWN {
790+ prop_assert_eq!( result, btype_a) ;
791+ } else {
792+ let size_a = typedesc_size( & typedesc_new( btype_a, Aggregate :: SCALAR , VecSemantics :: NOSEMANTICS , 0 ) ) ;
793+ let size_b = typedesc_size( & typedesc_new( btype_b, Aggregate :: SCALAR , VecSemantics :: NOSEMANTICS , 0 ) ) ;
794+
795+ if size_a < size_b {
796+ std:: mem:: swap( & mut btype_a, & mut btype_b) ;
797+ }
798+
799+ if btype_a == BaseType :: DOUBLE || btype_a == BaseType :: FLOAT {
800+ prop_assert_eq!( result, btype_a) ;
801+ } else if btype_a == BaseType :: UINT32 && ( btype_b == BaseType :: UINT16 || btype_b == BaseType :: UINT8 ) {
802+ prop_assert_eq!( result, btype_a) ;
803+ } else if btype_a == BaseType :: INT32 && ( btype_b == BaseType :: INT16 || btype_b == BaseType :: INT8 || btype_b == BaseType :: UINT16 || btype_b == BaseType :: UINT8 ) {
804+ prop_assert_eq!( result, btype_a) ;
805+ } else if ( btype_a == BaseType :: UINT16 || btype_a == BaseType :: HALF ) && btype_b == BaseType :: UINT8 {
806+ prop_assert_eq!( result, btype_a) ;
807+ } else if ( btype_a == BaseType :: INT16 || btype_a == BaseType :: HALF ) && ( btype_b == BaseType :: INT8 || btype_b == BaseType :: UINT8 ) {
808+ prop_assert_eq!( result, btype_a) ;
809+ } else {
810+ prop_assert_eq!( result, BaseType :: FLOAT ) ;
811+ }
812+ }
813+ }
814+
815+ #[ test]
816+ fn test_typedesc_basetype_merge_3_success(
817+ btype_a in basetypes( ) ,
818+ agg_a in aggregates( ) ,
819+ semantics_a in vecsemantics( ) ,
820+ arraylen_a in i32 :: MIN ..i32 :: MAX ,
821+ btype_b in basetypes( ) ,
822+ agg_b in aggregates( ) ,
823+ semantics_b in vecsemantics( ) ,
824+ arraylen_b in i32 :: MIN ..i32 :: MAX ,
825+ mut btype_c in basetypes( ) ,
826+ agg_c in aggregates( ) ,
827+ semantics_c in vecsemantics( ) ,
828+ arraylen_c in i32 :: MIN ..i32 :: MAX ,
829+ ) {
830+ let typedesc_a = typedesc_new( btype_a, agg_a, semantics_a, arraylen_a) ;
831+ let typedesc_b = typedesc_new( btype_b, agg_b, semantics_b, arraylen_b) ;
832+ let typedesc_c = typedesc_new( btype_c, agg_c, semantics_c, arraylen_c) ;
833+ let result = typedesc_basetype_merge_3( typedesc_a, typedesc_b, typedesc_c) ;
834+ let mut btype_inner = typedesc_basetype_merge( typedesc_a, typedesc_b) ;
835+
836+ if btype_inner == btype_c {
837+ prop_assert_eq!( result, btype_inner) ;
838+ prop_assert_eq!( result, btype_c) ;
839+ } else if btype_inner == BaseType :: UNKNOWN {
840+ prop_assert_eq!( result, btype_c) ;
841+ } else if btype_c == BaseType :: UNKNOWN {
842+ prop_assert_eq!( result, btype_inner) ;
843+ } else {
844+ let size_a = typedesc_size( & typedesc_new( btype_inner, Aggregate :: SCALAR , VecSemantics :: NOSEMANTICS , 0 ) ) ;
845+ let size_b = typedesc_size( & typedesc_new( btype_c, Aggregate :: SCALAR , VecSemantics :: NOSEMANTICS , 0 ) ) ;
846+
847+ if size_a < size_b {
848+ std:: mem:: swap( & mut btype_inner, & mut btype_c) ;
849+ }
850+
851+ if btype_inner == BaseType :: DOUBLE || btype_inner == BaseType :: FLOAT {
852+ prop_assert_eq!( result, btype_inner) ;
853+ } else if btype_inner == BaseType :: UINT32 && ( btype_c == BaseType :: UINT16 || btype_c == BaseType :: UINT8 ) {
854+ prop_assert_eq!( result, btype_inner) ;
855+ } else if btype_inner == BaseType :: INT32 && ( btype_c == BaseType :: INT16 || btype_c == BaseType :: INT8 || btype_c == BaseType :: UINT16 || btype_c == BaseType :: UINT8 ) {
856+ prop_assert_eq!( result, btype_inner) ;
857+ } else if ( btype_inner == BaseType :: UINT16 || btype_inner == BaseType :: HALF ) && btype_c == BaseType :: UINT8 {
858+ prop_assert_eq!( result, btype_inner) ;
859+ } else if ( btype_inner == BaseType :: INT16 || btype_inner == BaseType :: HALF ) && ( btype_c == BaseType :: INT8 || btype_c == BaseType :: UINT8 ) {
860+ prop_assert_eq!( result, btype_inner) ;
861+ } else {
862+ prop_assert_eq!( result, BaseType :: FLOAT ) ;
863+ }
864+ }
865+ }
866+
867+ #[ test]
868+ fn test_typedesc_convert_type_success(
869+ value_in in i32 :: MIN ..i32 :: MAX ,
870+ ) {
871+ let mut value_out = 0.0f32 . to_ne_bytes( ) ;
872+ let src_type = typedesc_new( BaseType :: INT32 , Aggregate :: SCALAR , VecSemantics :: NOSEMANTICS , 0 ) ;
873+ let dst_type = typedesc_new( BaseType :: FLOAT , Aggregate :: SCALAR , VecSemantics :: NOSEMANTICS , 0 ) ;
874+
875+ prop_assert!( typedesc_convert_type( src_type, & value_in. to_ne_bytes( ) , dst_type, & mut value_out, 1 ) ) ;
876+ prop_assert_eq!( f32 :: from_ne_bytes( value_out) , value_in as f32 ) ;
877+ }
728878 }
729879}
0 commit comments