Skip to content

Commit 107f470

Browse files
authored
Merge pull request #248 from Goddard-Fortran-Ecosystem/develop
Develop gitflow
2 parents ad8c86f + 864f54f commit 107f470

28 files changed

+2065
-36
lines changed

.github/workflows/main.yml

+4-4
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,7 @@ jobs:
7777
- name: Build Tests
7878
run: |
7979
cd build
80-
make -j4 tests
80+
make -j4 tests || ctest -j1 --output-on-failure --repeat until-pass:4
8181
8282
- name: Run Tests
8383
run: |
@@ -153,7 +153,7 @@ jobs:
153153
- name: Build Tests
154154
run: |
155155
cd build
156-
make -j4 tests
156+
make -j4 tests || ctest -j1 --output-on-failure --repeat until-pass:4
157157
158158
- name: Run Tests
159159
run: |
@@ -209,7 +209,7 @@ jobs:
209209
- name: Build Tests
210210
run: |
211211
cd build
212-
make -j4 tests
212+
make -j4 tests || ctest -j1 --output-on-failure --repeat until-pass:4
213213
214214
- name: Run Tests
215215
run: |
@@ -265,7 +265,7 @@ jobs:
265265
- name: Build Tests
266266
run: |
267267
cd build
268-
make -j4 tests
268+
make -j4 tests || ctest -j1 --output-on-failure --repeat until-pass:4
269269
270270
- name: Run Tests
271271
run: |

ChangeLog.MD

+9
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,15 @@
99

1010
### Added
1111

12+
- Introduced new container "alt_set". Interfaces are the same as "set" but underlying implementation uses vectors of indices rather than pointers. The hope is that this will result in fewer compiler bugs related to deep copies of structures with self-referential pointers.
13+
- Optional FPP setting `USE_ALT_SET` to enable map containter to use `alt_set` instead of `set` under-the-hood.
14+
15+
### Fixed
16+
17+
- missing `TARGET` in some container interfaces. Spotted during introducition of "alt_set" container.
18+
19+
### Added
20+
1221
- Preliminary LLVMFlang support
1322
- Added missing TARGET attribute in map::erase() procedures. When
1423
used with NAG compiler, would result in temporary objects with

include/v2/CMakeLists.txt

+1-1
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ endif()
2626
add_subdirectory(shared)
2727
add_subdirectory(parameters)
2828

29-
foreach (template ptr pair vector deque queue stack set map ordered_map algorithms)
29+
foreach (template ptr pair vector deque queue stack set alt_set map ordered_map algorithms)
3030
install (DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/${template} DESTINATION "${dest}/include/v2"
3131
PATTERN CMakeLists.txt EXCLUDE
3232
PATTERN *~ EXCLUDE

include/v2/algorithms/find/procedures.inc

+2
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
11
#ifdef __T_EQ__
2+
3+
24
function __MANGLE(find_basic)(first, last, value) result(iter)
35
type(__iterator) :: iter
46
type(__iterator), intent(in) :: first

include/v2/algorithms/procedures.inc

+3-2
Original file line numberDiff line numberDiff line change
@@ -9,11 +9,12 @@
99

1010

1111
#ifdef __algorithm_riterator
12-
# define __iterator __algorithm_riterator
1312
# define __guard __IDENTITY(__algorithm_guard)reverse_
13+
# define __iterator __algorithm_riterator
1414
# include "algorithms/dir_procedures.inc"
15-
# undef __guard
1615
# undef __iterator
16+
# undef __guard
17+
# undef __tmp
1718
#endif
1819

1920
#include "parameters/T/undef_derived_macros.inc"

include/v2/alt_set/header.inc

+8
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
#include "shared/define_common_macros.inc"
2+
#include "parameters/T/copy_T_to_alt_set_T.inc"
3+
4+
#define __alt_set alt_set
5+
#define __alt_set_value_compare alt_set_ValueCompare
6+
#define __alt_set_iterator alt_set_Iterator
7+
#define __alt_set_guard alt_set_
8+
+206
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,206 @@
1+
! =======================
2+
! iter_of
3+
! =======================
4+
function __MANGLE(iter_of)(this) result(value)
5+
class(__alt_set_iterator), intent(in) :: this
6+
__T_declare_result__, pointer :: value
7+
8+
print*,__FILE__,__LINE__
9+
value => null()
10+
print*,__FILE__,__LINE__, this%current
11+
print*,__FILE__,__LINE__, __MANGLE(exists)(this%current)
12+
print*,__FILE__,__LINE__, associated(this%tree)
13+
if (__MANGLE(exists)(this%current)) then
14+
value => this%tree%items%of(this%current)
15+
end if
16+
print*,__FILE__,__LINE__
17+
end function __MANGLE(iter_of)
18+
19+
! =======================
20+
! iter_next
21+
! =======================
22+
subroutine __MANGLE(iter_next)(this)
23+
class(__alt_set_iterator), intent(inout) :: this
24+
25+
call this%tree%advpos(this%current, __RIGHT)
26+
27+
end subroutine __MANGLE(iter_next)
28+
29+
! =======================
30+
! iter_prev
31+
! =======================
32+
subroutine __MANGLE(iter_prev)(this)
33+
class(__alt_set_iterator), intent(inout) :: this
34+
35+
call this%tree%advpos(this%current, __LEFT)
36+
37+
end subroutine __MANGLE(iter_prev)
38+
39+
! =======================
40+
! equalIters
41+
! =======================
42+
logical function __MANGLE(iter_equal)(a, b) result(eq)
43+
type(__alt_set_iterator), intent(in) :: a
44+
type(__alt_set_iterator), intent(in) :: b
45+
46+
eq = (a%current == b%current)
47+
48+
end function __MANGLE(iter_equal)
49+
50+
! =======================
51+
! nequal
52+
! =======================
53+
logical function __MANGLE(iter_not_equal)(a, b) result(ne)
54+
implicit none
55+
class(__alt_set_iterator), intent(in) :: a, b
56+
57+
ne = .not. (a == b)
58+
59+
end function __MANGLE(iter_not_equal)
60+
61+
62+
subroutine __MANGLE(iter_advance_size_kind)(it, n)
63+
type(__alt_set_iterator), intent(inout) :: it
64+
integer(kind=__gftl_size_kind), intent(in) :: n
65+
66+
integer :: i
67+
68+
do i = 1, n
69+
call it%next()
70+
end do
71+
72+
return
73+
end subroutine __MANGLE(iter_advance_size_kind)
74+
75+
subroutine __MANGLE(iter_advance_default)(it, n)
76+
type(__alt_set_iterator), intent(inout) :: it
77+
integer, intent(in) :: n
78+
79+
integer :: i
80+
81+
do i = 1, n
82+
call it%next()
83+
end do
84+
85+
return
86+
end subroutine __MANGLE(iter_advance_default)
87+
88+
89+
function __MANGLE(iter_begin)(cont) result(begin)
90+
type(__alt_set_iterator) :: begin
91+
type(__alt_set), target, intent(in) :: cont
92+
93+
begin = cont%begin()
94+
95+
return
96+
end function __MANGLE(iter_begin)
97+
98+
99+
100+
function __MANGLE(iter_end)(cont) result(end)
101+
type(__alt_set_iterator) :: end
102+
type(__alt_set), target, intent(in) :: cont
103+
104+
end = cont%end()
105+
106+
end function __MANGLE(iter_end)
107+
108+
109+
function __MANGLE(iter_ftn_begin)(cont) result(begin)
110+
type(__alt_set_iterator) :: begin
111+
type(__alt_set), target, intent(in) :: cont
112+
113+
begin = cont%ftn_begin()
114+
115+
return
116+
end function __MANGLE(iter_ftn_begin)
117+
118+
119+
120+
function __MANGLE(iter_ftn_end)(cont) result(end)
121+
type(__alt_set_iterator) :: end
122+
type(__alt_set), target, intent(in) :: cont
123+
124+
end = cont%ftn_end()
125+
126+
end function __MANGLE(iter_ftn_end)
127+
128+
129+
function __MANGLE(iter_next_1)(it) result(new_it)
130+
type(__alt_set_iterator) :: new_it
131+
type(__alt_set_iterator), intent(in) :: it
132+
133+
new_it = next(it,1)
134+
135+
return
136+
end function __MANGLE(iter_next_1)
137+
138+
function __MANGLE(iter_next_n_size_kind)(it, n) result(new_it)
139+
type(__alt_set_iterator) :: new_it
140+
type(__alt_set_iterator), intent(in) :: it
141+
integer(kind=__gftl_size_kind), intent(in) :: n
142+
143+
integer :: i
144+
145+
new_it = it
146+
do i = 1, n
147+
call new_it%next()
148+
end do
149+
150+
return
151+
end function __MANGLE(iter_next_n_size_kind)
152+
153+
function __MANGLE(iter_next_n_default)(it, n) result(new_it)
154+
type(__alt_set_iterator) :: new_it
155+
type(__alt_set_iterator), intent(in) :: it
156+
integer, intent(in) :: n
157+
158+
integer :: i
159+
160+
new_it = it
161+
do i = 1, n
162+
call new_it%next()
163+
end do
164+
165+
return
166+
end function __MANGLE(iter_next_n_default)
167+
168+
function __MANGLE(iter_prev_1)(it) result(new_it)
169+
type(__alt_set_iterator) :: new_it
170+
type(__alt_set_iterator), intent(in) :: it
171+
172+
new_it = prev(it,1)
173+
174+
return
175+
end function __MANGLE(iter_prev_1)
176+
177+
function __MANGLE(iter_prev_n_size_kind)(it, n) result(new_it)
178+
type(__alt_set_iterator) :: new_it
179+
type(__alt_set_iterator), intent(in) :: it
180+
integer(kind=__gftl_size_kind), intent(in) :: n
181+
182+
integer :: i
183+
184+
new_it = it
185+
do i = 1, n
186+
call new_it%prev()
187+
end do
188+
189+
return
190+
end function __MANGLE(iter_prev_n_size_kind)
191+
192+
function __MANGLE(iter_prev_n_default)(it, n) result(new_it)
193+
type(__alt_set_iterator) :: new_it
194+
type(__alt_set_iterator), intent(in) :: it
195+
integer, intent(in) :: n
196+
197+
integer :: i
198+
199+
new_it = it
200+
do i = 1, n
201+
call new_it%prev()
202+
end do
203+
204+
return
205+
end function __MANGLE(iter_prev_n_default)
206+
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
2+
3+
type :: __alt_set_iterator
4+
private
5+
type(__alt_set), pointer :: tree => null()
6+
integer(kind=GFTL_SIZE_KIND) :: current = -1
7+
!# type(__alt_set_node), pointer :: node => null()
8+
contains
9+
procedure :: of => __MANGLE(iter_of)
10+
procedure :: next => __MANGLE(iter_next)
11+
procedure :: prev => __MANGLE(iter_prev)
12+
end type __alt_set_iterator
13+
14+
interface operator(==)
15+
module procedure __MANGLE(iter_equal)
16+
end interface operator(==)
17+
18+
interface operator(/=)
19+
module procedure __MANGLE(iter_not_equal)
20+
end interface operator(/=)
21+
22+
interface advance
23+
#ifndef __gftl_disable_index_kind_overload
24+
module procedure __MANGLE(iter_advance_size_kind)
25+
#endif
26+
module procedure __MANGLE(iter_advance_default)
27+
end interface advance
28+
29+
interface begin
30+
module procedure __MANGLE(iter_begin)
31+
end interface begin
32+
33+
interface end
34+
module procedure __MANGLE(iter_end)
35+
end interface end
36+
37+
interface ftn_begin
38+
module procedure __MANGLE(iter_ftn_begin)
39+
end interface ftn_begin
40+
41+
interface ftn_end
42+
module procedure __MANGLE(iter_ftn_end)
43+
end interface ftn_end
44+
45+
interface next
46+
module procedure __MANGLE(iter_next_1)
47+
#ifndef __gftl_disable_index_kind_overload
48+
module procedure __MANGLE(iter_next_n_size_kind)
49+
#endif
50+
module procedure __MANGLE(iter_next_n_default)
51+
end interface next
52+
53+
interface prev
54+
module procedure __MANGLE(iter_prev_1)
55+
#ifndef __gftl_disable_index_kind_overload
56+
module procedure __MANGLE(iter_prev_n_size_kind)
57+
#endif
58+
module procedure __MANGLE(iter_prev_n_default)
59+
end interface prev
60+

0 commit comments

Comments
 (0)