X-Git-Url: https://bilbo.iut-bm.univ-fcomte.fr/and/gitweb/loba.git/blobdiff_plain/ba8a9c5fbc92dc95fc99d8078b3474fd2fd5a043..f581799445893c1b953c365fbfb025e3dbcc775a:/named_object_list.h?ds=sidebyside diff --git a/named_object_list.h b/named_object_list.h index d3fb20c..2c691fa 100644 --- a/named_object_list.h +++ b/named_object_list.h @@ -4,6 +4,17 @@ #include #include +// Define an associative container that maps a name with a class and a +// description. All classes must be derived from a same base class. +// +// We can then use the name to create an object of the associated +// class, and to retrieve a pointer to this object. +// +// Furthermore, it is possible to iterate over the elements to get +// their name and their description. + +// I am too lazy to comment the code, which should be obvious... + //===== arity 0 ===== template @@ -13,6 +24,7 @@ protected: std::string description; creator_base(const std::string& descr): description(descr) { } creator_base(const char* descr): description(descr) { } + virtual ~creator_base() { } virtual Base* operator()() const = 0; }; @@ -56,16 +68,12 @@ public: return NULL; } - Base* new_instance(const char* name) const - { - return new_instance(std::string(name)); - } - const std::string& get_name(iterator& it) const { return it->first; } const std::string& get_descr(iterator& it) const { return it->second->description; } - size_t size() const { return assoc.size(); } + bool exists(const std::string& name) const + { return assoc.find(name) != assoc.end(); } iterator begin() const { return assoc.begin(); } iterator end() const { return assoc.end(); } @@ -73,9 +81,6 @@ public: //===== arity 2 ===== -#include -#include - template class named_object_list2 { protected: @@ -83,6 +88,7 @@ protected: std::string description; creator_base(const std::string& descr): description(descr) { } creator_base(const char* descr): description(descr) { } + virtual ~creator_base() { } virtual Base* operator()(Arg1, Arg2) const = 0; }; @@ -127,11 +133,6 @@ public: return NULL; } - Base* new_instance(const char* name, Arg1 arg1, Arg2 arg2) const - { - return new_instance(std::string(name), arg1, arg2); - } - const std::string& get_name(iterator& it) const { return it->first; } const std::string& get_descr(iterator& it) const { return it->second->description; } @@ -145,7 +146,8 @@ public: //=================== -#define THIS_INSERT(name, descr, class) insert(name, new creator(descr)) +// "NOL" like in Named_Object_List.... +#define NOL_INSERT(name, descr, class) insert(name, new creator(descr)) #endif // !NAMED_OBJECT_LIST_H