use std::convert::Infallible;
use proc_macro::TokenStream;
use crate::TokenQueue;
pub trait IntoTokens: Sized {
fn queue_size_hint(&self) -> (usize, Option<usize>) {
(0, None)
}
fn extend_tokens(self, q: &mut TokenQueue);
#[inline]
fn into_tokens(self) -> TokenQueue {
let mut q = TokenQueue::with_capacity(self.queue_size_hint().0);
self.extend_tokens(&mut q);
q
}
}
impl IntoTokens for () {
fn extend_tokens(self, _: &mut TokenQueue) {}
fn queue_size_hint(&self) -> (usize, Option<usize>) {
(0, Some(0))
}
}
impl IntoTokens for Infallible {
fn extend_tokens(self, _: &mut TokenQueue) {
match self {}
}
}
impl<T: IntoTokens> IntoTokens for Option<T> {
fn extend_tokens(self, q: &mut TokenQueue) {
if let Some(this) = self {
this.extend_tokens(q);
}
}
fn into_tokens(self) -> TokenQueue {
if let Some(this) = self {
this.into_tokens()
} else {
TokenQueue::new()
}
}
fn queue_size_hint(&self) -> (usize, Option<usize>) {
self.as_ref().map_or((0, None), T::queue_size_hint)
}
}
pub trait RefToTokens: IntoTokens + Clone {}
impl<T: RefToTokens> IntoTokens for &T {
fn extend_tokens(self, q: &mut TokenQueue) {
self.clone().extend_tokens(q)
}
fn queue_size_hint(&self) -> (usize, Option<usize>) {
(*self).queue_size_hint()
}
fn into_tokens(self) -> TokenQueue {
self.clone().into_tokens()
}
}
impl<T: RefToTokens> RefToTokens for &T {}
impl RefToTokens for TokenStream {}