diff options
Diffstat (limited to 'devices/src/virtio/video/macros.rs')
-rw-r--r-- | devices/src/virtio/video/macros.rs | 46 |
1 files changed, 46 insertions, 0 deletions
diff --git a/devices/src/virtio/video/macros.rs b/devices/src/virtio/video/macros.rs new file mode 100644 index 0000000..d1ed386 --- /dev/null +++ b/devices/src/virtio/video/macros.rs @@ -0,0 +1,46 @@ +// Copyright 2020 The Chromium OS Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +//! Macros that helps virtio video implementation. + +/// Implements TryFrom<data_model::Le32> for an enum that implements `enumn::N`. +#[macro_export] +macro_rules! impl_try_from_le32_for_enumn { + ($ty:ty, $name:literal) => { + impl TryFrom<Le32> for $ty { + type Error = ReadCmdError; + + fn try_from(x: Le32) -> Result<Self, Self::Error> { + let v: u32 = x.into(); + Self::n(v).ok_or_else(|| { + error!(concat!("invalid ", $name, ": {}"), v); + ReadCmdError::InvalidArgument + }) + } + } + }; +} + +/// Implements `From` between two structs whose each field implements `From` each other. +#[macro_export] +macro_rules! impl_from_for_interconvertible_structs { + ($t1:ident, $t2:ident, $($v:ident),+) => { + impl_from_for_interconvertible_structs_core!($t1, $t2, $( $v ),+ ); + impl_from_for_interconvertible_structs_core!($t2, $t1, $( $v ),+ ); + }; +} + +macro_rules! impl_from_for_interconvertible_structs_core { + ($t1:ident, $t2:ident, $($v:ident),+) => { + impl From<$t1> for $t2 { + #[allow(clippy::needless_update)] + fn from(x :$t1) -> Self { + $t2 { + $( $v: x.$v.into(), )+ + ..Default::default() // for paddings + } + } + } + }; +} |