#include #include #include #include #include "polygon.h" // Only one of the constructors required! Polygon::Polygon(std::initializer_list l) : sides{} { for ( int i : l ) { sides.push_back(i); } validate(); } Polygon::Polygon(int a, int b) : sides{a, b} { validate(); } Polygon& Polygon::operator+=(int rhs) { sides.push_back(rhs); validate(); return *this; } Polygon Polygon::operator+(int rhs) const { Polygon ret{*this}; ret += rhs; return ret; } double Polygon::circumference() const { int sum{0}; for ( int i : sides ) { sum += i; } return sum + max_side(); } std::ostream& Polygon::print(std::ostream& os) const { os << '['; for ( int i : sides ) { os << i << ", "; } return os << max_side() << ']'; } int Polygon::max_side() const { int max{0}; for ( int i : sides ) { if ( i > max ) max = i; } return max; } void Polygon::validate() const { for ( int i : sides ) { if ( i <= 0 ) { throw std::invalid_argument("Bad polygon: Sides must be > 0.0"); } } if ( sides.size() < 2 ) { throw std::invalid_argument("Bad polygon: To few sides"); } } Polygon operator+(int lhs, Polygon const& rhs) { return rhs + lhs; } std::ostream& operator<<(std::ostream& os, Polygon const& rhs) { return rhs.print(os); }