Advertisement
kutuzzzov

Урок 6 плотная упаковка

Jul 21st, 2023
1,584
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.55 KB | None | 0 0
  1. #include <cassert>
  2. #include <cstddef>
  3. #include <cstdint>
  4. #include <string>
  5. #include <array>
  6.  
  7. using namespace std;
  8.  
  9. struct Nucleotide {
  10.     char symbol;
  11.     size_t position;
  12.     int chromosome_num;
  13.     int gene_num;
  14.     bool is_marked;
  15.     char service_info;
  16. };
  17.  
  18. const static int N = 4;
  19. const std::array<char, N> Letters = { 'A', 'T', 'G', 'C' };
  20.  
  21. struct CompactNucleotide {
  22.     // напишите вашу реализацию здесь
  23.     uint32_t position;
  24.     uint16_t is_marked : 1;
  25.     uint16_t gene_num : 15;
  26.     uint16_t chromosome_num : 6;
  27.     uint16_t symbol : 2;
  28.     uint16_t service_info : 8;
  29. };
  30.  
  31. CompactNucleotide Compress(const Nucleotide& n) {
  32.     // напишите вашу реализацию здесь
  33.     CompactNucleotide result;
  34.     result.position = n.position;
  35.     result.is_marked = n.is_marked;
  36.     result.gene_num = n.gene_num;
  37.     result.chromosome_num = n.chromosome_num;
  38.     for (int i = 0; i < N; ++i) {
  39.         if (n.symbol == Letters[i]) {
  40.             result.symbol = i;
  41.             continue;
  42.         }
  43.     }
  44.     result.service_info = n.service_info;
  45.  
  46.     return result;
  47. }
  48.  
  49. Nucleotide Decompress(const CompactNucleotide& cn) {
  50.     // напишите вашу реализацию здесь
  51.     Nucleotide result;
  52.     result.position = cn.position;
  53.     result.is_marked = cn.is_marked;
  54.     result.gene_num = cn.gene_num;
  55.     result.chromosome_num = cn.chromosome_num;
  56.     result.symbol = Letters[cn.symbol];
  57.     result.service_info = cn.service_info;
  58.  
  59.     return result;
  60. }
  61.  
  62. static_assert(sizeof(CompactNucleotide) <= 8, "Your CompactNucleotide is not compact enough"s);
  63. static_assert(alignof(CompactNucleotide) == 4, "Don't use '#pragma pack'!"s);
  64. bool operator==(const Nucleotide& lhs, const Nucleotide& rhs) {
  65.     return (lhs.symbol == rhs.symbol) && (lhs.position == rhs.position) && (lhs.chromosome_num == rhs.chromosome_num)
  66.         && (lhs.gene_num == rhs.gene_num) && (lhs.is_marked == rhs.is_marked) && (lhs.service_info == rhs.service_info);
  67. }
  68. void TestSize() {
  69.     assert(sizeof(CompactNucleotide) <= 8);
  70. }
  71. void TestCompressDecompress() {
  72.     Nucleotide source;
  73.     source.symbol = 'T';
  74.     source.position = 1'000'000'000;
  75.    source.chromosome_num = 48;
  76.    source.gene_num = 1'000;
  77.     source.is_marked = true;
  78.     source.service_info = '!';
  79.  
  80.     CompactNucleotide compressedSource = Compress(source);
  81.     Nucleotide decompressedSource = Decompress(compressedSource);
  82.  
  83.     assert(source == decompressedSource);
  84. }
  85.  
  86. int main() {
  87.     TestSize();
  88.     TestCompressDecompress();
  89. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement