#include "DevicesManager.hh"
/*
 * class DevicesManager
 */ 
DevicesManager::~DevicesManager() {
  m_update_order.clear();
  while( !m_devices.empty() ) {
    AbstractDevice *to_del = m_devices.front();
    m_devices.pop_front();
    delete to_del;
  }
}

AbstractDevice *DevicesManager::useDevice(Symbol const &name) const {
  return m_devices[name];
}


AbstractDevice *DevicesManager::useDevice(Symbol const &name,
					  ArgList const &args) {
  if( m_devices.exists(name) )
    return m_devices[name];
  else {
    Argument const &param = args.get(name);
    AbstractDevice *dev = m_factory->get(*param)(std::make_pair(name, &args));
    
    if( NULL!=dev ) {
      m_devices.add(name, dev);
      m_update_order.push_back(name);
    }
    return dev;
  }
}

void DevicesManager::update() {
  KeyMap<AbstractDevice *>::const_iterator i = m_devices.begin();
  KeyMap<AbstractDevice *>::const_iterator const endi = m_devices.end();

  for( ; endi!=i; ++i )
    i->second->resetUpdate();

  std::vector<Symbol>::const_iterator j = m_update_order.begin();
  std::vector<Symbol>::const_iterator const endj = m_update_order.end();
  
  for( ; endj!=j; ++j ) 
    m_devices.getRef(*j)->updateIt();    
}
