CS35 List ADT

list.h
#pragma once
/* Copyright (c) 2017
   Swarthmore College Computer Science Department, Swarthmore PA
   A. Danner, M. Gagne, J. Brody, Z. Palmer, A. Soni
   Distributed as course material for Fall 2017
   CPSC 035: Data Structures and Algorithms
 */

/**
 * A List is an abstract (a.k.a. pure virtual) class specifying the interface
 * for a list of an arbitrary data type.
 */
template <typename T>
class List {
  public:
    virtual ~List() { /* do nothing */ };

    /**
     * Determines the size of the list.
     * @return The number of elements in the list.
     */
    virtual int getSize() = 0;

    /**
     * Determines whether the list is empty.
     * @return true if the list is empty; false if it is not.
     */
    virtual bool isEmpty() = 0;

    /**
     * Retrieves the first element of the list.
     * @return The element at index 0 of this list.
     * @throws runtime_error If the list is empty.
     */
    virtual T peekHead() = 0;

    /**
     * Retrieves the last element of the list.
     * @return The element at the last index of this list.
     * @throws runtime_error If the list is empty.
     */
    virtual T peekTail() = 0;

    /**
     * Retrieves the element from the list at index i.
     * @param i The index for the element to retrieve.
     * @return The element at that index.
     * @throws runtime_error If there is no index i in this list.
     */
    virtual T get(int i) = 0;

    /**
     * Inserts a value at the beginning of this list.
     * @param value The value to insert.
     */
    virtual void insertAtHead(T value) = 0;

    /**
     * Inserts the value at the end of this list.
     * @param value The value to insert.
     */
    virtual void insertAtTail(T value) = 0;

    /**
     * Removes the first element from this list.
     * @return The element that was removed.
     * @throws runtime_error If the list was empty.
     */
    virtual T removeHead() = 0;

    /**
     * Removes the last element from this list.
     * @return The element that was removed.
     * @throws runtime_error If the list was empty.
     */
    virtual T removeTail() = 0;

    // You can safely ignore the following code.  This eliminates some default
    // class routines, preventing you from using them accidentally.
    // Specifically, we are disabling the use of the copy constructor and the
    // copy assignment operator.  You can read more here:
    //   http://www.cplusplus.com/articles/y8hv0pDG/
public:
    List() { }
private:
    List(const List& other) = delete;
    List& operator=(const List& other) = delete;
};