1use serde::{Deserialize, Serialize};
9use std::collections::HashMap;
10use std::time::Duration;
11use crate::core::types::{
13 AccessPattern, AllocationInfo, CreationContext, FragmentationAnalysis,
14 LifecycleEfficiencyMetrics, LifecyclePattern, ObjectLifecycleInfo, OptimizationPotential,
15 OptimizationRecommendation, PerformanceCharacteristics, PerformanceImpact, ScopeType,
16 TemporaryUsagePattern,
17};
18
19#[derive(Debug, Clone, Serialize, Deserialize)]
21pub struct EnhancedStackFrame {
22 pub frame_id: u64,
24 pub function_name: String,
26 pub allocations: Vec<usize>,
28 pub total_allocated: usize,
30 pub frame_size: usize,
32}
33
34#[derive(Debug, Clone, Serialize, Deserialize)]
36pub struct StackBoundaries {
37 pub stack_base: usize,
39 pub stack_top: usize,
41 pub stack_size: usize,
43}
44
45impl StackBoundaries {
46 pub fn detect() -> Self {
48 let stack_base = 0x7fff_0000_0000; let stack_size = 8 * 1024 * 1024; Self {
54 stack_base,
55 stack_top: stack_base + stack_size,
56 stack_size,
57 }
58 }
59
60 pub fn contains(&self, ptr: usize) -> bool {
62 ptr >= self.stack_base && ptr < self.stack_top
63 }
64
65 pub fn get_frame_base(&self, frame_id: u64) -> usize {
67 self.stack_base + (frame_id as usize * 4096)
69 }
70}
71
72#[derive(Debug, Clone, Serialize, Deserialize)]
74pub struct HeapSegment {
75 pub start: usize,
77 pub end: usize,
79}
80
81impl HeapSegment {
82 pub fn contains(&self, ptr: usize) -> bool {
84 ptr >= self.start && ptr < self.end
85 }
86}
87
88#[derive(Debug, Clone, Serialize, Deserialize)]
90pub struct AllocatorInfo {
91 pub name: String,
93 pub strategy: AllocationStrategy,
95 pub heap_segments: Vec<HeapSegment>,
97}
98
99#[derive(Debug, Clone, Serialize, Deserialize)]
101pub enum AllocationStrategy {
102 FirstFit,
104 BestFit,
106 WorstFit,
108 NextFit,
110 SlabAllocation,
112}
113
114#[derive(Debug, Clone, Serialize, Deserialize)]
116pub struct EnhancedTemporaryObjectInfo {
117 pub allocation: AllocationInfo,
119 pub pattern_classification: TemporaryPatternClassification,
121 pub usage_pattern: TemporaryUsagePattern,
123 pub hot_path_involvement: bool,
125 pub elimination_feasibility: EliminationFeasibility,
127 pub optimization_potential: OptimizationPotential,
129 pub creation_context: CreationContext,
131 pub lifetime_analysis: TemporaryLifetimeAnalysis,
133 pub performance_impact: PerformanceImpact,
135}
136
137#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
139pub enum TemporaryPatternClassification {
140 StringConcatenation,
142 VectorReallocation,
144 IteratorChaining,
146 ClosureCapture,
148 AsyncAwait,
150 ErrorHandling,
152 SerializationDeserialization,
154 GenericInstantiation,
156 TraitObjectCreation,
158 Unknown,
160}
161
162#[derive(Debug, Clone, Serialize, Deserialize)]
164pub enum EliminationFeasibility {
165 HighlyFeasible {
167 suggested_approach: String,
169 },
170 Feasible {
172 constraints: Vec<String>,
174 },
175 Difficult {
177 blockers: Vec<String>,
179 },
180 Infeasible {
182 reasons: Vec<String>,
184 },
185}
186
187#[derive(Debug, Clone, Serialize, Deserialize)]
189pub struct TemporaryLifetimeAnalysis {
190 pub creation_time: u64,
192 pub destruction_time: Option<u64>,
194 pub estimated_lifetime: Duration,
196 pub usage_frequency: usize,
198 pub scope_escape_analysis: EscapeAnalysis,
200}
201
202#[derive(Debug, Clone, Serialize, Deserialize)]
204pub enum EscapeAnalysis {
205 DoesNotEscape,
207 EscapesToHeap,
209 EscapesToCaller,
211 EscapesToGlobal,
213 Unknown,
215}
216
217#[derive(Debug, Clone, Serialize, Deserialize)]
219pub struct AllocationEvent {
220 pub timestamp: u64,
222 pub event_type: EnhancedAllocationEventType,
224 pub ptr: usize,
226 pub size: usize,
228 pub type_name: Option<String>,
230}
231
232#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
234pub enum EnhancedAllocationEventType {
235 Allocate,
237 Deallocate,
239 Reallocate,
241}
242
243#[derive(Debug, Clone, Serialize, Deserialize)]
245pub struct RealTimeMetrics {
246 pub current_fragmentation: f64,
248 pub allocation_rate: f64,
250 pub deallocation_rate: f64,
252 pub memory_pressure: f64,
254}
255
256impl RealTimeMetrics {
257 pub fn new() -> Self {
259 Self {
260 current_fragmentation: 0.0,
261 allocation_rate: 0.0,
262 deallocation_rate: 0.0,
263 memory_pressure: 0.0,
264 }
265 }
266
267 pub fn update_allocation(&mut self, _allocation: &AllocationInfo) {
269 self.allocation_rate += 1.0;
271 }
273}
274
275impl Default for RealTimeMetrics {
276 fn default() -> Self {
277 Self::new()
278 }
279}
280#[derive(Debug, Clone, Serialize, Deserialize)]
282pub enum FragmentationCause {
283 FrequentSmallAllocations,
285 MixedSizeAllocations,
287 LongLivedAllocations,
289 PoorDeallocationPatterns,
291 AllocatorLimitations,
293}
294
295#[derive(Debug, Clone, Serialize, Deserialize)]
297pub struct FragmentationMitigationStrategy {
298 pub strategy_type: MitigationStrategyType,
300 pub description: String,
302 pub expected_improvement: f64,
304 pub implementation_complexity: ImplementationComplexity,
306}
307
308#[derive(Debug, Clone, Serialize, Deserialize)]
310pub enum MitigationStrategyType {
311 PoolAllocation,
313 SizeClassSegregation,
315 GenerationalGC,
317 CompactionGC,
319 CustomAllocator,
321}
322
323#[derive(Debug, Clone, Serialize, Deserialize)]
325pub enum ImplementationComplexity {
326 Low,
328 Medium,
330 High,
332 VeryHigh,
334}
335
336#[derive(Debug, Clone, Serialize, Deserialize)]
338pub struct StackAllocationDetails {
339 pub allocation: AllocationInfo,
341 pub frame_info: crate::core::types::StackFrame,
343 pub stack_depth: usize,
345 pub scope_analysis: StackScopeAnalysis,
347}
348#[derive(Debug, Clone, Serialize, Deserialize)]
350pub struct HeapAllocationDetails {
351 pub allocation: AllocationInfo,
353 pub heap_info: HeapRegionInfo,
355 pub allocator_type: String,
357 pub fragmentation_impact: FragmentationImpact,
359}
360
361#[derive(Debug, Clone, Serialize, Deserialize)]
363pub struct AmbiguousAllocation {
364 pub allocation: AllocationInfo,
366 pub ambiguity_reason: AmbiguityReason,
368 pub confidence_score: f64,
370}
371
372#[derive(Debug, Clone, Serialize, Deserialize)]
374pub struct StackScopeAnalysis {
375 pub scope_type: ScopeType,
377 pub nesting_level: usize,
379 pub estimated_lifetime: Duration,
381 pub escape_analysis: EscapeAnalysis,
383}
384
385#[derive(Debug, Clone, Serialize, Deserialize)]
387pub struct FragmentationImpact {
388 pub severity: FragmentationSeverity,
390 pub affected_allocations: Vec<usize>,
392 pub estimated_waste: usize,
394 pub impact_level: ImpactLevel,
396}
397
398#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
400pub enum ImpactLevel {
401 Low,
403 Medium,
405 High,
407 Critical,
409}
410
411#[derive(Debug, Clone, Serialize, Deserialize, Default)]
413pub struct TemporaryObjectAnalysisReport {
414 pub temporary_objects: Vec<EnhancedTemporaryObjectInfo>,
416 pub optimization_candidates: Vec<OptimizationCandidate>,
418 pub hot_temporary_patterns: Vec<HotTemporaryPattern>,
420 pub optimization_suggestions: Vec<OptimizationSuggestion>,
422 pub pattern_statistics: PatternStatistics,
424 pub performance_impact_assessment: PerformanceImpactAssessment,
426}
427
428#[derive(Debug, Clone, Serialize, Deserialize)]
430pub struct OptimizationCandidate {
431 pub allocation: AllocationInfo,
433 pub optimization_type: OptimizationType,
435 pub expected_benefit: f64,
437 pub implementation_effort: ImplementationDifficulty,
439}
440
441#[derive(Debug, Clone, Serialize, Deserialize)]
443pub enum OptimizationType {
444 EliminateTemporary,
446 ReuseAllocation,
448 PoolAllocation,
450 LazyInitialization,
452 CopyElision,
454}
455#[derive(Debug, Clone, Serialize, Deserialize)]
457pub enum ImplementationDifficulty {
458 Easy,
460 Medium,
462 Hard,
464 VeryHard,
466}
467
468#[derive(Debug, Clone, Serialize, Deserialize)]
470pub struct HotTemporaryPattern {
471 pub pattern: TemporaryPatternClassification,
473 pub frequency: usize,
475 pub total_memory_impact: usize,
477 pub optimization_priority: Priority,
479}
480
481#[derive(Debug, Clone, Serialize, Deserialize)]
483pub enum Priority {
484 Low,
486 Medium,
488 High,
490 Critical,
492}
493
494#[derive(Debug, Clone, Serialize, Deserialize)]
496pub struct OptimizationSuggestion {
497 pub category: OptimizationCategory,
499 pub description: String,
501 pub code_example: Option<String>,
503 pub expected_improvement: f64,
505}
506
507#[derive(Debug, Clone, Serialize, Deserialize)]
509pub enum OptimizationCategory {
510 MemoryLayout,
512 TemporaryObjectReduction,
514 CacheOptimization,
516 AllocationStrategy,
518 LifecycleManagement,
520}
521
522#[derive(Debug, Clone, Serialize, Deserialize, Default)]
524pub struct PatternStatistics {
525 pub total_patterns_detected: usize,
527 pub pattern_frequency_distribution: HashMap<TemporaryPatternClassification, usize>,
529 pub memory_impact_by_pattern: HashMap<TemporaryPatternClassification, usize>,
531}
532
533#[derive(Debug, Clone, Serialize, Deserialize)]
535pub struct PerformanceImpactAssessment {
536 pub allocation_overhead: f64,
538 pub deallocation_overhead: f64,
540 pub cache_impact: f64,
542 pub overall_performance_cost: f64,
544}
545
546impl Default for PerformanceImpactAssessment {
547 fn default() -> Self {
548 Self {
549 allocation_overhead: 0.0,
550 deallocation_overhead: 0.0,
551 cache_impact: 0.0,
552 overall_performance_cost: 0.0,
553 }
554 }
555}
556
557#[derive(Debug, Clone, Serialize, Deserialize, Default)]
559pub struct RealTimeFragmentationAnalysis {
560 pub current_fragmentation: FragmentationMetrics,
562 pub fragmentation_trends: FragmentationTrends,
564 pub adaptive_strategies: Vec<AdaptiveStrategy>,
566 pub real_time_metrics: RealTimeMetrics,
568 pub fragmentation_visualization: FragmentationVisualization,
570 pub mitigation_recommendations: Vec<FragmentationMitigationStrategy>,
572}
573
574#[derive(Debug, Clone, Serialize, Deserialize)]
576pub struct FragmentationTrends {
577 pub trend_direction: TrendDirection,
579 pub rate_of_change: f64,
581 pub predicted_future_state: FragmentationPrediction,
583}
584
585impl Default for FragmentationTrends {
586 fn default() -> Self {
587 Self {
588 trend_direction: TrendDirection::Stable,
589 rate_of_change: 0.0,
590 predicted_future_state: FragmentationPrediction::default(),
591 }
592 }
593}
594
595#[derive(Debug, Clone, Serialize, Deserialize)]
597pub enum TrendDirection {
598 Improving,
600 Stable,
602 Degrading,
604 Volatile,
606}
607
608#[derive(Debug, Clone, Serialize, Deserialize)]
610pub struct FragmentationPrediction {
611 pub predicted_fragmentation_in_1h: f64,
613 pub predicted_fragmentation_in_24h: f64,
615 pub confidence_level: f64,
617}
618
619impl Default for FragmentationPrediction {
620 fn default() -> Self {
621 Self {
622 predicted_fragmentation_in_1h: 0.0,
623 predicted_fragmentation_in_24h: 0.0,
624 confidence_level: 0.0,
625 }
626 }
627}
628
629#[derive(Debug, Clone, Serialize, Deserialize)]
631pub struct FragmentationTimePoint {
632 pub timestamp: u64,
634 pub fragmentation_level: f64,
636 pub allocation_count: usize,
638}
639
640#[derive(Debug, Clone, Serialize, Deserialize, Default)]
642pub struct FragmentationHeatmapData {
643 pub memory_regions: Vec<MemoryRegion>,
645 pub fragmentation_scores: Vec<f64>,
647}
648
649#[derive(Debug, Clone, Serialize, Deserialize)]
651pub struct MemoryRegion {
652 pub start_address: usize,
654 pub end_address: usize,
656 pub fragmentation_score: f64,
658}
659
660#[derive(Debug, Clone, Serialize, Deserialize)]
662pub enum MitigationType {
663 MemoryPooling,
665 Compaction,
667 SizeClassSegregation,
669 CustomAllocator,
671}
672
673#[derive(Debug, Clone, Serialize, Deserialize)]
675pub struct AdaptiveStrategy {
676 pub strategy_name: String,
678 pub trigger_conditions: Vec<String>,
680 pub actions: Vec<String>,
682 pub effectiveness_score: f64,
684}
685
686#[derive(Debug, Clone, Serialize, Deserialize, Default)]
688pub struct FragmentationVisualization {
689 pub memory_map: Vec<MemoryBlock>,
691 pub fragmentation_heatmap: Vec<f64>,
693 pub allocation_timeline: Vec<AllocationEvent>,
695}
696
697#[derive(Debug, Clone, Serialize, Deserialize, Default)]
699pub struct MemoryBlock {
700 pub start_address: usize,
702 pub size: usize,
704 pub block_type: MemoryBlockType,
706 pub fragmentation_score: f64,
708}
709
710#[derive(Debug, Clone, Serialize, Deserialize, Default)]
712pub enum MemoryBlockType {
713 #[default]
715 Free,
716 Allocated,
718 Reserved,
720 Fragmented,
722}
723
724#[derive(Debug, Clone, Serialize, Deserialize)]
726pub struct OverallOptimizationRecommendation {
727 pub category: OptimizationCategory,
729 pub priority: Priority,
731 pub description: String,
733 pub expected_improvement: f64,
735 pub implementation_effort: ImplementationDifficulty,
737 pub affected_components: Vec<String>,
739}
740
741#[derive(Debug, Clone, Default, Serialize, Deserialize)]
743pub struct StackHeapInteractionAnalysis {
744 pub reference_relationships: Vec<ReferenceRelationship>,
746 pub lifetime_dependencies: Vec<LifetimeDependency>,
748 pub performance_implications: Vec<PerformanceImplication>,
750}
751
752#[derive(Debug, Clone, Serialize, Deserialize)]
754pub struct ReferenceRelationship {
755 pub stack_allocation: usize,
757 pub heap_allocation: usize,
759 pub relationship_type: ReferenceType,
761}
762
763#[derive(Debug, Clone, Serialize, Deserialize)]
765pub enum ReferenceType {
766 DirectReference,
768 IndirectReference,
770 WeakReference,
772 OwnershipTransfer,
774}
775
776#[derive(Debug, Clone, Serialize, Deserialize)]
778pub struct LifetimeDependency {
779 pub dependent_allocation: usize,
781 pub dependency_strength: DependencyStrength,
783}
784
785#[derive(Debug, Clone, Serialize, Deserialize)]
787pub enum DependencyStrength {
788 Strong,
790 Weak,
792 Optional,
794}
795
796#[derive(Debug, Clone, Serialize, Deserialize)]
798pub struct PerformanceImplication {
799 pub implication_type: PerformanceImplicationType,
801 pub severity: Severity,
803 pub description: String,
805 pub mitigation_suggestion: String,
807}
808
809#[derive(Debug, Clone, Serialize, Deserialize)]
811pub enum PerformanceImplicationType {
812 CacheMiss,
814 MemoryLatency,
816 AllocationOverhead,
818 MemoryOptimization,
820 Positive,
822 Negative,
824 Neutral,
826}
827
828#[derive(Debug, Clone, Serialize, Deserialize)]
830pub enum Severity {
831 Low,
833 Medium,
835 High,
837 Critical,
839}
840
841#[derive(Debug, Clone, Serialize, Deserialize)]
843pub struct MemorySpaceCoverage {
844 pub total_tracked_bytes: usize,
846 pub stack_coverage_percent: f64,
848 pub heap_coverage_percent: f64,
850 pub unknown_region_percent: f64,
852}
853
854#[derive(Debug, Clone, Serialize, Deserialize)]
856pub struct BoundaryDetectionAccuracy {
857 pub stack_detection_accuracy: f64,
859 pub heap_detection_accuracy: f64,
861 pub false_positive_rate: f64,
863 pub false_negative_rate: f64,
865}
866
867#[derive(Debug, Clone, Serialize, Deserialize)]
869pub struct StackHeapOptimization {
870 pub optimization_type: StackHeapOptimizationType,
872 pub description: String,
874 pub affected_allocations: Vec<usize>,
876 pub expected_benefit: String,
878}
879
880#[derive(Debug, Clone, Serialize, Deserialize)]
882pub enum StackHeapOptimizationType {
883 StackToHeapPromotion,
885 HeapToStackDemotion,
887 AllocationElimination,
889 LifetimeOptimization,
891}
892
893#[derive(Debug, Clone, Serialize, Deserialize, Default)]
895pub struct GenericTypeAnalysisReport {
896 pub instantiation_analysis: Vec<crate::core::types::GenericInstantiationInfo>,
898 pub code_bloat_assessment: CodeBloatAssessment,
900 pub optimization_recommendations: Vec<crate::core::types::MemoryOptimizationRecommendation>,
902 pub monomorphization_statistics: crate::enhanced_memory_analysis::MonomorphizationStatistics,
904 pub performance_characteristics: PerformanceCharacteristics,
906}
907
908#[derive(Debug, Clone, Serialize, Deserialize, Default)]
910pub struct ObjectLifecycleAnalysisReport {
911 pub lifecycle_reports: Vec<ObjectLifecycleInfo>,
913 pub lifecycle_patterns: Vec<LifecyclePattern>,
915 pub resource_waste_analysis: ResourceWasteAnalysis,
917 pub lifecycle_optimizations: Vec<crate::enhanced_memory_analysis::LifecycleOptimization>,
919 pub efficiency_metrics: crate::enhanced_memory_analysis::EfficiencyMetrics,
921 pub object_relationship_graph: crate::enhanced_memory_analysis::ObjectRelationshipGraph,
923}
924
925#[derive(Debug, Clone, Serialize, Deserialize, Default)]
927pub struct MemoryAccessAnalysisReport {
928 pub access_patterns: Vec<AccessPattern>,
930 pub layout_recommendations: Vec<crate::enhanced_memory_analysis::LayoutRecommendation>,
932 pub actual_access_tracking: crate::enhanced_memory_analysis::ActualAccessTracking,
934 pub bandwidth_utilization: crate::enhanced_memory_analysis::BandwidthUtilization,
936 pub locality_analysis: crate::enhanced_memory_analysis::LocalityAnalysis,
938}
939
940#[derive(Debug, Clone, Serialize, Deserialize, Default)]
942pub struct CacheOptimizationReport {
943 pub cache_line_analysis: crate::enhanced_memory_analysis::CacheLineAnalysis,
945 pub data_structure_optimizations:
947 Vec<crate::enhanced_memory_analysis::DataStructureOptimization>,
948 pub access_pattern_optimizations:
950 Vec<crate::enhanced_memory_analysis::AccessPatternOptimization>,
951 pub cache_efficiency_metrics: LifecycleEfficiencyMetrics,
953 pub optimization_recommendations: Vec<OptimizationRecommendation>,
955 pub performance_projections: PerformanceImplication,
957}
958
959#[derive(Debug, Clone, Serialize, Deserialize)]
961pub struct EnhancedMemoryAnalysisReport {
962 pub timestamp: u64,
964 pub analysis_duration_ms: u64,
966 pub stack_heap_analysis: StackHeapBoundaryAnalysis,
968 pub temp_object_analysis: TemporaryObjectAnalysisReport,
970 pub fragmentation_analysis: RealTimeFragmentationAnalysis,
972 pub generic_analysis: GenericTypeAnalysisReport,
974 pub lifecycle_analysis: ObjectLifecycleAnalysisReport,
976 pub access_pattern_analysis: MemoryAccessAnalysisReport,
978 pub cache_optimization: CacheOptimizationReport,
980 pub overall_recommendations: Vec<OverallOptimizationRecommendation>,
982}
983
984#[derive(Debug, Clone, Default, Serialize, Deserialize)]
986pub struct StackHeapBoundaryAnalysis {
987 pub stack_allocations: Vec<StackAllocationDetails>,
989 pub heap_allocations: Vec<HeapAllocationDetails>,
991 pub ambiguous_allocations: Vec<AmbiguousAllocation>,
993 pub stack_heap_interactions: StackHeapInteractionAnalysis,
995 pub memory_space_coverage: MemorySpaceCoverage,
997 pub boundary_detection_accuracy: BoundaryDetectionAccuracy,
999 pub optimization_opportunities: Vec<StackHeapOptimization>,
1001}
1002
1003#[derive(Debug, Clone, Serialize, Deserialize)]
1005pub struct CodeBloatAssessment {
1006 pub bloat_level: BloatLevel,
1008 pub estimated_code_size_increase: f64,
1010 pub compilation_time_impact: f64,
1012 pub binary_size_impact: f64,
1014}
1015
1016#[derive(Debug, Clone, Serialize, Deserialize)]
1018pub enum BloatLevel {
1019 Minimal,
1021 Low,
1023 Moderate,
1025 High,
1027 Severe,
1029}
1030
1031#[derive(Debug, Clone, Serialize, Deserialize)]
1033pub struct ResourceWasteAnalysis {
1034 pub wasted_allocations: usize,
1036 pub total_wasted_memory: usize,
1038 pub waste_percentage: f64,
1040 pub waste_categories: Vec<WasteCategory>,
1042}
1043
1044#[derive(Debug, Clone, Serialize, Deserialize)]
1046pub struct WasteCategory {
1047 pub category_type: WasteCategoryType,
1049 pub wasted_bytes: usize,
1051 pub frequency: usize,
1053}
1054
1055#[derive(Debug, Clone, Serialize, Deserialize)]
1057pub enum WasteCategoryType {
1058 UnusedAllocations,
1060 OverAllocations,
1062 LeakedMemory,
1064 FragmentationWaste,
1066 TemporaryObjectWaste,
1068}
1069
1070#[derive(Debug, Clone, Serialize, Deserialize)]
1072pub enum MemoryLocation {
1073 Stack(crate::enhanced_memory_analysis::StackFrameInfo),
1075 Heap(HeapRegionInfo),
1077 Ambiguous(AmbiguityReason),
1079}
1080
1081#[derive(Debug, Clone, Serialize, Deserialize)]
1083pub enum AmbiguityReason {
1084 InsufficientMetadata,
1086 BorderlineAddress,
1088 CorruptedTracking,
1090 ExternalAllocation,
1092}
1093
1094#[derive(Debug, Clone, Serialize, Deserialize)]
1096pub struct HeapRegionInfo {
1097 pub region_start: usize,
1099 pub region_end: usize,
1101 pub allocator_name: String,
1103 pub region_type: HeapRegionType,
1105}
1106
1107#[derive(Debug, Clone, Serialize, Deserialize)]
1108pub enum HeapRegionType {
1110 MainHeap,
1112 LargeObjectHeap,
1114 SmallObjectHeap,
1116 ThreadLocalHeap,
1118}
1119
1120#[derive(Debug, Clone, Serialize, Deserialize)]
1122pub struct EnhancedFragmentationAnalysis {
1124 pub fragmentation_metrics: FragmentationMetrics,
1126 pub fragmentation_severity: FragmentationSeverity,
1128 pub fragmentation_causes: Vec<FragmentationCause>,
1130 pub mitigation_strategies: Vec<FragmentationMitigationStrategy>,
1132 pub fragmentation_trends: FragmentationTrends,
1134 pub real_time_monitoring: crate::enhanced_memory_analysis::RealTimeMonitoringData,
1136 pub adaptive_recommendations: Vec<crate::enhanced_memory_analysis::AdaptiveRecommendation>,
1138}
1139
1140#[derive(Debug, Clone, Serialize, Deserialize)]
1141pub struct FragmentationMetrics {
1143 pub external_fragmentation_ratio: f64,
1145 pub internal_fragmentation_ratio: f64,
1147 pub total_fragmentation_ratio: f64,
1149 pub largest_free_block: usize,
1151 pub free_block_count: usize,
1153 pub average_free_block_size: f64,
1155 pub memory_utilization_ratio: f64,
1157}
1158
1159impl Default for FragmentationMetrics {
1160 fn default() -> Self {
1161 Self {
1162 external_fragmentation_ratio: 0.0,
1163 internal_fragmentation_ratio: 0.0,
1164 total_fragmentation_ratio: 0.0,
1165 largest_free_block: 0,
1166 free_block_count: 0,
1167 average_free_block_size: 0.0,
1168 memory_utilization_ratio: 1.0,
1169 }
1170 }
1171}
1172
1173#[derive(Debug, Clone, Serialize, Deserialize)]
1175pub enum FragmentationSeverity {
1176 Low,
1178 Moderate,
1180 High,
1182 Critical,
1184}
1185
1186#[derive(Debug, Clone, Serialize, Deserialize)]
1188pub struct TemporaryOptimization {
1190 pub optimization_type: OptimizationType,
1192 pub expected_benefit: f64,
1194 pub implementation_effort: ImplementationDifficulty,
1196 pub description: String,
1198}
1199
1200#[derive(Debug, Clone, Serialize, Deserialize)]
1201pub struct TemporaryPatternStatistics {
1203 pub total_patterns: usize,
1205 pub pattern_distribution: HashMap<TemporaryPatternClassification, usize>,
1207 pub memory_impact: HashMap<TemporaryPatternClassification, usize>,
1209}
1210
1211#[derive(Debug, Clone, Serialize, Deserialize)]
1212pub struct TemporaryObjectPerformanceImpact {
1214 pub allocation_overhead: f64,
1216 pub deallocation_overhead: f64,
1218 pub cache_impact: f64,
1220 pub overall_cost: f64,
1222}
1223
1224#[derive(Debug, Clone, Serialize, Deserialize)]
1225pub enum OptimizationStrategy {
1227 Eliminate,
1229 Reuse,
1231 Pool,
1233 Defer,
1235}
1236
1237#[derive(Debug, Clone, Serialize, Deserialize)]
1238pub struct FragmentationTrendAnalysis {
1240 pub historical_data: Vec<FragmentationAnalysis>,
1242 pub trend_direction: TrendDirection,
1244 pub projected_levels: Vec<FragmentationProjection>,
1246 pub fragmentation_levels: Vec<f64>,
1248}
1249
1250#[derive(Debug, Clone, Serialize, Deserialize)]
1251pub struct AdaptiveFragmentationStrategy {
1253 pub strategy_name: String,
1255 pub trigger_conditions: Vec<String>,
1257 pub actions: Vec<String>,
1259 pub effectiveness_score: f64,
1261}
1262
1263#[derive(Debug, Clone, Serialize, Deserialize)]
1264pub struct RealTimeFragmentationMetrics {
1266 pub current_fragmentation: f64,
1268 pub allocation_rate: f64,
1270 pub deallocation_rate: f64,
1272 pub memory_pressure: f64,
1274}
1275
1276#[derive(Debug, Clone, Serialize, Deserialize)]
1277pub struct FragmentationVisualizationData {
1279 pub memory_map: Vec<MemoryBlock>,
1281 pub fragmentation_heatmap: Vec<f64>,
1283 pub allocation_timeline: Vec<AllocationEvent>,
1285}
1286
1287#[derive(Debug, Clone, Serialize, Deserialize)]
1288pub struct FragmentationMitigationRecommendation {
1290 pub strategy_type: MitigationStrategyType,
1292 pub description: String,
1294 pub expected_improvement: f64,
1296 pub implementation_complexity: ImplementationComplexity,
1298}
1299
1300#[derive(Debug, Clone, Serialize, Deserialize)]
1301pub struct TrendAnalysis {
1303 pub direction: TrendDirection,
1305 pub rate_of_change: f64,
1307 pub confidence: f64,
1309}
1310
1311#[derive(Debug, Clone, Serialize, Deserialize)]
1312pub struct CyclicalPattern {
1314 pub pattern_name: String,
1316 pub cycle_duration: Duration,
1318 pub amplitude: f64,
1320}
1321
1322#[derive(Debug, Clone, Serialize, Deserialize)]
1323pub struct FragmentationAnomaly {
1325 pub anomaly_type: String,
1327 pub severity: f64,
1329 pub timestamp: u64,
1331 pub description: String,
1333}
1334
1335#[derive(Debug, Clone, Serialize, Deserialize)]
1336pub struct FragmentationProjection {
1338 pub time_horizon_hours: u32,
1340 pub projected_fragmentation: f64,
1342 pub confidence: f64,
1344}
1345
1346#[derive(Debug, Clone, Serialize, Deserialize)]
1347pub enum ScalabilityImpact {
1349 Positive,
1351 Neutral,
1353 Negative,
1355}
1356
1357#[derive(Debug, Clone, Serialize, Deserialize)]
1358pub struct AdaptiveMitigationStrategy {
1360 pub strategy_name: String,
1362 pub trigger_threshold: f64,
1364 pub actions: Vec<String>,
1366 pub expected_effectiveness: f64,
1368}
1369
1370#[derive(Debug, Clone, Serialize, Deserialize)]
1371pub struct CurrentFragmentationState {
1373 pub external_fragmentation: f64,
1375 pub internal_fragmentation: f64,
1377 pub severity_level: FragmentationSeverity,
1379 pub timestamp: u64,
1381}
1382
1383impl Default for CodeBloatAssessment {
1385 fn default() -> Self {
1386 Self {
1387 bloat_level: BloatLevel::Minimal,
1388 estimated_code_size_increase: 0.0,
1389 compilation_time_impact: 0.0,
1390 binary_size_impact: 0.0,
1391 }
1392 }
1393}
1394
1395impl Default for ResourceWasteAnalysis {
1396 fn default() -> Self {
1397 Self {
1398 wasted_allocations: 0,
1399 total_wasted_memory: 0,
1400 waste_percentage: 0.0,
1401 waste_categories: Vec::new(),
1402 }
1403 }
1404}
1405
1406impl Default for MemorySpaceCoverage {
1407 fn default() -> Self {
1408 Self {
1409 total_tracked_bytes: 0,
1410 stack_coverage_percent: 0.0,
1411 heap_coverage_percent: 0.0,
1412 unknown_region_percent: 0.0,
1413 }
1414 }
1415}
1416
1417impl Default for BoundaryDetectionAccuracy {
1418 fn default() -> Self {
1419 Self {
1420 stack_detection_accuracy: 0.0,
1421 heap_detection_accuracy: 0.0,
1422 false_positive_rate: 0.0,
1423 false_negative_rate: 0.0,
1424 }
1425 }
1426}
1427
1428impl Default for PerformanceImplication {
1429 fn default() -> Self {
1430 Self {
1431 implication_type: PerformanceImplicationType::Neutral,
1432 severity: Severity::Low,
1433 description: String::new(),
1434 mitigation_suggestion: String::new(),
1435 }
1436 }
1437}
1438
1439#[cfg(test)]
1440mod tests {
1441 use super::*;
1442 use std::time::Duration;
1443
1444 #[test]
1445 fn test_stack_boundaries_creation() {
1446 let boundaries = StackBoundaries::detect();
1447
1448 assert_eq!(boundaries.stack_base, 0x7fff_0000_0000);
1449 assert_eq!(boundaries.stack_size, 8 * 1024 * 1024);
1450 assert_eq!(
1451 boundaries.stack_top,
1452 boundaries.stack_base + boundaries.stack_size
1453 );
1454 }
1455
1456 #[test]
1457 fn test_stack_boundaries_contains() {
1458 let boundaries = StackBoundaries::detect();
1459
1460 let stack_ptr = boundaries.stack_base + 1024;
1462 assert!(boundaries.contains(stack_ptr));
1463
1464 let heap_ptr = 0x1000_0000;
1466 assert!(!boundaries.contains(heap_ptr));
1467
1468 assert!(boundaries.contains(boundaries.stack_base));
1470 assert!(!boundaries.contains(boundaries.stack_top));
1471 }
1472
1473 #[test]
1474 fn test_stack_boundaries_get_frame_base() {
1475 let boundaries = StackBoundaries::detect();
1476
1477 let frame_base_0 = boundaries.get_frame_base(0);
1478 let frame_base_1 = boundaries.get_frame_base(1);
1479
1480 assert_eq!(frame_base_0, boundaries.stack_base);
1481 assert_eq!(frame_base_1, boundaries.stack_base + 4096);
1482 assert!(frame_base_1 > frame_base_0);
1483 }
1484
1485 #[test]
1486 fn test_heap_segment_contains() {
1487 let segment = HeapSegment {
1488 start: 0x1000_0000,
1489 end: 0x2000_0000,
1490 };
1491
1492 assert!(segment.contains(0x1500_0000));
1494
1495 assert!(!segment.contains(0x500_0000));
1497 assert!(!segment.contains(0x2500_0000));
1498
1499 assert!(segment.contains(segment.start));
1501 assert!(!segment.contains(segment.end));
1502 }
1503
1504 #[test]
1505 fn test_allocation_strategy_variants() {
1506 let strategies = vec![
1507 AllocationStrategy::FirstFit,
1508 AllocationStrategy::BestFit,
1509 AllocationStrategy::WorstFit,
1510 AllocationStrategy::NextFit,
1511 AllocationStrategy::SlabAllocation,
1512 ];
1513
1514 for strategy in strategies {
1515 assert!(!format!("{strategy:?}").is_empty());
1516 }
1517 }
1518
1519 #[test]
1520 fn test_temporary_pattern_classification_variants() {
1521 let patterns = vec![
1522 TemporaryPatternClassification::StringConcatenation,
1523 TemporaryPatternClassification::VectorReallocation,
1524 TemporaryPatternClassification::IteratorChaining,
1525 TemporaryPatternClassification::ClosureCapture,
1526 TemporaryPatternClassification::AsyncAwait,
1527 TemporaryPatternClassification::ErrorHandling,
1528 TemporaryPatternClassification::SerializationDeserialization,
1529 TemporaryPatternClassification::GenericInstantiation,
1530 TemporaryPatternClassification::TraitObjectCreation,
1531 TemporaryPatternClassification::Unknown,
1532 ];
1533
1534 for pattern in patterns {
1535 assert!(!format!("{pattern:?}").is_empty());
1536 }
1537 }
1538
1539 #[test]
1540 fn test_elimination_feasibility_variants() {
1541 let feasibilities = vec![
1542 EliminationFeasibility::HighlyFeasible {
1543 suggested_approach: "Use string builder".to_string(),
1544 },
1545 EliminationFeasibility::Feasible {
1546 constraints: vec!["Memory limit".to_string()],
1547 },
1548 EliminationFeasibility::Difficult {
1549 blockers: vec!["API constraints".to_string()],
1550 },
1551 EliminationFeasibility::Infeasible {
1552 reasons: vec!["Required by interface".to_string()],
1553 },
1554 ];
1555
1556 for feasibility in feasibilities {
1557 assert!(!format!("{feasibility:?}").is_empty());
1558 }
1559 }
1560
1561 #[test]
1562 fn test_escape_analysis_variants() {
1563 let analyses = vec![
1564 EscapeAnalysis::DoesNotEscape,
1565 EscapeAnalysis::EscapesToHeap,
1566 EscapeAnalysis::EscapesToCaller,
1567 EscapeAnalysis::EscapesToGlobal,
1568 EscapeAnalysis::Unknown,
1569 ];
1570
1571 for analysis in analyses {
1572 assert!(!format!("{analysis:?}").is_empty());
1573 }
1574 }
1575
1576 #[test]
1577 fn test_real_time_metrics_creation() {
1578 let metrics = RealTimeMetrics::new();
1579
1580 assert_eq!(metrics.current_fragmentation, 0.0);
1581 assert_eq!(metrics.allocation_rate, 0.0);
1582 assert_eq!(metrics.deallocation_rate, 0.0);
1583 assert_eq!(metrics.memory_pressure, 0.0);
1584 }
1585
1586 #[test]
1587 fn test_real_time_metrics_default() {
1588 let metrics = RealTimeMetrics::default();
1589
1590 assert_eq!(metrics.current_fragmentation, 0.0);
1591 assert_eq!(metrics.allocation_rate, 0.0);
1592 assert_eq!(metrics.deallocation_rate, 0.0);
1593 assert_eq!(metrics.memory_pressure, 0.0);
1594 }
1595
1596 #[test]
1597 fn test_real_time_metrics_update_allocation() {
1598 use crate::core::types::AllocationInfo;
1599
1600 let mut metrics = RealTimeMetrics::new();
1601 let allocation = AllocationInfo::new(0x1000, 512);
1602
1603 let initial_rate = metrics.allocation_rate;
1604 metrics.update_allocation(&allocation);
1605
1606 assert!(metrics.allocation_rate > initial_rate);
1607 assert_eq!(metrics.allocation_rate, initial_rate + 1.0);
1608 }
1609
1610 #[test]
1611 fn test_enhanced_allocation_event_type_variants() {
1612 let events = vec![
1613 EnhancedAllocationEventType::Allocate,
1614 EnhancedAllocationEventType::Deallocate,
1615 EnhancedAllocationEventType::Reallocate,
1616 ];
1617
1618 for event in events {
1619 assert!(!format!("{event:?}").is_empty());
1620 }
1621 }
1622
1623 #[test]
1624 fn test_fragmentation_cause_variants() {
1625 let causes = vec![
1626 FragmentationCause::FrequentSmallAllocations,
1627 FragmentationCause::MixedSizeAllocations,
1628 FragmentationCause::LongLivedAllocations,
1629 FragmentationCause::PoorDeallocationPatterns,
1630 FragmentationCause::AllocatorLimitations,
1631 ];
1632
1633 for cause in causes {
1634 assert!(!format!("{cause:?}").is_empty());
1635 }
1636 }
1637
1638 #[test]
1639 fn test_mitigation_strategy_type_variants() {
1640 let strategies = vec![
1641 MitigationStrategyType::PoolAllocation,
1642 MitigationStrategyType::SizeClassSegregation,
1643 MitigationStrategyType::GenerationalGC,
1644 MitigationStrategyType::CompactionGC,
1645 MitigationStrategyType::CustomAllocator,
1646 ];
1647
1648 for strategy in strategies {
1649 assert!(!format!("{strategy:?}").is_empty());
1650 }
1651 }
1652
1653 #[test]
1654 fn test_implementation_complexity_variants() {
1655 let complexities = vec![
1656 ImplementationComplexity::Low,
1657 ImplementationComplexity::Medium,
1658 ImplementationComplexity::High,
1659 ImplementationComplexity::VeryHigh,
1660 ];
1661
1662 for complexity in complexities {
1663 assert!(!format!("{complexity:?}").is_empty());
1664 }
1665 }
1666
1667 #[test]
1668 fn test_impact_level_variants() {
1669 let levels = vec![
1670 ImpactLevel::Low,
1671 ImpactLevel::Medium,
1672 ImpactLevel::High,
1673 ImpactLevel::Critical,
1674 ];
1675
1676 for level in levels {
1677 assert!(!format!("{level:?}").is_empty());
1678 }
1679 }
1680
1681 #[test]
1682 fn test_optimization_type_variants() {
1683 let types = vec![
1684 OptimizationType::EliminateTemporary,
1685 OptimizationType::ReuseAllocation,
1686 OptimizationType::PoolAllocation,
1687 OptimizationType::LazyInitialization,
1688 OptimizationType::CopyElision,
1689 ];
1690
1691 for opt_type in types {
1692 assert!(!format!("{opt_type:?}").is_empty());
1693 }
1694 }
1695
1696 #[test]
1697 fn test_priority_variants() {
1698 let priorities = vec![
1699 Priority::Low,
1700 Priority::Medium,
1701 Priority::High,
1702 Priority::Critical,
1703 ];
1704
1705 for priority in priorities {
1706 assert!(!format!("{priority:?}").is_empty());
1707 }
1708 }
1709
1710 #[test]
1711 fn test_optimization_category_variants() {
1712 let categories = vec![
1713 OptimizationCategory::MemoryLayout,
1714 OptimizationCategory::TemporaryObjectReduction,
1715 OptimizationCategory::CacheOptimization,
1716 OptimizationCategory::AllocationStrategy,
1717 OptimizationCategory::LifecycleManagement,
1718 ];
1719
1720 for category in categories {
1721 assert!(!format!("{category:?}").is_empty());
1722 }
1723 }
1724
1725 #[test]
1726 fn test_pattern_statistics_default() {
1727 let stats = PatternStatistics::default();
1728
1729 assert_eq!(stats.total_patterns_detected, 0);
1730 assert!(stats.pattern_frequency_distribution.is_empty());
1731 assert!(stats.memory_impact_by_pattern.is_empty());
1732 }
1733
1734 #[test]
1735 fn test_performance_impact_assessment_default() {
1736 let assessment = PerformanceImpactAssessment::default();
1737
1738 assert_eq!(assessment.allocation_overhead, 0.0);
1739 assert_eq!(assessment.deallocation_overhead, 0.0);
1740 assert_eq!(assessment.cache_impact, 0.0);
1741 assert_eq!(assessment.overall_performance_cost, 0.0);
1742 }
1743
1744 #[test]
1745 fn test_trend_direction_variants() {
1746 let directions = vec![
1747 TrendDirection::Improving,
1748 TrendDirection::Stable,
1749 TrendDirection::Degrading,
1750 TrendDirection::Volatile,
1751 ];
1752
1753 for direction in directions {
1754 assert!(!format!("{direction:?}").is_empty());
1755 }
1756 }
1757
1758 #[test]
1759 fn test_fragmentation_prediction_default() {
1760 let prediction = FragmentationPrediction::default();
1761
1762 assert_eq!(prediction.predicted_fragmentation_in_1h, 0.0);
1763 assert_eq!(prediction.predicted_fragmentation_in_24h, 0.0);
1764 assert_eq!(prediction.confidence_level, 0.0);
1765 }
1766
1767 #[test]
1768 fn test_fragmentation_trends_default() {
1769 let trends = FragmentationTrends::default();
1770
1771 assert!(matches!(trends.trend_direction, TrendDirection::Stable));
1772 assert_eq!(trends.rate_of_change, 0.0);
1773 }
1774
1775 #[test]
1776 fn test_memory_block_type_variants() {
1777 let types = vec![
1778 MemoryBlockType::Free,
1779 MemoryBlockType::Allocated,
1780 MemoryBlockType::Reserved,
1781 MemoryBlockType::Fragmented,
1782 ];
1783
1784 for block_type in types {
1785 assert!(!format!("{block_type:?}").is_empty());
1786 }
1787 }
1788
1789 #[test]
1790 fn test_memory_block_default() {
1791 let block = MemoryBlock::default();
1792
1793 assert_eq!(block.start_address, 0);
1794 assert_eq!(block.size, 0);
1795 assert!(matches!(block.block_type, MemoryBlockType::Free));
1796 assert_eq!(block.fragmentation_score, 0.0);
1797 }
1798
1799 #[test]
1800 fn test_reference_type_variants() {
1801 let types = vec![
1802 ReferenceType::DirectReference,
1803 ReferenceType::IndirectReference,
1804 ReferenceType::WeakReference,
1805 ReferenceType::OwnershipTransfer,
1806 ];
1807
1808 for ref_type in types {
1809 assert!(!format!("{ref_type:?}").is_empty());
1810 }
1811 }
1812
1813 #[test]
1814 fn test_dependency_strength_variants() {
1815 let strengths = vec![
1816 DependencyStrength::Strong,
1817 DependencyStrength::Weak,
1818 DependencyStrength::Optional,
1819 ];
1820
1821 for strength in strengths {
1822 assert!(!format!("{strength:?}").is_empty());
1823 }
1824 }
1825
1826 #[test]
1827 fn test_performance_implication_type_variants() {
1828 let types = vec![
1829 PerformanceImplicationType::CacheMiss,
1830 PerformanceImplicationType::MemoryLatency,
1831 PerformanceImplicationType::AllocationOverhead,
1832 PerformanceImplicationType::MemoryOptimization,
1833 PerformanceImplicationType::Positive,
1834 PerformanceImplicationType::Negative,
1835 PerformanceImplicationType::Neutral,
1836 ];
1837
1838 for impl_type in types {
1839 assert!(!format!("{impl_type:?}").is_empty());
1840 }
1841 }
1842
1843 #[test]
1844 fn test_severity_variants() {
1845 let severities = vec![
1846 Severity::Low,
1847 Severity::Medium,
1848 Severity::High,
1849 Severity::Critical,
1850 ];
1851
1852 for severity in severities {
1853 assert!(!format!("{severity:?}").is_empty());
1854 }
1855 }
1856
1857 #[test]
1858 fn test_fragmentation_metrics_default() {
1859 let metrics = FragmentationMetrics::default();
1860
1861 assert_eq!(metrics.external_fragmentation_ratio, 0.0);
1862 assert_eq!(metrics.internal_fragmentation_ratio, 0.0);
1863 assert_eq!(metrics.total_fragmentation_ratio, 0.0);
1864 assert_eq!(metrics.largest_free_block, 0);
1865 assert_eq!(metrics.free_block_count, 0);
1866 assert_eq!(metrics.average_free_block_size, 0.0);
1867 assert_eq!(metrics.memory_utilization_ratio, 1.0);
1868 }
1869
1870 #[test]
1871 fn test_fragmentation_severity_variants() {
1872 let severities = vec![
1873 FragmentationSeverity::Low,
1874 FragmentationSeverity::Moderate,
1875 FragmentationSeverity::High,
1876 FragmentationSeverity::Critical,
1877 ];
1878
1879 for severity in severities {
1880 assert!(!format!("{severity:?}").is_empty());
1881 }
1882 }
1883
1884 #[test]
1885 fn test_bloat_level_variants() {
1886 let levels = vec![
1887 BloatLevel::Minimal,
1888 BloatLevel::Low,
1889 BloatLevel::Moderate,
1890 BloatLevel::High,
1891 BloatLevel::Severe,
1892 ];
1893
1894 for level in levels {
1895 assert!(!format!("{level:?}").is_empty());
1896 }
1897 }
1898
1899 #[test]
1900 fn test_code_bloat_assessment_default() {
1901 let assessment = CodeBloatAssessment::default();
1902
1903 assert!(matches!(assessment.bloat_level, BloatLevel::Minimal));
1904 assert_eq!(assessment.estimated_code_size_increase, 0.0);
1905 assert_eq!(assessment.compilation_time_impact, 0.0);
1906 assert_eq!(assessment.binary_size_impact, 0.0);
1907 }
1908
1909 #[test]
1910 fn test_waste_category_type_variants() {
1911 let types = vec![
1912 WasteCategoryType::UnusedAllocations,
1913 WasteCategoryType::OverAllocations,
1914 WasteCategoryType::LeakedMemory,
1915 WasteCategoryType::FragmentationWaste,
1916 WasteCategoryType::TemporaryObjectWaste,
1917 ];
1918
1919 for waste_type in types {
1920 assert!(!format!("{waste_type:?}").is_empty());
1921 }
1922 }
1923
1924 #[test]
1925 fn test_resource_waste_analysis_default() {
1926 let analysis = ResourceWasteAnalysis::default();
1927
1928 assert_eq!(analysis.wasted_allocations, 0);
1929 assert_eq!(analysis.total_wasted_memory, 0);
1930 assert_eq!(analysis.waste_percentage, 0.0);
1931 assert!(analysis.waste_categories.is_empty());
1932 }
1933
1934 #[test]
1935 fn test_ambiguity_reason_variants() {
1936 let reasons = vec![
1937 AmbiguityReason::InsufficientMetadata,
1938 AmbiguityReason::BorderlineAddress,
1939 AmbiguityReason::CorruptedTracking,
1940 AmbiguityReason::ExternalAllocation,
1941 ];
1942
1943 for reason in reasons {
1944 assert!(!format!("{reason:?}").is_empty());
1945 }
1946 }
1947
1948 #[test]
1949 fn test_heap_region_type_variants() {
1950 let types = vec![
1951 HeapRegionType::MainHeap,
1952 HeapRegionType::LargeObjectHeap,
1953 HeapRegionType::SmallObjectHeap,
1954 HeapRegionType::ThreadLocalHeap,
1955 ];
1956
1957 for region_type in types {
1958 assert!(!format!("{region_type:?}").is_empty());
1959 }
1960 }
1961
1962 #[test]
1963 fn test_memory_space_coverage_default() {
1964 let coverage = MemorySpaceCoverage::default();
1965
1966 assert_eq!(coverage.total_tracked_bytes, 0);
1967 assert_eq!(coverage.stack_coverage_percent, 0.0);
1968 assert_eq!(coverage.heap_coverage_percent, 0.0);
1969 assert_eq!(coverage.unknown_region_percent, 0.0);
1970 }
1971
1972 #[test]
1973 fn test_boundary_detection_accuracy_default() {
1974 let accuracy = BoundaryDetectionAccuracy::default();
1975
1976 assert_eq!(accuracy.stack_detection_accuracy, 0.0);
1977 assert_eq!(accuracy.heap_detection_accuracy, 0.0);
1978 assert_eq!(accuracy.false_positive_rate, 0.0);
1979 assert_eq!(accuracy.false_negative_rate, 0.0);
1980 }
1981
1982 #[test]
1983 fn test_performance_implication_default() {
1984 let implication = PerformanceImplication::default();
1985
1986 assert!(matches!(
1987 implication.implication_type,
1988 PerformanceImplicationType::Neutral
1989 ));
1990 assert!(matches!(implication.severity, Severity::Low));
1991 assert!(implication.description.is_empty());
1992 assert!(implication.mitigation_suggestion.is_empty());
1993 }
1994
1995 #[test]
1996 fn test_scalability_impact_variants() {
1997 let impacts = vec![
1998 ScalabilityImpact::Positive,
1999 ScalabilityImpact::Neutral,
2000 ScalabilityImpact::Negative,
2001 ];
2002
2003 for impact in impacts {
2004 assert!(!format!("{impact:?}").is_empty());
2005 }
2006 }
2007
2008 #[test]
2009 fn test_optimization_strategy_variants() {
2010 let strategies = vec![
2011 OptimizationStrategy::Eliminate,
2012 OptimizationStrategy::Reuse,
2013 OptimizationStrategy::Pool,
2014 OptimizationStrategy::Defer,
2015 ];
2016
2017 for strategy in strategies {
2018 assert!(!format!("{strategy:?}").is_empty());
2019 }
2020 }
2021
2022 #[test]
2023 fn test_temporary_object_analysis_report_default() {
2024 let report = TemporaryObjectAnalysisReport::default();
2025
2026 assert!(report.temporary_objects.is_empty());
2027 assert!(report.optimization_candidates.is_empty());
2028 assert!(report.hot_temporary_patterns.is_empty());
2029 assert!(report.optimization_suggestions.is_empty());
2030 }
2031
2032 #[test]
2033 fn test_real_time_fragmentation_analysis_default() {
2034 let analysis = RealTimeFragmentationAnalysis::default();
2035
2036 assert_eq!(
2038 analysis.current_fragmentation.external_fragmentation_ratio,
2039 0.0
2040 );
2041 assert!(matches!(
2042 analysis.fragmentation_trends.trend_direction,
2043 TrendDirection::Stable
2044 ));
2045 assert!(analysis.adaptive_strategies.is_empty());
2046 assert_eq!(analysis.real_time_metrics.current_fragmentation, 0.0);
2047 }
2048
2049 #[test]
2050 fn test_complex_struct_creation() {
2051 let allocation_event = AllocationEvent {
2052 timestamp: 1000,
2053 event_type: EnhancedAllocationEventType::Allocate,
2054 ptr: 0x1000,
2055 size: 512,
2056 type_name: Some("Vec<i32>".to_string()),
2057 };
2058
2059 assert_eq!(allocation_event.timestamp, 1000);
2060 assert!(matches!(
2061 allocation_event.event_type,
2062 EnhancedAllocationEventType::Allocate
2063 ));
2064 assert_eq!(allocation_event.ptr, 0x1000);
2065 assert_eq!(allocation_event.size, 512);
2066 assert_eq!(allocation_event.type_name, Some("Vec<i32>".to_string()));
2067 }
2068
2069 #[test]
2070 fn test_temporary_lifetime_analysis_creation() {
2071 let analysis = TemporaryLifetimeAnalysis {
2072 creation_time: 1000,
2073 destruction_time: Some(2000),
2074 estimated_lifetime: Duration::from_millis(1000),
2075 usage_frequency: 5,
2076 scope_escape_analysis: EscapeAnalysis::DoesNotEscape,
2077 };
2078
2079 assert_eq!(analysis.creation_time, 1000);
2080 assert_eq!(analysis.destruction_time, Some(2000));
2081 assert_eq!(analysis.estimated_lifetime, Duration::from_millis(1000));
2082 assert_eq!(analysis.usage_frequency, 5);
2083 assert!(matches!(
2084 analysis.scope_escape_analysis,
2085 EscapeAnalysis::DoesNotEscape
2086 ));
2087 }
2088
2089 #[test]
2090 fn test_fragmentation_mitigation_strategy_creation() {
2091 let strategy = FragmentationMitigationStrategy {
2092 strategy_type: MitigationStrategyType::PoolAllocation,
2093 description: "Use memory pools for similar-sized allocations".to_string(),
2094 expected_improvement: 0.3,
2095 implementation_complexity: ImplementationComplexity::Medium,
2096 };
2097
2098 assert!(matches!(
2099 strategy.strategy_type,
2100 MitigationStrategyType::PoolAllocation
2101 ));
2102 assert!(strategy.description.contains("memory pools"));
2103 assert_eq!(strategy.expected_improvement, 0.3);
2104 assert!(matches!(
2105 strategy.implementation_complexity,
2106 ImplementationComplexity::Medium
2107 ));
2108 }
2109}