Skip to content

Commit f520442

Browse files
authored
adding getter and setter for AeroMode::name (#198)
1 parent 22ca79b commit f520442

File tree

5 files changed

+80
-0
lines changed

5 files changed

+80
-0
lines changed

src/aero_mode.F90

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -218,4 +218,30 @@ subroutine f_aero_mode_get_type(ptr_c, type) bind(C)
218218

219219
end subroutine
220220

221+
subroutine f_aero_mode_set_name(ptr_c, name_data, name_size) bind(C)
222+
type(c_ptr), intent(inout) :: ptr_c
223+
type(aero_mode_t), pointer :: aero_mode => null()
224+
character(kind=c_char), dimension(*), intent(in) :: name_data
225+
integer(c_int), intent(in) :: name_size
226+
integer :: i
227+
228+
call c_f_pointer(ptr_c, aero_mode)
229+
do i=1, name_size
230+
aero_mode%name(i:i) = name_data(i)
231+
end do
232+
do i=name_size+1, len(aero_mode%name)
233+
aero_mode%name(i:i) = " "
234+
end do
235+
end subroutine
236+
237+
subroutine f_aero_mode_get_name(ptr_c, name_data, name_size) bind(C)
238+
type(c_ptr), intent(inout) :: ptr_c
239+
type(aero_mode_t), pointer :: aero_mode => null()
240+
type(c_ptr), intent(out) :: name_data
241+
integer(c_int), intent(out) :: name_size
242+
243+
call c_f_pointer(ptr_c, aero_mode)
244+
name_data = c_loc(aero_mode%name)
245+
name_size = len_trim(aero_mode%name)
246+
end subroutine
221247
end module

src/aero_mode.hpp

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,16 @@ extern "C" void f_aero_mode_get_type(
9696
int *val
9797
) noexcept;
9898

99+
extern "C" void f_aero_mode_set_name(
100+
void *ptr,
101+
const char *name_data, const int *name_size
102+
) noexcept;
103+
104+
extern "C" void f_aero_mode_get_name(
105+
const void *ptr,
106+
char **name_data, int *name_size
107+
) noexcept;
108+
99109
extern "C" void f_aero_mode_set_sampled(
100110
void *ptr,
101111
const void *rad_data,
@@ -272,4 +282,20 @@ struct AeroMode {
272282

273283
return AeroMode::types()[type - 1];
274284
}
285+
286+
static void set_name(AeroMode &self, const std::string &name) {
287+
int size = name.size();
288+
f_aero_mode_set_name(self.ptr.f_arg_non_const(), name.c_str(), &size);
289+
}
290+
291+
static auto get_name(const AeroMode &self) {
292+
std::string name;
293+
char* f_ptr = NULL;
294+
int size = 0;
295+
f_aero_mode_get_name(self.ptr.f_arg(), &f_ptr, &size);
296+
name.resize(size);
297+
for (int i = 0; i < size; ++i)
298+
name[i] = f_ptr[i];
299+
return name;
300+
}
275301
};

src/pypartmc.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -323,6 +323,7 @@ PYBIND11_MODULE(_PyPartMC, m) {
323323
&AeroMode::set_gsd)
324324
.def("set_sample", &AeroMode::set_sampled)
325325
.def_property("type", &AeroMode::get_type, &AeroMode::set_type)
326+
.def_property("name", &AeroMode::get_name, &AeroMode::set_name)
326327
;
327328

328329
py::class_<AeroDist>(m,"AeroDist")

tests/test_aero_dist.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,7 @@ def test_ctor_multimode(n_modes):
6666
for i in range(sut.n_mode):
6767
assert sut.mode(i).type == modes[i]["mode_type"]
6868
assert sut.mode(i).num_conc == modes[i]["num_conc"]
69+
assert sut.mode(i).name == f"mode_{i}"
6970

7071
@staticmethod
7172
@pytest.mark.parametrize("idx", (-1, 500))

tests/test_aero_mode.py

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -189,3 +189,29 @@ def test_from_json_mono(modes, diam_type):
189189
mode = modes[tuple(modes.keys())[0]]
190190
assert sut.num_conc == mode["num_conc"]
191191
assert sut.type == mode["mode_type"]
192+
193+
@staticmethod
194+
def test_get_name():
195+
# arrange
196+
aero_data = ppmc.AeroData(AERO_DATA_CTOR_ARG_MINIMAL)
197+
sut = ppmc.AeroMode(aero_data, AERO_MODE_CTOR_LOG_NORMAL)
198+
199+
# act
200+
name = sut.name
201+
202+
# assert
203+
assert tuple(AERO_MODE_CTOR_LOG_NORMAL.keys())[0] == name
204+
205+
@staticmethod
206+
def test_set_name():
207+
# arrange
208+
aero_data = ppmc.AeroData(AERO_DATA_CTOR_ARG_MINIMAL)
209+
sut = ppmc.AeroMode(aero_data, AERO_MODE_CTOR_LOG_NORMAL)
210+
val = "abc"
211+
assert sut.name != val
212+
213+
# act
214+
sut.name = val
215+
216+
# assert
217+
assert sut.name == val

0 commit comments

Comments
 (0)