
#include "hlavicka.h"


vv_bool::vv_bool(){
  pocet=0;
};


void vv_bool::pis(vector<bool> kod){
  while(!kod.empty()){
    zostatok_vystup.push(kod.back());
    kod.pop_back();
    pocet++;
  }
  while(pocet>7){
    unsigned char w(0);
    for(int i=0;i<8;i++){
      w=(w << 1);
      w|=zostatok_vystup.front();
      zostatok_vystup.pop();
      pocet--;
    }
    cout << w;
  }
}

void vv_bool::ukonci_vystup(){
  int i;
  unsigned char w(0);
  for(i=0;pocet>0;pocet--,i++){//zapise zvysok
    w=(w << 1);
    w|=zostatok_vystup.front();
    zostatok_vystup.pop();
  }
  for(;i<8;i++){//a doplni nulami
    w=(w << 1);
  }
  pocet=0;
  cout << w;
}

vv_sek::vv_sek(int d,int p, kod_abeceda* k, dek_abeceda* de){
  dlzka_kod_sekv=d;
  pocet_pismen=p;
  zac=false;
  koncim=false;
  kod=k;
  dek=de;
  mam=0;
  sekv=0;
}

bool vv_sek::ber(char pismeno){//TODO zistovanbie ci je pismeno v map s kodovacou abecedou
  if((kod->count(pismeno))>0){

    int pom=(*kod)[pismeno];
    sekv=sekv*pocet_pismen+pom;
    mam++;
//cerr << " mam: " << mam << " " << sekv << endl;
    
    sekvencia.push_back(pismeno);//ulozi pismeno na koniec zalohovanej sekvencie aby sa to v pripade potreby nemuselo pocitat znovu
    if (mam==dlzka_kod_sekv) return true;
    return false;
  }else{
    koncim=true;
    sekvencia.push_back(pismeno);
  // cerr << pismeno << " hmm "<<sekvencia.size() << endl;
    return false;
  }
}

bool vv_sek::koniec(){
  return koncim;
}

bool vv_sek::zacal(){
  return zac;
}

void vv_sek::ukonci(){
  // cout << " koncim " << (*sekvencia.begin()) <<" "<<(*sekvencia.end()) << " " << sekvencia.size() << endl;
cerr << " ukoncujem" << endl;  
  //int pom=sekvencia.size();
  
  for(vector<char>::iterator it=sekvencia.begin();it!=sekvencia.end();it++){
    cout << (*it);
   
  }
  sekvencia.clear();
  mam=0;
  sekv=0;
  koncim=false;
  zac=false;
}

long vv_sek::daj(){
  if(!zac){
    zac=true;
    cout << '#';
  }
 // cerr << "sekvencia " << sekv << " " << mam<< endl;
  mam=0;
  sekvencia.clear();
  long pom=sekv;
  sekv=0;

  return pom;
}

void vv_sek::pis(long sekvencia){
cerr << "pisem " << sekvencia << endl;
stack<char> zas;
long pom=sekvencia;
  for(int i=0;i<dlzka_kod_sekv;i++){
    zas.push((*dek)[pom%pocet_pismen]);
    pom=pom/pocet_pismen;
  }
  for(int i=0;i<dlzka_kod_sekv;i++){
    cout << zas.top();
    zas.pop();
  }
  
}

