ladata/unit/
build.rs

1// ladata::unit::build
2//
3//! All the types are built here
4//!
5//! Firstly some mockups of unimported types are defined in order for the
6//! `define_all_sizes` macro to work correctly under any feature combination.
7//!
8//! Secondly the crate types are built for the following sizes:
9//! - bytes: 1, 2, 4, 8, 16, 32, 64, 128
10//! - bits: 8, 16, 32, 64, 128, 256, 512, 1024
11//
12
13use super::macros::*;
14use super::{DataType, DataTypeCopy, DataUnit, DataUnitCopy};
15
16use crate::all::BitArray;
17
18#[cfg(feature = "unsafe_unit")]
19use super::DataRaw;
20
21// 1. Mockups for substituting unused dependencies
22// -----------------------------------------------------------------------------
23
24// "deps_continuous"
25
26#[cfg(not(feature = "half"))]
27mod half {
28    #![allow(dead_code)]
29    pub struct f16;
30    pub struct bf16;
31}
32#[cfg(not(feature = "twofloat"))]
33mod twofloat {
34    #![allow(dead_code)]
35    pub struct TwoFloat;
36}
37
38// "deps_discrete"
39
40#[cfg(not(feature = "num-rational"))]
41mod num_rational {
42    #![allow(dead_code)]
43    pub struct Ratio;
44}
45
46#[cfg(not(feature = "num-bigint"))]
47mod num_bigint {
48    #![allow(dead_code)]
49    pub struct BigInt;
50}
51#[cfg(not(feature = "rust_decimal"))]
52mod rust_decimal {
53    #![allow(dead_code)]
54    pub struct Decimal;
55}
56
57// "deps_string"
58
59#[cfg(not(feature = "arraystring"))]
60mod arraystring {
61    #![allow(dead_code)]
62    pub struct ArrayString<T> {
63        _t: T,
64    }
65}
66#[cfg(feature = "arraystring")]
67use arraystring::{typenum, ArrayString};
68
69// "deps_time"
70
71#[cfg(not(feature = "fugit"))]
72mod fugit {
73    #![allow(dead_code)]
74    pub struct Instant<T, const A: usize, B: Into<usize>> {
75        _t: T,
76        _b: B,
77    }
78    pub struct Duration<T, const A: usize, B: Into<usize>> {
79        _t: T,
80        _b: B,
81    }
82}
83#[cfg(not(feature = "time"))]
84mod time {
85    #![allow(dead_code)]
86    pub struct Date;
87    pub struct Time;
88    pub struct Instant;
89    pub struct UtcOffset;
90    pub struct OffsetDateTime;
91    pub struct PrimitiveDateTime;
92    pub struct Duration;
93}
94
95// 2. TYPES DEFINITIONS
96// -----------------------------------------------------------------------------
97
98// NOTE that right now several groups are empty. In some cases the macro can
99// error when adding new elements, because of unexpected commas in the matching
100// rules. The macro must be updated in the necessary places, by adding or
101// removing commas as needed. See for example the `NOTE:missing-commas` tags.
102define_all_sizes! {
103    // NOTE: order matters
104    DataType, DataUnit, DataRaw,
105
106    // -------------------------------------------------------- 1-B / 8-b
107    copy_variants_1B:
108    "8-bit unsigned integer ", U8, u8,
109    "8-bit signed integer", I8, i8,
110    "1-Byte array of bytes", ByteArray1, [u8; 1],
111    "Boolean value", Bool, bool,
112    "8-bit Array of bits", BitArray8, BitArray<(), 8, 1>,
113    copy_variants_1B_dep: ,
114    copy_variants_1B_psize:
115        "8-bit usize", Usize, usize, target_pointer_width = "8",
116        "8-bit isize", Isize, isize, target_pointer_width = "8",
117    copy_variants_1B_psize_dep: ,
118
119    noncopy_variants_1B: ,
120    noncopy_variants_1B_dep: ,
121    noncopy_variants_1B_psize: ,
122    noncopy_variants_1B_psize_dep: ,
123
124    // -------------------------------------------------------- 2-B / 16-b
125    copy_variants_2B:
126    "16-bit unsigned integer ", U16, u16,
127    "16-bit signed integer", I16, i16,
128    "2-Byte array of bytes", ByteArray2, [u8; 2],
129    "16-bit Array of bits", BitArray16, BitArray<(), 16, 2>,
130    copy_variants_2B_dep:
131    "16-bit [`half`](https://crates.io/crates/half)'s `binary16` floating-point number",
132        F16, half::f16, "half", "half",
133    "16-bit [`half`](https://crates.io/crates/half)'s `bfloat16` floating-point number",
134        BF16, half::bf16, "half", "half",
135    "2-Byte [`arraystring`](https://crates.io/crates/arraystring)'s ArrayString of len()=1",
136        ArrayString1, ArrayString<typenum::U1>, "arraystring", "arraystring",
137    copy_variants_2B_psize:
138        "16-bit usize", Usize, usize, target_pointer_width = "16",
139        "16-bit isize", Isize, isize, target_pointer_width = "16",
140    copy_variants_2B_psize_dep: ,
141
142    noncopy_variants_2B: ,
143    noncopy_variants_2B_dep: ,
144    noncopy_variants_2B_psize: ,
145    noncopy_variants_2B_psize_dep: ,
146
147    // -------------------------------------------------------- 4-B / 32-b
148    copy_variants_4B:
149    "32-bit unsigned integer ", U32, u32,
150    "32-bit signed integer", I32, i32,
151    "32-bit floating-point number", F32, f32,
152    "4-Byte array of bytes", ByteArray4, [u8; 4],
153    "32-bit Array of bits", BitArray32, BitArray<(), 32, 4>,
154    "4-Byte char ", Char, char,
155    copy_variants_4B_dep:
156    "4-Byte [`arraystring`](https://crates.io/crates/arraystring)'s ArrayString of len()=3",
157        ArrayString3, ArrayString<typenum::U3>, "arraystring", "arraystring",
158    "32-bit [`time`](https://crates.io/crates/time)'s `Date`",
159        TDate, time::Date, "time", "time",
160    "32-bit [`time`](https://crates.io/crates/time)'s `UtcOffset`",
161        TUtcOffset, time::UtcOffset, "time", "time",
162    "32-bit [`fugit`](https://crates.io/crates/fugit)'s `Duration` in hours",
163        FugitDuration32Hours, fugit::Duration<u32, 3_600, 1>, "fugit", "fugit",
164    "32-bit [`fugit`](https://crates.io/crates/fugit)'s `Duration` in minutes",
165        FugitDuration32Minutes, fugit::Duration<u32, 60, 1>, "fugit", "fugit",
166    "32-bit [`fugit`](https://crates.io/crates/fugit)'s `Duration` in seconds",
167        FugitDuration32Seconds, fugit::Duration<u32, 1, 1>, "fugit", "fugit",
168    "32-bit [`fugit`](https://crates.io/crates/fugit)'s `Duration` in milliseconds",
169        FugitDuration32Millis, fugit::Duration<u32, 1, 1_000>, "fugit", "fugit",
170    "32-bit [`fugit`](https://crates.io/crates/fugit)'s `Duration` in nanoseconds",
171        FugitDuration32Nanos, fugit::Duration<u32, 1, 1_000_000>, "fugit", "fugit",
172    "32-bit [`fugit`](https://crates.io/crates/fugit)'s `Instant` in hours",
173        FugitInstant32Hours, fugit::Instant<u32, 3_600, 1>, "fugit", "fugit",
174    "32-bit [`fugit`](https://crates.io/crates/fugit)'s `Instant` in minutes",
175        FugitInstant32Minutes, fugit::Instant<u32, 60, 1>, "fugit", "fugit",
176    "32-bit [`fugit`](https://crates.io/crates/fugit)'s `Instant` in seconds",
177        FugitInstant32Seconds, fugit::Instant<u32, 1, 1>, "fugit", "fugit",
178    "32-bit [`fugit`](https://crates.io/crates/fugit)'s `Instant` in milliseconds",
179        FugitInstant32Millis, fugit::Instant<u32, 1, 1_000>, "fugit", "fugit",
180    "32-bit [`fugit`](https://crates.io/crates/fugit)'s `Instant` in nanoseconds",
181        FugitInstant32Nanos, fugit::Instant<u32, 1, 1_000_000>, "fugit", "fugit",
182    copy_variants_4B_psize:
183        "32-bit usize", Usize, usize, target_pointer_width = "32",
184        "32-bit isize", Isize, isize, target_pointer_width = "32",
185    copy_variants_4B_psize_dep: ,
186
187    noncopy_variants_4B: ,
188    noncopy_variants_4B_dep: ,
189    noncopy_variants_4B_psize: ,
190    noncopy_variants_4B_psize_dep: ,
191
192    // ------------------------------------------------------------------------- 8-B / 64-b
193    copy_variants_8B:
194    "64-bit unsigned integer ", U64, u64,
195    "64-bit signed integer", I64, i64,
196    "64-bit floating-point number", F64, f64,
197    "8-Byte array of bytes", ByteArray8, [u8; 8],
198    "64-bit Array of bits", BitArray64, BitArray<(), 64, 8>,
199    copy_variants_8B_dep:
200    "32-bit [`num_rational`](https://crates.io/crates/num_rational)'s `Ratio` rational number",
201        R32, num_rational::Ratio<i32>, "num-rational", "num-rational",
202    "8-Byte [`arraystring`](https://crates.io/crates/arraystring)'s ArrayString of len()=7",
203        ArrayString7, ArrayString<typenum::U7>, "arraystring", "arraystring",
204    "64-bit [`time`](https://crates.io/crates/time)'s `Time`",
205        TTime, time::Time, "time", "time",
206    "64-bit [`fugit`](https://crates.io/crates/fugit)'s `Duration` in hours",
207        FugitDuration64Hours, fugit::Duration<u64, 3_600, 1>, "fugit", "fugit",
208    "64-bit [`fugit`](https://crates.io/crates/fugit)'s `Duration` in minutes",
209        FugitDuration64Minutes, fugit::Duration<u64, 60, 1>, "fugit", "fugit",
210    "64-bit [`fugit`](https://crates.io/crates/fugit)'s `Duration` in seconds",
211        FugitDuration64Seconds, fugit::Duration<u64, 1, 1>, "fugit", "fugit",
212    "64-bit [`fugit`](https://crates.io/crates/fugit)'s `Duration` in milliseconds",
213        FugitDuration64Millis, fugit::Duration<u64, 1, 1_000>, "fugit", "fugit",
214    "64-bit [`fugit`](https://crates.io/crates/fugit)'s `Duration` in nanoseconds",
215        FugitDuration64Nanos, fugit::Duration<u64, 1, 1_000_000>, "fugit", "fugit",
216    "64-bit [`fugit`](https://crates.io/crates/fugit)'s `Instant` in hours",
217        FugitInstant64Hours, fugit::Instant<u64, 3_600, 1>, "fugit", "fugit",
218    "64-bit [`fugit`](https://crates.io/crates/fugit)'s `Instant` in minutes",
219        FugitInstant64Minutes, fugit::Instant<u64, 60, 1>, "fugit", "fugit",
220    "64-bit [`fugit`](https://crates.io/crates/fugit)'s `Instant` in seconds",
221        FugitInstant64Seconds, fugit::Instant<u64, 1, 1>, "fugit", "fugit",
222    "64-bit [`fugit`](https://crates.io/crates/fugit)'s `Instant` in milliseconds",
223        FugitInstant64Millis, fugit::Instant<u64, 1, 1_000>, "fugit", "fugit",
224    "64-bit [`fugit`](https://crates.io/crates/fugit)'s `Instant` in nanoseconds",
225        FugitInstant64Nanos, fugit::Instant<u64, 1, 1_000_000>, "fugit", "fugit",
226    copy_variants_8B_psize:
227        "64-bit usize", Usize, usize, target_pointer_width = "64",
228        "64-bit isize", Isize, isize, target_pointer_width = "64",
229    copy_variants_8B_psize_dep: ,
230
231    noncopy_variants_8B: ,
232    noncopy_variants_8B_dep: ,
233    noncopy_variants_8B_psize: ,
234    noncopy_variants_8B_psize_dep:
235        "6-Byte fat-pointer String", String, std::string::String,
236            target_pointer_width = "16", "std", "std",
237
238    // ------------------------------------------------------------------------- 16-B /128-b
239    copy_variants_16B:
240    "128-bit unsigned integer ", U128, u128,
241    "128-bit signed integer", I128, i128,
242    "16-Byte array of bytes", ByteArray16, [u8; 16],
243    "128-bit Array of bits", BitArray128, BitArray<(), 128, 16>,
244    "128-bit Duration", Duration, core::time::Duration,
245    copy_variants_16B_dep:
246    "64-bit [`num_rational`](https://crates.io/crates/num_rational)'s `Ratio` rational number",
247        R64, num_rational::Ratio<i64>, "num-rational", "num-rational",
248    "16-Byte [rust_decimal] Decimal number",
249        Decimal, rust_decimal::Decimal, "rust_decimal", "rust_decimal",
250    "16-Byte [`arraystring`](https://crates.io/crates/arraystring)'s ArrayString of len()=15",
251        ArrayString15, ArrayString<typenum::U15>, "arraystring", "arraystring",
252    "128-bit [`time`](https://crates.io/crates/time)'s `Duration`",
253        TDuration, time::Duration, "time", "time",
254    "128-bit [`time`](https://crates.io/crates/time)'s `PrimitiveDateTime`",
255        TDateTime, time::PrimitiveDateTime, "time", "time",
256    "128-bit [`time`](https://crates.io/crates/time)'s `OffsetDateTime`",
257        TOffsetDateTime, time::OffsetDateTime, "time", "time",
258    "128-bit floating point number",
259        F128, twofloat::TwoFloat, "std", "twofloat",
260    "128-bit Instant",
261        Instant, std::time::Instant, "std", "std",
262    "128-bit SystemTime",
263        SystemTime, std::time::SystemTime, "std", "std",
264    "128-bit [`time`](https://crates.io/crates/time)'s Instant`",
265        TInstant, time::Instant, "std", "time",
266    copy_variants_16B_psize:
267        "128-bit usize", Usize, usize, target_pointer_width = "128",
268        "128-bit isize", Isize, isize, target_pointer_width = "128",
269    copy_variants_16B_psize_dep: ,
270
271    noncopy_variants_16B: ,
272    noncopy_variants_16B_dep: ,
273    noncopy_variants_16B_psize: ,
274    noncopy_variants_16B_psize_dep:
275        "12-Byte fat-pointer String", String, std::string::String,
276            target_pointer_width = "32", "std", "std",
277
278    // ------------------------------------------------------------------------- 32-B / 256-b
279    copy_variants_32B:
280    "32-Byte array of bytes", ByteArray32, [u8; 32],
281    "256-bit Array of bits", BitArray256, BitArray<(), 256, 32>,
282    copy_variants_32B_dep:
283    "128-bit rational number", R128, num_rational::Ratio<i128>, "num-rational", "num-rational",
284    "32-Byte [`arraystring`](https://crates.io/crates/arraystring)'s ArrayString of len()=31",
285        ArrayString31, ArrayString<typenum::U31>, "arraystring", "arraystring",
286    copy_variants_32B_psize: ,
287    copy_variants_32B_psize_dep: ,
288
289    noncopy_variants_32B: ,
290    noncopy_variants_32B_dep:
291    "Big Integer", BigInt, num_bigint::BigInt, "num-bigint", "num-bigint",
292    noncopy_variants_32B_psize: ,
293    noncopy_variants_32B_psize_dep:
294        "24-Byte fat-pointer String", String, std::string::String,
295            target_pointer_width = "64", "std", "std",
296
297    // ------------------------------------------------------------------------- 64 B / 512-b
298    copy_variants_64B:
299    "64-Byte array of bytes", ByteArray64, [u8; 64],
300    "512-bit Array of bits", BitArray512, BitArray<(), 512, 64>,
301    copy_variants_64B_dep:
302    "64-Byte [`arraystring`](https://crates.io/crates/arraystring)'s ArrayString of len()=63",
303        ArrayString63, ArrayString<typenum::U63>, "arraystring", "arraystring",
304    copy_variants_64B_psize: ,
305    copy_variants_64B_psize_dep: ,
306
307    noncopy_variants_64B: ,
308    noncopy_variants_64B_dep: ,
309    noncopy_variants_64B_psize: ,
310    noncopy_variants_64B_psize_dep:
311        "48-Byte fat-pointer String", String, std::string::String,
312            target_pointer_width = "128", "std", "std",
313
314    // ------------------------------------------------------------------------- 128-B / 1024-b
315    copy_variants_128B:
316    "128-Byte array of bytes", ByteArray128, [u8; 128],
317    "1024-bit Array of bits", BitArray1024, BitArray<(), 1024, 128>,
318    copy_variants_128B_dep:
319    "128-Byte [`arraystring`](https://crates.io/crates/arraystring)'s ArrayString of len()=127",
320        ArrayString127, ArrayString<typenum::U127>, "arraystring", "arraystring",
321    copy_variants_128B_psize: ,
322    copy_variants_128B_psize_dep: ,
323
324    noncopy_variants_128B: ,
325    noncopy_variants_128B_dep: ,
326    noncopy_variants_128B_psize: ,
327    noncopy_variants_128B_psize_dep: ,
328}