18cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd/**
28cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * @file generic_spec.h
38cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * Container holding an item or a special "match all" item
48cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd *
58cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * @remark Copyright 2003 OProfile authors
68cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * @remark Read the file COPYING
78cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd *
88cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * @author John Levon
98cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * @author Philippe Elie
108cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd */
118cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
128cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#ifndef GENERIC_SPEC_H
138cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#define GENERIC_SPEC_H
148cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
158cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#include <stdexcept>
168cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#include <string>
178cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#include <sstream>
188cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
198cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#include "string_manip.h"
208cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
218cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
228cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd/**
238cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * used to hold something like { int cpu_nr, bool is_all };
248cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * to store a sub part of a samples filename see PP:3.21.
258cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd */
268cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddtemplate <class T>
278cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddclass generic_spec
288cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd{
298cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddpublic:
308cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	/**
318cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	 * build a default spec which match anything
328cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	 */
338cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	generic_spec();
348cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
358cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	/// build a spec from a string, valid argument are "all"
368cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	/// or a string convertible to T through istringtream(str) >> data
378cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	/// conversion is strict, no space are allowed at begin or end of str
388cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	void set(std::string const &);
398cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
408cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	/// return true if a specific value is held by this container
418cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	bool is_set() const {
428cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		return !is_all;
438cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	}
448cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
458cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	/// return the specific value (only if is_set() == true)
468cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	T const value() const {
478cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		if (!is_all)
488cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			return data;
498cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		throw std::out_of_range("generic_spec holds no value");
508cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	}
518cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
528cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	/// return true if rhs match this spec. Sub part of PP:3.24
538cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	bool match(T const & rhs) const {
548cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		return rhs == data;
558cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	}
568cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
578cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	/// return true if rhs match this spec. Sub part of PP:3.24
588cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	bool match(generic_spec<T> const & rhs) const {
598cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		return is_all || rhs.is_all || rhs.data == data;
608cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	}
618cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
628cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddprivate:
638cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	T data;
648cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	bool is_all;
658cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd};
668cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
678cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
688cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddtemplate <class T>
698cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddgeneric_spec<T>::generic_spec()
708cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	:
718cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	data(T()),
728cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	is_all(true)
738cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd{
748cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd}
758cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
768cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
778cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddtemplate <class T>
788cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddvoid generic_spec<T>::set(std::string const & str)
798cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd{
808cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	if (str == "all") {
818cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		is_all = true;
828cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		return;
838cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	}
848cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
858cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	is_all = false;
868cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	data = op_lexical_cast<T>(str);
878cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd}
888cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
898cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
908cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd/// We don't use generic_spec<string>, since it's probably an error to try
918cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd/// to use generic_spec<string> we specialize but don't define it to get a
928cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd/// link error (using generic_spec<string> is problematic because g.set("all")
938cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd/// is ambiguous)
948cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddtemplate <>
958cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddvoid generic_spec<std::string>::set(std::string const & str);
968cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
978cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#endif /* !GENERIC_SPEC_H */
98