diff --git a/src/Particle/ParticleContainer.H b/src/Particle/ParticleContainer.H index da27b85f..79242de2 100644 --- a/src/Particle/ParticleContainer.H +++ b/src/Particle/ParticleContainer.H @@ -44,22 +44,56 @@ std::string particle_type_suffix () return suffix; } -template -void make_Base_Iterators (py::module &m, std::string allocstr) +template class Allocator=amrex::DefaultAllocator> +auto // std::tuple +define_Iterators (py::module &m, std::string allocstr) { using namespace amrex; - using iterator_base = T_ParIterBase; - using container = typename iterator_base::ContainerType; + using iterator = T_ParIter; + using container = typename iterator::ContainerType; using ParticleType = typename container::ParticleType; constexpr int NArrayReal = container::NArrayReal; constexpr int NArrayInt = container::NArrayInt; + using iterator_base = amrex::ParIterBase_impl; std::string const suffix = particle_type_suffix(); + std::string particle_it_base_name = std::string("Par"); if (is_const) particle_it_base_name += "Const"; particle_it_base_name += "IterBase_" + suffix + "_" + allocstr; - auto py_it_base = py::class_(m, particle_it_base_name.c_str(), py::dynamic_attr()) + auto py_it_base = py::class_(m, particle_it_base_name.c_str(), py::dynamic_attr()); + + auto particle_it_name = std::string("Par"); + if (is_const) particle_it_name += "Const"; + particle_it_name += std::string("Iter_") + suffix + "_" + allocstr; + auto py_it = py::class_(m, particle_it_name.c_str()) + .def("__repr__", + [particle_it_name](iterator const & pti) { + std::string r = ""); + return r; + } + ) + ; + return std::tuple(py_it, py_it_base); +} + +template +void make_Iterators ( + T_PyParIter & py_it, + T_PyParIterBase & py_it_base +) +{ + using namespace amrex; + + using iterator = typename T_PyParIter::type; + using container = typename iterator::ContainerType; + using ParticleType = typename container::ParticleType; + using iterator_base = typename T_PyParIterBase::type; + + py_it_base .def(py::init(), // while the created iterator (argument 1: this) exists, // keep the ParticleContainer (argument 2) alive @@ -95,35 +129,8 @@ void make_Base_Iterators (py::module &m, std::string allocstr) py_it_base.def("aos", &iterator_base::GetArrayOfStructs, py::return_value_policy::reference_internal); -} - -template class Allocator=amrex::DefaultAllocator> -void make_Iterators (py::module &m, std::string allocstr) -{ - using namespace amrex; - - using iterator = T_ParIter; - using container = typename iterator::ContainerType; - using ParticleType = typename container::ParticleType; - constexpr int NArrayReal = container::NArrayReal; - constexpr int NArrayInt = container::NArrayInt; - - using iterator_base = amrex::ParIterBase_impl; - make_Base_Iterators< is_const, iterator_base >(m, allocstr); - std::string const suffix = particle_type_suffix(); - auto particle_it_name = std::string("Par"); - if (is_const) particle_it_name += "Const"; - particle_it_name += std::string("Iter_") + suffix + "_" + allocstr; - py::class_(m, particle_it_name.c_str()) - .def("__repr__", - [particle_it_name](iterator const & pti) { - std::string r = ""); - return r; - } - ) + py_it .def(py::init(), py::arg("particle_container"), py::arg("level")) //.def(py::init(), @@ -172,6 +179,11 @@ void make_ParticleContainer_and_Iterators (py::module &m, std::string allocstr) using ParticleInitData = typename ParticleContainerType::ParticleInitData; using ParticleTileType = typename ParticleContainerType::ParticleTileType; + using iterator = amrex::ParIter_impl; + using const_iterator = amrex::ParConstIter_impl; + auto [py_it, py_it_base] = define_Iterators< false, iterator, Allocator >(m, allocstr); + auto [py_const_it, py_const_it_base] = define_Iterators< true, const_iterator, Allocator >(m, allocstr); + std::string const suffix = particle_type_suffix(); auto const particle_container_type = std::string("ParticleContainer_") + suffix + "_" + allocstr; auto py_pc = py::class_(m, particle_container_type.c_str()) @@ -488,10 +500,8 @@ void make_ParticleContainer_and_Iterators (py::module &m, std::string allocstr) ; } - using iterator = amrex::ParIter_impl; - make_Iterators< false, iterator, Allocator >(m, allocstr); - using const_iterator = amrex::ParConstIter_impl; - make_Iterators< true, const_iterator, Allocator >(m, allocstr); + make_Iterators(py_it, py_it_base); + make_Iterators(py_const_it, py_const_it_base); // simpler particle iterator loops: return types of this particle box py_pc