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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: sequtil_convert_imp.hpp,v $
  4.  * PRODUCTION Revision 1000.0  2003/10/29 16:02:38  gouriano
  5.  * PRODUCTION PRODUCTION: IMPORTED [ORIGINAL] Dev-tree R1.2
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. #ifndef UTIL_SEQUTIL___SEQUTIL_CONVERT_IMP__HPP
  10. #define UTIL_SEQUTIL___SEQUTIL_CONVERT_IMP__HPP
  11. /*  $Id: sequtil_convert_imp.hpp,v 1000.0 2003/10/29 16:02:38 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:  Mati Shomrat
  37.  *
  38.  * File Description:
  39.  *   
  40.  */   
  41. #include <corelib/ncbistd.hpp>
  42. #include <corelib/ncbiexpt.hpp>
  43. #include <util/sequtil/sequtil.hpp>
  44. #include "sequtil_shared.hpp"
  45. BEGIN_NCBI_SCOPE
  46. class CSeqConvert_imp
  47. {
  48. public:
  49.     typedef CSeqUtil::TCoding TCoding;
  50.     // Conversion
  51.     template <typename SrcCont, typename DstCont>
  52.     static SIZE_TYPE Convert
  53.     (const SrcCont& src,
  54.      TCoding src_coding,
  55.      TSeqPos pos,
  56.      TSeqPos length,
  57.      DstCont& dst, 
  58.      TCoding dst_coding)
  59.     {
  60.         _ASSERT(!OutOfRange(pos, src, src_coding));
  61.         
  62.         if ( src.empty()  ||  (length == 0) ) {
  63.             return 0;
  64.         }
  65.         
  66.         AdjustLength(src, src_coding, pos, length);
  67.         ResizeDst(dst, dst_coding, length);
  68.         
  69.         return Convert(&*src.begin(), src_coding, pos, length,
  70.             &*dst.begin(), dst_coding);
  71.     }
  72.     static SIZE_TYPE Convert(const char* src, TCoding src_coding,
  73.                              TSeqPos pos, TSeqPos length,
  74.                              char* dst, TCoding dst_coding);
  75.     // Subseq
  76.     template <typename SrcCont, typename DstCont>
  77.     static SIZE_TYPE Subseq
  78.     (const SrcCont& src,
  79.      TCoding coding,
  80.      TSeqPos pos,
  81.      TSeqPos length,
  82.      DstCont& dst)
  83.     {
  84.         _ASSERT(!OutOfRange(pos, src, coding));
  85.         if ( src.empty()  ||  (length == 0) ) {
  86.             return 0;
  87.         }
  88.         
  89.         AdjustLength(src, coding, pos, length);
  90.         ResizeDst(dst, coding, length);
  91.         
  92.         return Subseq(&*src.begin(), coding, pos, length, &*dst.begin());
  93.     }
  94.     static SIZE_TYPE Subseq(const char* src, TCoding coding,
  95.                             TSeqPos pos, TSeqPos length,
  96.                             char* dst);
  97.     // Pack
  98.     template <typename SrcCont, typename DstCont>
  99.     static SIZE_TYPE Pack
  100.     (const SrcCont& src,
  101.      TCoding src_coding,
  102.      DstCont& dst,
  103.      TCoding& dst_coding,
  104.      TSeqPos length)
  105.     {
  106.         if ( src.empty()  ||  (length == 0) ) {
  107.             return 0;
  108.         }
  109.         
  110.         AdjustLength(src, src_coding, 0, length);
  111.         // we allocate enough memory for ncbi4na coding
  112.         // if the result will be ncbi2na coding we'll resize (see below)
  113.         ResizeDst(dst, CSeqUtil::e_Ncbi4na, length);
  114.         
  115.         SIZE_TYPE res = Pack(&*src.begin(), length, src_coding, 
  116.                              &*dst.begin(), dst_coding);
  117.         if ( dst_coding == CSeqUtil::e_Ncbi2na ) {
  118.             size_t new_size = res / 4;
  119.             if ( (res % 4) != 0 ) {
  120.                 ++new_size;
  121.             }
  122.             dst.resize(new_size);
  123.         }
  124.         return res;
  125.     }
  126.     static SIZE_TYPE Pack(const char* src, TSeqPos length, TCoding src_coding,
  127.                           char* dst, TCoding& dst_coding);
  128. private:
  129.     // Conversion methods:
  130.     // --- NA conversions:
  131.     // iupacna -> ...
  132.     static SIZE_TYPE x_ConvertIupacnaToIupacna(const char* src, TSeqPos pos,
  133.         TSeqPos length, char* dst);
  134.     static SIZE_TYPE x_ConvertIupacnaTo2na(const char* src, TSeqPos pos, 
  135.         TSeqPos length, char* dst);
  136.     static SIZE_TYPE x_ConvertIupacnaTo2naExpand(const char* src, TSeqPos pos,
  137.         TSeqPos length, char* dst);
  138.     static SIZE_TYPE x_ConvertIupacnaTo4na(const char* src, TSeqPos pos, 
  139.         TSeqPos length, char* dst);
  140.     static SIZE_TYPE x_ConvertIupacnaTo8na(const char* src, TSeqPos pos, 
  141.         TSeqPos length, char* dst);
  142.     // ncbi2na -> ...
  143.     static SIZE_TYPE x_Convert2naToIupacna(const char* src, TSeqPos pos, 
  144.         TSeqPos length, char* dst);
  145.     static SIZE_TYPE x_Convert2naTo2naExpand(const char* src, TSeqPos pos,
  146.         TSeqPos length, char* dst);
  147.     static SIZE_TYPE x_Convert2naTo4na(const char* src, TSeqPos pos, 
  148.         TSeqPos length, char* dst);
  149.     static SIZE_TYPE x_Convert2naTo8na(const char* src, TSeqPos pos, 
  150.         TSeqPos length, char* dst);
  151.     // ncbi2na_expand -> ...
  152.     static SIZE_TYPE x_Convert2naExpandToIupacna(const char* src, TSeqPos pos,
  153.         TSeqPos length, char* dst);
  154.     static SIZE_TYPE x_Convert2naExpandTo2na(const char* src, TSeqPos pos,
  155.         TSeqPos length, char* dst);
  156.     static SIZE_TYPE x_Convert2naExpandTo4na(const char* src, TSeqPos pos, 
  157.         TSeqPos length, char* dst);
  158.     static SIZE_TYPE x_Convert2naExpandTo8na(const char* src, TSeqPos pos, 
  159.         TSeqPos length, char* dst);
  160.     // ncbi4na -> ...
  161.     static SIZE_TYPE x_Convert4naToIupacna(const char* src, TSeqPos pos, 
  162.         TSeqPos length, char* dst);
  163.     static SIZE_TYPE x_Convert4naTo2na(const char* src, TSeqPos pos, 
  164.         TSeqPos length, char* dst);
  165.     static SIZE_TYPE x_Convert4naTo2naExpand(const char* src, TSeqPos pos,
  166.         TSeqPos length, char* dst);
  167.     static SIZE_TYPE x_Convert4naTo8na(const char* src, TSeqPos pos, 
  168.         TSeqPos length, char* dst);
  169.     // ncbi8na (ncbi4na_expand) -> ...
  170.     static SIZE_TYPE x_Convert8naToIupacna(const char* src, TSeqPos pos, 
  171.         TSeqPos length, char* dst);
  172.     static SIZE_TYPE x_Convert8naTo2na(const char* src, TSeqPos pos, 
  173.         TSeqPos length, char* dst);
  174.     static SIZE_TYPE x_Convert8naTo2naExpand(const char* src, TSeqPos pos,
  175.         TSeqPos length, char* dst);
  176.     static SIZE_TYPE x_Convert8naTo4na(const char* src, TSeqPos pos, 
  177.         TSeqPos length, char* dst);
  178.     // --- AA conversions:
  179.     // iupacaa -> ...
  180.     static SIZE_TYPE x_ConvertIupacaaToEaa(const char* src, TSeqPos pos, 
  181.         TSeqPos length, char* dst);
  182.     static SIZE_TYPE x_ConvertIupacaaToStdaa(const char* src, TSeqPos pos, 
  183.         TSeqPos length, char* dst);
  184.     // ncbieaa -> ...
  185.     static SIZE_TYPE x_ConvertEaaToIupacaa(const char* src, TSeqPos pos, 
  186.         TSeqPos length, char* dst);
  187.     static SIZE_TYPE x_ConvertEaaToStdaa(const char* src, TSeqPos pos, 
  188.         TSeqPos length, char* dst);
  189.     // ncbistdaa (ncbi8aa) -> ...
  190.     static SIZE_TYPE x_ConvertStdaaToIupacaa(const char* src, TSeqPos pos, 
  191.         TSeqPos length, char* dst);
  192.     static SIZE_TYPE x_ConvertStdaaToEaa(const char* src, TSeqPos pos, 
  193.         TSeqPos length, char* dst);
  194.     
  195.     // Test for amibiguous bases (not A,C,G or T) starting at position 0.
  196.     static bool x_HasAmbig(const char* src, TCoding src_coding, size_t length);
  197.     static bool x_HasAmbigNcbi8na(const char* src, size_t length);
  198.     static bool x_HasAmbigNcbi4na(const char* src, size_t length);
  199.     static bool x_HasAmbigIupacna(const char* src, size_t length);
  200. };
  201. END_NCBI_SCOPE
  202. #endif  /* UTIL_SEQUTIL___SEQUTIL_CONVERT_IMP__HPP */
  203. /*
  204. * ===========================================================================
  205. *
  206. * $Log: sequtil_convert_imp.hpp,v $
  207. * Revision 1000.0  2003/10/29 16:02:38  gouriano
  208. * PRODUCTION: IMPORTED [ORIGINAL] Dev-tree R1.2
  209. *
  210. * Revision 1.2  2003/10/14 14:51:02  ucko
  211. * Fix for GCC 2.95, whose operator[] const returns a copy rather than a
  212. * const reference, by substituting *x.begin().
  213. *
  214. * Revision 1.1  2003/10/08 13:35:10  shomrat
  215. * Initial version
  216. *
  217. *
  218. * ===========================================================================
  219. */