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 */
22template <class T>
23class comma_list
24{
25public:
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
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
49private:
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
58template <class T>
59comma_list<T>::comma_list()
60	: is_all(true)
61{
62}
63
64
65template <class T>
66void 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
84template <class T>
85bool 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