#include "Map.hpp" #include // basically an int wrapper class MyKeyType { private: int val; public: // not default constructable, not copy assignable, not move assignable MyKeyType() = delete; MyKeyType &operator=(const MyKeyType &) = delete; MyKeyType &operator=(MyKeyType &&) = delete; // copy constructable and move assignable MyKeyType(MyKeyType &&) = default; MyKeyType(const MyKeyType &) = default; ~MyKeyType() = default; MyKeyType(int i) : val(i) {} bool operator<(const MyKeyType &other) const { return this->val < other.val; } bool operator==(const MyKeyType &other) const { return this->val == other.val; } }; // same as keytype except no operator< class MyValueType { private: int val; public: // not default constructable, not copy assignable, not move assignable MyValueType() = delete; MyValueType &operator=(const MyValueType &) = delete; MyValueType &operator=(MyValueType &&) = delete; // copy constructable and move assignable MyValueType(MyValueType &&) = default; MyValueType(const MyValueType &) = default; ~MyValueType() = default; MyValueType(int i) : val(i) {} bool operator==(const MyValueType &other) const { return this->val == other.val; } }; class MyDefaultConstructible { friend bool operator<(const MyDefaultConstructible &o1, const MyDefaultConstructible &o2) { return o1.val < o2.val; } private: int val = 0; public: // not copy assignable, not move assignable MyDefaultConstructible &operator=(const MyDefaultConstructible &) = delete; MyDefaultConstructible &operator=(MyDefaultConstructible &&) = delete; // default constructable, copy constructable and move assignable MyDefaultConstructible() = default; MyDefaultConstructible(MyDefaultConstructible &&) = default; MyDefaultConstructible(const MyDefaultConstructible &) = default; ~MyDefaultConstructible() = default; MyDefaultConstructible(int i) : val(i) {} bool operator==(const MyDefaultConstructible &other) const { return this->val == other.val; } }; class MyAssignable { private: int val = 0; public: MyAssignable() = default; MyAssignable(int i) : val(i) {} bool operator==(const MyAssignable &other) const { return this->val == other.val; } }; // manual instantiation, instantiates every member function instead of // just the ones called template class cs440::Map; int main() { cs440::Map m{{3, 5}}; m.insert({{2}, {3}}); m.insert({{1}, {3}}); m.insert({{5}, {3}}); m.insert({{7}, {3}}); m.at(2); auto iter = m.find(2); m.erase(iter); auto m_copy = m; assert(m_copy == m); cs440::Map m2{{8, 9}}; m2[10]; // should default construct these values m2[15]; cs440::Map m3{{6, 7}}; m3[20] = {5}; // move assign MyAssignable ma{1}; m3[10] = ma; // copy assign return 0; }