@@ -643,13 +643,108 @@ static void run_CFI_setpointer_tests() {
643
643
}
644
644
}
645
645
646
+ static void run_CFI_is_contiguous_tests () {
647
+ // INTEGER :: A(0:3,0:3)
648
+ constexpr CFI_rank_t rank{2 };
649
+ CFI_index_t extents[rank] = {4 , 4 };
650
+ CFI_CDESC_T (rank) dv_storage;
651
+ CFI_cdesc_t *dv{&dv_storage};
652
+ Descriptor *dvDesc{reinterpret_cast <Descriptor *>(dv)};
653
+ char base;
654
+ void *base_addr{&base};
655
+ int retCode{CFI_establish (dv, base_addr, CFI_attribute_other, CFI_type_int,
656
+ /* elem_len=*/ 0 , rank, extents)};
657
+ MATCH (retCode == CFI_SUCCESS, true );
658
+
659
+ MATCH (true , CFI_is_contiguous (dv) == 1 );
660
+ MATCH (true , dvDesc->IsContiguous ());
661
+
662
+ CFI_CDESC_T (rank) sectionDescriptorStorage;
663
+ CFI_cdesc_t *section{§ionDescriptorStorage};
664
+ Descriptor *sectionDesc{reinterpret_cast <Descriptor *>(section)};
665
+ retCode = CFI_establish (section, base_addr, CFI_attribute_other, CFI_type_int,
666
+ /* elem_len=*/ 0 , rank, extents);
667
+ MATCH (retCode == CFI_SUCCESS, true );
668
+
669
+ // Test empty section B = A(0:3:2,0:3:-2) is contiguous.
670
+ CFI_index_t lb[rank] = {0 , 0 };
671
+ CFI_index_t ub[rank] = {3 , 3 };
672
+ CFI_index_t strides[rank] = {2 , -2 };
673
+ retCode = CFI_section (section, dv, lb, ub, strides);
674
+ MATCH (true , retCode == CFI_SUCCESS);
675
+ MATCH (true , CFI_is_contiguous (section) == 1 );
676
+ MATCH (true , sectionDesc->IsContiguous ());
677
+
678
+ // Test 1 element section B = A(0:1:2,0:1:2) is contiguous.
679
+ lb[0 ] = 0 ;
680
+ lb[1 ] = 0 ;
681
+ ub[0 ] = 1 ;
682
+ ub[1 ] = 1 ;
683
+ strides[0 ] = 2 ;
684
+ strides[1 ] = 2 ;
685
+ retCode = CFI_section (section, dv, lb, ub, strides);
686
+ MATCH (true , retCode == CFI_SUCCESS);
687
+ MATCH (true , CFI_is_contiguous (section) == 1 );
688
+ MATCH (true , sectionDesc->IsContiguous ());
689
+
690
+ // Test section B = A(0:3:1,0:2:1) is contiguous.
691
+ lb[0 ] = 0 ;
692
+ lb[1 ] = 0 ;
693
+ ub[0 ] = 3 ;
694
+ ub[1 ] = 2 ;
695
+ strides[0 ] = 1 ;
696
+ strides[1 ] = 1 ;
697
+ retCode = CFI_section (section, dv, lb, ub, strides);
698
+ sectionDesc->Dump ();
699
+ MATCH (true , retCode == CFI_SUCCESS);
700
+ MATCH (true , CFI_is_contiguous (section) == 1 );
701
+ MATCH (true , sectionDesc->IsContiguous ());
702
+
703
+ // Test section B = A(0:2:1,0:2:1) is not contiguous.
704
+ lb[0 ] = 0 ;
705
+ lb[1 ] = 0 ;
706
+ ub[0 ] = 2 ;
707
+ ub[1 ] = 2 ;
708
+ strides[0 ] = 1 ;
709
+ strides[1 ] = 1 ;
710
+ retCode = CFI_section (section, dv, lb, ub, strides);
711
+ sectionDesc->Dump ();
712
+ MATCH (true , retCode == CFI_SUCCESS);
713
+ MATCH (true , CFI_is_contiguous (section) == 0 );
714
+ MATCH (false , sectionDesc->IsContiguous ());
715
+
716
+ // Test section B = A(0:3:2,0:3:1) is not contiguous.
717
+ lb[0 ] = 0 ;
718
+ lb[1 ] = 0 ;
719
+ ub[0 ] = 3 ;
720
+ ub[1 ] = 3 ;
721
+ strides[0 ] = 2 ;
722
+ strides[1 ] = 1 ;
723
+ retCode = CFI_section (section, dv, lb, ub, strides);
724
+ MATCH (true , retCode == CFI_SUCCESS);
725
+ MATCH (true , CFI_is_contiguous (section) == 0 );
726
+ MATCH (false , sectionDesc->IsContiguous ());
727
+
728
+ // Test section B = A(0:3:1,0:3:2) is not contiguous.
729
+ lb[0 ] = 0 ;
730
+ lb[1 ] = 0 ;
731
+ ub[0 ] = 3 ;
732
+ ub[1 ] = 3 ;
733
+ strides[0 ] = 1 ;
734
+ strides[1 ] = 2 ;
735
+ retCode = CFI_section (section, dv, lb, ub, strides);
736
+ MATCH (true , retCode == CFI_SUCCESS);
737
+ MATCH (true , CFI_is_contiguous (section) == 0 );
738
+ MATCH (false , sectionDesc->IsContiguous ());
739
+ }
740
+
646
741
int main () {
647
742
TestCdescMacroForAllRanksSmallerThan<CFI_MAX_RANK>();
648
743
run_CFI_establish_tests ();
649
744
run_CFI_address_tests ();
650
745
run_CFI_allocate_tests ();
651
746
// TODO: test CFI_deallocate
652
- // TODO: test CFI_is_contiguous
747
+ run_CFI_is_contiguous_tests ();
653
748
run_CFI_section_tests ();
654
749
run_CFI_select_part_tests ();
655
750
run_CFI_setpointer_tests ();
0 commit comments