pub use alloc::Allocator; use super::command::Command; use super::util::floatX; use super::v8; use super::s16; use super::PDF; use super::interface::StaticCommand; use super::histogram::{ HistogramLiteral, HistogramCommand, HistogramDistance, ContextType, }; use super::cluster::HistogramPair; use super::entropy_encode::HuffmanTree; use super::hash_to_binary_tree::ZopfliNode; #[cfg(feature="std")] use alloc_stdlib::StandardAlloc; /* struct CombiningAllocator, AllocT2:Allocator>(AllocT1, AllocT2); impl , AllocT2:Allocator> CombiningAllocator { pub fn new(a: AllocT1, b: AllocT2) -> Self { CombiningAllocator(a, b) } } impl , AllocT2:Allocator> Allocator for CombiningAllocator { } impl , AllocT2:Allocator> Allocator for CombiningAllocator { } */ pub trait BrotliAlloc:Allocator + Allocator + Allocator + Allocator + Allocator + Allocator + Allocator + Allocator + Allocator + Allocator + Allocator + Allocator + Allocator + Allocator + Allocator + Allocator + Allocator + Allocator{ } #[cfg(feature="std")] impl BrotliAlloc for StandardAlloc{} pub struct CombiningAllocator, AllocU16:Allocator, AllocI32:Allocator, AllocU32:Allocator, AllocU64:Allocator, AllocCommand:Allocator, AllocFloatX:Allocator, AllocV8:Allocator, AllocS16:Allocator, AllocPDF:Allocator, AllocStaticCommand:Allocator, AllocHistogramLiteral:Allocator, AllocHistogramCommand:Allocator, AllocHistogramDistance:Allocator, AllocHistogramPair:Allocator, AllocContextType:Allocator, AllocHuffmanTree:Allocator, AllocZopfliNode:Allocator, >{ alloc_u8: AllocU8, alloc_u16: AllocU16, alloc_i32: AllocI32, alloc_u32: AllocU32, alloc_u64: AllocU64, alloc_c: AllocCommand, alloc_f: AllocFloatX, alloc_f32x8: AllocV8, alloc_i16x16: AllocS16, alloc_pdf: AllocPDF, alloc_sc: AllocStaticCommand, alloc_hl: AllocHistogramLiteral, alloc_hc: AllocHistogramCommand, alloc_hd: AllocHistogramDistance, alloc_hp: AllocHistogramPair, alloc_ct: AllocContextType, alloc_ht: AllocHuffmanTree, alloc_zn: AllocZopfliNode, } impl, AllocU16:Allocator, AllocI32:Allocator, AllocU32:Allocator, AllocU64:Allocator, AllocCommand:Allocator, AllocFloatX:Allocator, AllocV8:Allocator, AllocS16:Allocator, AllocPDF:Allocator, AllocStaticCommand:Allocator, AllocHistogramLiteral:Allocator, AllocHistogramCommand:Allocator, AllocHistogramDistance:Allocator, AllocHistogramPair:Allocator, AllocContextType:Allocator, AllocHuffmanTree:Allocator, AllocZopfliNode:Allocator, > CombiningAllocator { pub fn new(alloc_u8: AllocU8, alloc_u16: AllocU16, alloc_i32: AllocI32, alloc_u32: AllocU32, alloc_u64: AllocU64, alloc_c: AllocCommand, alloc_f: AllocFloatX, alloc_f32x8: AllocV8, alloc_i16x16: AllocS16, alloc_pdf: AllocPDF, alloc_sc: AllocStaticCommand, alloc_hl: AllocHistogramLiteral, alloc_hc: AllocHistogramCommand, alloc_hd: AllocHistogramDistance, alloc_hp: AllocHistogramPair, alloc_ct: AllocContextType, alloc_ht: AllocHuffmanTree, alloc_zn: AllocZopfliNode) -> Self { CombiningAllocator{ alloc_u8: alloc_u8, alloc_u16: alloc_u16, alloc_i32: alloc_i32, alloc_u32: alloc_u32, alloc_u64: alloc_u64, alloc_c: alloc_c, alloc_f: alloc_f, alloc_f32x8: alloc_f32x8, alloc_i16x16: alloc_i16x16, alloc_pdf: alloc_pdf, alloc_sc: alloc_sc, alloc_hl: alloc_hl, alloc_hc: alloc_hc, alloc_hd: alloc_hd, alloc_hp: alloc_hp, alloc_ct: alloc_ct, alloc_ht: alloc_ht, alloc_zn: alloc_zn, } } } impl, AllocU16:Allocator, AllocI32:Allocator, AllocU32:Allocator, AllocU64:Allocator, AllocCommand:Allocator, AllocFloatX:Allocator, AllocV8:Allocator, AllocS16:Allocator, AllocPDF:Allocator, AllocStaticCommand:Allocator, AllocHistogramLiteral:Allocator, AllocHistogramCommand:Allocator, AllocHistogramDistance:Allocator, AllocHistogramPair:Allocator, AllocContextType:Allocator, AllocHuffmanTree:Allocator, AllocZopfliNode:Allocator, > BrotliAlloc for CombiningAllocator { } impl+Default, AllocU16:Allocator+Default, AllocI32:Allocator+Default, AllocU32:Allocator+Default, AllocU64:Allocator+Default, AllocCommand:Allocator+Default, AllocFloatX:Allocator+Default, AllocV8:Allocator+Default, AllocS16:Allocator+Default, AllocPDF:Allocator+Default, AllocStaticCommand:Allocator+Default, AllocHistogramLiteral:Allocator+Default, AllocHistogramCommand:Allocator+Default, AllocHistogramDistance:Allocator+Default, AllocHistogramPair:Allocator+Default, AllocContextType:Allocator+Default, AllocHuffmanTree:Allocator+Default, AllocZopfliNode:Allocator+Default, > Default for CombiningAllocator { fn default() -> Self { CombiningAllocator{ alloc_u8: AllocU8::default(), alloc_u16: AllocU16::default(), alloc_i32: AllocI32::default(), alloc_u32: AllocU32::default(), alloc_u64: AllocU64::default(), alloc_c: AllocCommand::default(), alloc_f: AllocFloatX::default(), alloc_f32x8:AllocV8::default(), alloc_i16x16:AllocS16::default(), alloc_pdf: AllocPDF::default(), alloc_sc: AllocStaticCommand::default(), alloc_hl: AllocHistogramLiteral::default(), alloc_hc: AllocHistogramCommand::default(), alloc_hd: AllocHistogramDistance::default(), alloc_hp: AllocHistogramPair::default(), alloc_ct: AllocContextType::default(), alloc_ht: AllocHuffmanTree::default(), alloc_zn: AllocZopfliNode::default(), } } } impl+Clone, AllocU16:Allocator+Clone, AllocI32:Allocator+Clone, AllocU32:Allocator+Clone, AllocU64:Allocator+Clone, AllocCommand:Allocator+Clone, AllocFloatX:Allocator+Clone, AllocV8:Allocator+Clone, AllocS16:Allocator+Clone, AllocPDF:Allocator+Clone, AllocStaticCommand:Allocator+Clone, AllocHistogramLiteral:Allocator+Clone, AllocHistogramCommand:Allocator+Clone, AllocHistogramDistance:Allocator+Clone, AllocHistogramPair:Allocator+Clone, AllocContextType:Allocator+Clone, AllocHuffmanTree:Allocator+Clone, AllocZopfliNode:Allocator+Clone, > Clone for CombiningAllocator { fn clone(&self) -> Self { CombiningAllocator{ alloc_u8: self.alloc_u8.clone(), alloc_u16: self.alloc_u16.clone(), alloc_i32: self.alloc_i32.clone(), alloc_u32: self.alloc_u32.clone(), alloc_u64: self.alloc_u64.clone(), alloc_c: self.alloc_c.clone(), alloc_f: self.alloc_f.clone(), alloc_f32x8:self.alloc_f32x8.clone(), alloc_i16x16:self.alloc_i16x16.clone(), alloc_pdf: self.alloc_pdf.clone(), alloc_sc: self.alloc_sc.clone(), alloc_hl: self.alloc_hl.clone(), alloc_hc: self.alloc_hc.clone(), alloc_hd: self.alloc_hd.clone(), alloc_hp: self.alloc_hp.clone(), alloc_ct: self.alloc_ct.clone(), alloc_ht: self.alloc_ht.clone(), alloc_zn: self.alloc_zn.clone(), } } } impl+Copy, AllocU16:Allocator+Copy, AllocI32:Allocator+Copy, AllocU32:Allocator+Copy, AllocU64:Allocator+Copy, AllocCommand:Allocator+Copy, AllocFloatX:Allocator+Copy, AllocV8:Allocator+Copy, AllocS16:Allocator+Copy, AllocPDF:Allocator+Copy, AllocStaticCommand:Allocator+Copy, AllocHistogramLiteral:Allocator+Copy, AllocHistogramCommand:Allocator+Copy, AllocHistogramDistance:Allocator+Copy, AllocHistogramPair:Allocator+Copy, AllocContextType:Allocator+Copy, AllocHuffmanTree:Allocator+Copy, AllocZopfliNode:Allocator+Copy, > Copy for CombiningAllocator { } macro_rules! implement_allocator { ($bound_name: ty, $type_name: ty, $sub_type_name: ty, $local_name: ident) => { impl, AllocU16:Allocator, AllocI32:Allocator, AllocU32:Allocator, AllocU64:Allocator, AllocCommand:Allocator, AllocFloatX:Allocator, AllocV8:Allocator, AllocS16:Allocator, AllocPDF:Allocator, AllocStaticCommand:Allocator, AllocHistogramLiteral:Allocator, AllocHistogramCommand:Allocator, AllocHistogramDistance:Allocator, AllocHistogramPair:Allocator, AllocContextType:Allocator, AllocHuffmanTree:Allocator, AllocZopfliNode:Allocator, > Allocator<$type_name> for CombiningAllocator { type AllocatedMemory = $sub_type_name; fn alloc_cell(&mut self, size: usize) -> >::AllocatedMemory { self.$local_name.alloc_cell(size) } fn free_cell(&mut self, data: >::AllocatedMemory) { self.$local_name.free_cell(data) } } }; } implement_allocator!(AllocU8, u8, AllocU8::AllocatedMemory, alloc_u8); implement_allocator!(AllocU16, u16, AllocU16::AllocatedMemory, alloc_u16); implement_allocator!(AllocI32, i32, AllocI32::AllocatedMemory, alloc_i32); implement_allocator!(AllocU32, u32, AllocU32::AllocatedMemory, alloc_u32); implement_allocator!(AllocU64, u64, AllocU64::AllocatedMemory, alloc_u64); implement_allocator!(AllocCommand, Command, AllocCommand::AllocatedMemory, alloc_c); implement_allocator!(AllocFloatX, floatX, AllocFloatX::AllocatedMemory, alloc_f); implement_allocator!(AllocV8, v8, AllocV8::AllocatedMemory, alloc_f32x8); implement_allocator!(AllocS16, s16, AllocS16::AllocatedMemory, alloc_i16x16); implement_allocator!(AllocPDF, PDF, AllocPDF::AllocatedMemory, alloc_pdf); implement_allocator!(AllocStaticCommand, StaticCommand, AllocStaticCommand::AllocatedMemory, alloc_sc); implement_allocator!(AllocHistogramLiteral, HistogramLiteral, AllocHistogramLiteral::AllocatedMemory, alloc_hl); implement_allocator!(AllocHistogramCommand, HistogramCommand, AllocHistogramCommand::AllocatedMemory, alloc_hc); implement_allocator!(AllocHistogramDistance, HistogramDistance, AllocHistogramDistance::AllocatedMemory, alloc_hd); implement_allocator!(AllocHistogramPair, HistogramPair, AllocHistogramPair::AllocatedMemory, alloc_hp); implement_allocator!(AllocContextType, ContextType, AllocContextType::AllocatedMemory, alloc_ct); implement_allocator!(AllocHuffmanTree, HuffmanTree, AllocHuffmanTree::AllocatedMemory, alloc_ht); implement_allocator!(AllocZopfliNode, ZopfliNode, AllocZopfliNode::AllocatedMemory, alloc_zn);