einsum_codegen/
namespace.rs1use proc_macro2::TokenStream;
2use quote::{format_ident, ToTokens, TokenStreamExt};
3use std::fmt;
4
5#[derive(Debug, PartialEq, Eq, Clone)]
14pub struct Namespace {
15 last: usize,
16}
17
18impl Namespace {
19 pub fn init() -> Self {
21 Namespace { last: 0 }
22 }
23
24 pub fn new_ident(&mut self) -> Position {
26 let pos = Position::Out(self.last);
27 self.last += 1;
28 pos
29 }
30}
31
32#[derive(PartialEq, Eq, PartialOrd, Ord, Hash, Clone, Copy)]
34pub enum Position {
35 Arg(usize),
37 Out(usize),
39}
40
41impl fmt::Debug for Position {
42 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
43 match self {
44 Position::Arg(n) => write!(f, "arg{}", n),
45 Position::Out(n) => write!(f, "out{}", n),
46 }
47 }
48}
49
50impl fmt::Display for Position {
51 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
52 fmt::Debug::fmt(self, f)
53 }
54}
55
56impl ToTokens for Position {
57 fn to_tokens(&self, tokens: &mut TokenStream) {
58 match self {
59 Position::Arg(n) => tokens.append(format_ident!("arg{}", n)),
60 Position::Out(n) => tokens.append(format_ident!("out{}", n)),
61 }
62 }
63}