/**
 * @file filename_spec.h
 * Container holding a sample filename split into its components
 *
 * @remark Copyright 2003 OProfile authors
 * @remark Read the file COPYING
 *
 * @author Philippe Elie
 */

#ifndef FILENAME_SPEC_H
#define FILENAME_SPEC_H

#include <unistd.h>
#include <string>

#include "generic_spec.h"

class profile_spec;
class extra_images;

/**
 * A class to split and store components of a sample filename.
 * These derived values are then used to match against a
 * profile_spec as given by the user.
 */
class filename_spec
{
	friend class profile_spec;

public:
	/**
	 * @param filename  the samples filename
	 * @param extra  extra binary image location
	 *
	 * build a filename_spec from a samples filename
	 */
	filename_spec(std::string const & filename,
		      extra_images const & extra);

	filename_spec();

	/**
	 * @param filename  a sample filename
	 * @param extra  extra binary image location
	 *
	 * setup filename spec according to the samples filename. PP:3.19 to
	 * 3.25
	 */
	void set_sample_filename(std::string const & filename,
				 extra_images const & extra);

	/**
	 * @param rhs  right hand side of the match operator
	 * @param binary  if binary is non-empty, and matches
	 * the binary or lib name, use it rather than the
	 * one in rhs.
	 *
	 * return true if *this match rhs, matching if:
	 *  - image_name are identical
	 *  - lib_name are identical
	 *  - event_spec match
	 *
	 * This operation is not commutative. First part of PP:3.24
	 */
	bool match(filename_spec const & rhs,
	           std::string const & binary) const;

	bool is_dependent() const;

private:
	std::string image;
	std::string lib_image;
	std::string cg_image;
	std::string event;
	int count;
	unsigned int unitmask;
	generic_spec<pid_t> tgid;
	generic_spec<pid_t> tid;
	generic_spec<int> cpu;
};


#endif /* !FILENAME_SPEC_H */