seq_vector_cvt_gen.hpp
上传用户:yhdzpy8989
上传日期:2007-06-13
资源大小:13604k
文件大小:12k
源码类别:

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: seq_vector_cvt_gen.hpp,v $
  4.  * PRODUCTION Revision 1000.0  2003/10/29 20:26:03  gouriano
  5.  * PRODUCTION PRODUCTION: IMPORTED [ORIGINAL] Dev-tree R1.2
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. #ifndef SEQ_VECTOR_CVT_GEN__HPP
  10. #define SEQ_VECTOR_CVT_GEN__HPP
  11. /*  $Id: seq_vector_cvt_gen.hpp,v 1000.0 2003/10/29 20:26:03 gouriano Exp $
  12. * ===========================================================================
  13. *
  14. *                            PUBLIC DOMAIN NOTICE
  15. *               National Center for Biotechnology Information
  16. *
  17. *  This software/database is a "United States Government Work" under the
  18. *  terms of the United States Copyright Act.  It was written as part of
  19. *  the author's official duties as a United States Government employee and
  20. *  thus cannot be copyrighted.  This software/database is freely available
  21. *  to the public for use. The National Library of Medicine and the U.S.
  22. *  Government have not placed any restriction on its use or reproduction.
  23. *
  24. *  Although all reasonable efforts have been taken to ensure the accuracy
  25. *  and reliability of the software and data, the NLM and the U.S.
  26. *  Government do not and cannot warrant the performance or results that
  27. *  may be obtained by using this software or data. The NLM and the U.S.
  28. *  Government disclaim all warranties, express or implied, including
  29. *  warranties of performance, merchantability or fitness for any particular
  30. *  purpose.
  31. *
  32. *  Please cite the author in any work or product based on this material.
  33. *
  34. * ===========================================================================
  35. *
  36. * Author: Eugene Vasilchenko
  37. *
  38. * File Description:
  39. *   Generic Seq-vector conversion functions
  40. *
  41. */
  42. BEGIN_NCBI_SCOPE
  43. template<class DstIter, class SrcCont>
  44. inline
  45. void copy_8bit(DstIter dst, size_t count,
  46.                const SrcCont& srcCont, size_t srcPos)
  47. {
  48.     typename SrcCont::const_iterator src = srcCont.begin() + srcPos;
  49.     for ( DstIter end(dst + count); dst != end; ++src, ++dst ) {
  50.         *dst = *src;
  51.     }
  52. }
  53. template<class DstIter, class SrcCont>
  54. inline
  55. void copy_8bit_table(DstIter dst, size_t count,
  56.                      const SrcCont& srcCont, size_t srcPos,
  57.                      const char* table)
  58. {
  59.     typename SrcCont::const_iterator src = srcCont.begin() + srcPos;
  60.     for ( DstIter end(dst + count); dst != end; ++src, ++dst ) {
  61.         *dst = table[static_cast<unsigned char>(*src)];
  62.     }
  63. }
  64. template<class DstIter, class SrcCont>
  65. inline
  66. void copy_8bit_reverse(DstIter dst, size_t count,
  67.                        const SrcCont& srcCont, size_t srcPos)
  68. {
  69.     srcPos += (count - 1);
  70.     typename SrcCont::const_iterator src = srcCont.begin() + srcPos;
  71.     for ( DstIter end(dst + count); dst != end; --src, ++dst ) {
  72.         *dst = *src;
  73.     }
  74. }
  75. template<class DstIter, class SrcCont>
  76. inline
  77. void copy_8bit_table_reverse(DstIter dst, size_t count,
  78.                              const SrcCont& srcCont, size_t srcPos,
  79.                              const char* table)
  80. {
  81.     srcPos += (count - 1);
  82.     typename SrcCont::const_iterator src = srcCont.begin() + srcPos;
  83.     for ( DstIter end(dst + count); dst != end; --src, ++dst ) {
  84.         *dst = table[static_cast<unsigned char>(*src)];
  85.     }
  86. }
  87. template<class DstIter, class SrcCont>
  88. void copy_4bit(DstIter dst, size_t count,
  89.                const SrcCont& srcCont, size_t srcPos)
  90. {
  91.     typename SrcCont::const_iterator src = srcCont.begin() + srcPos / 2;
  92.     if ( srcPos % 2 ) {
  93.         // odd char first
  94.         char c = *src++;
  95.         *(dst++) = (c     ) & 0x0f;
  96.         --count;
  97.     }
  98.     for ( DstIter end(dst + (count & ~1)); dst != end; dst += 2, ++src ) {
  99.         char c = *src;
  100.         *(dst  ) = (c >> 4) & 0x0f;
  101.         *(dst+1) = (c     ) & 0x0f;
  102.     }
  103.     if ( count % 2 ) {
  104.         // remaining odd char
  105.         char c = *src;
  106.         *(dst  ) = (c >> 4) & 0x0f;
  107.     }
  108. }
  109. template<class DstIter, class SrcCont>
  110. void copy_4bit_table(DstIter dst, size_t count,
  111.                      const SrcCont& srcCont, size_t srcPos,
  112.                      const char* table)
  113. {
  114.     typename SrcCont::const_iterator src = srcCont.begin() + srcPos / 2;
  115.     if ( srcPos % 2 ) {
  116.         // odd char first
  117.         char c = *src++;
  118.         *(dst++) = table[(c    ) & 0x0f];
  119.         --count;
  120.     }
  121.     for ( DstIter end(dst + (count & ~1)); dst != end; dst += 2, ++src ) {
  122.         char c = *src;
  123.         *(dst  ) = table[(c >> 4) & 0x0f];
  124.         *(dst+1) = table[(c     ) & 0x0f];
  125.     }
  126.     if ( count % 2 ) {
  127.         // remaining odd char
  128.         char c = *src;
  129.         *(dst  ) = table[(c >> 4) & 0x0f];
  130.     }
  131. }
  132. template<class DstIter, class SrcCont>
  133. void copy_4bit_reverse(DstIter dst, size_t count,
  134.                        const SrcCont& srcCont, size_t srcPos)
  135. {
  136.     srcPos += (count - 1);
  137.     typename SrcCont::const_iterator src = srcCont.begin() + srcPos / 2;
  138.     if ( srcPos % 2 == 0 ) {
  139.         // odd char first
  140.         char c = *src--;
  141.         *(dst++) = (c >> 4) & 0x0f;
  142.         --count;
  143.     }
  144.     for ( DstIter end(dst + (count & ~1)); dst != end; dst += 2, --src ) {
  145.         char c = *src;
  146.         *(dst  ) = (c     ) & 0x0f;
  147.         *(dst+1) = (c >> 4) & 0x0f;
  148.     }
  149.     if ( count % 2 ) {
  150.         // remaining odd char
  151.         char c = *src;
  152.         *(dst  ) = (c     ) & 0x0f;
  153.     }
  154. }
  155. template<class DstIter, class SrcCont>
  156. void copy_4bit_table_reverse(DstIter dst, size_t count,
  157.                              const SrcCont& srcCont, size_t srcPos,
  158.                              const char* table)
  159. {
  160.     srcPos += (count - 1);
  161.     typename SrcCont::const_iterator src = srcCont.begin() + srcPos / 2;
  162.     if ( srcPos % 2 == 0 ) {
  163.         // odd char first
  164.         char c = *src--;
  165.         *(dst++) = table[(c >> 4) & 0x0f];
  166.         --count;
  167.     }
  168.     for ( DstIter end(dst + (count & ~1)); dst != end; dst += 2, --src ) {
  169.         char c = *src;
  170.         *(dst  ) = table[(c     ) & 0x0f];
  171.         *(dst+1) = table[(c >> 4) & 0x0f];
  172.     }
  173.     if ( count % 2 ) {
  174.         // remaining odd char
  175.         char c = *src;
  176.         *(dst  ) = table[(c     ) & 0x0f];
  177.     }
  178. }
  179. template<class DstIter, class SrcCont>
  180. void copy_2bit(DstIter dst, size_t count,
  181.                const SrcCont& srcCont, size_t srcPos)
  182. {
  183.     typename SrcCont::const_iterator src = srcCont.begin() + srcPos / 4;
  184.     {
  185.         // odd chars first
  186.         char c = *src;
  187.         switch ( srcPos % 4 ) {
  188.         case 1:
  189.             *(dst++) = (c >> 4) & 0x03;
  190.             if ( --count == 0 ) return;
  191.             // intentional fall through 
  192.         case 2:
  193.             *(dst++) = (c >> 2) & 0x03;
  194.             if ( --count == 0 ) return;
  195.             // intentional fall through 
  196.         case 3:
  197.             *(dst++) = (c     ) & 0x03;
  198.             ++src;
  199.             --count;
  200.             break;
  201.         }
  202.     }
  203.     for ( DstIter end = dst + (count & ~3); dst != end; dst += 4, ++src ) {
  204.         char c3 = *src;
  205.         char c0 = c3 >> 6;
  206.         char c1 = c3 >> 4;
  207.         char c2 = c3 >> 2;
  208.         c0 &= 0x03;
  209.         c1 &= 0x03;
  210.         c2 &= 0x03;
  211.         c3 &= 0x03;
  212.         *(dst  ) = c0;
  213.         *(dst+1) = c1;
  214.         *(dst+2) = c2;
  215.         *(dst+3) = c3;
  216.     }
  217.     // remaining odd chars
  218.     switch ( count % 4 ) {
  219.     case 3:
  220.         *(dst+2) = (*src >> 2) & 0x03;
  221.         // intentional fall through
  222.     case 2:
  223.         *(dst+1) = (*src >> 4) & 0x03;
  224.         // intentional fall through
  225.     case 1:
  226.         *(dst  ) = (*src >> 6) & 0x03;
  227.         break;
  228.     }
  229. }
  230. template<class DstIter, class SrcCont>
  231. void copy_2bit_reverse(DstIter dst, size_t count,
  232.                        const SrcCont& srcCont, size_t srcPos)
  233. {
  234.     srcPos += (count - 1);
  235.     typename SrcCont::const_iterator src = srcCont.begin() + srcPos / 4;
  236.     {
  237.         // odd chars first
  238.         char c = *src;
  239.         switch ( srcPos % 4 ) {
  240.         case 2:
  241.             *(dst++) = (c >> 2) & 0x03;
  242.             if ( --count == 0 ) return;
  243.             // intentional fall through 
  244.         case 1:
  245.             *(dst++) = (c >> 3) & 0x03;
  246.             if ( --count == 0 ) return;
  247.             // intentional fall through 
  248.         case 0:
  249.             *(dst++) = (c >> 6) & 0x03;
  250.             --src;
  251.             --count;
  252.             break;
  253.         }
  254.     }
  255.     for ( DstIter end = dst + (count & ~3); dst != end; dst += 4, --src ) {
  256.         char c0 = *src;
  257.         char c1 = c0 >> 2;
  258.         char c2 = c0 >> 4;
  259.         char c3 = c0 >> 6;
  260.         c0 &= 0x03;
  261.         c1 &= 0x03;
  262.         c2 &= 0x03;
  263.         c3 &= 0x03;
  264.         *(dst  ) = c0;
  265.         *(dst+1) = c1;
  266.         *(dst+2) = c2;
  267.         *(dst+3) = c3;
  268.     }
  269.     // remaining odd chars
  270.     switch ( count % 4 ) {
  271.     case 3:
  272.         *(dst+2) = (*src >> 4) & 0x03;
  273.         // intentional fall through
  274.     case 2:
  275.         *(dst+1) = (*src >> 2) & 0x03;
  276.         // intentional fall through
  277.     case 1:
  278.         *(dst  ) = (*src     ) & 0x03;
  279.         break;
  280.     }
  281. }
  282. template<class DstIter, class SrcCont>
  283. void copy_2bit_table(DstIter dst, size_t count,
  284.                      const SrcCont& srcCont, size_t srcPos,
  285.                      const char* table)
  286. {
  287.     typename SrcCont::const_iterator src = srcCont.begin() + srcPos / 4;
  288.     {
  289.         // odd chars first
  290.         char c = *src;
  291.         switch ( srcPos % 4 ) {
  292.         case 1:
  293.             *(dst++) = table[(c >> 4) & 0x03];
  294.             if ( --count == 0 ) return;
  295.             // intentional fall through 
  296.         case 2:
  297.             *(dst++) = table[(c >> 2) & 0x03];
  298.             if ( --count == 0 ) return;
  299.             // intentional fall through 
  300.         case 3:
  301.             *(dst++) = table[(c     ) & 0x03];
  302.             ++src;
  303.             --count;
  304.             break;
  305.         }
  306.     }
  307.     for ( DstIter end = dst + (count & ~3); dst != end; dst += 4, ++src ) {
  308.         char c3 = *src;
  309.         char c0 = c3 >> 6;
  310.         char c1 = c3 >> 4;
  311.         char c2 = c3 >> 2;
  312.         c0 = table[c0 & 0x03];
  313.         c1 = table[c1 & 0x03];
  314.         *(dst  ) = c0;
  315.         c2 = table[c2 & 0x03];
  316.         *(dst+1) = c1;
  317.         c3 = table[c3 & 0x03];
  318.         *(dst+2) = c2;
  319.         *(dst+3) = c3;
  320.     }
  321.     // remaining odd chars
  322.     switch ( count % 4 ) {
  323.     case 3:
  324.         *(dst+2) = table[(*src >> 2) & 0x03];
  325.         // intentional fall through
  326.     case 2:
  327.         *(dst+1) = table[(*src >> 4) & 0x03];
  328.         // intentional fall through
  329.     case 1:
  330.         *(dst  ) = table[(*src >> 6) & 0x03];
  331.         break;
  332.     }
  333. }
  334. template<class DstIter, class SrcCont>
  335. void copy_2bit_table_reverse(DstIter dst, size_t count,
  336.                              const SrcCont& srcCont, size_t srcPos,
  337.                              const char* table)
  338. {
  339.     srcPos += (count - 1);
  340.     typename SrcCont::const_iterator src = srcCont.begin() + srcPos / 4;
  341.     {
  342.         // odd chars first  
  343.         char c = *src;
  344.         switch ( srcPos % 4 ) {
  345.         case 2:
  346.             *(dst++) = table[(c >> 2) & 0x03];
  347.             if ( --count == 0 ) return;
  348.             // intentional fall thro    ugh
  349.         case 1:
  350.             *(dst++) = table[(c >> 4) & 0x03];
  351.             if ( --count == 0 ) return;
  352.             // intentional fall thro    ugh
  353.         case 0:
  354.             *(dst++) = table[(c >> 6) & 0x03];
  355.             --src;
  356.             --count;
  357.             break;
  358.         }
  359.     }
  360.     for ( DstIter end = dst + (count & ~3); dst != end; dst += 4, --src ) {
  361.         char c0 = *src;
  362.         char c1 = c0 >> 2;
  363.         char c2 = c0 >> 4;
  364.         char c3 = c0 >> 6;
  365.         c0 = table[c0 & 0x03];
  366.         c1 = table[c1 & 0x03];
  367.         *(dst  ) = c0;
  368.         c2 = table[c2 & 0x03];
  369.         *(dst+1) = c1;
  370.         c3 = table[c3 & 0x03];
  371.         *(dst+2) = c2;
  372.         *(dst+3) = c3;
  373.     }
  374.     // remaining odd chars
  375.     switch ( count % 4 ) {
  376.     case 3:
  377.         *(dst+2) = table[(*src >> 4) & 0x03];
  378.         // intentional fall through
  379.     case 2:
  380.         *(dst+1) = table[(*src >> 2) & 0x03];
  381.         // intentional fall through
  382.     case 1:
  383.         *(dst  ) = table[(*src     ) & 0x03];
  384.         break;
  385.     }
  386. }
  387. END_NCBI_SCOPE
  388. #endif//SEQ_VECTOR_CVT_GEN__HPP