mirror of
				https://github.com/superseriousbusiness/gotosocial.git
				synced 2025-11-03 21:52:25 -06:00 
			
		
		
		
	
		
			
	
	
		
			47 lines
		
	
	
	
		
			845 B
		
	
	
	
		
			Go
		
	
	
	
	
	
		
		
			
		
	
	
			47 lines
		
	
	
	
		
			845 B
		
	
	
	
		
			Go
		
	
	
	
	
	
| 
								 | 
							
								package pools
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								import (
							 | 
						||
| 
								 | 
							
									"sync"
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									"codeberg.org/gruf/go-bytes"
							 | 
						||
| 
								 | 
							
								)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								// BufferPool is a pooled allocator for bytes.Buffer objects
							 | 
						||
| 
								 | 
							
								type BufferPool interface {
							 | 
						||
| 
								 | 
							
									// Get fetches a bytes.Buffer from pool
							 | 
						||
| 
								 | 
							
									Get() *bytes.Buffer
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									// Put places supplied bytes.Buffer in pool
							 | 
						||
| 
								 | 
							
									Put(*bytes.Buffer)
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								// NewBufferPool returns a newly instantiated bytes.Buffer pool
							 | 
						||
| 
								 | 
							
								func NewBufferPool(size int) BufferPool {
							 | 
						||
| 
								 | 
							
									return &bufferPool{
							 | 
						||
| 
								 | 
							
										pool: sync.Pool{
							 | 
						||
| 
								 | 
							
											New: func() interface{} {
							 | 
						||
| 
								 | 
							
												return &bytes.Buffer{B: make([]byte, 0, size)}
							 | 
						||
| 
								 | 
							
											},
							 | 
						||
| 
								 | 
							
										},
							 | 
						||
| 
								 | 
							
										size: size,
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								// bufferPool is our implementation of BufferPool
							 | 
						||
| 
								 | 
							
								type bufferPool struct {
							 | 
						||
| 
								 | 
							
									pool sync.Pool
							 | 
						||
| 
								 | 
							
									size int
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								func (p *bufferPool) Get() *bytes.Buffer {
							 | 
						||
| 
								 | 
							
									return p.pool.Get().(*bytes.Buffer)
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								func (p *bufferPool) Put(buf *bytes.Buffer) {
							 | 
						||
| 
								 | 
							
									if buf.Cap() < p.size {
							 | 
						||
| 
								 | 
							
										return
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
									buf.Reset()
							 | 
						||
| 
								 | 
							
									p.pool.Put(buf)
							 | 
						||
| 
								 | 
							
								}
							 |