# pragma once 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# include  <condition_variable> 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# include  <map> 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# include  <mutex> 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# include  <set> 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# include  <vector> 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# include  "tools/replay/route.h" 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								constexpr  int  MIN_SEGMENTS_CACHE  =  5 ; 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								using  SegmentMap  =  std : : map < int ,  std : : shared_ptr < Segment > > ; 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								class  SegmentManager  { 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								public : 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  struct  EventData  { 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    std : : vector < Event >  events ;   //  Events extracted from the segments
   
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    SegmentMap  segments ;         // Associated segments that contributed to these events
   
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    bool  isSegmentLoaded ( int  n )  const  {  return  segments . find ( n )  ! =  segments . end ( ) ;  } 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  } ; 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								  SegmentManager ( const  std : : string  & route_name ,  uint32_t  flags ,  const  std : : string  & data_dir  =  " " ,  bool  auto_source  =  false ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      :  flags_ ( flags ) ,  route_ ( route_name ,  data_dir ,  auto_source ) ,  event_data_ ( std : : make_shared < EventData > ( ) )  { } 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  ~ SegmentManager ( ) ; 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  bool  load ( ) ; 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  void  setCurrentSegment ( int  seg_num ) ; 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  void  setCallback ( const  std : : function < void ( ) >  & callback )  {  onSegmentMergedCallback_  =  callback ;  } 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  void  setFilters ( const  std : : vector < bool >  & filters )  {  filters_  =  filters ;  } 
  
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								  const  std : : shared_ptr < EventData >  getEventData ( )  const  {  return  std : : atomic_load ( & event_data_ ) ;  } 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  bool  hasSegment ( int  n )  const  {  return  segments_ . find ( n )  ! =  segments_ . end ( ) ;  } 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  Route  route_ ; 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  int  segment_cache_limit_  =  MIN_SEGMENTS_CACHE ; 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								private : 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  void  manageSegmentCache ( ) ; 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  void  loadSegmentsInRange ( SegmentMap : : iterator  begin ,  SegmentMap : : iterator  cur ,  SegmentMap : : iterator  end ) ; 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  bool  mergeSegments ( const  SegmentMap : : iterator  & begin ,  const  SegmentMap : : iterator  & end ) ; 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  std : : vector < bool >  filters_ ; 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  uint32_t  flags_ ; 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  std : : mutex  mutex_ ; 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  std : : condition_variable  cv_ ; 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  std : : thread  thread_ ; 
  
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								  int  cur_seg_num_  =  - 1 ; 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  bool  needs_update_  =  false ; 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  bool  exit_  =  false ; 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  SegmentMap  segments_ ; 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  std : : shared_ptr < EventData >  event_data_ ; 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  std : : function < void ( ) >  onSegmentMergedCallback_  =  nullptr ; 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  std : : set < int >  merged_segments_ ; 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								} ;