Home | History | Annotate | Download | only in libpp
      1 /**
      2  * @file name_storage.h
      3  * Type-safe unique storage of global names (filenames and symbols)
      4  *
      5  * @remark Copyright 2002 OProfile authors
      6  * @remark Read the file COPYING
      7  *
      8  * @author Philippe Elie
      9  * @author John Levon
     10  */
     11 
     12 #ifndef NAME_STORAGE_H
     13 #define NAME_STORAGE_H
     14 
     15 #include <string>
     16 
     17 #include "unique_storage.h"
     18 
     19 class extra_images;
     20 
     21 /// store original name and processed name
     22 struct stored_name {
     23 	stored_name(std::string const & n = std::string())
     24 		: name(n) {}
     25 
     26 	bool operator<(stored_name const & rhs) const {
     27 		return name < rhs.name;
     28 	}
     29 
     30 	std::string name;
     31 	mutable std::string name_processed;
     32 };
     33 
     34 
     35 /// partial specialization for unique storage of names
     36 template <typename I> struct name_storage : unique_storage<I, stored_name> {
     37 
     38 	typedef typename unique_storage<I, stored_name>::id_value id_value;
     39 
     40 	std::string const & name(id_value const & id) const {
     41 		return unique_storage<I, stored_name>::get(id).name;
     42 	}
     43 };
     44 
     45 
     46 class debug_name_tag;
     47 /// a debug filename
     48 typedef name_storage<debug_name_tag>::id_value debug_name_id;
     49 
     50 /// class storing a set of shared debug name (source filename)
     51 struct debug_name_storage : name_storage<debug_name_tag> {
     52 	/// return the basename for the given ID
     53 	std::string const & basename(debug_name_id id) const;
     54 };
     55 
     56 /// store original name and processed name
     57 struct stored_filename {
     58 	stored_filename(std::string const & n = std::string())
     59 		: filename(n), extra_images_uid(0) {}
     60 
     61 	bool operator<(stored_filename const & rhs) const {
     62 		return filename < rhs.filename;
     63 	}
     64 
     65 	std::string filename;
     66 	mutable std::string base_filename;
     67 	mutable std::string real_filename;
     68 	mutable std::string real_base_filename;
     69 	mutable int extra_images_uid;
     70 };
     71 
     72 /// partial specialization for unique storage of filenames
     73 template <typename I>
     74 struct filename_storage : unique_storage<I, stored_filename> {
     75 
     76 	typedef typename unique_storage<I, stored_filename>::id_value id_value;
     77 
     78 	std::string const & name(id_value const & id) const {
     79 		return unique_storage<I, stored_filename>::get(id).filename;
     80 	}
     81 };
     82 
     83 class image_name_tag;
     84 /// an image name
     85 typedef filename_storage<image_name_tag>::id_value image_name_id;
     86 
     87 /// class storing a set of shared image name
     88 struct image_name_storage : filename_storage<image_name_tag> {
     89 	enum image_name_type {
     90 		/// image name based on the sample filename w/o path
     91 		int_basename,
     92 		/// image name based on the sample filename
     93 		int_filename,
     94 		/// real image name, can be different for module.
     95 		int_real_basename,
     96 		/// same as int_real_basename + the complete path, including an
     97 		/// optionnal archive_path passed trough profile_spec
     98 		int_real_filename,
     99 	};
    100 
    101 	/**
    102 	 * @param id  the image name id
    103 	 * @param type  the image name type
    104 	 * @param extra  extra locations where the image can be found
    105 	 *
    106 	 * If type == int_real_name (resp. int_real_filename) and the image
    107 	 * can't be located the return value is the same as if get_name()
    108 	 * was called with int_name (resp. int_filename).
    109 	 *
    110 	 * multiple call with the image_name_id and different extra parameter
    111 	 * will throw a runtime error, multiple extra_images are possible
    112 	 * with differential profile but the name. FIXME
    113 	 */
    114 	std::string const & get_name(image_name_id id,
    115 				     image_name_type type,
    116 				     extra_images const & extra) const;
    117 
    118 	/// return the basename name for the given ID
    119 	std::string const & basename(image_name_id) const;
    120 };
    121 
    122 
    123 class symbol_name_tag;
    124 /// a (demangled) symbol
    125 typedef name_storage<symbol_name_tag>::id_value symbol_name_id;
    126 
    127 /// class storing a set of shared symbol name
    128 struct symbol_name_storage : name_storage<symbol_name_tag> {
    129 	/// return the demangled name for the given ID
    130 	std::string const & demangle(symbol_name_id id) const;
    131 };
    132 
    133 
    134 /// for images
    135 extern image_name_storage image_names;
    136 
    137 /// for debug filenames i.e. source filename
    138 extern debug_name_storage debug_names;
    139 
    140 /// for symbols
    141 extern symbol_name_storage symbol_names;
    142 
    143 
    144 /**
    145  * debug name specialisation for comparison.
    146  *
    147  * We compare by name rather by id since what user will see are
    148  * filename and when the criteria "samples count" give identical
    149  * result it's better to obtain result sorted by the user visible
    150  * property filename rather than by an obscure, invisible from user
    151  * point of view, file identifier property
    152  */
    153 template<> inline bool
    154 debug_name_id::operator<(debug_name_id const & rhs) const
    155 {
    156 	return debug_names.name(*this) < debug_names.name(rhs);
    157 }
    158 
    159 #endif /* !NAME_STORAGE_H */
    160