/**
* @file symbol_container.h
* Internal container for symbols
*
* @remark Copyright 2002, 2003 OProfile authors
* @remark Read the file COPYING
*
* @author Philippe Elie
* @author John Levon
*/
#ifndef SYMBOL_CONTAINER_H
#define SYMBOL_CONTAINER_H
#include <string>
#include <set>
#include "symbol.h"
#include "symbol_functors.h"
/**
* An arbitrary container of symbols. Supports lookup
* by name, by VMA, and by file location.
*
* Lookup by name or by VMA is O(n). Lookup by file location
* is O(log(n)).
*/
class symbol_container {
public:
/// container type
typedef std::set<symbol_entry, less_symbol> symbols_t;
typedef symbols_t::size_type size_type;
/// return the number of symbols stored
size_type size() const;
/**
* Insert a new symbol. If the symbol already exists in the container,
* then the sample counts are accumulated.
* Returns the newly created symbol or the existing one. This pointer
* remains valid during the whole life time of a symbol_container
* object and is warranted unique according to less_symbol comparator.
* Can only be done before any file-location based lookups, since the
* two lookup methods are not synchronised.
*/
symbol_entry const * insert(symbol_entry const &);
/// find the symbols at the given filename and line number, if any
symbol_collection const find(debug_name_id filename, size_t linenr) const;
/// find the symbols defined in the given filename, if any
symbol_collection const find(debug_name_id filename) const;
/// find the symbol with the given image_name vma if any
symbol_entry const * find_by_vma(std::string const & image_name,
bfd_vma vma) const;
/// Search a symbol. Return NULL if not found.
symbol_entry const * find(symbol_entry const & symbol) const;
/// return start of symbols
symbols_t::iterator begin();
/// return end of symbols
symbols_t::iterator end();
private:
/// build the symbol by file-location cache
void build_by_loc() const;
/**
* The main container of symbols. Multiple symbols with the same
* name are allowed.
*/
symbols_t symbols;
/**
* Differently-named symbol at same file location are allowed e.g.
* template instantiation.
*/
typedef std::multiset<symbol_entry const *, less_by_file_loc>
symbols_by_loc_t;
// must be declared after the set to ensure a correct life-time.
/**
* Symbols sorted by location order. Lazily built on request,
* so mutable.
*/
mutable symbols_by_loc_t symbols_by_loc;
};
#endif /* SYMBOL_CONTAINER_H */