Sales_data.h

an anonymous user · March 21, 2023
#ifndef SALES_DATA_H
#define SALES_DATA_H

#include <iostream>
#include <string>

class Sales_data
{
	friend std::ostream& operator<<(std::ostream&, const Sales_data&);
	friend std::istream& operator>>(std::istream&, Sales_data&);
	friend Sales_data operator+(const Sales_data&, const Sales_data&);
	friend bool operator==(const Sales_data&, const Sales_data&);
	friend bool operator!=(const Sales_data&, const Sales_data&);

public:
	Sales_data() : Sales_data("", 0, 0) {};
	explicit Sales_data(const std::string& s) : Sales_data(s, 0, 0) {}
	explicit Sales_data(std::istream& is) : Sales_data() { is >> *this; }
	Sales_data(const std::string& s, unsigned n, double p) : book_no(s), units_sold(n), revenue(p*n) {}
	std::string isbn() const { return book_no; }
	Sales_data operator+=(const Sales_data&);
private:
	inline double avg_price() const { return units_sold ? revenue / units_sold : 0; };
	std::string book_no;
	unsigned units_sold = 0;
	double revenue = 0.0;
};

std::ostream& operator<<(std::ostream& os, const Sales_data& item)
{
	os << item.isbn() << " " << item.units_sold << " " << item.revenue << " " << item.avg_price();
	return os;
}

std::istream& operator>>(std::istream& is, Sales_data& item)
{
	double price;
	is >> item.book_no >> item.units_sold >> price;
	if (is)
	{
		item.revenue = item.units_sold * price;
	}
	else
	{
		item = Sales_data();
	}
	return is;
}

Sales_data operator+(const Sales_data& lhs, const Sales_data& rhs)
{
	Sales_data sum = lhs;
	sum += rhs;
	return sum;
}

Sales_data Sales_data::operator+=(const Sales_data& rhs)
{
	units_sold += rhs.units_sold;
	revenue += rhs.revenue;
	return *this;
}

bool operator==(const Sales_data& lhs, const Sales_data& rhs)
{
	return lhs.isbn() == rhs.isbn() && lhs.units_sold == rhs.units_sold && lhs.revenue == rhs.revenue;
}

bool operator!=(const Sales_data& lhs, const Sales_data& rhs)
{
	return !(lhs == rhs);
}

#endif
Output

Comments

Please sign up or log in to contribute to the discussion.