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