#ifndef TAPE_H #define TAPE_H #include /** * Abstract class representing a magnetic tape. * * Tape is a storage medium consisting of N cells, where each cell contains a * 32-bit signed integer. Data can be read or written into one cell at a time. * Tape can be moved one cell forward or backwards in order to change the * targeted cell. Tape performs every operation sequentially. The amount of data * stored on a single tape could exceed the amount of available RAM. Moving tape * forward or backwards is a very time-consuming operation. */ class Tape { public: Tape(const Tape &) = default; Tape(Tape &&) = default; Tape &operator=(const Tape &) = default; Tape &operator=(Tape &&) = default; virtual ~Tape() = default; /** * Advances the tape one cell forward. * * @return false if the next cell doesn't exist (reached end of tape), * otherwise true. */ virtual bool seekForward() = 0; /** * Rewinds the tape one cell backwards. * * @return false if the previous cell doesn't exist (reached beginning of * tape), otherwise true. */ virtual bool seekBackwards() = 0; /** * Reads data from the current cell. * * @return number, that is stored on the current cell. */ virtual int32_t read() = 0; /** * Writes data to the current cell. * * @param data Number, that should be written to the current cell. */ virtual void write(int32_t data) = 0; }; #endif