@@ -102,17 +102,17 @@ contains
102
102
${ti}$, intent(out), optional :: iwork(0:)
103
103
logical, intent(in), optional :: reverse
104
104
105
- ${ti}$ :: array_size, i, stat
105
+ integer(int_index) :: array_size, i, stat
106
106
${t2}$, allocatable :: buf(:)
107
107
${ti}$, allocatable :: ibuf(:)
108
108
109
- if ( size(array, kind=int_index) > huge(1_${ki}$ ) ) then
109
+ if ( size(array, kind=int_index) > huge(1_int_index ) ) then
110
110
error stop "Too many entries for the kind of index."
111
111
end if
112
112
113
- array_size = size(array, kind=${ki}$ )
113
+ array_size = size(array, kind=int_index )
114
114
115
- if ( size(index, kind=${ki}$ ) < array_size ) then
115
+ if ( size(index, kind=int_index ) < array_size ) then
116
116
error stop "index array is too small."
117
117
end if
118
118
@@ -126,11 +126,11 @@ contains
126
126
127
127
! If necessary allocate buffers to serve as scratch memory.
128
128
if ( present(work) ) then
129
- if ( size(work, kind=${ki}$ ) < array_size/2 ) then
129
+ if ( size(work, kind=int_index ) < array_size/2 ) then
130
130
error stop "work array is too small."
131
131
end if
132
132
if ( present(iwork) ) then
133
- if ( size(iwork, kind=${ki}$ ) < array_size/2 ) then
133
+ if ( size(iwork, kind=int_index ) < array_size/2 ) then
134
134
error stop "iwork array is too small."
135
135
endif
136
136
call merge_sort( array, index, work, iwork )
@@ -148,7 +148,7 @@ contains
148
148
#:endif
149
149
if ( stat /= 0 ) error stop "Allocation of array buffer failed."
150
150
if ( present(iwork) ) then
151
- if ( size(iwork, kind=${ki}$ ) < array_size/2 ) then
151
+ if ( size(iwork, kind=int_index ) < array_size/2 ) then
152
152
error stop "iwork array is too small."
153
153
endif
154
154
call merge_sort( array, index, buf, iwork )
@@ -169,17 +169,17 @@ contains
169
169
!! Returns the minimum length of a run from 32-63 so that N/MIN_RUN is
170
170
!! less than or equal to a power of two. See
171
171
!! https://svn.python.org/projects/python/trunk/Objects/listsort.txt
172
- ${ti}$ :: min_run
173
- ${ti}$ , intent(in) :: n
172
+ integer(int_index) :: min_run
173
+ integer(int_index) , intent(in) :: n
174
174
175
- ${ti}$ :: num, r
175
+ integer(int_index) :: num, r
176
176
177
177
num = n
178
- r = 0_${ki}$
178
+ r = 0_int_index
179
179
180
180
do while( num >= 64 )
181
- r = ior( r, iand(num, 1_${ki}$ ) )
182
- num = ishft(num, -1_${ki}$ )
181
+ r = ior( r, iand(num, 1_int_index ) )
182
+ num = ishft(num, -1_int_index )
183
183
end do
184
184
min_run = num + r
185
185
@@ -192,11 +192,11 @@ contains
192
192
${t1}$, intent(inout) :: array(0:)
193
193
${ti}$, intent(inout) :: index(0:)
194
194
195
- ${ti}$ :: i, j
195
+ integer(int_index) :: i, j
196
196
${ti}$ :: key_index
197
197
${t3}$ :: key
198
198
199
- do j=1, size(array, kind=${ki}$ )-1
199
+ do j=1, size(array, kind=int_index )-1
200
200
key = array(j)
201
201
key_index = index(j)
202
202
i = j - 1
@@ -220,13 +220,13 @@ contains
220
220
! 1. len(-3) > len(-2) + len(-1)
221
221
! 2. len(-2) > len(-1)
222
222
223
- ${ti}$ :: r
224
- type(run_type_${namei}$ ), intent(in), target :: runs(0:)
223
+ integer(int_index) :: r
224
+ type(run_type_default ), intent(in), target :: runs(0:)
225
225
226
- ${ti}$ :: n
226
+ integer(int_index) :: n
227
227
logical :: test
228
228
229
- n = size(runs, kind=${ki}$ )
229
+ n = size(runs, kind=int_index )
230
230
test = .false.
231
231
if (n >= 2) then
232
232
if ( runs( n-1 ) % base == 0 .or. &
@@ -278,12 +278,12 @@ contains
278
278
${ti}$, intent(inout) :: index(0:)
279
279
280
280
${t3}$ :: tmp
281
- ${ti}$ :: i
281
+ integer(int_index) :: i
282
282
${ti}$ :: tmp_index
283
283
284
284
tmp = array(0)
285
285
tmp_index = index(0)
286
- find_hole: do i=1, size(array, kind=${ki}$ )-1
286
+ find_hole: do i=1, size(array, kind=int_index )-1
287
287
if ( array(i) >= tmp ) exit find_hole
288
288
array(i-1) = array(i)
289
289
index(i-1) = index(i)
@@ -320,11 +320,11 @@ contains
320
320
${t3}$, intent(inout) :: buf(0:)
321
321
${ti}$, intent(inout) :: ibuf(0:)
322
322
323
- ${ti}$ :: array_size, finish, min_run, r, r_count, &
323
+ integer(int_index) :: array_size, finish, min_run, r, r_count, &
324
324
start
325
- type(run_type_${namei}$ ) :: runs(0:max_merge_stack-1), left, right
325
+ type(run_type_default ) :: runs(0:max_merge_stack-1), left, right
326
326
327
- array_size = size(array, kind=${ki}$ )
327
+ array_size = size(array, kind=int_index )
328
328
329
329
! Very short runs are extended using insertion sort to span at least this
330
330
! many elements. Slices of up to this length are sorted using insertion sort.
@@ -372,7 +372,7 @@ contains
372
372
end do Insert
373
373
if ( start == 0 .and. finish == array_size - 1 ) return
374
374
375
- runs(r_count) = run_type_${namei}$ ( base = start, &
375
+ runs(r_count) = run_type_default ( base = start, &
376
376
len = finish - start + 1 )
377
377
finish = start-1
378
378
r_count = r_count + 1
@@ -390,7 +390,7 @@ contains
390
390
index( left % base: &
391
391
right % base + right % len - 1 ), ibuf )
392
392
393
- runs(r) = run_type_${namei}$ ( base = left % base, &
393
+ runs(r) = run_type_default ( base = left % base, &
394
394
len = left % len + right % len )
395
395
if ( r == r_count - 3 ) runs(r+1) = runs(r+2)
396
396
r_count = r_count - 1
@@ -409,14 +409,14 @@ contains
409
409
! `ARRAY(0:)`. `MID` must be > 0, and < `SIZE(ARRAY)-1`. Buffer `BUF`
410
410
! must be long enough to hold the shorter of the two runs.
411
411
${t1}$, intent(inout) :: array(0:)
412
- ${ti}$ , intent(in) :: mid
412
+ integer(int_index) , intent(in) :: mid
413
413
${t3}$, intent(inout) :: buf(0:)
414
414
${ti}$, intent(inout) :: index(0:)
415
415
${ti}$, intent(inout) :: ibuf(0:)
416
416
417
- ${ti}$ :: array_len, i, j, k
417
+ integer(int_index) :: array_len, i, j, k
418
418
419
- array_len = size(array, kind=${ki}$ )
419
+ array_len = size(array, kind=int_index )
420
420
421
421
! Merge first copies the shorter run into `buf`. Then, depending on which
422
422
! run was shorter, it traces the copied run and the longer run forwards
@@ -477,11 +477,11 @@ contains
477
477
${ti}$, intent(inout) :: index(0:)
478
478
479
479
${ti}$ :: itemp
480
- ${ti}$ :: lo, hi
480
+ integer(int_index) :: lo, hi
481
481
${t3}$ :: temp
482
482
483
483
lo = 0
484
- hi = size( array, kind=${ki}$ ) - 1
484
+ hi = size( array, kind=int_index ) - 1
485
485
do while( lo < hi )
486
486
temp = array(lo)
487
487
array(lo) = array(hi)
0 commit comments