]> AND Private Git Repository - loba.git/blob - named_object_list.h
Logo AND Algorithmique Numérique Distribuée

Private GIT Repository
Cosmetics: sort topologies in source files.
[loba.git] / named_object_list.h
1 #ifndef NAMED_OBJECT_LIST_H
2 #define NAMED_OBJECT_LIST_H
3
4 #include <map>
5 #include <string>
6
7 //===== arity 0 =====
8
9 template <typename Base>
10 class named_object_list {
11 protected:
12     struct creator_base {
13         std::string description;
14         creator_base(const std::string& descr): description(descr) { }
15         creator_base(const char* descr): description(descr) { }
16         virtual Base* operator()() const = 0;
17     };
18
19     template <typename Derived>
20     struct creator: public creator_base {
21         creator(const std::string& descr): creator_base(descr) { }
22         creator(const char* descr): creator_base(descr) { }
23         Base* operator()() const { return new Derived(); }
24     };
25
26     typedef std::map<std::string, const creator_base*> map_type;
27
28     map_type assoc;
29
30     void insert(const std::string& name, const creator_base* creat)
31     {
32         assoc.insert(std::make_pair(name, creat));
33     }
34
35     void insert(const char* name, const creator_base* creat)
36     {
37         assoc.insert(std::make_pair(std::string(name), creat));
38     }
39
40 public:
41     typedef typename map_type::const_iterator iterator;
42
43     named_object_list() { };
44     ~named_object_list()
45     {
46         for (iterator it = begin(); it != end(); ++it)
47             delete it->second;
48     }
49
50     Base* new_instance(const std::string& name) const
51     {
52         iterator it = assoc.find(name);
53         if (it != assoc.end())
54             return (*it->second)();
55         else
56             return NULL;
57     }
58
59     Base* new_instance(const char* name) const
60     {
61         return new_instance(std::string(name));
62     }
63
64     const std::string& get_name(iterator& it) const { return it->first; }
65     const std::string& get_descr(iterator& it) const
66     { return it->second->description; }
67
68     bool exists(const std::string& name) const
69     { return assoc.find(name) != assoc.end(); }
70     iterator begin() const       { return assoc.begin(); }
71     iterator end() const         { return assoc.end();   }
72
73 };
74
75 //===== arity 2 =====
76
77 #include <map>
78 #include <string>
79
80 template <typename Base, typename Arg1, typename Arg2>
81 class named_object_list2 {
82 protected:
83     struct creator_base {
84         std::string description;
85         creator_base(const std::string& descr): description(descr) { }
86         creator_base(const char* descr): description(descr) { }
87         virtual Base* operator()(Arg1, Arg2) const = 0;
88     };
89
90     template <typename Derived>
91     struct creator: public creator_base {
92         creator(const std::string& descr): creator_base(descr) { }
93         creator(const char* descr): creator_base(descr) { }
94         Base* operator()(Arg1 arg1, Arg2 arg2) const
95         { return new Derived(arg1, arg2); }
96     };
97
98     typedef std::map<std::string, const creator_base*> map_type;
99
100     map_type assoc;
101
102     void insert(const std::string& name, const creator_base* creat)
103     {
104         assoc.insert(std::make_pair(name, creat));
105     }
106
107     void insert(const char* name, const creator_base* creat)
108     {
109         assoc.insert(std::make_pair(std::string(name), creat));
110     }
111
112 public:
113     typedef typename map_type::const_iterator iterator;
114
115     named_object_list2() { };
116     ~named_object_list2()
117     {
118         for (iterator it = begin(); it != end(); ++it)
119             delete it->second;
120     }
121
122     Base* new_instance(const std::string& name, Arg1 arg1, Arg2 arg2) const
123     {
124         iterator it = assoc.find(name);
125         if (it != assoc.end())
126             return (*it->second)(arg1, arg2);
127         else
128             return NULL;
129     }
130
131     Base* new_instance(const char* name, Arg1 arg1, Arg2 arg2) const
132     {
133         return new_instance(std::string(name), arg1, arg2);
134     }
135
136     const std::string& get_name(iterator& it) const { return it->first; }
137     const std::string& get_descr(iterator& it) const
138     { return it->second->description; }
139
140     bool exists(const std::string& name) const
141     { return assoc.find(name) != assoc.end(); }
142     iterator begin() const       { return assoc.begin(); }
143     iterator end() const         { return assoc.end();   }
144
145 };
146
147 //===================
148
149 #define NOL_INSERT(name, descr, class) insert(name, new creator<class>(descr))
150
151 #endif // !NAMED_OBJECT_LIST_H
152
153 // Local variables:
154 // mode: c++
155 // End: