Skip to content

Commit 50366c6

Browse files
authored
Merge pull request #196 from Goddard-Fortran-Ecosystem/develop
Develop
2 parents 7e20756 + 4a38b1e commit 50366c6

28 files changed

+393
-5
lines changed

CMakeLists.txt

+1-1
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ if (COMMAND cmake_policy)
44
endif (COMMAND cmake_policy)
55

66
project (GFTL
7-
VERSION 1.8.3
7+
VERSION 1.9.0
88
LANGUAGES NONE)
99

1010
if (CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT)

ChangeLog.MD

+27
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,33 @@
22

33
## Unreleased
44

5+
## [1.9.0] - 2023-03-12
6+
7+
### Added
8+
9+
- Added Fortran-friendly iterator factories (and tests) to
10+
11+
`ftn_begin()` and `ftn_end()` have been added to vector, set, map,
12+
and ordered_map templates. `ftn_begin()` points to just-before the
13+
1st element of a container, while `ftn_end()` points to the last
14+
element. This allows the `next()` invocation to be at the start of the loop which
15+
is less error prone in the presence of `CYCLE` statements. Example usage:
16+
17+
```f90
18+
type(Vector) :: v
19+
type(VectorIterator) :: iter
20+
...
21+
associate (e => v%ftn_end())
22+
iter = v%ftn_begin()
23+
do while (iter /= e)
24+
call iter%next()
25+
...
26+
if (<cond>) cycle ! does the right thing
27+
...
28+
end do
29+
end associate
30+
```
31+
532
## [1.8.3] - 2023-01-27
633

734
### Fixed

include/v2/map/iterator_procedures.inc

+25
Original file line numberDiff line numberDiff line change
@@ -148,6 +148,31 @@
148148
end function __MANGLE(iter_end)
149149

150150
! ======
151+
! ftn_begin
152+
! ======
153+
154+
function __MANGLE(iter_ftn_begin)(cont) result(begin)
155+
type(__map_iterator) :: begin
156+
type(__map), target, intent(in) :: cont
157+
158+
begin = cont%ftn_begin()
159+
160+
return
161+
end function __MANGLE(iter_ftn_begin)
162+
163+
! =====
164+
! ftn_end
165+
! =====
166+
167+
function __MANGLE(iter_ftn_end)(cont) result(end)
168+
type(__map_iterator) :: end
169+
type(__map), target, intent(in) :: cont
170+
171+
end = cont%ftn_end()
172+
173+
return
174+
end function __MANGLE(iter_ftn_end)
175+
! ======
151176
! next
152177
! ======
153178

include/v2/map/iterator_specification.inc

+8
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,14 @@
4141
module procedure __MANGLE(iter_end)
4242
end interface end
4343

44+
interface ftn_begin
45+
module procedure __MANGLE(iter_ftn_begin)
46+
end interface ftn_begin
47+
48+
interface ftn_end
49+
module procedure __MANGLE(iter_ftn_end)
50+
end interface ftn_end
51+
4452
interface next
4553
module procedure __MANGLE(iter_next_1)
4654
#ifndef __gftl_disable_index_kind_overload

include/v2/map/procedures.inc

+29-3
Original file line numberDiff line numberDiff line change
@@ -341,9 +341,9 @@
341341
end function __MANGLE(begin)
342342

343343

344-
! =======================
345-
! end
346-
! =======================
344+
! =======================
345+
! end
346+
! =======================
347347
function __MANGLE(end)(this) result(iter)
348348
class(__map), target, intent(in) :: this
349349
type (__map_iterator) :: iter
@@ -354,6 +354,32 @@
354354
end function __MANGLE(end)
355355

356356

357+
! =======================
358+
! ftn_begin
359+
! =======================
360+
function __MANGLE(ftn_begin)(this) result(iter)
361+
class(__map), target, intent(in) :: this
362+
type (__map_iterator) :: iter
363+
364+
iter%reference => this
365+
iter%set_iter = this%tree%ftn_begin()
366+
367+
end function __MANGLE(ftn_begin)
368+
369+
370+
! =======================
371+
! ftn_end
372+
! =======================
373+
function __MANGLE(ftn_end)(this) result(iter)
374+
class(__map), target, intent(in) :: this
375+
type (__map_iterator) :: iter
376+
377+
iter%reference => this
378+
iter%set_iter = this%tree%ftn_end()
379+
380+
end function __MANGLE(ftn_end)
381+
382+
357383
! =======================
358384
! find
359385
! =======================

include/v2/map/public.inc

+2
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@
1010
public :: advance
1111
public :: begin
1212
public :: end
13+
public :: ftn_begin
14+
public :: ftn_end
1315
public :: next
1416
public :: prev
1517

include/v2/map/specification.inc

+2
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,8 @@
9696

9797
procedure :: begin => __MANGLE(begin)
9898
procedure :: end => __MANGLE(end)
99+
procedure :: ftn_begin => __MANGLE(ftn_begin)
100+
procedure :: ftn_end => __MANGLE(ftn_end)
99101
procedure :: find => __MANGLE(find)
100102

101103
procedure :: count => __MANGLE(count)

include/v2/ordered_map/iterator_procedures.inc

+26
Original file line numberDiff line numberDiff line change
@@ -160,6 +160,32 @@
160160
return
161161
end function __MANGLE(iter_end)
162162

163+
! ======
164+
! ftn_begin
165+
! ======
166+
167+
function __MANGLE(iter_ftn_begin)(cont) result(begin)
168+
type(__omap_iterator) :: begin
169+
type(__omap), target, intent(in) :: cont
170+
171+
begin = cont%ftn_begin()
172+
173+
return
174+
end function __MANGLE(iter_ftn_begin)
175+
176+
! =====
177+
! ftn_end
178+
! =====
179+
180+
function __MANGLE(iter_ftn_end)(cont) result(end)
181+
type(__omap_iterator) :: end
182+
type(__omap), target, intent(in) :: cont
183+
184+
end = cont%ftn_end()
185+
186+
return
187+
end function __MANGLE(iter_ftn_end)
188+
163189
! ======
164190
! next
165191
! ======

include/v2/ordered_map/iterator_specification.inc

+8
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,14 @@
3434
module procedure __MANGLE(iter_end)
3535
end interface end
3636

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+
3745
interface next
3846
module procedure __MANGLE(iter_next_1)
3947
#ifndef __gftl_disable_index_kind_overload

include/v2/ordered_map/procedures.inc

+27
Original file line numberDiff line numberDiff line change
@@ -40,12 +40,14 @@
4040
#define __vector_guard __IDENTITY(__omap_guard)__IDENTITY(K_)
4141
#define __vector __IDENTITY(__omap_guard)__IDENTITY(Vector)
4242
#define __vector_iterator __IDENTITY(__omap_guard)__IDENTITY(VectorIterator)
43+
#define __vector_ftn_iterator __IDENTITY(__omap_guard)__IDENTITY(VectorFtnIterator)
4344
#define __vector_riterator __IDENTITY(__omap_guard)__IDENTITY(VectorRIterator)
4445

4546
#include "vector/procedures.inc"
4647

4748
#undef __vector
4849
#undef __vector_iterator
50+
#undef __vector_ftn_iterator
4951
#undef __vector_riterator
5052
#undef __vector_guard
5153
#include "parameters/T/undef_vector_T.inc"
@@ -335,6 +337,31 @@
335337

336338
end function __MANGLE(end)
337339

340+
! =======================
341+
! ftn_begin
342+
! =======================
343+
function __MANGLE(ftn_begin)(this) result(iter)
344+
class(__omap), target, intent(in) :: this
345+
type (__omap_iterator) :: iter
346+
347+
iter%reference => this
348+
iter%key_iter = this%ordered_keys%ftn_begin()
349+
350+
end function __MANGLE(ftn_begin)
351+
352+
353+
! =======================
354+
! ftn_end
355+
! =======================
356+
function __MANGLE(ftn_end)(this) result(iter)
357+
class(__omap), target, intent(in) :: this
358+
type (__omap_iterator) :: iter
359+
360+
iter%reference => this
361+
iter%key_iter = this%ordered_keys%ftn_end()
362+
363+
end function __MANGLE(ftn_end)
364+
338365

339366
! =======================
340367
! find

include/v2/ordered_map/public.inc

+2
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@
1111
public :: advance
1212
public :: begin
1313
public :: end
14+
public :: ftn_begin
15+
public :: ftn_end
1416
public :: next
1517
public :: prev
1618

include/v2/ordered_map/specification.inc

+4
Original file line numberDiff line numberDiff line change
@@ -41,12 +41,14 @@
4141
#define __vector_guard __IDENTITY(__omap_guard)__IDENTITY(K_)
4242
#define __vector __IDENTITY(__omap_guard)__IDENTITY(Vector)
4343
#define __vector_iterator __IDENTITY(__omap_guard)__IDENTITY(VectorIterator)
44+
#define __vector_ftn_iterator __IDENTITY(__omap_guard)__IDENTITY(VectorFtnIterator)
4445
#define __vector_riterator __IDENTITY(__omap_guard)__IDENTITY(VectorRIterator)
4546

4647
#include "vector/specification.inc"
4748

4849
#undef __vector
4950
#undef __vector_iterator
51+
#undef __vector_ftn_iterator
5052
#undef __vector_riterator
5153
#undef __vector_guard
5254
#include "parameters/T/undef_vector_T.inc"
@@ -100,6 +102,8 @@
100102

101103
procedure :: begin => __MANGLE(begin)
102104
procedure :: end => __MANGLE(end)
105+
procedure :: ftn_begin => __MANGLE(ftn_begin)
106+
procedure :: ftn_end => __MANGLE(ftn_end)
103107
procedure :: find => __MANGLE(find)
104108

105109
procedure :: count => __MANGLE(count)

include/v2/set/iterator_procedures.inc

+20
Original file line numberDiff line numberDiff line change
@@ -106,6 +106,26 @@
106106
end function __MANGLE(iter_end)
107107

108108

109+
function __MANGLE(iter_ftn_begin)(cont) result(begin)
110+
type(__set_iterator) :: begin
111+
type(__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(__set_iterator) :: end
122+
type(__set), target, intent(in) :: cont
123+
124+
end = cont%ftn_end()
125+
126+
end function __MANGLE(iter_ftn_end)
127+
128+
109129
function __MANGLE(iter_next_1)(it) result(new_it)
110130
type(__set_iterator) :: new_it
111131
type(__set_iterator), intent(in) :: it

include/v2/set/iterator_specification.inc

+8
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,14 @@
3333
module procedure __MANGLE(iter_end)
3434
end interface end
3535

36+
interface ftn_begin
37+
module procedure __MANGLE(iter_ftn_begin)
38+
end interface ftn_begin
39+
40+
interface ftn_end
41+
module procedure __MANGLE(iter_ftn_end)
42+
end interface ftn_end
43+
3644
interface next
3745
module procedure __MANGLE(iter_next_1)
3846
#ifndef __gftl_disable_index_kind_overload

include/v2/set/procedures.inc

+27
Original file line numberDiff line numberDiff line change
@@ -447,6 +447,33 @@
447447
return
448448
end function __MANGLE(end)
449449

450+
! =======================
451+
! ftn_begin
452+
! =======================
453+
function __MANGLE(ftn_begin)(this) result(begin)
454+
class(__set), target, intent(in) :: this
455+
type(__set_iterator) :: begin
456+
457+
begin%tree => this
458+
459+
return
460+
end function __MANGLE(ftn_begin)
461+
462+
! =======================
463+
! end
464+
! =======================
465+
function __MANGLE(ftn_end)(this) result(end_)
466+
class(__set), target, intent(in) :: this
467+
type(__set_iterator) :: end_
468+
469+
type(__set_iterator) :: tmp
470+
471+
! brute force implementation for now
472+
end_ = next(this%begin(), this%size()-1)
473+
474+
return
475+
end function __MANGLE(ftn_end)
476+
450477
! =======================
451478
! lower_bound
452479
! =======================

include/v2/set/public.inc

+2
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@
1010
public :: advance
1111
public :: begin
1212
public :: end
13+
public :: ftn_begin
14+
public :: ftn_end
1315
public :: next
1416
public :: prev
1517

include/v2/set/specification.inc

+2
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,8 @@
6262
generic :: erase => erase_iter, erase_value, erase_range
6363
procedure :: begin => __MANGLE(begin)
6464
procedure :: end => __MANGLE(end)
65+
procedure :: ftn_begin => __MANGLE(ftn_begin)
66+
procedure :: ftn_end => __MANGLE(ftn_end)
6567
procedure :: lower_bound => __MANGLE(lower_bound)
6668
procedure :: upper_bound => __MANGLE(upper_bound)
6769

0 commit comments

Comments
 (0)