DNA-sequences / tests / testprogramma.cc
testprogramma.cc
Raw
#include "../include/sequentie.h"
#include "../include/variant.h"
#include "../include/deletie.h"
#include "../include/insertie.h"
#include "../include/inversie.h"
#include "../include/delinsertie.h"
#include "../include/substitutie.h"
#include "../include/seqpointer.h"
#include "../include/seqarray.h"

#include <iostream>
#include <fstream>
#include <string>
#include <vector>
#include <cstdint>
#include <stdio.h>

// Menu voor het type waarin de sequentie komt
std::string menuType() {
    std::string keuze = std::string();
    std::cout << "Welke sequentie type wilt u kiezen? " << std::endl
            << "- typ 'string' voor type string" << std::endl
            << "- typ 'array' voor type array" << std::endl
            << "- typ 'pointer' voor type pointerlijst" << std::endl;
    std::cin >> keuze;
    std::cout << std::endl;

    if(keuze != "string" && keuze != "array" && keuze != "pointer") {
        std::cerr << "U heeft geen goed type ingevuld." << std::endl << std::endl;
        return std::string();
    } // Geen geldige type

    return keuze;
} // menuType

// Menu voor het type integer, geldt alleen bij de array en pointerlijst
int menuTypeInteger() {
    int keuze;
    std::cout << "Welke type integer wilt u kiezen?" << std::endl
            << "- typ '8' voor 8-bit integer" << std::endl
            << "- typ '16' voor 16-bit integer" << std::endl
            << "- typ '32' voor 32-bit integer" << std::endl
            << "- typ '32' voor 64-bit integer" << std::endl;
    std::cin >> keuze;
    std::cout << std::endl;

    if(keuze != 8 && keuze != 16 && keuze != 32 && keuze != 64) {
        return 0;
    } // Geen geldige keuze

    return keuze;
} // menuTypeInteger

// Leest een sequentie in uit een file en retourneerd deze
std::string inlezenSequentie(std::string const input) {
    std::string sequentie; // de sequentie
    std::ifstream invoer;
    invoer.open(input, std::ifstream::in);

    std::cout << std::endl;
    if(invoer.fail()) {
        std::cerr << "Kon file niet openen/vinden." << std::endl << std::endl;
        return std::string();
    } // Er is iets mis gegaan

    while(!invoer.eof()) {
        std::string temp;
        invoer >> temp;
        sequentie += temp;
    } // Voor als er endlines in de file zitten

    invoer.close();
    if(sequentie == std::string()) {
        std::cerr << "De file is leeg." << std::endl << std::endl;
    } // Lege file

    return sequentie;
} // inlezenSequentie

// Leest de varianten in uit een file en retourneerd deze in een vector
std::vector<Variant const*> inlezenVarianten() {
    std::vector<Variant const*> varianten; // de varianten
    std::string input = std::string(); // filenaam

    std::cout << "Wat is de naam van de file met de varianten? " << std::endl;
    std::cin >> input;
    std::cout << std::endl;
    std::ifstream invoer;
    invoer.open(input, std::ifstream::in);

    if(invoer.fail()) {
        std::cerr << "Kon file niet openen/vinden." << std::endl << std::endl;
        return varianten;
    } // Er is iets mis gegaan

    while(!invoer.eof()) {
        int begin = int(); // begin
        int eind = int(); // eind
        std::string variantType = std::string(); //variant-type
        std::string insert = std::string(); // insert-sequentie
        invoer >> begin;
        invoer >> eind;
        invoer >> variantType;
        if(variantType == ">" || variantType == "ins" || variantType == "delins") {
            invoer >> insert;
        } // Bij deze varianten hoort een insert-sequentie
        Variant const* var = var->read(begin, eind, variantType, insert); // Maakt de variant

        if(var == nullptr) {
            invoer.close();
            varianten.clear();
            return varianten;
        } // De variant is niet geldig
        varianten.push_back(var);
    } // Voor als er endlines in de file zitten

    invoer.close();
    if(varianten.empty()) {
        std::cerr << "De file is leeg." << std::endl << std::endl;
    } // Lege file

    return varianten;
} // inlezenVarianten

// Schrijft de sequentie weg naar een file
void wegschrijven(std::string sequentie) {
    std::ofstream uitvoer;
    std::string input = std::string(); // filenaam

    std:: cout << "Wat is de naam van de file waarin de sequentie moet worden weggeschreven? " << std::endl;
    std::cin >> input;
    std::cout << std::endl;
    uitvoer.open(input, std::ofstream::out);

    if(uitvoer.fail()) {
        std::cerr << "Kon file niet openen/vinden." << std::endl << std::endl;
        uitvoer.close();
        return;
    } // Er is iets mis gegaan

    uitvoer << sequentie;

    uitvoer.close();
} // wegschrijven

// Menu voor de opties die de gebruiker kan doen met de sequentie
int menuKeuzes() {
    int keuze = 0;
    while(keuze < 1 || keuze > 5) {
        std::string input;
        std:: cout << "Wat wilt u doen? (typ het cijfer)" << std::endl
                << "1) Een file met varianten op de huidige sequentie uitvoeren" << std::endl
                << "2) Een nieuwe type sequentie uit een file inlezen" << std::endl
                << "3) De huidige sequentie wegschrijven naar een file" << std::endl
                << "4) De huidige sequentie afdrukken op het scherm" << std::endl
                << "5) Stoppen met het programma" << std::endl;
        std::cin >> input;
        if(input.length() == 1) {
            keuze = input[0] - '0';
        }
        std::cout << std::endl;
    }
    return keuze;
} // menuKeuzes

// Menu voor type string
int menuString(Sequentie seq) {
    int stoppen = 0;
    while(stoppen == 0) {
        int menuKeuze = menuKeuzes();
        switch(menuKeuze) {
            case 5: {
                stoppen = 1;
            }
            break; // stoppen met het programma
            case 4: {
                seq.drukAf();
                std::cout << std::endl;
            }
            break; // sequentie afdrukken op scherm
            case 3: {
                std::ofstream uitvoer;
                std::string input = std::string(); // filenaam

                std:: cout << "Wat is de naam van de file waarin de sequentie moet worden weggeschreven? " << std::endl;
                std::cin >> input;
                std::cout << std::endl;
                uitvoer.open(input, std::ofstream::out);

                if(uitvoer.fail()) {
                    std::cerr << "Kon file niet openen/vinden." << std::endl << std::endl;
                    uitvoer.close();
                } // Er is iets mis gegaan
                std::streambuf *coutbuf = std::cout.rdbuf();
                std::cout.rdbuf(uitvoer.rdbuf()); // redirect cout naar de file

                seq.drukAf();

                std::cout.rdbuf(coutbuf); // reset naar cout

                uitvoer.close();
            }
            break; // sequentie wegschrijven naar file
            case 2: {
                stoppen = 2;
            }
            break; // stoppen met het menu
            case 1: {
                std::vector<Variant const*> varianten = inlezenVarianten();
                if(!varianten.empty()) {
                    seq = seq.apply(varianten);
                }
            }
            break; // varianten toepassen op sequentie
        }
    }
    return stoppen;
} // menuString

// Menu voor type array
template <typename T>
int menuArray(SeqArray<T> seq) {
    int stoppen = 0;
    while(stoppen == 0) {
        int menuKeuze = menuKeuzes();
        switch(menuKeuze) {
            case 5: 
                stoppen = 1;
            break; // stoppen met het programma
            case 4: 
                seq.drukAf();
                std::cout << std::endl;
            break; // sequentie afdrukken op scherm
            case 3: {
                std::ofstream uitvoer;
                std::string input = std::string(); // filenaam

                std:: cout << "Wat is de naam van de file waarin de sequentie moet worden weggeschreven? " << std::endl;
                std::cin >> input;
                std::cout << std::endl;
                uitvoer.open(input, std::ofstream::out);

                if(uitvoer.fail()) {
                    std::cerr << "Kon file niet openen/vinden." << std::endl << std::endl;
                    uitvoer.close();
                } // Er is iets mis gegaan
                std::streambuf *coutbuf = std::cout.rdbuf();
                std::cout.rdbuf(uitvoer.rdbuf()); // redirect cout naar de file

                seq.drukAf();

                std::cout.rdbuf(coutbuf); // reset naar cout

                uitvoer.close();
            }
            break; // sequentie wegschrijven naar file
            case 2: 
                stoppen = 2;
                break; // stoppen met het menu
            case 1: {
                std::vector<Variant const*> varianten = inlezenVarianten();
                if(!varianten.empty()) {
                    seq.copy(seq.apply(varianten));
                }
            }
            break; // varianten toe passen op sequentie
        }
    }
    return stoppen;
} // menuArray

// Menu voor type pointerlijst
template <typename T>
int menuPointer(SeqPointer<T> seq) {
    int stoppen = 0;
    while(stoppen == 0) {
        int menuKeuze = menuKeuzes();
        switch(menuKeuze) {
            case 5: 
                stoppen = 1;
            break; // stoppen met het programma
            case 4: 
                seq.drukAf();
                std::cout << std::endl;
            break; // sequentie afdrukken op scherm
            case 3: {
                std::ofstream uitvoer;
                std::string input = std::string(); // filenaam

                std:: cout << "Wat is de naam van de file waarin de sequentie moet worden weggeschreven? " << std::endl;
                std::cin >> input;
                std::cout << std::endl;
                uitvoer.open(input, std::ofstream::out);

                if(uitvoer.fail()) {
                    std::cerr << "Kon file niet openen/vinden." << std::endl << std::endl;
                    uitvoer.close();
                } // Er is iets mis gegaan
                std::streambuf *coutbuf = std::cout.rdbuf();
                std::cout.rdbuf(uitvoer.rdbuf()); // redirect cout naar de file

                seq.drukAf();

                std::cout.rdbuf(coutbuf); // reset naar cout

                uitvoer.close();
            }
            break; // sequentie wegschrijven naar file
            case 2: 
                stoppen = 2;
            break; // stoppen met het menu
            case 1: {
                std::vector<Variant const*> varianten = inlezenVarianten();
                if(!varianten.empty()) {
                    seq.copy2(seq.apply(varianten));
                }
            }
            break; // varianten toe passen op sequentie
        }
    }
    return stoppen;
} // menuPointer

// Algemene menu voor type sequentie, type integer, 
// inlezen sequentie en de menu's voor de types
void menu() {
    int keuze = 0;
    while(keuze != 1) {
        std::string type = std::string(); // type
        std::string input = std::string(); // filenaam voor sequentie
        std::string sequentie = std::string(); // de ingelezen sequentie
        int typeInteger = 0; // grootte/type integer

        while(type == std::string()) {
            type = menuType();
        } // type sequentie

        if(type == "array" || type == "pointer") {
            while(typeInteger == 0) {
                typeInteger = menuTypeInteger();
            }
        } // type integer, voor de types array en pointer

        while(sequentie == std::string()) {
            std:: cout << "Wat is de naam van de file met de sequentie? " << std::endl;
            std::cin >> input;
            sequentie = inlezenSequentie(input);
        } // de sequentie inlezen

        if(type == "string") {
            keuze = menuString(Sequentie(sequentie));
        } // string
        else if(type == "array") {
            switch(typeInteger) {
                case 64:
                    keuze = menuArray<uint64_t>(SeqArray<uint64_t>(sequentie));
                    break;
                case 32: 
                    keuze = menuArray<uint32_t>(SeqArray<uint32_t>(sequentie));
                    break;
                case 16:
                    keuze = menuArray<uint16_t>(SeqArray<uint16_t>(sequentie));
                    break;
                case 8:
                default:
                    keuze = menuArray<uint8_t>(SeqArray<uint8_t>(sequentie));
                    break;
            }
        } // array
        else {
            switch(typeInteger) {
                case 64:
                    keuze = menuPointer<uint64_t>(SeqPointer<uint64_t>(sequentie));
                    break;
                case 32: 
                    keuze = menuPointer<uint32_t>(SeqPointer<uint32_t>(sequentie));
                    break;
                case 16:
                    keuze = menuPointer<uint16_t>(SeqPointer<uint16_t>(sequentie));
                    break;
                case 8:
                default:
                    keuze = menuPointer<uint8_t>(SeqPointer<uint8_t>(sequentie));
                    break;
            }
        } // pointerlijst
    }
} // menu

int main() {
    menu();
}