#include <rudiments/singlylinkedlist.h>
#include <rudiments/stdio.h>


// Define a simple class.  Instances of it will be stored in a list later.
class myclass {
        public:
                        myclass(int64_t v) { value=v; }
                void    print() { stdoutput.printf("value: %lld\n",value); }
        private:
                int64_t value;
};


int main(int argc, const char **argv) {

        // lists of various types
        singlylinkedlist<int16_t>       i16sll;
        singlylinkedlist<int64_t>       i64sll;
        singlylinkedlist< char * >      ssll;
        singlylinkedlist< myclass * >   osll;

        // populate the lists
        for (int64_t i=0; i<20; i++) {
                i16sll.append(i);
                i64sll.append(i);
                ssll.append(charstring::parseNumber(i));
                osll.append(new myclass(i));
        }

        // print the lists of primitive types
        stdoutput.printf("list of 16-bit integers:\n");
        i16sll.print();
        stdoutput.write('\n');

        stdoutput.printf("list of 64-bit integers:\n");
        i16sll.print();
        stdoutput.write('\n');

        stdoutput.printf("list of strings:\n");
        i16sll.print();
        stdoutput.write('\n');

        // manually print the list of objects
        stdoutput.printf("list of objects:\n");
        for (singlylinkedlistnode< myclass * > *n=osll.getFirst();
                                                n; n=n->getNext()) {
                n->getValue()->print();
        }
        stdoutput.write('\n');

        // clean up
        for (singlylinkedlistnode< char * > *n=ssll.getFirst();
                                                n; n=n->getNext()) {
                delete[] n->getValue();
        }
        for (singlylinkedlistnode< myclass * > *n=osll.getFirst();
                                                n; n=n->getNext()) {
                delete n->getValue();
        }
}