cargo_futhark/
target.rs

1use enumflags2::bitflags;
2
3use std::fmt::Display;
4
5/// Futhark targets.
6#[bitflags]
7#[repr(u8)]
8#[derive(Debug, Clone, Copy, PartialEq, Eq)]
9pub enum Target {
10    /// Futhark `c` target.
11    ///
12    /// # Requirements
13    /// None
14    C,
15
16    /// Futhark `multicore` target.
17    ///
18    /// # Requirements
19    /// None
20    MultiCore,
21
22    /// Futhark `opencl` target.
23    ///
24    /// # Requirements
25    /// - OpenCL headers
26    /// - OpenCL loader
27    OpenCL,
28
29    /// Futhark `cuda` target.
30    ///
31    /// # Requirements
32    /// - Nvidia CUDA SDK
33    Cuda,
34
35    /// Futhark `ispc` target.
36    ///
37    /// # Requirements
38    /// - Intel ISPC SDK
39    ISPC,
40}
41
42impl Display for Target {
43    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
44        write!(f, "{}", self.name())
45    }
46}
47
48impl Target {
49    pub(crate) fn struct_name(&self) -> &'static str {
50        match self {
51            Target::C => "C",
52            Target::MultiCore => "MultiCore",
53            Target::OpenCL => "OpenCL",
54            Target::Cuda => "Cuda",
55            Target::ISPC => "Ispc",
56        }
57    }
58
59    pub(crate) fn name(&self) -> &'static str {
60        match self {
61            Target::C => "c",
62            Target::MultiCore => "multicore",
63            Target::OpenCL => "opencl",
64            Target::Cuda => "cuda",
65            Target::ISPC => "ispc",
66        }
67    }
68}