Newer
Older
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
#include <stdexcept>
#include <regex>
#include "layer_stack_builder.hh"
#include "loggers.hh"
layer_stack_builder* layer_stack_builder::_instance = NULL;
// static functions
layer_stack_builder * layer_stack_builder::get_instance()
{
return _instance ? _instance : _instance = new layer_stack_builder();
}
void layer_stack_builder::register_layer_factory(const std::string & p_type, layer_factory* p_layer_factory)
{
layer_stack_builder::get_instance()->_register_layer_factory(p_type, p_layer_factory);
}
// member functions
layer_stack_builder::layer_stack_builder()
{
}
void layer_stack_builder::_register_layer_factory(const std::string & p_type, layer_factory* p_layer_factory)
{
_layer_factories[p_type] = p_layer_factory;
}
Layer* layer_stack_builder::create_layer_stack(const char* p_layer_stack_description)
{
loggers::get_instance().log(">>> layer_stack_builder::create_layer_stack: %s", p_layer_stack_description);
Layer * entry = NULL; // Initial layer (the first declared)
Layer * up = NULL; // Upper layer
// Parse the layer description
try {
std::regex rgx ("(\\w+)(\\((.*?)\\))?(\\/|$)");
std::string str = p_layer_stack_description;
std::sregex_iterator begin(str.cbegin(), str.cend(), rgx);
std::sregex_iterator end = std::sregex_iterator();
for (std::sregex_iterator it = begin; it != end; ++it) {
std::smatch m = *it;
loggers::get_instance().log("layer_stack_builder::create_layer_stack: %d - %s - %s - %s - %s", m.size(), m[0].str().c_str(), m[1].str().c_str(), m[2].str().c_str(), m[3].str().c_str());
LayerFactoryMap::iterator i = _layer_factories.find(m[1].str());
if (i == _layer_factories.end()) {
loggers::get_instance().error("layer_stack_builder::create_layer_stack: %s: Unknown layer type", m[1].str().c_str());
}
loggers::get_instance().log("layer_stack_builder::create_layer_stack: Create layer %s, %s", m[1].str().c_str(), m[3].str().c_str());
Layer * l = i->second->create_layer(m[1].str(), m[3].str());
if (NULL == l) {
loggers::get_instance().error("layer_stack_builder::create_layer_stack: %s: Layer creation error", m[1].str().c_str());
}
loggers::get_instance().log("layer_stack_builder::create_layer_stack: Setup layers for %s", l->to_string().c_str());
l->addUpperLayer(up);
if (entry == NULL) { // Set the first declared layer
entry = l;
}
up = l; // Build the linked list of layers
} // End of 'for' statement
}
catch(const std::logic_error& e){
if(up){ // FIXME To be reviewed
up->deleteLayer();
up = NULL;
}
}
return entry;
}