Guest User

Untitled

a guest
Jan 19th, 2018
80
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.37 KB | None | 0 0
  1. #include <cassert>
  2. #include <fstream>
  3.  
  4. struct cdata {
  5. uint64_t data;
  6. unsigned count;
  7. cdata() {reset();}
  8. void reset() {data = count = 0;}
  9. template<typename T>
  10. void write(T &stream, size_t nbytes=sizeof(data) / sizeof(char)) {
  11. stream.write((char *)&data, nbytes);
  12. reset();
  13. }
  14. };
  15.  
  16. int main(int argc, char *argv[]) {
  17. if(argc < 2) {
  18. std::fprintf(stderr, "Usage: %s <infile> <outfile>\n", argv[0]);
  19. return EXIT_FAILURE;
  20. }
  21. std::ios_base::sync_with_stdio(false);
  22. std::ifstream ins(argv[1]);
  23. std::ofstream outs(argc > 2 ? argv[2]: "/dev/stdout", std::fstream::binary | std::ios::out);
  24. std::string line;
  25. cdata data;
  26. while(std::getline(ins, line)) {
  27. switch(line[0]) case '@': case '#': case '>': continue;
  28. for(const auto c: line) {
  29. switch(c) {
  30. case 'a': case 'A': break;
  31. case 'c': case 'C': data.data |= 1ull << 62; break;
  32. case 'g': case 'G': data.data |= 2ull << 62; break;
  33. case 't': case 'T': data.data |= 3ull << 62; break;
  34. default: continue;
  35. }
  36. if(++data.count == 32) data.write(outs);
  37. data.data >>= 2;
  38. }
  39. }
  40. data.data >>= (32 - data.count - 1) << 1;
  41. outs.write((char *)&data.data, (data.count >> 2) + ((data.count & 0x3u) != 0));
  42. return EXIT_SUCCESS;
  43. }
Add Comment
Please, Sign In to add comment