/**
* @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 */