57 lines
1.8 KiB
Haskell
57 lines
1.8 KiB
Haskell
module Base(
|
|
base
|
|
)
|
|
where
|
|
|
|
import Control.Monad(forM_)
|
|
import File
|
|
import Gen
|
|
|
|
base :: File
|
|
base = File {
|
|
predicate = \ _ _ -> True,
|
|
outputName = "base",
|
|
generator = declareBaseStructure,
|
|
testGenerator = Nothing
|
|
}
|
|
|
|
declareBaseStructure :: Word -> Gen ()
|
|
declareBaseStructure bitsize =
|
|
do let name = "U" ++ show bitsize
|
|
entries = bitsize `div` 64
|
|
top = entries - 1
|
|
out "use core::fmt;"
|
|
out "use quickcheck::{Arbitrary,Gen};"
|
|
blank
|
|
out "#[derive(Clone)]"
|
|
wrapIndent ("pub struct " ++ name) $
|
|
out ("pub(crate) value: [u64; " ++ show entries ++ "]")
|
|
blank
|
|
implFor "fmt::Debug" name $
|
|
wrapIndent "fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result" $
|
|
do out ("f.debug_tuple(" ++ show name ++ ")")
|
|
forM_ [0..top] $ \ i ->
|
|
out (" .field(&self.value[" ++ show i ++ "])")
|
|
out " .finish()"
|
|
blank
|
|
implFor "fmt::UpperHex" name $
|
|
wrapIndent "fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result" $
|
|
do forM_ (reverse [1..top]) $ \ i ->
|
|
out ("write!(f, \"{:X}\", self.value[" ++ show i ++ "])?;")
|
|
out "write!(f, \"{:X}\", self.value[0])"
|
|
blank
|
|
implFor "fmt::LowerHex" name $
|
|
wrapIndent "fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result" $
|
|
do forM_ (reverse [1..top]) $ \ i ->
|
|
out ("write!(f, \"{:x}\", self.value[" ++ show i ++ "])?;")
|
|
out "write!(f, \"{:x}\", self.value[0])"
|
|
blank
|
|
implFor "Arbitrary" name $
|
|
wrapIndent "fn arbitrary<G: Gen>(g: &mut G) -> Self" $
|
|
do out (name ++ " {")
|
|
indent $
|
|
do out ("value: [")
|
|
indent $ forM_ [0..top] $ \ _ ->
|
|
out ("g.next_u64(),")
|
|
out ("]")
|
|
out ("}") |