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

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