#include <algorithm>
#include <cmath>
#include <ios>
#include <iterator>
#include <iostream>
#include <string>
#include <vector>
namespace model {
struct GasStation
{
std::string name_;
bool loyalty_card_;
double price_; // Don't use doubles for currency
GasStation(std::string const& name, bool loyalty_card, double price)
:name_(name)
,loyalty_card_(loyalty_card)
,price_(price)
{
}
double getprice(int kindOfGas) const
{
return price_ + kindOfGas;
}
};
std::ostream& operator <<(std::ostream& out, GasStation const& gs)
{
out << "{\n"
<< gs.name_ << '\n'
<< std::boolalpha << gs.loyalty_card_ << '\n'
<< "$" << gs.price_ << '\n'
<< "}\n";
return out;
}
struct StationVector
{
std::vector<GasStation> localStations;
struct SortByGrade
{
int kindOfGas_;
double tolerance_;
SortByGrade(int kindOfGas)
:kindOfGas_(kindOfGas)
,tolerance_(0.0001)
{
}
bool operator() (GasStation const& L, GasStation const& R) const
{
if (::fabs(L.getprice(kindOfGas_) - R.getprice(kindOfGas_)) > tolerance_)
return L.getprice(kindOfGas_) < R.getprice(kindOfGas_);
if (L.loyalty_card_ != R.loyalty_card_)
return L.loyalty_card_ < R.loyalty_card_;
return L.name_ < R.name_;
}
};
void sortByGrade(int kindOfGas)
{
std::sort(localStations.begin(), localStations.end(), SortByGrade(kindOfGas));
}
void add(std::string const& name, bool loyalty_card, double price)
{
GasStation gs(name, loyalty_card, price);
localStations.push_back(gs);
}
void print(std::ostream& out)
{
std::copy(localStations.begin(), localStations.end(), std::ostream_iterator<GasStation>(out, "\n"));
}
};
}
int main()
{
model::StationVector sv;
sv.add("Alex's Garage", true, 1.99);
sv.add("Andy's Garage", true, 1.99);
sv.add("Dave's Garage", false, 1.99);
sv.add("Gary's Garage", false, 3.99);
sv.add("Kent's Garage", true, 2.99);
sv.add("Matt's Garage", false, 2.99);
sv.add("Mike's Garage", true, 3.99);
sv.add("Pete's Garage", true, 0.99);
std::cout << " ==== Before ==== " << std::endl;
sv.print(std::cout);
sv.sortByGrade(0);
std::cout << " ==== After ==== " << std::endl;
sv.print(std::cout);
sv.sortByGrade(0);
std::cout << " ==== After sorting again (are we stable?) ==== " << std::endl;
sv.print(std::cout);
}
I2luY2x1ZGUgPGFsZ29yaXRobT4KI2luY2x1ZGUgPGNtYXRoPgojaW5jbHVkZSA8aW9zPgojaW5jbHVkZSA8aXRlcmF0b3I+CiNpbmNsdWRlIDxpb3N0cmVhbT4KI2luY2x1ZGUgPHN0cmluZz4KI2luY2x1ZGUgPHZlY3Rvcj4KCm5hbWVzcGFjZSBtb2RlbCB7CgpzdHJ1Y3QgR2FzU3RhdGlvbgp7CiAgICBzdGQ6OnN0cmluZyBuYW1lXzsKICAgIGJvb2wgbG95YWx0eV9jYXJkXzsKICAgIGRvdWJsZSBwcmljZV87IC8vIERvbid0IHVzZSBkb3VibGVzIGZvciBjdXJyZW5jeQoKICAgIEdhc1N0YXRpb24oc3RkOjpzdHJpbmcgY29uc3QmIG5hbWUsIGJvb2wgbG95YWx0eV9jYXJkLCBkb3VibGUgcHJpY2UpCiAgICAgICAgOm5hbWVfKG5hbWUpCiAgICAgICAgLGxveWFsdHlfY2FyZF8obG95YWx0eV9jYXJkKQogICAgICAgICxwcmljZV8ocHJpY2UpCiAgICB7CiAgICB9CgogICAgZG91YmxlIGdldHByaWNlKGludCBraW5kT2ZHYXMpIGNvbnN0CiAgICB7CiAgICAgICAgcmV0dXJuIHByaWNlXyArIGtpbmRPZkdhczsKICAgIH0KfTsKCnN0ZDo6b3N0cmVhbSYgb3BlcmF0b3IgPDwoc3RkOjpvc3RyZWFtJiBvdXQsIEdhc1N0YXRpb24gY29uc3QmIGdzKQp7CiAgICBvdXQgPDwgIntcbiIKICAgICAgICA8PCBncy5uYW1lXyA8PCAnXG4nCiAgICAgICAgPDwgc3RkOjpib29sYWxwaGEgPDwgZ3MubG95YWx0eV9jYXJkXyA8PCAnXG4nCiAgICAgICAgPDwgIiQiIDw8IGdzLnByaWNlXyA8PCAnXG4nCiAgICAgICAgPDwgIn1cbiI7CiAgICByZXR1cm4gb3V0Owp9CgpzdHJ1Y3QgU3RhdGlvblZlY3Rvcgp7CiAgICBzdGQ6OnZlY3RvcjxHYXNTdGF0aW9uPiBsb2NhbFN0YXRpb25zOwoKICAgIHN0cnVjdCBTb3J0QnlHcmFkZQogICAgewogICAgICAgIGludCBraW5kT2ZHYXNfOwogICAgICAgIGRvdWJsZSB0b2xlcmFuY2VfOwoKICAgICAgICBTb3J0QnlHcmFkZShpbnQga2luZE9mR2FzKQogICAgICAgICAgICA6a2luZE9mR2FzXyhraW5kT2ZHYXMpCiAgICAgICAgICAgICAgICAsdG9sZXJhbmNlXygwLjAwMDEpCiAgICAgICAgewogICAgICAgIH0KCiAgICAgICAgYm9vbCBvcGVyYXRvcigpIChHYXNTdGF0aW9uIGNvbnN0JiBMLCBHYXNTdGF0aW9uIGNvbnN0JiBSKSBjb25zdAogICAgICAgIHsKICAgICAgICAgICAgaWYgKDo6ZmFicyhMLmdldHByaWNlKGtpbmRPZkdhc18pIC0gUi5nZXRwcmljZShraW5kT2ZHYXNfKSkgPiB0b2xlcmFuY2VfKQogICAgICAgICAgICAgICAgcmV0dXJuIEwuZ2V0cHJpY2Uoa2luZE9mR2FzXykgPCBSLmdldHByaWNlKGtpbmRPZkdhc18pOwogICAgICAgICAgICBpZiAoTC5sb3lhbHR5X2NhcmRfICE9IFIubG95YWx0eV9jYXJkXykKICAgICAgICAgICAgICAgIHJldHVybiBMLmxveWFsdHlfY2FyZF8gPCBSLmxveWFsdHlfY2FyZF87CiAgICAgICAgICAgIHJldHVybiBMLm5hbWVfIDwgUi5uYW1lXzsKICAgICAgICB9CiAgICB9OwoKICAgIHZvaWQgc29ydEJ5R3JhZGUoaW50IGtpbmRPZkdhcykgCiAgICB7CiAgICAgICAgc3RkOjpzb3J0KGxvY2FsU3RhdGlvbnMuYmVnaW4oKSwgbG9jYWxTdGF0aW9ucy5lbmQoKSwgU29ydEJ5R3JhZGUoa2luZE9mR2FzKSk7CiAgICB9CgogICAgdm9pZCBhZGQoc3RkOjpzdHJpbmcgY29uc3QmIG5hbWUsIGJvb2wgbG95YWx0eV9jYXJkLCBkb3VibGUgcHJpY2UpCiAgICB7CiAgICAgICAgR2FzU3RhdGlvbiBncyhuYW1lLCBsb3lhbHR5X2NhcmQsIHByaWNlKTsKICAgICAgICBsb2NhbFN0YXRpb25zLnB1c2hfYmFjayhncyk7CiAgICB9CgogICAgdm9pZCBwcmludChzdGQ6Om9zdHJlYW0mIG91dCkKICAgIHsKICAgICAgICBzdGQ6OmNvcHkobG9jYWxTdGF0aW9ucy5iZWdpbigpLCBsb2NhbFN0YXRpb25zLmVuZCgpLCBzdGQ6Om9zdHJlYW1faXRlcmF0b3I8R2FzU3RhdGlvbj4ob3V0LCAiXG4iKSk7CiAgICB9Cn07Cgp9CgppbnQgbWFpbigpCnsKICAgIG1vZGVsOjpTdGF0aW9uVmVjdG9yIHN2OwogICAgc3YuYWRkKCJBbGV4J3MgR2FyYWdlIiwgdHJ1ZSwgMS45OSk7CiAgICBzdi5hZGQoIkFuZHkncyBHYXJhZ2UiLCB0cnVlLCAxLjk5KTsKICAgIHN2LmFkZCgiRGF2ZSdzIEdhcmFnZSIsIGZhbHNlLCAxLjk5KTsKICAgIHN2LmFkZCgiR2FyeSdzIEdhcmFnZSIsIGZhbHNlLCAzLjk5KTsKICAgIHN2LmFkZCgiS2VudCdzIEdhcmFnZSIsIHRydWUsIDIuOTkpOwogICAgc3YuYWRkKCJNYXR0J3MgR2FyYWdlIiwgZmFsc2UsIDIuOTkpOwogICAgc3YuYWRkKCJNaWtlJ3MgR2FyYWdlIiwgdHJ1ZSwgMy45OSk7CiAgICBzdi5hZGQoIlBldGUncyBHYXJhZ2UiLCB0cnVlLCAwLjk5KTsKCiAgICBzdGQ6OmNvdXQgPDwgIiA9PT09IEJlZm9yZSA9PT09ICIgPDwgc3RkOjplbmRsOwogICAgc3YucHJpbnQoc3RkOjpjb3V0KTsKCiAgICBzdi5zb3J0QnlHcmFkZSgwKTsKCiAgICBzdGQ6OmNvdXQgPDwgIiA9PT09IEFmdGVyID09PT0gIiA8PCBzdGQ6OmVuZGw7CiAgICBzdi5wcmludChzdGQ6OmNvdXQpOwoKICAgIHN2LnNvcnRCeUdyYWRlKDApOwoKICAgIHN0ZDo6Y291dCA8PCAiID09PT0gQWZ0ZXIgc29ydGluZyBhZ2FpbiAoYXJlIHdlIHN0YWJsZT8pID09PT0gIiA8PCBzdGQ6OmVuZGw7CiAgICBzdi5wcmludChzdGQ6OmNvdXQpOwoKfQo=