#include "SMILES.h" bool SMILES::kontrola(const std::vector<char> & vstup) { char predchoziznak = ' '; std::string aktualniprvek; bool nazevprvku = false; if (isalpha(vstup[0]) == false) { return false; } if (vstup[vstup.size() - 1] == '#' || vstup[vstup.size() - 1] == '-' || vstup[vstup.size() - 1] == '=') { return false; } for (auto&& it : vstup) { if ((it == '-' || it == '=' || it == '#') && (predchoziznak == '-' || predchoziznak == '=' || predchoziznak == '#')) { return false; } if (it == ')' && (predchoziznak == '(' || predchoziznak == '-' || predchoziznak == '=' || predchoziznak == '#')) { return false; } predchoziznak = it; } return true; } void SMILES::prevedvzorec(const std::vector<char> & vstup) { if (kontrola(vstup)) { for (auto && it : vstup) { if (cteniprvku) { if (islower(it)) { aktualniprvek = aktualniprvek + it; } else { prvky.push_back(aktualniprvek); aktualniprvek.clear(); cteniprvku = false; if (aktualnipredchozi != 0) { vytvorvazbu(); } aktualnipredchozi = prvky.size(); } } if (it == '(') { odbocky.push_back(aktualnipredchozi); } if (it == ')') { aktualnipredchozi = odbocky[odbocky.size() - 1]; odbocky.erase(odbocky.end() - 1); } if (ctenibackreference && !isdigit(it)) { ctenibackreference = false; auto klic = smycky.find(value); if (klic != smycky.end()) { int temp = aktualnipredchozi; aktualnipredchozi = klic->second; vytvorvazbu(); aktualnipredchozi = temp; } else { smycky.insert(std::make_pair(value, aktualnipredchozi)); } value = 0; } if (isdigit(it)) { value = value * 10 + it - '0'; ctenibackreference = true; } if (isupper(it)) { aktualniprvek = it; cteniprvku = true; } if (it == '=') { poslednivazba = it; } if (it == '#') { poslednivazba = it; } } } else { std::cout << "Invalid input"; } } void SMILES::vytvorvazbu() { if (poslednivazba == '-') { auto it2 = jednoduchevazby.find(aktualnipredchozi); if (it2 == jednoduchevazby.end()) { std::vector<int> temp; temp.push_back(prvky.size()); jednoduchevazby.insert(std::make_pair(aktualnipredchozi, temp)); } else { it2->second.push_back(prvky.size()); } } if (poslednivazba == '=') { auto it2 = dvojitevazby.find(aktualnipredchozi); if (it2 == dvojitevazby.end()) { std::vector<int> temp; temp.push_back(prvky.size()); dvojitevazby.insert(std::make_pair(aktualnipredchozi, temp)); } else { it2->second.push_back(prvky.size()); } poslednivazba = '-'; } if (poslednivazba == '#') { auto it2 = trojitevazby.find(aktualnipredchozi); if (it2 == trojitevazby.end()) { std::vector<int> temp; temp.push_back(prvky.size()); trojitevazby.insert(std::make_pair(aktualnipredchozi, temp)); } else { it2->second.push_back(prvky.size()); } poslednivazba = '-'; } } void SMILES::vypisprvky() { int count = 1; std::cout << "Prvky:" << std::endl; for(auto&& it : prvky) { std::cout << count << it << std::endl; count++; } } void SMILES::vypisvazby() { int count = 1; for (auto&& it : prvky) { auto it2 = jednoduchevazby.find(count); if (it2 != jednoduchevazby.end()) { for (int i = 0; i < it2->second.size(); i++) { std::cout << it2->first << " - " << it2->second[i] << std::endl; } } auto it3 = dvojitevazby.find(count); if (it3 != dvojitevazby.end()) { for (int i = 0; i < it3->second.size(); i++) { std::cout << it3->first << " = " << it3->second[i] << std::endl; } } auto it4 = trojitevazby.find(count); if (it4 != trojitevazby.end()) { for (int i = 0; i < it4->second.size(); i++) { std::cout << it4->first << " # " << it4->second[i] << std::endl; } } count++; } }