1quantity! {
4 quantity: Volume; "volume";
6 dimension: ISQ<
8 P3, Z0, Z0, Z0, Z0, Z0, Z0>; units {
16 @cubic_yottameter: prefix!(yotta) * prefix!(yotta) * prefix!(yotta);
17 "Ym³", "cubic yottameter", "cubic yottameters";
18 @cubic_zettameter: prefix!(zetta) * prefix!(zetta) * prefix!(zetta);
19 "Zm³", "cubic zettameter", "cubic zettameters";
20 @cubic_exameter: prefix!(exa) * prefix!(exa) * prefix!(exa);
21 "Em³", "cubic exameter", "cubic exameters";
22 @cubic_petameter: prefix!(peta) * prefix!(peta) * prefix!(peta);
23 "Pm³", "cubic petameter", "cubic petameters";
24 @cubic_terameter: prefix!(tera) * prefix!(tera) * prefix!(tera);
25 "Tm³", "cubic terameter", "cubic terameters";
26 @cubic_gigameter: prefix!(giga) * prefix!(giga) * prefix!(giga);
27 "Gm³", "cubic gigameter", "cubic gigameters";
28 @cubic_megameter: prefix!(mega) * prefix!(mega) * prefix!(mega);
29 "Mm³", "cubic megameter", "cubic megameters";
30 @cubic_kilometer: prefix!(kilo) * prefix!(kilo) * prefix!(kilo);
31 "km³", "cubic kilometer", "cubic kilometers";
32 @cubic_hectometer: prefix!(hecto) * prefix!(hecto) * prefix!(hecto);
33 "hm³", "cubic hectometer", "cubic hectometers";
34 @cubic_decameter: prefix!(deca) * prefix!(deca) * prefix!(deca);
35 "dam³", "cubic decameter", "cubic decameters";
36 @cubic_meter: prefix!(none); "m³", "cubic meter", "cubic meters";
37 @cubic_decimeter: prefix!(deci) * prefix!(deci) * prefix!(deci);
38 "dm³", "cubic decimeter", "cubic decimeters";
39 @cubic_centimeter: prefix!(centi) * prefix!(centi) * prefix!(centi);
40 "cm³", "cubic centimeter", "cubic centimeters";
41 @cubic_millimeter: prefix!(milli) * prefix!(milli) * prefix!(milli);
42 "mm³", "cubic millimeter", "cubic millimeters";
43 @cubic_micrometer: prefix!(micro) * prefix!(micro) * prefix!(micro);
44 "µm³", "cubic micrometer", "cubic micrometers";
45 @cubic_nanometer: prefix!(nano) * prefix!(nano) * prefix!(nano);
46 "nm³", "cubic nanometer", "cubic nanometers";
47 @cubic_picometer: prefix!(pico) * prefix!(pico) * prefix!(pico);
48 "pm³", "cubic picometer", "cubic picometers";
49 @cubic_femtometer: prefix!(femto) * prefix!(femto) * prefix!(femto);
50 "fm³", "cubic femtometer", "cubic femtometers";
51 @cubic_attometer: prefix!(atto) * prefix!(atto) * prefix!(atto);
52 "am³", "cubic attometer", "cubic attometers";
53 @cubic_zeptometer: prefix!(zepto) * prefix!(zepto) * prefix!(zepto);
54 "zm³", "cubic zeptometer", "cubic zeptometers";
55 @cubic_yoctometer: prefix!(yocto) * prefix!(yocto) * prefix!(yocto);
56 "ym³", "cubic yoctometer", "cubic yoctometers";
57
58 @acre_foot: 1.233_489_E3; "ac · ft", "acre-foot", "acre-feet";
59 @barrel: 1.589_873_E-1; "bbl", "barrel", "barrels";
60 @bushel: 3.523_907_E-2; "bu", "bushel", "bushels";
61 @cord: 3.624_556_E0; "cords", "cord", "cords";
62 @cubic_foot: 2.831_685_E-2; "ft³", "cubic foot", "cubic feet";
63 @cubic_inch: 1.638_706_E-5; "in³", "cubic inch", "cubic inches";
64 @cubic_mile: 4.168_182_E9; "mi³", "cubic mile", "cubic miles";
65 @cubic_yard: 7.645_549_E-1; "yd³", "cubic yard", "cubic yards";
66 @cup: 2.365_882_E-4; "cup", "cup", "cups";
67 @fluid_ounce: 2.957_353_E-5; "fl oz", "fluid ounce", "fluid ounces";
68 @fluid_ounce_imperial: 2.841_306_E-5; "fl oz (UK)", "Imperial fluid ounce", "Imperial fluid ounces";
69 @gallon_imperial: 4.546_09_E-3; "gal (UK)", "Imperial gallon", "Imperial gallons";
70 @gallon: 3.785_412_E-3; "gal", "gallon", "gallons";
71 @gill_imperial: 1.420_653_E-4; "gi (UK)", "Imperial gill", "Imperial gills";
72 @gill: 1.182_941_E-4; "gi", "gill", "gills";
73 @yottaliter: prefix!(milli) * prefix!(yotta); "YL", "yottaliter", "yottaliters";
74 @zettaliter: prefix!(milli) * prefix!(zetta); "ZL", "zettaliter", "zettaliters";
75 @exaliter: prefix!(milli) * prefix!(exa); "EL", "exaliter", "exaliters";
76 @petaliter: prefix!(milli) * prefix!(peta); "PL", "petaliter", "petaliters";
77 @teraliter: prefix!(milli) * prefix!(tera); "TL", "teraliter", "teraliters";
78 @gigaliter: prefix!(milli) * prefix!(giga); "GL", "gigaliter", "gigaliters";
79 @megaliter: prefix!(milli) * prefix!(mega); "ML", "megaliter", "megaliters";
80 @kiloliter: prefix!(milli) * prefix!(kilo); "kL", "kiloliter", "kiloliters";
81 @hectoliter: prefix!(milli) * prefix!(hecto); "hL", "hectoliter", "hectoliters";
82 @decaliter: prefix!(milli) * prefix!(deca); "daL", "decaliter", "decaliters";
83 @liter: prefix!(milli); "L", "liter", "liters";
84 @deciliter: prefix!(milli) * prefix!(deci); "dL", "deciliter", "deciliters";
85 @centiliter: prefix!(milli) * prefix!(centi); "cL", "centiliter", "centiliters";
86 @milliliter: prefix!(milli) * prefix!(milli); "mL", "milliliter", "milliliters";
87 @microliter: prefix!(milli) * prefix!(micro); "µL", "microliter", "microliters";
88 @nanoliter: prefix!(milli) * prefix!(nano); "nL", "nanoliter", "nanoliters";
89 @picoliter: prefix!(milli) * prefix!(pico); "pL", "picoliter", "picoliters";
90 @femtoliter: prefix!(milli) * prefix!(femto); "fL", "femtoliter", "femtoliters";
91 @attoliter: prefix!(milli) * prefix!(atto); "aL", "attoliter", "attoliters";
92 @zeptoliter: prefix!(milli) * prefix!(zepto); "zL", "zeptoliter", "zeptoliters";
93 @yoctoliter: prefix!(milli) * prefix!(yocto); "yL", "yoctoliter", "yoctoliters";
94 @peck: 8.809_768_E-3; "pk", "peck", "pecks";
95 @pint_dry: 5.506_105_E-4; "dry pt", "dry pint", "dry pints";
96 @pint_liquid: 4.731_765_E-4; "liq pt", "liquid pint", "liquid pints";
97 @quart_dry: 1.101_221_E-3; "dry qt", "dry quart", "dry quarts";
98 @quart_liquid: 9.463_529_E-4; "liq qt", "liquid quart", "liquid quarts";
99 @stere: 1.0_E0; "st", "stere", "steres";
100 @tablespoon: 1.478_676_E-5; "tbsp", "tablespoon", "tablespoons";
101 @teaspoon: 4.928_922_E-6; "tsp", "teaspoon", "teaspoons";
102 @register_ton: 2.831_685_E0; "RT", "register ton", "register tons";
103 }
104}
105
106#[cfg(test)]
107mod tests {
108 storage_types! {
109 use crate::lib::any::TypeId;
110 use crate::num::{FromPrimitive, One};
111 use crate::si::area as a;
112 use crate::si::length as l;
113 use crate::si::quantities::*;
114 use crate::si::volume as v;
115 use crate::tests::Test;
116
117 #[test]
118 fn check_dimension() {
119 let _: Volume<V> = Length::new::<l::meter>(V::one())
120 * Length::new::<l::meter>(V::one())
121 * Length::new::<l::meter>(V::one());
122 let _: Volume<V> = Length::new::<l::meter>(V::one())
123 * Area::new::<a::square_meter>(V::one());
124 }
125
126 #[test]
127 fn check_liters() {
128 test::<v::liter, v::cubic_meter>(V::from_f64(prefix!(milli)).unwrap());
130 test::<v::yottaliter, v::liter>(V::from_f64(prefix!(yotta)).unwrap());
133 test::<v::zettaliter, v::liter>(V::from_f64(prefix!(zetta)).unwrap());
134 test::<v::exaliter, v::liter>(V::from_f64(prefix!(exa)).unwrap());
135 test::<v::petaliter, v::liter>(V::from_f64(prefix!(peta)).unwrap());
136 test::<v::teraliter, v::liter>(V::from_f64(prefix!(tera)).unwrap());
137 test::<v::gigaliter, v::liter>(V::from_f64(prefix!(giga)).unwrap());
138 test::<v::megaliter, v::liter>(V::from_f64(prefix!(mega)).unwrap());
139 test::<v::kiloliter, v::liter>(V::from_f64(prefix!(kilo)).unwrap());
140 test::<v::hectoliter, v::liter>(V::from_f64(prefix!(hecto)).unwrap());
141 test::<v::decaliter, v::liter>(V::from_f64(prefix!(deca)).unwrap());
142 test::<v::liter, v::liter>(V::one());
143 test::<v::deciliter, v::liter>(V::from_f64(prefix!(deci)).unwrap());
144 test::<v::centiliter, v::liter>(V::from_f64(prefix!(centi)).unwrap());
145 test::<v::milliliter, v::liter>(V::from_f64(prefix!(milli)).unwrap());
146 test::<v::microliter, v::liter>(V::from_f64(prefix!(micro)).unwrap());
147 test::<v::nanoliter, v::liter>(V::from_f64(prefix!(nano)).unwrap());
148 test::<v::picoliter, v::liter>(V::from_f64(prefix!(pico)).unwrap());
149 test::<v::femtoliter, v::liter>(V::from_f64(prefix!(femto)).unwrap());
150 test::<v::attoliter, v::liter>(V::from_f64(prefix!(atto)).unwrap());
151 test::<v::zeptoliter, v::liter>(V::from_f64(prefix!(zepto)).unwrap());
152 test::<v::yoctoliter, v::liter>(V::from_f64(prefix!(yocto)).unwrap());
153
154 fn test<T: v::Conversion<V>, U: v::Conversion<V>>(ratio: V) {
155 Test::assert_eq(&Volume::new::<T>(V::one()), &Volume::new::<U>(ratio))
156 }
157 }
158
159 #[test]
160 #[cfg(not(target_arch = "arm"))]
162 fn check_units() {
163 if TypeId::of::<f64>() == TypeId::of::<V>() {
165 test::<l::yottameter, v::cubic_yottameter>();
166 test::<l::zettameter, v::cubic_zettameter>();
167 test::<l::exameter, v::cubic_exameter>();
168 test::<l::petameter, v::cubic_petameter>();
169 }
170
171 test::<l::terameter, v::cubic_terameter>();
172 test::<l::gigameter, v::cubic_gigameter>();
173 test::<l::megameter, v::cubic_megameter>();
174 test::<l::kilometer, v::cubic_kilometer>();
175 test::<l::hectometer, v::cubic_hectometer>();
176 test::<l::decameter, v::cubic_decameter>();
177 test::<l::meter, v::cubic_meter>();
178 test::<l::decimeter, v::cubic_decimeter>();
179 test::<l::centimeter, v::cubic_centimeter>();
180 test::<l::millimeter, v::cubic_millimeter>();
181 test::<l::micrometer, v::cubic_micrometer>();
182 test::<l::nanometer, v::cubic_nanometer>();
183 test::<l::picometer, v::cubic_picometer>();
184 test::<l::femtometer, v::cubic_femtometer>();
185
186 if TypeId::of::<f64>() == TypeId::of::<V>() {
188 test::<l::attometer, v::cubic_attometer>();
189 test::<l::zeptometer, v::cubic_zeptometer>();
190 test::<l::yoctometer, v::cubic_yoctometer>();
191 }
192
193 fn test<L: l::Conversion<V>, O: v::Conversion<V>>() {
194 Test::assert_eq(&Volume::new::<O>(V::one()),
195 &(Length::new::<L>(V::one())
196 * Length::new::<L>(V::one())
197 * Length::new::<L>(V::one())));
198 }
199 }
200 }
201}