Skip to content

Commit 779ad38

Browse files
committed
add copy and deepcopy dunder methods
1 parent dee1d7b commit 779ad38

File tree

4 files changed

+99
-2
lines changed

4 files changed

+99
-2
lines changed

python/units_python.cpp

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,14 @@ NB_MODULE(units_llnl_ext, mod)
8585
"multiplier"_a,
8686
"unit"_a,
8787
"commodity"_a)
88+
.def("__copy__", [](const units::precise_unit* unit)
89+
{
90+
return units::precise_unit(*unit);
91+
})
92+
.def("__deepcopy__", [](const units::precise_unit* unit, nb::dict & /*memo*/)
93+
{
94+
return units::precise_unit(*unit);
95+
})
8896
.def_prop_ro("multiplier", &units::precise_unit::multiplier)
8997
.def_prop_ro(
9098
"commodity",
@@ -372,6 +380,14 @@ NB_MODULE(units_llnl_ext, mod)
372380
},
373381
"value"_a,
374382
"unit"_a)
383+
.def("__copy__", [](const units::precise_measurement& copy)
384+
{
385+
return units::precise_measurement(copy);
386+
})
387+
.def("__deepcopy__", [](const units::precise_measurement& copy, nb::dict & /*memo*/)
388+
{
389+
return units::precise_measurement(copy);
390+
})
375391
.def_prop_ro(
376392
"value",
377393
[](const units::precise_measurement& measurement) {
@@ -718,6 +734,14 @@ NB_MODULE(units_llnl_ext, mod)
718734
new (dim) Dimension{def};
719735
},
720736
"composition"_a)
737+
.def("__copy__", [](const Dimension& copy)
738+
{
739+
return Dimension(copy);
740+
})
741+
.def("__deepcopy__", [](const Dimension* dim, nb::dict & /*memo*/)
742+
{
743+
return Dimension(*dim);
744+
})
721745
.def_prop_ro(
722746
"default_unit",
723747
[](const Dimension& dim) { return (dim.base); },

test/python/test_dimensions.py

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77

88
from units_llnl import Unit, Measurement, Dimension, asdimension
99

10+
import copy
1011

1112
def test_dimensions():
1213
d1 = Dimension("length")
@@ -87,3 +88,27 @@ def test_dimensions_decompose2():
8788
dim2 = Dimension(decomposition)
8889
assert dim2 == dim
8990
assert dim2.default_unit == u1
91+
92+
93+
def test_copy():
94+
m1=u.Dimension("10 m")
95+
m2=copy.copy(m1)
96+
assert m1==m2
97+
98+
def test_deepcopy():
99+
m1=u.Dimension("10 m")
100+
m2=copy.deepcopy(m1)
101+
assert m1==m2
102+
103+
def test_deepcopy_object():
104+
class val1:
105+
value1=u.Dimension("10 m")
106+
value2=u.Dimension("20 kg")
107+
value3=u.Dimension("30 A")
108+
values=[value1,value2,value3]
109+
110+
v=val1()
111+
v2=copy.deepcopy(v)
112+
assert v2.value1==v.value1
113+
v.value1=u.Dimension("50 mol")
114+
assert v2.value1==u.Dimension("10 m")

test/python/test_measurement.py

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55

66
import units_llnl as u
77
import math
8-
8+
import copy
99

1010
def test_basic_measurement():
1111
m1 = u.Measurement("10 m")
@@ -315,3 +315,27 @@ def test_to_dict():
315315
dv = m1.to_dict()
316316
assert dv["value"] == 25
317317
assert dv["unit"] == "lb"
318+
319+
320+
def test_copy():
321+
m1=u.Measurement("10 m")
322+
m2=copy.copy(m1)
323+
assert m1==m2
324+
325+
def test_deepcopy():
326+
m1=u.Measurement("10 m")
327+
m2=copy.deepcopy(m1)
328+
assert m1==m2
329+
330+
def test_deepcopy_object():
331+
class val1:
332+
value1=u.Measurement("10 m")
333+
value2=u.Measurement("20 m")
334+
value3=u.Measurement("30 m")
335+
values=[value1,value2,value3]
336+
337+
v=val1()
338+
v2=copy.deepcopy(v)
339+
assert v2.value1==v.value1
340+
v.value1=u.Measurement("50 m")
341+
assert v2.value1==u.Measurement("10 m")

test/python/test_units.py

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
# SPDX-License-Identifier: BSD-3-Clause
55

66
import units_llnl as u
7-
7+
import copy
88

99
def test_basic_unit():
1010
u1 = u.Unit("m")
@@ -246,3 +246,27 @@ def test_convert_string():
246246

247247
v2 = u1.to(unit_out="mm", value=20)
248248
assert v2 == 20000
249+
250+
def test_copy():
251+
u1=u.Unit("10 m")
252+
u2=copy.copy(u1)
253+
assert u1==u2
254+
255+
def test_deepcopy():
256+
u1=u.Unit("10 m")
257+
u2=copy.deepcopy(u1)
258+
assert u1==u2
259+
260+
def test_deepcopy_object():
261+
class val1:
262+
value1=u.Unit("10 m")
263+
value2=u.Unit("20 m")
264+
value3=u.Unit("30 m")
265+
values=[value1,value2,value3]
266+
267+
v=val1()
268+
v2=copy.deepcopy(v)
269+
assert v2.value1==v.value1
270+
v.value1=u.Unit("50 m")
271+
assert v2.value1==u.Unit("10 m")
272+

0 commit comments

Comments
 (0)