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

Private GIT Repository
03bf00d024a3f267465d3dae4151b5aa28b7551c
[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     size_t size() const          { return assoc.size();  }
69     iterator begin() const       { return assoc.begin(); }
70     iterator end() const         { return assoc.end();   }
71
72 };
73
74 //===== arity 2 =====
75
76 #include <map>
77 #include <string>
78
79 template <typename Base, typename Arg1, typename Arg2>
80 class named_object_list2 {
81 protected:
82     struct creator_base {
83         std::string description;
84         creator_base(const std::string& descr): description(descr) { }
85         creator_base(const char* descr): description(descr) { }
86         virtual Base* operator()(Arg1, Arg2) const = 0;
87     };
88
89     template <typename Derived>
90     struct creator: public creator_base {
91         creator(const std::string& descr): creator_base(descr) { }
92         creator(const char* descr): creator_base(descr) { }
93         Base* operator()(Arg1 arg1, Arg2 arg2) const
94         { return new Derived(arg1, arg2); }
95     };
96
97     typedef std::map<std::string, const creator_base*> map_type;
98
99     map_type assoc;
100
101     void insert(const std::string& name, const creator_base* creat)
102     {
103         assoc.insert(std::make_pair(name, creat));
104     }
105
106     void insert(const char* name, const creator_base* creat)
107     {
108         assoc.insert(std::make_pair(std::string(name), creat));
109     }
110
111 public:
112     typedef typename map_type::const_iterator iterator;
113
114     named_object_list2() { };
115     ~named_object_list2()
116     {
117         for (iterator it = begin(); it != end(); ++it)
118             delete it->second;
119     }
120
121     Base* new_instance(const std::string& name, Arg1 arg1, Arg2 arg2) const
122     {
123         iterator it = assoc.find(name);
124         if (it != assoc.end())
125             return (*it->second)(arg1, arg2);
126         else
127             return NULL;
128     }
129
130     Base* new_instance(const char* name, Arg1 arg1, Arg2 arg2) const
131     {
132         return new_instance(std::string(name), arg1, arg2);
133     }
134
135     const std::string& get_name(iterator& it) const { return it->first; }
136     const std::string& get_descr(iterator& it) const
137     { return it->second->description; }
138
139     bool exists(const std::string& name) const
140     { return assoc.find(name) != assoc.end(); }
141     iterator begin() const       { return assoc.begin(); }
142     iterator end() const         { return assoc.end();   }
143
144 };
145
146 //===================
147
148 #define NOL_INSERT(name, descr, class) insert(name, new creator<class>(descr))
149
150 #endif // !NAMED_OBJECT_LIST_H
151
152 // Local variables:
153 // mode: c++
154 // End: