Skip to content

Commit 88e3f0a

Browse files
Fix iterator return value policies
1 parent e3d910c commit 88e3f0a

File tree

6 files changed

+22
-18
lines changed

6 files changed

+22
-18
lines changed

source/analysis/accumulables/pyG4AccumulableManager.cc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,5 +37,5 @@ void export_G4AccumulableManager(py::module &m)
3737
.def("Reset", &G4AccumulableManager::Reset, py::call_guard<py::gil_scoped_release>())
3838
.def(
3939
"__iter__", [](G4AccumulableManager &self) { return py::make_iterator(self.Begin(), self.End()); },
40-
py::is_operator());
40+
py::is_operator(), py::return_value_policy::reference_internal);
4141
}

source/geometry/management/pyG4Region.cc

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ void export_G4Region(py::module &m)
5757

5858
return py::make_iterator(begin, end);
5959
},
60-
py::keep_alive<0, 1>())
60+
py::is_operator(), py::return_value_policy::reference_internal)
6161

6262
.def(
6363
"GetMaterialIterator",
@@ -67,7 +67,7 @@ void export_G4Region(py::module &m)
6767

6868
return py::make_iterator(begin, end);
6969
},
70-
py::keep_alive<0, 1>())
70+
py::is_operator(), py::return_value_policy::reference_internal)
7171

7272
.def("GetNumberOfMaterials", &G4Region::GetNumberOfMaterials)
7373
.def("GetNumberOfRootVolumes", &G4Region::GetNumberOfRootVolumes)

source/geometry/navigation/pyG4TransportationManager.cc

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@ void export_G4TransportationManager(py::module &m)
7272

7373
return py::make_iterator(begin, end);
7474
},
75-
py::keep_alive<0, 1>())
75+
py::is_operator(), py::return_value_policy::reference_internal)
7676

7777
.def("GetNoWorlds", &G4TransportationManager::GetNoWorlds)
7878
.def(
@@ -83,7 +83,7 @@ void export_G4TransportationManager(py::module &m)
8383

8484
return py::make_iterator(begin, end);
8585
},
86-
py::keep_alive<0, 1>())
86+
py::is_operator(), py::return_value_policy::reference_internal)
8787

8888
.def("GetSafetyHelper", &G4TransportationManager::GetSafetyHelper, py::return_value_policy::reference)
8989
.def("GetParallelWorld", &G4TransportationManager::GetParallelWorld, py::arg("worldName"),

source/geometry/volumes/pyG4AssemblyVolume.cc

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ void export_G4AssemblyVolume(py::module &m)
5555

5656
return py::make_iterator(begin, end);
5757
},
58-
py::keep_alive<0, 1>())
58+
py::is_operator(), py::return_value_policy::reference_internal)
5959

6060
.def("TotalImprintedVolumes", &G4AssemblyVolume::TotalImprintedVolumes)
6161
.def("GetImprintTransformation", &G4AssemblyVolume::GetImprintTransformation, py::arg("imprintID"))
@@ -67,7 +67,7 @@ void export_G4AssemblyVolume(py::module &m)
6767

6868
return py::make_iterator(begin, end);
6969
},
70-
py::keep_alive<0, 1>())
70+
py::is_operator(), py::return_value_policy::reference_internal)
7171

7272
.def("TotalTriplets", &G4AssemblyVolume::TotalTriplets)
7373
.def("GetImprintsCount", &G4AssemblyVolume::GetImprintsCount)

source/materials/pyG4ExtendedMaterial.cc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,5 +43,5 @@ void export_G4ExtendedMaterial(py::module &m)
4343

4444
.def(
4545
"__iter__", [](G4ExtendedMaterial &self) { return py::make_iterator(self.begin(), self.end()); },
46-
py::keep_alive<0, 1>(), py::is_operator());
46+
py::is_operator(), py::return_value_policy::reference_internal);
4747
}

source/particles/pyG4ParticleList.cc

Lines changed: 14 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -53,24 +53,28 @@ PyG4ParticleList::ParticleList PyG4ParticleList::particleTableCache;
5353

5454
void export_PyG4ParticleList(py::module &m)
5555
{
56-
py::class_<PyG4ParticleList>(m, "PyG4ParticleList", "particle list")
56+
py::class_<PyG4ParticleList, py::nodelete>(m, "PyG4ParticleList", "particle list")
5757
.def(py::init<>())
5858
.def(
59-
"__iter__", [](PyG4ParticleList &self) { py::make_iterator(self.p_begin(), self.p_end()); }, py::is_operator())
59+
"__iter__", [](PyG4ParticleList &self) { py::make_iterator(self.p_begin(), self.p_end()); }, py::is_operator(),
60+
py::return_value_policy::reference_internal)
6061

6162
.def(
6263
"__getitem__",
6364
[](PyG4ParticleList &self, size_t i) {
6465
self.p_begin();
6566
return self.particleTableCache[i];
6667
},
67-
py::is_operator())
68+
py::is_operator(), py::return_value_policy::reference_internal)
6869

69-
.def_property_readonly("particles", [](PyG4ParticleList &self) {
70-
py::list list;
71-
for (auto it = self.p_begin(); it < self.p_end(); it++) {
72-
list.append(it);
73-
}
74-
return list;
75-
});
70+
.def_property_readonly(
71+
"particles",
72+
[](PyG4ParticleList &self) {
73+
py::list list;
74+
for (auto it = self.p_begin(); it < self.p_end(); it++) {
75+
list.append(it);
76+
}
77+
return list;
78+
},
79+
py::return_value_policy::reference_internal);
7680
}

0 commit comments

Comments
 (0)