"C++ for C Programmers" mini-course Final Project: Please write a C++ "database" program which has a command line interface. The program will be a key-value storage system, where the user can insert, update, remove, or lookup individual keys. The user can also get a count of all of the keys in the "database', can remove all keys in the "database", and can list all of the contents of the "database". The program can also, optionally, include a save command and a load command for "extra credit". There should be no arbitrary hard limits in your source code for memory usage -- the only limitation on the number of keys to be inserted or the size of the corresponding value should be the limits imposed by the hardware, operating system, and the programming language environment. The program should gracefully handle all inputs given to it, including non-commands, improper arguments to commands, and all other user errors. Errors should be reported as messages to the user in a form such as "ERROR: Out of memory", or other appropriate message. Please gracefully handle all environment errors which can occur, including memory (or other resource) exhaustion, IO errors from file operations, and any other situations. A memory exhaustion error in a "database" insertion, update, or removal operation should leave the database in a consistent state. Failures in insertion should not leave a "ghost" key with an empty value. Failures in update operations on a key may leave the original value, or a valid "null string" value, or remove the key entirely. An invariant of the database structure is that as long a key still exists, then the value entry for that key must be valid. All programs have bugs, and I fully expect some implementation bugs in your program. With the exception of reasonably difficult to predict corner cases, I expect this program to demonstrate a "bug free" feel. The submission should be as "bulletproof" as any professional or widely used open source program tends to be. In other words, while there will undoubtedly be sequences of inputs to your program which will cause a complete crash or even buggy behavior, I expect that this program will appear to be bug free for the vast majority of complex use cases. This program should not exhibit the kind of instability seen in "under development" or "incomplete" programs. This program is to be written in of C++. As this program is a "final project" to help you tie together your knowledge of C++, as presented over the past few months, please feel free to use any feature of C++98 you feel is necessary to help you express the program. I am not requiring that your program use EVERY feature that we covered, nor am I recommending or requiring a specific selection of features to be used. The goal of this assignment is to give you a chance to use your best judgment to select which C++ features will help you accomplish a given task -- there is more than one right solution here. The only requirement on the C++ code is that it must compile on a standards conforming C++ compiler. As I have only really taught C++98, I will test your program on a C++98 compiler first. If you choose to use features from C++11, C++14, or C++17, I will raise the minimum compiler standard to the level necessary for your program -- in other words, I am perfectly willing to accept a C++ program using more modern features, but I am only requiring that C++98 features be used in the program. Command operation summary. Arguments in [] are optional. Arguments in <> are mandatory. insert Print error if key exists, otherwise store. update Print error if key does not exist, otherwise store. remove Print message if key does not exist. This message is just a warning. lookup Print the value for key, or an error if not present. count Print total number of keys. clear Remove all keys and values from the database. Please be sure to release all of the resources used by the database. dump Print all contents of the database. quit Quit the program. Please return all resources to the system before quitting -- do not rely upon the operating system's cleanup of process resources. Your program must explicitly release all memory it uses, before the call to operating system termination (exit(3), or `return`ing from main). Bonus: save Save the database state to the named `filename`. load Load the database state from the named `filename`.