LayerFactory.cc 1.61 KB
Newer Older
#include <stdexcept>
#include <regex>
filatov's avatar
filatov committed

garciay's avatar
garciay committed
#include "loggers.hh"

LayerStackBuilder * LayerStackBuilder::_instance = NULL;

// static functions
LayerStackBuilder * LayerStackBuilder::GetInstance()
{
  return _instance ? _instance : _instance=new LayerStackBuilder();
}
void LayerStackBuilder::RegisterLayerFactory(const std::string & type, LayerFactory * f)
{
	LayerStackBuilder::GetInstance()->registerLayerFactory(type, f);
}

// member functions
LayerStackBuilder::LayerStackBuilder()
{
void LayerStackBuilder::registerLayerFactory(const std::string & type, LayerFactory * f)
filatov's avatar
filatov committed
{
  _fs[type] = f;
}

Layer* LayerStackBuilder::createLayerStack(const char* s)
filatov's avatar
filatov committed
{
garciay's avatar
garciay committed
    loggers::loggers::log(">>> LayerStackBuilder::createLayerStack: %s", s);
garciay's avatar
garciay committed
	Layer * up = NULL;
	//parse str
	std::regex rgx ("(\\w+)(\\((.*?)\\))?(\\/|$)");
	std::smatch m;
	std::string str = s;
	try {
		while(std::regex_search(str, m, rgx)) {
			std::string mname = m[1];
garciay's avatar
garciay committed
			loggers::loggers::log("LayerStackBuilder::createLayerStack: mname=%s", mname);
			LayerFactoryMap::iterator it =_fs.find(mname);
			if(it == _fs.end()){
				throw (std::logic_error(mname + ": Unknown layer type"));
			}
			// TODO: parse parameters
garciay's avatar
garciay committed
			loggers::loggers::log("LayerStackBuilder::createLayerStack: Create layer %s", it->first);
			Layer * l = it->second->createLayer(mname, m[3]);
			if(NULL == l){
				throw (std::logic_error(mname + ": Layer creation error"));
			}

			l->addUpperLayer(up);
			up = l;
		}
	}
	catch(const std::logic_error& e){
		if(up){
			up->deleteLayer();
			up = NULL;
		}
	}
	return up;
filatov's avatar
filatov committed
}