/** * @file sample_container.h * Internal implementation of sample container * * @remark Copyright 2002 OProfile authors * @remark Read the file COPYING * * @author Philippe Elie * @author John Levon */ #ifndef SAMPLE_CONTAINER_H #define SAMPLE_CONTAINER_H #include <map> #include <set> #include <string> #include "symbol.h" #include "symbol_functors.h" /** * Arbitrary container of sample entries. Can return * number of samples for a file or line number and * return the particular sample information for a VMA. */ class sample_container { typedef std::pair<symbol_entry const *, bfd_vma> sample_index_t; public: typedef std::map<sample_index_t, sample_entry> samples_storage; typedef samples_storage::const_iterator samples_iterator; /// return iterator to the first samples for this symbol samples_iterator begin(symbol_entry const *) const; /// return iterator to the last samples for this symbol samples_iterator end(symbol_entry const *) const; /// return iterator to the first samples samples_iterator begin() const; /// return iterator to the last samples samples_iterator end() const; /// insert a sample entry by creating a new entry or by cumulating /// samples into an existing one. Can only be done before any lookups void insert(symbol_entry const * symbol, sample_entry const &); /// return nr of samples in the given filename count_array_t accumulate_samples(debug_name_id filename_id) const; /// return nr of samples at the given line nr in the given file count_array_t accumulate_samples(debug_name_id, size_t linenr) const; /// return the sample entry for the given image_name and vma if any sample_entry const * find_by_vma(symbol_entry const * symbol, bfd_vma vma) const; private: /// build the symbol by file-location cache void build_by_loc() const; /// main sample entry container samples_storage samples; typedef std::multiset<sample_entry const *, less_by_file_loc> samples_by_loc_t; // must be declared after the samples_storage to ensure a // correct life-time. /** * Sample entries by file location. Lazily built when necessary, * so mutable. */ mutable samples_by_loc_t samples_by_loc; }; #endif /* SAMPLE_CONTAINER_H */