mirror of
https://github.com/rtic-rs/rtic.git
synced 2025-12-18 22:05:37 +01:00
const generics
This commit is contained in:
parent
c67657371b
commit
e4319de3d5
11 changed files with 50 additions and 94 deletions
|
|
@ -42,15 +42,13 @@ pub fn codegen(app: &App, analysis: &Analysis, _extra: &Extra) -> Vec<TokenStrea
|
|||
}
|
||||
));
|
||||
|
||||
let n = util::capacity_typenum(channel.capacity, true);
|
||||
let n = util::capacity_literal(channel.capacity as usize + 1);
|
||||
let rq = util::rq_ident(level);
|
||||
let rq = util::mark_internal_ident(&rq);
|
||||
let (rq_ty, rq_expr) = {
|
||||
(
|
||||
quote!(rtic::export::SCRQ<#t, #n>),
|
||||
quote!(rtic::export::Queue(unsafe {
|
||||
rtic::export::iQueue::u8_sc()
|
||||
})),
|
||||
quote!(rtic::export::Queue::new()),
|
||||
)
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -32,8 +32,8 @@ pub fn codegen(
|
|||
let (_, _, _, input_ty) = util::regroup_inputs(inputs);
|
||||
|
||||
let cap = task.args.capacity;
|
||||
let cap_lit = util::capacity_literal(cap);
|
||||
let cap_ty = util::capacity_typenum(cap, true);
|
||||
let cap_lit = util::capacity_literal(cap as usize);
|
||||
let cap_lit_p1 = util::capacity_literal(cap as usize + 1);
|
||||
|
||||
// Create free queues and inputs / instants buffers
|
||||
let fq = util::fq_ident(name);
|
||||
|
|
@ -41,10 +41,8 @@ pub fn codegen(
|
|||
|
||||
let (fq_ty, fq_expr, mk_uninit): (_, _, Box<dyn Fn() -> Option<_>>) = {
|
||||
(
|
||||
quote!(rtic::export::SCFQ<#cap_ty>),
|
||||
quote!(rtic::export::Queue(unsafe {
|
||||
rtic::export::iQueue::u8_sc()
|
||||
})),
|
||||
quote!(rtic::export::SCFQ<#cap_lit_p1>),
|
||||
quote!(rtic::export::Queue::new()),
|
||||
Box::new(|| util::link_section_uninit()),
|
||||
)
|
||||
};
|
||||
|
|
|
|||
|
|
@ -62,12 +62,12 @@ pub fn codegen(app: &App, analysis: &Analysis, _extra: &Extra) -> Vec<TokenStrea
|
|||
{
|
||||
// For future use
|
||||
// let doc = &format!("Timer queue for {}", monotonic_name);
|
||||
let cap = app
|
||||
let cap: u8 = app
|
||||
.software_tasks
|
||||
.iter()
|
||||
.map(|(_name, task)| task.args.capacity)
|
||||
.sum();
|
||||
let n = util::capacity_typenum(cap, false);
|
||||
let n = util::capacity_literal(cap as usize);
|
||||
let tq_ty =
|
||||
quote!(core::mem::MaybeUninit<rtic::export::TimerQueue<#mono_type, #t, #n>>);
|
||||
|
||||
|
|
|
|||
|
|
@ -8,23 +8,10 @@ use syn::{Attribute, Ident, LitInt, PatType};
|
|||
use crate::check::Extra;
|
||||
|
||||
/// Turns `capacity` into an unsuffixed integer literal
|
||||
pub fn capacity_literal(capacity: u8) -> LitInt {
|
||||
pub fn capacity_literal(capacity: usize) -> LitInt {
|
||||
LitInt::new(&capacity.to_string(), Span::call_site())
|
||||
}
|
||||
|
||||
/// Turns `capacity` into a type-level (`typenum`) integer
|
||||
pub fn capacity_typenum(capacity: u8, round_up_to_power_of_two: bool) -> TokenStream2 {
|
||||
let capacity = if round_up_to_power_of_two {
|
||||
capacity.checked_next_power_of_two().expect("UNREACHABLE")
|
||||
} else {
|
||||
capacity
|
||||
};
|
||||
|
||||
let ident = Ident::new(&format!("U{}", capacity), Span::call_site());
|
||||
|
||||
quote!(rtic::export::consts::#ident)
|
||||
}
|
||||
|
||||
/// Identifier for the free queue
|
||||
pub fn fq_ident(task: &Ident) -> Ident {
|
||||
Ident::new(&format!("{}_FQ", task.to_string()), Span::call_site())
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue