| /** |
| * @file comma_list.h |
| * Container holding items from a list of comma separated items |
| * |
| * @remark Copyright 2003 OProfile authors |
| * @remark Read the file COPYING |
| * |
| * @author Philippe Elie |
| */ |
| |
| #ifndef COMMA_LIST_H |
| #define COMMA_LIST_H |
| |
| #include <string> |
| #include <vector> |
| |
| #include "string_manip.h" |
| |
| /** |
| * hold a list of item of type T, tracking also if item has been set. |
| */ |
| template <class T> |
| class comma_list |
| { |
| public: |
| comma_list(); |
| |
| /** |
| * @param str list of comma separated item |
| * |
| * setup items array according to str parameters. Implement PP:3.17 |
| * w/o restriction on charset and with the special string all which |
| * match anything. |
| */ |
| void set(std::string const & str); |
| |
| /// return true if a specific value is held by this container |
| bool is_set() const { |
| return !is_all; |
| } |
| |
| /** |
| * @param value the value to test |
| * |
| * return true if value match one the stored value in items |
| */ |
| bool match(T const & value) const; |
| |
| private: |
| typedef T value_type; |
| typedef std::vector<value_type> container_type; |
| typedef typename container_type::const_iterator const_iterator; |
| bool is_all; |
| container_type items; |
| }; |
| |
| |
| template <class T> |
| comma_list<T>::comma_list() |
| : is_all(true) |
| { |
| } |
| |
| |
| template <class T> |
| void comma_list<T>::set(std::string const & str) |
| { |
| items.clear(); |
| |
| is_all = false; |
| |
| std::vector<std::string> result = separate_token(str, ','); |
| for (size_t i = 0 ; i < result.size() ; ++i) { |
| if (result[i] == "all") { |
| is_all = true; |
| items.clear(); |
| break; |
| } |
| items.push_back(op_lexical_cast<T>(result[i])); |
| } |
| } |
| |
| |
| template <class T> |
| bool comma_list<T>::match(T const & value) const |
| { |
| if (is_all) |
| return true; |
| |
| const_iterator cit = items.begin(); |
| const_iterator const end = items.end(); |
| |
| for (; cit != end; ++cit) { |
| if (value == *cit) |
| return true; |
| } |
| |
| return false; |
| } |
| |
| |
| #endif /* !COMMA_LIST_H */ |