Skip to content

Commit 816dc92

Browse files
committed
use list comprehension instead of temporary array in the implementation of filter
1 parent 844923b commit 816dc92

File tree

2 files changed

+31
-81
lines changed

2 files changed

+31
-81
lines changed

VERSION

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
0.4.0
1+
0.4.1

src/lib/mod_functional.f90

Lines changed: 30 additions & 80 deletions
Original file line numberDiff line numberDiff line change
@@ -906,15 +906,10 @@ pure function filter_i1(f, x) result(filter)
906906
!! This specific procedure is for 1-byte integers.
907907
!! Overloaded by generic procedure `filter`.
908908
procedure(f_i1_logical) :: f !! Filtering function
909-
integer(i1), dimension(:), intent(in) :: x !! Input array
910-
integer(i1), dimension(:), allocatable :: filter
911-
logical, dimension(:), allocatable :: f_x
909+
integer(i1), intent(in) :: x(:) !! Input array
910+
integer(i1), allocatable :: filter(:)
912911
integer :: i
913-
allocate(f_x(size(x)))
914-
do concurrent(i = 1:size(x))
915-
f_x(i) = f(x(i))
916-
enddo
917-
filter = pack(x, f_x)
912+
filter = pack(x, [(f(x(i)), i = 1, size(x))])
918913
end function filter_i1
919914

920915

@@ -923,15 +918,10 @@ pure function filter_i2(f, x) result(filter)
923918
!! This specific procedure is for 2-byte integers.
924919
!! Overloaded by generic procedure `filter`.
925920
procedure(f_i2_logical) :: f !! Filtering function
926-
integer(i2), dimension(:), intent(in) :: x !! Input array
927-
integer(i2), dimension(:), allocatable :: filter
928-
logical, dimension(:), allocatable :: f_x
921+
integer(i2), intent(in) :: x(:) !! Input array
922+
integer(i2), allocatable :: filter(:)
929923
integer :: i
930-
allocate(f_x(size(x)))
931-
do concurrent(i = 1:size(x))
932-
f_x(i) = f(x(i))
933-
enddo
934-
filter = pack(x, f_x)
924+
filter = pack(x, [(f(x(i)), i = 1, size(x))])
935925
end function filter_i2
936926

937927

@@ -940,15 +930,10 @@ pure function filter_i4(f, x) result(filter)
940930
!! This specific procedure is for 4-byte integers.
941931
!! Overloaded by generic procedure `filter`.
942932
procedure(f_i4_logical) :: f !! Filtering function
943-
integer(i4), dimension(:), intent(in) :: x !! Input array
944-
integer(i4), dimension(:), allocatable :: filter
945-
logical, dimension(:), allocatable :: f_x
933+
integer(i4), intent(in) :: x(:) !! Input array
934+
integer(i4), allocatable :: filter(:)
946935
integer :: i
947-
allocate(f_x(size(x)))
948-
do concurrent(i = 1:size(x))
949-
f_x(i) = f(x(i))
950-
enddo
951-
filter = pack(x, f_x)
936+
filter = pack(x, [(f(x(i)), i = 1, size(x))])
952937
end function filter_i4
953938

954939

@@ -957,15 +942,10 @@ pure function filter_i8(f, x) result(filter)
957942
!! This specific procedure is for 8-byte integers.
958943
!! Overloaded by generic procedure `filter`.
959944
procedure(f_i8_logical) :: f !! Filtering function
960-
integer(i8), dimension(:), intent(in) :: x !! Input array
961-
integer(i8), dimension(:), allocatable :: filter
962-
logical, dimension(:), allocatable :: f_x
945+
integer(i8), intent(in) :: x(:) !! Input array
946+
integer(i8), allocatable :: filter(:)
963947
integer :: i
964-
allocate(f_x(size(x)))
965-
do concurrent(i = 1:size(x))
966-
f_x(i) = f(x(i))
967-
enddo
968-
filter = pack(x, f_x)
948+
filter = pack(x, [(f(x(i)), i = 1, size(x))])
969949
end function filter_i8
970950

971951

@@ -974,15 +954,10 @@ pure function filter_r4(f, x) result(filter)
974954
!! This specific procedure is for 4-byte reals.
975955
!! Overloaded by generic procedure `filter`.
976956
procedure(f_r4_logical) :: f !! Filtering function
977-
real(r4), dimension(:), intent(in) :: x !! Input array
978-
real(r4), dimension(:), allocatable :: filter
979-
logical, dimension(:), allocatable :: f_x
957+
real(r4), intent(in) :: x(:) !! Input array
958+
real(r4), allocatable :: filter(:)
980959
integer :: i
981-
allocate(f_x(size(x)))
982-
do concurrent(i = 1:size(x))
983-
f_x(i) = f(x(i))
984-
enddo
985-
filter = pack(x, f_x)
960+
filter = pack(x, [(f(x(i)), i = 1, size(x))])
986961
end function filter_r4
987962

988963

@@ -991,15 +966,10 @@ pure function filter_r8(f, x) result(filter)
991966
!! This specific procedure is for 8-byte reals.
992967
!! Overloaded by generic procedure `filter`.
993968
procedure(f_r8_logical) :: f !! Filtering function
994-
real(r8), dimension(:), intent(in) :: x !! Input array
995-
real(r8), dimension(:), allocatable :: filter
996-
logical, dimension(:), allocatable :: f_x
969+
real(r8), intent(in) :: x(:) !! Input array
970+
real(r8), allocatable :: filter(:)
997971
integer :: i
998-
allocate(f_x(size(x)))
999-
do concurrent(i = 1:size(x))
1000-
f_x(i) = f(x(i))
1001-
enddo
1002-
filter = pack(x, f_x)
972+
filter = pack(x, [(f(x(i)), i = 1, size(x))])
1003973
end function filter_r8
1004974

1005975

@@ -1008,15 +978,10 @@ pure function filter_r16(f, x) result(filter)
1008978
!! This specific procedure is for 16-byte reals.
1009979
!! Overloaded by generic procedure `filter`.
1010980
procedure(f_r16_logical) :: f !! Filtering function
1011-
real(r16), dimension(:), intent(in) :: x !! Input array
1012-
real(r16), dimension(:), allocatable :: filter
1013-
logical, dimension(:), allocatable :: f_x
981+
real(r16), intent(in) :: x(:) !! Input array
982+
real(r16), allocatable :: filter(:)
1014983
integer :: i
1015-
allocate(f_x(size(x)))
1016-
do concurrent(i = 1:size(x))
1017-
f_x(i) = f(x(i))
1018-
enddo
1019-
filter = pack(x, f_x)
984+
filter = pack(x, [(f(x(i)), i = 1, size(x))])
1020985
end function filter_r16
1021986

1022987

@@ -1025,15 +990,10 @@ pure function filter_c4(f, x) result(filter)
1025990
!! This specific procedure is for 4-byte reals.
1026991
!! Overloaded by generic procedure `filter`.
1027992
procedure(f_c4_logical) :: f !! Filtering function
1028-
complex(r4), dimension(:), intent(in) :: x !! Input array
1029-
complex(r4), dimension(:), allocatable :: filter
1030-
logical, dimension(:), allocatable :: f_x
993+
complex(r4), intent(in) :: x(:) !! Input array
994+
complex(r4), allocatable :: filter(:)
1031995
integer :: i
1032-
allocate(f_x(size(x)))
1033-
do concurrent(i = 1:size(x))
1034-
f_x(i) = f(x(i))
1035-
enddo
1036-
filter = pack(x, f_x)
996+
filter = pack(x, [(f(x(i)), i = 1, size(x))])
1037997
end function filter_c4
1038998

1039999

@@ -1042,15 +1002,10 @@ pure function filter_c8(f, x) result(filter)
10421002
!! This specific procedure is for 8-byte complex reals.
10431003
!! Overloaded by generic procedure `filter`.
10441004
procedure(f_c8_logical) :: f !! Filtering function
1045-
complex(r8), dimension(:), intent(in) :: x !! Input array
1046-
complex(r8), dimension(:), allocatable :: filter
1047-
logical, dimension(:), allocatable :: f_x
1005+
complex(r8), intent(in) :: x(:) !! Input array
1006+
complex(r8), allocatable :: filter(:)
10481007
integer :: i
1049-
allocate(f_x(size(x)))
1050-
do concurrent(i = 1:size(x))
1051-
f_x(i) = f(x(i))
1052-
enddo
1053-
filter = pack(x, f_x)
1008+
filter = pack(x, [(f(x(i)), i = 1, size(x))])
10541009
end function filter_c8
10551010

10561011

@@ -1059,15 +1014,10 @@ pure function filter_c16(f, x) result(filter)
10591014
!! This specific procedure is for 16-byte complex reals.
10601015
!! Overloaded by generic procedure `filter`.
10611016
procedure(f_c16_logical) :: f !! Filtering function
1062-
complex(r16), dimension(:), intent(in) :: x !! Input array
1063-
complex(r16), dimension(:), allocatable :: filter
1064-
logical, dimension(:), allocatable :: f_x
1017+
complex(r16), intent(in) :: x(:) !! Input array
1018+
complex(r16), allocatable :: filter(:)
10651019
integer :: i
1066-
allocate(f_x(size(x)))
1067-
do concurrent(i = 1:size(x))
1068-
f_x(i) = f(x(i))
1069-
enddo
1070-
filter = pack(x, f_x)
1020+
filter = pack(x, [(f(x(i)), i = 1, size(x))])
10711021
end function filter_c16
10721022

10731023

0 commit comments

Comments
 (0)