#include #include class Inventory_Space { public: Inventory_Space(int* obj = nullptr); ~Inventory_Space(); Inventory_Space(Inventory_Space const& rhs); Inventory_Space(Inventory_Space && rhs); Inventory_Space& operator=(Inventory_Space const& rhs) = delete; Inventory_Space& operator=(Inventory_Space && rhs) = delete; Inventory_Space& merge(Inventory_Space& rhs); void print() const; private: int* content; }; Inventory_Space::Inventory_Space(int* obj) : content{obj} { } Inventory_Space::~Inventory_Space() { delete content; } Inventory_Space::Inventory_Space(Inventory_Space const& rhs) : content{new int {*(rhs.content)}} { } Inventory_Space::Inventory_Space(Inventory_Space && rhs) : content{rhs.content} { rhs.content = nullptr; } Inventory_Space& Inventory_Space::merge(Inventory_Space& rhs) { if ( this == &rhs ) { return *this; } if ( content == nullptr ) { std::swap(content, rhs.content); } else if ( rhs.content != nullptr ) { if ( *content == *rhs.content ) { ++*content; delete rhs.content; rhs.content = nullptr; } } return *this; } void Inventory_Space::print() { if ( content != nullptr ) { std::cout << *content; } else { std::cout << '-'; } } int main() { std::vector v {}; // Create 8 spaces for ( unsigned int i{}; i < 8; ++i ) { v.push_back(Inventory_Space{new int{1}}); } for ( unsigned int i{0}; i < v.size(); ++i ) { // Merge each space with the next. Empty spaces will "bubble" to // the end as each iteration drop the next space into it. for ( unsigned int j{1}; j < v.size(); ++j ) { v.at(j-1).merge( v.at(j) ); } // Print all spaces after each iteration (one line of output) for ( unsigned int k{0}; k < v.size(); ++k ) { v.at(k).print(); } std::cout << std::endl; } return 0; }