Skip to content

Commit 77b8da2

Browse files
committed
Add includes set routine.
1 parent 9015cff commit 77b8da2

File tree

5 files changed

+466
-5
lines changed

5 files changed

+466
-5
lines changed

doc/modules/algorithm.rst

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -145,12 +145,28 @@ Set operations
145145
==============
146146

147147
Sorted arrays can be manipulated as "sets," supporting unions, intersections,
148-
and differences. TODO.
148+
and differences.
149149

150150
includes
151151
--------
152152

153-
TODO
153+
Whether one set encloses another set: every item of the second array is present
154+
in the first array.
155+
156+
Example::
157+
158+
use flc_algorithm, only : includes
159+
implicit none
160+
integer, dimension(6) :: iarr = [ -5, 1, 2, 4, 9]
161+
integer, dimension(3) :: jarr = [ 1, 2, 5]
162+
logical :: is_superset
163+
164+
is_superset = includes(iarr, iarr)) ! true
165+
is_superset = includes(iarr, iarr(:3))) ! true
166+
is_superset = includes(iarr, iarr(3:))) ! true
167+
is_superset = includes(iarr(3:), iarr)) ! false
168+
is_superset = includes(iarr, jarr) ! false
169+
is_superset = includes(iarr, jarr(1:2))) ! true
154170

155171
set_difference
156172
--------------

src/flc_algorithm.i

Lines changed: 24 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -49,12 +49,20 @@ typedef int index_int;
4949
%typemap(ftype, in={integer(INDEX_INT), intent(in)}) index_int
5050
%{integer(INDEX_INT)%}
5151

52+
%apply (SWIGTYPE *DATA, size_t SIZE) { (index_int *IDX, size_t IDXSIZE) };
53+
54+
%apply (const SWIGTYPE *DATA, size_t SIZE) {
55+
(const int32_t *DATA1, size_t DATASIZE1),
56+
(const int64_t *DATA1, size_t DATASIZE1),
57+
(const double *DATA1, size_t DATASIZE1),
58+
(const int32_t *DATA2, size_t DATASIZE2),
59+
(const int64_t *DATA2, size_t DATASIZE2),
60+
(const double *DATA2, size_t DATASIZE2) };
61+
5262
/******************************
5363
* Sorting
5464
******************************/
5565

56-
%apply (SWIGTYPE *DATA, size_t SIZE) { (index_int *IDX, size_t IDXSIZE) };
57-
5866
%{
5967
template<class T, class Compare>
6068
static void sort_impl(T *data, size_t size, Compare cmp) {
@@ -141,6 +149,20 @@ static void minmax_element_impl(const T *data, size_t size, index_int *min_index
141149
index_int *min_index, index_int *max_index),
142150
%arg(DATA, DATASIZE, min_index, max_index))
143151

152+
/******************************
153+
* Set operations
154+
******************************/
155+
156+
%{
157+
template<class T, class Compare>
158+
static bool includes_impl(const T *data1, size_t size1, const T *data2, size_t size2, Compare cmp) {
159+
return std::includes(data1, data1 + size1, data2, data2 + size2, cmp);
160+
}
161+
%}
162+
163+
%flc_cmp_algorithm(bool, includes, %arg(const T *DATA1, size_t DATASIZE1,
164+
const T *DATA2, size_t DATASIZE2),
165+
%arg(DATA1, DATASIZE1, DATA2, DATASIZE2))
144166

145167
/******************************
146168
* Reordering

src/generated/flc_algorithm.f90

Lines changed: 269 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,11 @@ module flc_algorithm
4444
module procedure swigf_shuffle__SWIG_1, swigf_shuffle__SWIG_2, swigf_shuffle__SWIG_3
4545
end interface
4646
public :: shuffle
47+
interface includes
48+
module procedure swigf_includes__SWIG_1, swigf_includes__SWIG_2, swigf_includes__SWIG_3, swigf_includes__SWIG_4, &
49+
swigf_includes__SWIG_5, swigf_includes__SWIG_6
50+
end interface
51+
public :: includes
4752
interface is_sorted
4853
module procedure swigf_is_sorted__SWIG_1, swigf_is_sorted__SWIG_2, swigf_is_sorted__SWIG_3, swigf_is_sorted__SWIG_4, &
4954
swigf_is_sorted__SWIG_5, swigf_is_sorted__SWIG_6
@@ -403,6 +408,69 @@ subroutine swigc_minmax_element__SWIG_6(farg1, farg3, farg4, farg5) &
403408
type(C_FUNPTR), value :: farg5
404409
end subroutine
405410

411+
function swigc_includes__SWIG_1(farg1, farg3) &
412+
bind(C, name="_wrap_includes__SWIG_1") &
413+
result(fresult)
414+
use, intrinsic :: ISO_C_BINDING
415+
import :: swigarraywrapper
416+
type(SwigArrayWrapper) :: farg1
417+
type(SwigArrayWrapper) :: farg3
418+
integer(C_INT) :: fresult
419+
end function
420+
421+
function swigc_includes__SWIG_2(farg1, farg3) &
422+
bind(C, name="_wrap_includes__SWIG_2") &
423+
result(fresult)
424+
use, intrinsic :: ISO_C_BINDING
425+
import :: swigarraywrapper
426+
type(SwigArrayWrapper) :: farg1
427+
type(SwigArrayWrapper) :: farg3
428+
integer(C_INT) :: fresult
429+
end function
430+
431+
function swigc_includes__SWIG_3(farg1, farg3) &
432+
bind(C, name="_wrap_includes__SWIG_3") &
433+
result(fresult)
434+
use, intrinsic :: ISO_C_BINDING
435+
import :: swigarraywrapper
436+
type(SwigArrayWrapper) :: farg1
437+
type(SwigArrayWrapper) :: farg3
438+
integer(C_INT) :: fresult
439+
end function
440+
441+
function swigc_includes__SWIG_4(farg1, farg3, farg5) &
442+
bind(C, name="_wrap_includes__SWIG_4") &
443+
result(fresult)
444+
use, intrinsic :: ISO_C_BINDING
445+
import :: swigarraywrapper
446+
type(SwigArrayWrapper) :: farg1
447+
type(SwigArrayWrapper) :: farg3
448+
type(C_FUNPTR), value :: farg5
449+
integer(C_INT) :: fresult
450+
end function
451+
452+
function swigc_includes__SWIG_5(farg1, farg3, farg5) &
453+
bind(C, name="_wrap_includes__SWIG_5") &
454+
result(fresult)
455+
use, intrinsic :: ISO_C_BINDING
456+
import :: swigarraywrapper
457+
type(SwigArrayWrapper) :: farg1
458+
type(SwigArrayWrapper) :: farg3
459+
type(C_FUNPTR), value :: farg5
460+
integer(C_INT) :: fresult
461+
end function
462+
463+
function swigc_includes__SWIG_6(farg1, farg3, farg5) &
464+
bind(C, name="_wrap_includes__SWIG_6") &
465+
result(fresult)
466+
use, intrinsic :: ISO_C_BINDING
467+
import :: swigarraywrapper
468+
type(SwigArrayWrapper) :: farg1
469+
type(SwigArrayWrapper) :: farg3
470+
type(C_FUNPTR), value :: farg5
471+
integer(C_INT) :: fresult
472+
end function
473+
406474
subroutine swigc_shuffle__SWIG_1(farg1, farg2) &
407475
bind(C, name="_wrap_shuffle__SWIG_1")
408476
use, intrinsic :: ISO_C_BINDING
@@ -1336,6 +1404,207 @@ subroutine swigf_minmax_element__SWIG_6(data, min_index, max_index, cmp)
13361404
call swigc_minmax_element__SWIG_6(farg1, farg3, farg4, farg5)
13371405
end subroutine
13381406

1407+
function swigf_includes__SWIG_1(data1, data2) &
1408+
result(swig_result)
1409+
use, intrinsic :: ISO_C_BINDING
1410+
logical :: swig_result
1411+
integer(C_INT32_T), dimension(:), intent(in), target :: data1
1412+
integer(C_INT32_T), pointer :: farg1_view
1413+
integer(C_INT32_T), dimension(:), intent(in), target :: data2
1414+
integer(C_INT32_T), pointer :: farg3_view
1415+
integer(C_INT) :: fresult
1416+
type(SwigArrayWrapper) :: farg1
1417+
type(SwigArrayWrapper) :: farg3
1418+
1419+
if (size(data1) > 0) then
1420+
farg1_view => data1(1)
1421+
farg1%data = c_loc(farg1_view)
1422+
farg1%size = size(data1)
1423+
else
1424+
farg1%data = c_null_ptr
1425+
farg1%size = 0
1426+
end if
1427+
if (size(data2) > 0) then
1428+
farg3_view => data2(1)
1429+
farg3%data = c_loc(farg3_view)
1430+
farg3%size = size(data2)
1431+
else
1432+
farg3%data = c_null_ptr
1433+
farg3%size = 0
1434+
end if
1435+
fresult = swigc_includes__SWIG_1(farg1, farg3)
1436+
swig_result = SWIG_int_to_logical(fresult)
1437+
end function
1438+
1439+
function swigf_includes__SWIG_2(data1, data2) &
1440+
result(swig_result)
1441+
use, intrinsic :: ISO_C_BINDING
1442+
logical :: swig_result
1443+
integer(C_INT64_T), dimension(:), intent(in), target :: data1
1444+
integer(C_INT64_T), pointer :: farg1_view
1445+
integer(C_INT64_T), dimension(:), intent(in), target :: data2
1446+
integer(C_INT64_T), pointer :: farg3_view
1447+
integer(C_INT) :: fresult
1448+
type(SwigArrayWrapper) :: farg1
1449+
type(SwigArrayWrapper) :: farg3
1450+
1451+
if (size(data1) > 0) then
1452+
farg1_view => data1(1)
1453+
farg1%data = c_loc(farg1_view)
1454+
farg1%size = size(data1)
1455+
else
1456+
farg1%data = c_null_ptr
1457+
farg1%size = 0
1458+
end if
1459+
if (size(data2) > 0) then
1460+
farg3_view => data2(1)
1461+
farg3%data = c_loc(farg3_view)
1462+
farg3%size = size(data2)
1463+
else
1464+
farg3%data = c_null_ptr
1465+
farg3%size = 0
1466+
end if
1467+
fresult = swigc_includes__SWIG_2(farg1, farg3)
1468+
swig_result = SWIG_int_to_logical(fresult)
1469+
end function
1470+
1471+
function swigf_includes__SWIG_3(data1, data2) &
1472+
result(swig_result)
1473+
use, intrinsic :: ISO_C_BINDING
1474+
logical :: swig_result
1475+
real(C_DOUBLE), dimension(:), intent(in), target :: data1
1476+
real(C_DOUBLE), pointer :: farg1_view
1477+
real(C_DOUBLE), dimension(:), intent(in), target :: data2
1478+
real(C_DOUBLE), pointer :: farg3_view
1479+
integer(C_INT) :: fresult
1480+
type(SwigArrayWrapper) :: farg1
1481+
type(SwigArrayWrapper) :: farg3
1482+
1483+
if (size(data1) > 0) then
1484+
farg1_view => data1(1)
1485+
farg1%data = c_loc(farg1_view)
1486+
farg1%size = size(data1)
1487+
else
1488+
farg1%data = c_null_ptr
1489+
farg1%size = 0
1490+
end if
1491+
if (size(data2) > 0) then
1492+
farg3_view => data2(1)
1493+
farg3%data = c_loc(farg3_view)
1494+
farg3%size = size(data2)
1495+
else
1496+
farg3%data = c_null_ptr
1497+
farg3%size = 0
1498+
end if
1499+
fresult = swigc_includes__SWIG_3(farg1, farg3)
1500+
swig_result = SWIG_int_to_logical(fresult)
1501+
end function
1502+
1503+
function swigf_includes__SWIG_4(data1, data2, cmp) &
1504+
result(swig_result)
1505+
use, intrinsic :: ISO_C_BINDING
1506+
logical :: swig_result
1507+
integer(C_INT32_T), dimension(:), intent(in), target :: data1
1508+
integer(C_INT32_T), pointer :: farg1_view
1509+
integer(C_INT32_T), dimension(:), intent(in), target :: data2
1510+
integer(C_INT32_T), pointer :: farg3_view
1511+
type(C_FUNPTR), intent(in), value :: cmp
1512+
integer(C_INT) :: fresult
1513+
type(SwigArrayWrapper) :: farg1
1514+
type(SwigArrayWrapper) :: farg3
1515+
type(C_FUNPTR) :: farg5
1516+
1517+
if (size(data1) > 0) then
1518+
farg1_view => data1(1)
1519+
farg1%data = c_loc(farg1_view)
1520+
farg1%size = size(data1)
1521+
else
1522+
farg1%data = c_null_ptr
1523+
farg1%size = 0
1524+
end if
1525+
if (size(data2) > 0) then
1526+
farg3_view => data2(1)
1527+
farg3%data = c_loc(farg3_view)
1528+
farg3%size = size(data2)
1529+
else
1530+
farg3%data = c_null_ptr
1531+
farg3%size = 0
1532+
end if
1533+
farg5 = cmp
1534+
fresult = swigc_includes__SWIG_4(farg1, farg3, farg5)
1535+
swig_result = SWIG_int_to_logical(fresult)
1536+
end function
1537+
1538+
function swigf_includes__SWIG_5(data1, data2, cmp) &
1539+
result(swig_result)
1540+
use, intrinsic :: ISO_C_BINDING
1541+
logical :: swig_result
1542+
integer(C_INT64_T), dimension(:), intent(in), target :: data1
1543+
integer(C_INT64_T), pointer :: farg1_view
1544+
integer(C_INT64_T), dimension(:), intent(in), target :: data2
1545+
integer(C_INT64_T), pointer :: farg3_view
1546+
type(C_FUNPTR), intent(in), value :: cmp
1547+
integer(C_INT) :: fresult
1548+
type(SwigArrayWrapper) :: farg1
1549+
type(SwigArrayWrapper) :: farg3
1550+
type(C_FUNPTR) :: farg5
1551+
1552+
if (size(data1) > 0) then
1553+
farg1_view => data1(1)
1554+
farg1%data = c_loc(farg1_view)
1555+
farg1%size = size(data1)
1556+
else
1557+
farg1%data = c_null_ptr
1558+
farg1%size = 0
1559+
end if
1560+
if (size(data2) > 0) then
1561+
farg3_view => data2(1)
1562+
farg3%data = c_loc(farg3_view)
1563+
farg3%size = size(data2)
1564+
else
1565+
farg3%data = c_null_ptr
1566+
farg3%size = 0
1567+
end if
1568+
farg5 = cmp
1569+
fresult = swigc_includes__SWIG_5(farg1, farg3, farg5)
1570+
swig_result = SWIG_int_to_logical(fresult)
1571+
end function
1572+
1573+
function swigf_includes__SWIG_6(data1, data2, cmp) &
1574+
result(swig_result)
1575+
use, intrinsic :: ISO_C_BINDING
1576+
logical :: swig_result
1577+
real(C_DOUBLE), dimension(:), intent(in), target :: data1
1578+
real(C_DOUBLE), pointer :: farg1_view
1579+
real(C_DOUBLE), dimension(:), intent(in), target :: data2
1580+
real(C_DOUBLE), pointer :: farg3_view
1581+
type(C_FUNPTR), intent(in), value :: cmp
1582+
integer(C_INT) :: fresult
1583+
type(SwigArrayWrapper) :: farg1
1584+
type(SwigArrayWrapper) :: farg3
1585+
type(C_FUNPTR) :: farg5
1586+
1587+
if (size(data1) > 0) then
1588+
farg1_view => data1(1)
1589+
farg1%data = c_loc(farg1_view)
1590+
farg1%size = size(data1)
1591+
else
1592+
farg1%data = c_null_ptr
1593+
farg1%size = 0
1594+
end if
1595+
if (size(data2) > 0) then
1596+
farg3_view => data2(1)
1597+
farg3%data = c_loc(farg3_view)
1598+
farg3%size = size(data2)
1599+
else
1600+
farg3%data = c_null_ptr
1601+
farg3%size = 0
1602+
end if
1603+
farg5 = cmp
1604+
fresult = swigc_includes__SWIG_6(farg1, farg3, farg5)
1605+
swig_result = SWIG_int_to_logical(fresult)
1606+
end function
1607+
13391608
subroutine swigf_shuffle__SWIG_1(g, data)
13401609
use, intrinsic :: ISO_C_BINDING
13411610
class(Engine), intent(in) :: g

0 commit comments

Comments
 (0)