• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /**
2  * @file comma_list.h
3  * Container holding items from a list of comma separated items
4  *
5  * @remark Copyright 2003 OProfile authors
6  * @remark Read the file COPYING
7  *
8  * @author Philippe Elie
9  */
10 
11 #ifndef COMMA_LIST_H
12 #define COMMA_LIST_H
13 
14 #include <string>
15 #include <vector>
16 
17 #include "string_manip.h"
18 
19 /**
20  * hold a list of item of type T, tracking also if item has been set.
21  */
22 template <class T>
23 class comma_list
24 {
25 public:
26 	comma_list();
27 
28 	/**
29 	 * @param str  list of comma separated item
30 	 *
31 	 * setup items array according to str parameters. Implement PP:3.17
32 	 * w/o restriction on charset and with the special string all which
33 	 * match anything.
34 	 */
35 	void set(std::string const & str);
36 
37 	/// return true if a specific value is held by this container
is_set()38 	bool is_set() const {
39 		return !is_all;
40 	}
41 
42 	/**
43 	 * @param value  the value to test
44 	 *
45 	 * return true if value match one the stored value in items
46 	 */
47 	bool match(T const & value) const;
48 
49 private:
50 	typedef T value_type;
51 	typedef std::vector<value_type> container_type;
52 	typedef typename container_type::const_iterator const_iterator;
53 	bool is_all;
54 	container_type items;
55 };
56 
57 
58 template <class T>
comma_list()59 comma_list<T>::comma_list()
60 	: is_all(true)
61 {
62 }
63 
64 
65 template <class T>
set(std::string const & str)66 void comma_list<T>::set(std::string const & str)
67 {
68 	items.clear();
69 
70 	is_all = false;
71 
72 	std::vector<std::string> result = separate_token(str, ',');
73 	for (size_t i = 0 ; i < result.size() ; ++i) {
74 		if (result[i] == "all") {
75 			is_all = true;
76 			items.clear();
77 			break;
78 		}
79 		items.push_back(op_lexical_cast<T>(result[i]));
80 	}
81 }
82 
83 
84 template <class T>
match(T const & value)85 bool comma_list<T>::match(T const & value) const
86 {
87 	if (is_all)
88 		return true;
89 
90 	const_iterator cit = items.begin();
91 	const_iterator const end = items.end();
92 
93 	for (; cit != end; ++cit) {
94 		if (value == *cit)
95 			return true;
96 	}
97 
98 	return false;
99 }
100 
101 
102 #endif /* !COMMA_LIST_H */
103