Skip to content

Commit 0af9670

Browse files
authored
Merge pull request #65 from JesseMckinzie/fix_pybind_iterator_v2
Fix pybind11 iterator
2 parents 6281efa + d746d6b commit 0af9670

File tree

4 files changed

+55
-24
lines changed

4 files changed

+55
-24
lines changed

ci-utils/envs/conda_cpp.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
pybind11 >= 2.10.0, <=2.11.1
1+
pybind11

environment.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ dependencies:
66
- python=3.7
77
- compilers
88
- cmake
9-
- pybind11[version='>=2.10.0']
9+
- pybind11
1010
- pydantic
1111
- pip:
1212
- sphinx

src/filepattern/cpp/bindings.cpp

Lines changed: 38 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -36,36 +36,54 @@ PYBIND11_MODULE(backend, m){
3636
.def_static("getRegex", &FilePattern::getRegex)
3737
.def_static("inferPattern", py::overload_cast<const std::string&, std::string&, const std::string&>(&FilePattern::inferPattern))
3838
.def_static("inferPattern", py::overload_cast<std::vector<std::string>&, std::string&>(&FilePattern::inferPattern))
39-
.def("__iter__", [](FilePattern &v){
39+
.def("isGrouped", [](FilePattern &v){
4040
auto& pattern_obj = v.getPatternObject();
41+
return !(pattern_obj->group_.size() == 0 || (pattern_obj->group_.size() != 0 && pattern_obj->group_[0] == ""));
42+
})
43+
.def("iterator", [](FilePattern &v){
44+
45+
auto& pattern_obj = v.getPatternObject();
46+
4147
if(pattern_obj != nullptr) {
42-
if(pattern_obj->external) {
4348

44-
if(pattern_obj->group_.size() == 0 || (pattern_obj->group_.size() != 0 && pattern_obj->group_[0] == "")) {
49+
return py::make_iterator(pattern_obj->valid_files_.begin(), pattern_obj->valid_files_.end());
50+
51+
}
52+
53+
}, py::keep_alive<0, 1>())
54+
.def("iteratorExternal", [](FilePattern &v){
4555

46-
v.next();
47-
return py::make_iterator(pattern_obj->current_block_.begin(), pattern_obj->current_block_.end());
56+
auto& pattern_obj = v.getPatternObject();
4857

49-
} else {
58+
if(pattern_obj != nullptr) {
59+
60+
v.next();
61+
return py::make_iterator(pattern_obj->current_block_.begin(), pattern_obj->current_block_.end());
5062

51-
v.nextGroup();
52-
return py::make_iterator(pattern_obj->current_group_.begin(), pattern_obj->current_group_.end());
53-
}
63+
}
5464

55-
} else {
65+
}, py::keep_alive<0, 1>())
66+
.def("iteratorGrouped", [](FilePattern &v){
5667

57-
if(pattern_obj->group_.size() == 0 || (pattern_obj->group_.size() != 0 && pattern_obj->group_[0] == "")){
68+
auto& pattern_obj = v.getPatternObject();
69+
70+
if(pattern_obj != nullptr) {
71+
72+
return py::make_iterator(pattern_obj->valid_grouped_files_.begin(), pattern_obj->valid_grouped_files_.end());
73+
74+
}
75+
76+
}, py::keep_alive<0, 1>())
77+
.def("iteratorGroupedExternal", [](FilePattern &v){
78+
79+
auto& pattern_obj = v.getPatternObject();
80+
81+
if(pattern_obj != nullptr) {
5882

59-
return py::make_iterator(pattern_obj->valid_files_.begin(), pattern_obj->valid_files_.end());
60-
//return py::make_iterator(pattern_obj->valid_grouped_files_.begin(), pattern_obj->valid_grouped_files_.end());
61-
}
62-
else{
83+
v.nextGroup();
84+
return py::make_iterator(pattern_obj->current_group_.begin(), pattern_obj->current_group_.end());
6385

64-
return py::make_iterator(pattern_obj->valid_grouped_files_.begin(), pattern_obj->valid_grouped_files_.end());
65-
}
66-
}
6786
}
68-
},
69-
py::keep_alive<0, 1>()); // Keep vector alive while iterator is used
7087

88+
}, py::keep_alive<0, 1>());
7189
}

src/filepattern/filepattern.py

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -259,7 +259,13 @@ def __iter__(self) -> Union[List[Tuple[List[Tuple[str, Union[str, int, float]]],
259259
"""
260260

261261
if self._block_size == "":
262-
for file in self._file_pattern.__iter__():
262+
263+
if (self._file_pattern.isGrouped()):
264+
iterator = self._file_pattern.iteratorGrouped()
265+
else:
266+
iterator = self._file_pattern.iterator()
267+
268+
for file in iterator:
263269
if (self.pydantic_iterator):
264270

265271
if (isinstance(file[0], dict)):
@@ -280,8 +286,15 @@ def __iter__(self) -> Union[List[Tuple[List[Tuple[str, Union[str, int, float]]],
280286
else:
281287
yield file
282288
else:
289+
283290
while True:
284-
for block in self._file_pattern.__iter__():
291+
292+
if (self._file_pattern.isGrouped()):
293+
iterator = self._file_pattern.iteratorGroupedExternal()
294+
else:
295+
iterator = self._file_pattern.iteratorExternal()
296+
297+
for block in iterator:
285298

286299
if self._length() == 0:
287300
break

0 commit comments

Comments
 (0)