1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
pub mod constant;
pub use self::constant::Constant;

pub mod garbage;
pub use self::garbage::Garbage;

pub mod unknown;
pub use self::unknown::Unknown;

pub mod padding;
pub use self::padding::Padding;

pub mod named;
pub use self::named::Named;

/// Field types.
#[derive(Clone, PartialEq, Debug)]
pub enum Field {
	Constant(Constant),
	Garbage(Garbage),
	Unknown(Unknown),
	Padding(Padding),
	Named(Named),
}

impl Field {
	/// Get how many bits the field is.
	pub fn bits(&self) -> usize {
		match self {
			&Field::Constant(ref v) => v.bits(),
			&Field::Garbage(ref v)  => v.bits(),
			&Field::Unknown(ref v)  => v.bits(),
			&Field::Padding(ref v)  => v.bits(),
			&Field::Named(ref v)    => v.bits(),
		}
	}

	/// Create a `Constant` field.
	pub fn constant() -> constant::Builder {
		constant::Builder::default()
	}

	/// Create a `Named` field.
	pub fn named<T: Into<String>>(name: T) -> named::Builder {
		named::Builder::default().name(name)
	}

	/// Create a `Padding` field.
	pub fn padding() -> padding::Builder {
		padding::Builder::default()
	}

	/// Create a `Garbage` field.
	pub fn garbage() -> garbage::Builder {
		garbage::Builder::default()
	}

	/// Create an `Unknown` field.
	pub fn unknown() -> unknown::Builder {
		unknown::Builder::default()
	}
}

#[doc(hidden)]
pub fn bytes(bits: usize) -> usize {
	(bits as f32 / 8.0).ceil() as usize
}