Skip to content

Commit f1f70de

Browse files
committed
correct iterator example
1 parent 1fd4050 commit f1f70de

5 files changed

Lines changed: 30 additions & 19 deletions

File tree

test/iterator/CMakeLists.txt

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
set_property(DIRECTORY PROPERTY LABELS iterator)
2+
13
include(CheckCXXSymbolExists)
24

35
check_cxx_symbol_exists(__cpp_lib_to_address "memory" cpp20_to_address)
@@ -8,18 +10,15 @@ endif()
810
add_library(int_iterator OBJECT lib.cpp)
911
target_include_directories(int_iterator PUBLIC ${CMAKE_CURRENT_SOURCE_DIR})
1012

11-
# glitch in arm64 GitHub Actions. Happened on other projects too (h5fortran-mpi)
12-
if(NOT (APPLE AND "$ENV{GITHUB_ACTIONS}"))
1313
add_executable(int_iterator_fortran main.f90)
1414
target_link_libraries(int_iterator_fortran PRIVATE int_iterator)
1515
set_property(TARGET int_iterator_fortran PROPERTY LINKER_LANGUAGE ${linker_lang})
1616
add_test(NAME IntegerIteratorFortran COMMAND int_iterator_fortran)
17-
endif()
1817

1918
add_executable(int_iterator_cpp main.cpp)
2019
target_link_libraries(int_iterator_cpp PRIVATE int_iterator)
2120
add_test(NAME IntegerIteratorCpp COMMAND int_iterator_cpp)
2221

23-
get_property(tests DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} PROPERTY TESTS)
24-
# in work, may not be correct algorithms
25-
set_tests_properties(${tests} PROPERTIES DISABLED true)
22+
# get_property(tests DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} PROPERTY TESTS)
23+
# # in work, may not be correct algorithms
24+
# set_tests_properties(${tests} PROPERTIES DISABLED true)

test/iterator/int_iter.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ extern "C" {
66
void* initIterator_C();
77
void incrementIterator_C(void*);
88
int getIteratorValue_C(void*);
9+
void destroyIterator_C(void*);
910

1011
#ifdef __cplusplus
1112
}

test/iterator/lib.cpp

Lines changed: 18 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,9 @@
11
#include <vector>
2-
#include <memory>
32

43
extern "C" void* initIterator_C();
54
extern "C" void incrementIterator_C(void*);
65
extern "C" int getIteratorValue_C(void*);
7-
8-
auto initIterator(){
9-
std::vector<int> vec{0, 1, 2};
10-
return vec;
11-
}
6+
extern "C" void destroyIterator_C(void*);
127

138
void incrementIterator(std::vector<int>::iterator &it) {
149
++it;
@@ -18,19 +13,29 @@ int getIteratorValue(std::vector<int>::iterator &it) {
1813
return *it;
1914
}
2015

16+
struct IteratorState {
17+
std::vector<int> vec{0, 1, 2};
18+
std::vector<int>::iterator it = vec.begin();
19+
};
20+
2121

2222
void* initIterator_C(){
23-
auto it = initIterator();
24-
void* ptr = std::to_address(it.begin());
25-
return ptr;
23+
auto* state = new IteratorState();
24+
state->it = state->vec.begin();
25+
return state;
2626
}
2727

2828
void incrementIterator_C(void* ptr){
29-
auto it = static_cast<std::vector<int>::iterator*>(ptr);
30-
incrementIterator(*it);
29+
auto state = static_cast<IteratorState*>(ptr);
30+
incrementIterator(state->it);
3131
}
3232

3333
int getIteratorValue_C(void* ptr){
34-
auto it = static_cast<std::vector<int>::iterator*>(ptr);
35-
return getIteratorValue(*it);
34+
auto state = static_cast<IteratorState*>(ptr);
35+
return getIteratorValue(state->it);
36+
}
37+
38+
void destroyIterator_C(void* ptr){
39+
auto state = static_cast<IteratorState*>(ptr);
40+
delete state;
3641
}

test/iterator/main.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ void* it = initIterator_C();
1010
std::cout << getIteratorValue_C(it) << "\n";
1111

1212
incrementIterator_C(it);
13+
destroyIterator_C(it);
1314

1415
std::cout << "OK: c++: iterator\n";
1516
}

test/iterator/main.f90

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,10 @@ integer(C_INT) FUNCTION getIteratorValue_C(pit) BIND(C, NAME='getIteratorValue_C
1616
import C_INT, C_PTR
1717
type(C_PTR), value, intent(in) :: pit
1818
end function
19+
subroutine destroyIterator_C(pit) BIND(C, NAME='destroyIterator_C')
20+
import C_PTR
21+
type(C_PTR), value, intent(in) :: pit
22+
end subroutine
1923
end interface
2024

2125
type(C_PTR) :: it
@@ -25,6 +29,7 @@ integer(C_INT) FUNCTION getIteratorValue_C(pit) BIND(C, NAME='getIteratorValue_C
2529
print *, getIteratorValue_C(it)
2630

2731
call incrementIterator_C(it)
32+
call destroyIterator_C(it)
2833

2934
print *, "OK: iterator"
3035

0 commit comments

Comments
 (0)