int get_all_devices(const char *filename, DeviceFilter &dev_filt,
		    ConfigReader &cfg)
{
	struct file_header f_hdr;
	struct aggr_data *agg;
	int rc = 0;

	rc = get_initial_data(filename, &f_hdr, &agg, dev_filt, cfg);
	discard_aggr_data_struct(agg);
	free(agg);

	return rc;
}
 pair<double, optional<std::shared_ptr<tangent_vector> > > operator()(const double& x, const double& epsilon) const
 {
   typedef pair<double, optional<std::shared_ptr<tangent_vector> > > return_type;
   
   if (!curve_(x))
     return return_type(x, optional<std::shared_ptr<tangent_vector> >());
   
   cache_iterator_type initial_data(get_initial_data(x));
   
   if (abs(initial_data->first - x) <= epsilon)
     return return_type(initial_data->first, optional<std::shared_ptr<tangent_vector> >(initial_data->second));
   
   optional<cache_iterator_type> result(advance(*initial_data->second, initial_data->first, x));
   
   if (result)
     return return_type(x, optional<std::shared_ptr<tangent_vector> >((*result)->second));
   
   return return_type(x, optional<std::shared_ptr<tangent_vector> >());
 }
int print_summary_report(FILE *fp, char *filename, ConfigReader &cfg)
{
	int rc = 0;
	int lrc=0;
	struct file_header f_hdr;
	struct aggr_data *a_hdr;
	DeviceFilter dev_filt;

	if (get_initial_data(filename, &f_hdr, &a_hdr, dev_filt, cfg))
		return -1;

	rc += fprintf(fp, "Data Summary\n");
	rc += fprintf(fp, "------------\n");

	rc += fprintf(fp, "Aggregated range: ");
	if (a_hdr) {
		rc += fprintf(fp, "%s to ",
			      print_time_formatted(a_hdr->begin_time - f_hdr.interval_length));
		rc += fprintf(fp, "%s\n",
			      print_time_formatted(a_hdr->end_time));
	}
	else
		rc += fprintf(fp, "none\n");

	discard_aggr_data_struct(a_hdr);
	free(a_hdr);
	a_hdr = NULL;

	rc += fprintf(fp, "Detailed range:   %s to ",
		      print_time_formatted(f_hdr.begin_time - f_hdr.interval_length));
	rc += fprintf(fp, "%s\n", print_time_formatted(f_hdr.end_time));
	rc += fprintf(fp, "Interval length:  %d seconds\n",
		      f_hdr.interval_length);

	list<__u32> disks = dev_filt.get_mm_list();
	list<__u32> host_ids  = dev_filt.get_host_id_list();
	int first = 1;
	const char *frmt;
	for (list<__u32>::const_iterator i = host_ids.begin();
	      i != host_ids.end(); ++i) {
		if (first) {
			frmt = "HBA/CHPID:        0.0.%04x/%x\n";
			first = 0;
		}
		else
			frmt = "                  0.0.%04x/%x\n";
		rc += fprintf(fp, frmt, cfg.get_devno_by_host_id(*i, &lrc),
			      cfg.get_chpid_by_host_id(*i, &lrc));
		if (lrc)
			return -1;
	}

	first = 1;
	for (list<__u32>::const_iterator i = disks.begin();
	      i != disks.end(); ++i) {
		if (first) {
			frmt = "WWPN/LUN (dev):   0x%016Lx/0x%016Lx (%s)\n";
			first = 0;
		}
		else
			frmt = "                  0x%016Lx/0x%016Lx (%s)\n";
		rc += fprintf(fp, frmt, cfg.get_wwpn_by_mm_internal(*i, &lrc),
			      cfg.get_lun_by_mm_internal(*i, &lrc),
			      cfg.get_dev_by_mm_internal(*i, &lrc));
		if (lrc)
			return -1;
	}

	return rc;
}