ringbuffer.jl

oUqE2/src/ is a source file in module oUqE2
    
1
    

			
			
			
			
			mutable
			
			 
			
			
			struct
			
			 
			
			
			
			



			RingBuffer
	
			
			{
			
			T
			
			}
    
			
			
			
			buffers
			
			::
			
			
			Channel
			
			{
			
			T
			
			}
    
			
			
			results
			
			::
			
			
			Channel
			
			{
			
			T
			
			}
    
			
			
			current
			
			::
			
			
			T
			
			

			
			
			end
			
			


			
			
			
			
			function
			
			 
			
			
			



			RingBuffer
	
			
			(
			
			
			bufs
			
			::
			
			
			Vector
			
			{
			
			T
			
			}
			
			) 
			
			where 
			
			
			T
			
			
    
			
			
			
			
			size
			
			 
			
			= 
			
			
			
			length
			
			(
			
			bufs
			
			) 
			
			- 
			
			1
    
			
			
			
			buffers
			
			 
			
			= 
			
			
			
			Channel
			
			{
			
			T
			
			}
			
			(
			
			
			
			size
			
			 
			
			+ 
			
			1
			
			)
    
			
			
			
			results
			
			 
			
			= 
			
			
			
			Channel
			
			{
			
			T
			
			}
			
			(
			
			size
			
			)
    
			
			
			
			foreach
			
			(
			
			
			bufs
			
			[
			
			
			2
			
			:
			
			end
			
			]
			
			) 
			
			
			do
			
			 
			
			
			
			
			buf
			
			
        
			
			
			
			put!
			
			(
			
			buffers
			
			, 
			
			buf
			
			)
    
			
			
			end
			
			

    
			
			
			
			return
			
			 
			
			
			



			RingBuffer
	
			
			{
			
			T
			
			}
			
			(
			
			buffers
			
			, 
			
			results
			
			, 
			
			
			bufs
			
			[
			
			1
			
			]
			
			)

			
			
			end
			
			


			
			
			
			
			function
			
			 
			
			
			



			RingBuffer
	
			
			(
			
			size
			
			, 
			
			
			buffer
			
			::
			
			T
			
			) 
			
			where 
			
			
			T
			
			
    
			
			
			
			
			buffers
			
			 
			
			= 
			
			
			[
			
			buffer
			
			]
    
			
			
			
			for
			
			 
			
			
			
			i
			
			 
			
			
			
			1
			
			:
			
			
			size
			
			
        
			
			
			
			push!
			
			(
			
			buffers
			
			, 
			
			
			deepcopy
			
			(
			
			buffer
			
			)
			
			)
    
			
			
			end
			
			
    
			
			
			
			return
			
			 
			
			



			RingBuffer
	
			
			(
			
			buffers
			
			)

			
			
			end
			
			



			
			
			
			
			function
			
			 
			
			
			
			Base
			
			.
			
			
			take!
			
			(
			
			
			ringbuffer
			
			::
			



			RingBuffer
	
			
			)
    
			
			
			
			put!
			
			(
			
			
			ringbuffer
			
			.
			
			
			buffers
			
			, 
			
			
			ringbuffer
			
			.
			
			
			current
			
			)
    
			
			
			
			ringbuffer
			
			.
			
			
			
			current
			
			 
			
			= 
			
			
			take!
			
			(
			
			
			ringbuffer
			
			.
			
			
			results
			
			)
    
			
			
			
			return
			
			 
			
			
			ringbuffer
			
			.
			
			
			
			current
			
			

			
			
			end
			
			



			
			
			
			
			function
			
			 
			
			
			
			Base
			
			.
			
			
			put!
			
			(
			
			f!
			
			, 
			
			
			ringbuffer
			
			::
			



			RingBuffer
	
			
			)
    
			
			
			
			
			buf
			
			 
			
			= 
			
			
			take!
			
			(
			
			
			ringbuffer
			
			.
			
			
			buffers
			
			)
    
			
			
			
			buf_
			
			 
			
			= 
			
			
			f!
			
			(
			
			buf
			
			)
    #@assert buf_ === buf
    
			
			
			put!
			
			(
			
			
			ringbuffer
			
			.
			
			
			results
			
			, 
			
			buf_
			
			)

			
			
			end
			
			



			
			
			
			
			function
			
			 
			
			
			
			Base
			
			.
			
			
			close
			
			(
			
			
			ringbuffer
			
			::
			



			RingBuffer
	
			
			)
    
			
			
			
			close
			
			(
			
			
			ringbuffer
			
			.
			
			
			results
			
			)
    
			
			
			close
			
			(
			
			
			ringbuffer
			
			.
			
			
			buffers
			
			)

			
			end