#pragma once /* Copyright (c) 2018 Swarthmore College Computer Science Department, Swarthmore PA A. Danner, M. Gagne, J. Brody, Z. Palmer, A. Soni, L. Meeden Distributed as course material for Spring 2018 CPSC 035: Data Structures and Algorithms */ #include <iterator> #include <list> #include <stdexcept> #include <cs35/list.h> using std::list; using std::runtime_error; template <typename T> class STLList : public List<T> { public: int getSize(); bool isEmpty(); T peekHead(); T peekTail(); T get(int i); void insertAtHead(T value); void insertAtTail(T value); T removeHead(); T removeTail(); private: list<T> actualList; }; template <typename T> int STLList<T>::getSize() { return actualList.size(); } template <typename T> bool STLList<T>::isEmpty() { return actualList.empty(); } template <typename T> T STLList<T>::peekHead() { if (actualList.empty()) { throw runtime_error("peekHead: empty list"); } else { return actualList.front(); } } template <typename T> T STLList<T>::peekTail() { if (actualList.empty()) { throw runtime_error("peekTail: empty list"); } else { return actualList.back(); } } template <typename T> T STLList<T>::get(int i) { if (i<0 || i>=actualList.size()) { throw runtime_error("get: invalid index"); } return *(std::next(actualList.begin(), i)); } template <typename T> void STLList<T>::insertAtHead(T value) { actualList.push_front(value); } template <typename T> void STLList<T>::insertAtTail(T value) { actualList.push_back(value); } template <typename T> T STLList<T>::removeHead() { if (actualList.empty()) { throw runtime_error("removeHead: empty list"); } else { T value = peekHead(); actualList.pop_front(); return value; } } template <typename T> T STLList<T>::removeTail() { if (actualList.empty()) { throw runtime_error("removeTail: empty list"); } else { T value = peekTail(); actualList.pop_back(); return value; } }