Skip to content
Snippets Groups Projects
client_manager.go 1.07 KiB
Newer Older
  • Learn to ignore specific revisions
  • package routingtable
    
    
    // ClientManager manages clients of routing tables (observer pattern)
    
    type ClientManager struct {
    
    	clients map[RouteTableClient]struct{} // Ensures a client registers at most once
    
    Oliver Herms's avatar
    Oliver Herms committed
    	master  RouteTableClient
    
    }
    
    // NewClientManager creates and initializes a new client manager
    
    Oliver Herms's avatar
    Oliver Herms committed
    func NewClientManager(master RouteTableClient) ClientManager {
    
    	return ClientManager{
    		clients: make(map[RouteTableClient]struct{}, 0),
    
    Oliver Herms's avatar
    Oliver Herms committed
    		master:  master,
    
    // Register registers a client for updates
    
    func (c *ClientManager) Register(client RouteTableClient) {
    	if c.clients == nil {
    		c.clients = make(map[RouteTableClient]struct{}, 0)
    	}
    	c.clients[client] = struct{}{}
    
    Oliver Herms's avatar
    Oliver Herms committed
    	c.master.UpdateNewClient(client)
    
    // Unregister unregisters a client
    
    func (c *ClientManager) Unregister(client RouteTableClient) {
    	if _, ok := c.clients[client]; !ok {
    		return
    	}
    	delete(c.clients, client)
    }
    
    
    // Clients returns a list of registered clients
    
    Oliver Herms's avatar
    Oliver Herms committed
    func (c *ClientManager) Clients() []RouteTableClient {
    	ret := make([]RouteTableClient, 0)
    
    	for rtc := range c.clients {
    		ret = append(ret, rtc)
    	}
    
    	return ret
    }