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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: blast_hspstream.c,v $
  4.  * PRODUCTION Revision 1000.0  2004/06/01 18:13:38  gouriano
  5.  * PRODUCTION PRODUCTION: IMPORTED [GCC34_MSVC7] Dev-tree R1.2
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /*  $Id: blast_hspstream.c,v 1000.0 2004/06/01 18:13:38 gouriano Exp $
  10.  * ===========================================================================
  11.  *
  12.  *                            PUBLIC DOMAIN NOTICE
  13.  *               National Center for Biotechnology Information
  14.  *
  15.  *  This software/database is a "United States Government Work" under the
  16.  *  terms of the United States Copyright Act.  It was written as part of
  17.  *  the author's official duties as a United States Government employee and
  18.  *  thus cannot be copyrighted.  This software/database is freely available
  19.  *  to the public for use. The National Library of Medicine and the U.S.
  20.  *  Government have not placed any restriction on its use or reproduction.
  21.  *
  22.  *  Although all reasonable efforts have been taken to ensure the accuracy
  23.  *  and reliability of the software and data, the NLM and the U.S.
  24.  *  Government do not and cannot warrant the performance or results that
  25.  *  may be obtained by using this software or data. The NLM and the U.S.
  26.  *  Government disclaim all warranties, express or implied, including
  27.  *  warranties of performance, merchantability or fitness for any particular
  28.  *  purpose.
  29.  *
  30.  *  Please cite the author in any work or product based on this material.
  31.  *
  32.  * ===========================================================================
  33.  *
  34.  * Author:  Christiam Camacho
  35.  *
  36.  */
  37. /** @file blast_hspstream.c
  38.  * Definition of ADT to save and retrieve lists of HSPs in the BLAST engine.
  39.  */
  40. static char const rcsid[] = 
  41.     "$Id: blast_hspstream.c,v 1000.0 2004/06/01 18:13:38 gouriano Exp $";
  42. #include <algo/blast/core/blast_hspstream.h>
  43. #include <algo/blast/core/blast_def.h>      /* needed for sfree */
  44. /** Complete type definition of Blast Hsp Stream ADT */
  45. struct BlastHSPStream {
  46.     BlastHSPStreamConstructor NewFnPtr;       /**< Constructor */
  47.     BlastHSPStreamDestructor  DeleteFnPtr;    /**< Destructor */
  48.     /* The operational interface */
  49.     BlastHSPStreamMethod      WriteFnPtr;     /**< Write to BlastHSPStream */
  50.     BlastHSPStreamMethod      ReadFnPtr;      /**< Read from BlastHSPStream */
  51.     void* DataStructure;  /**< ADT holding HSPStream */
  52. };
  53. BlastHSPStream* BlastHSPStreamNew(const BlastHSPStreamNewInfo* bhsn_info)
  54. {
  55.     BlastHSPStream* retval = NULL;
  56.     BlastHSPStreamFunctionPointerTypes fnptr;
  57.     if ( bhsn_info == NULL ) {
  58.         return NULL;
  59.     }
  60.     if ( !(retval = (BlastHSPStream*) calloc(1, sizeof(BlastHSPStream)))) {
  61.         return NULL;
  62.     }
  63.     /* Save the constructor and invoke it */
  64.     fnptr.ctor = bhsn_info->constructor;
  65.     SetMethod(retval, eConstructor, fnptr);
  66.     if (retval->NewFnPtr) {
  67.         retval = (*retval->NewFnPtr)(retval, bhsn_info->ctor_argument);
  68.     } else {
  69.         sfree(retval);
  70.     }
  71.     ASSERT(retval->DeleteFnPtr);
  72.     ASSERT(retval->WriteFnPtr);
  73.     ASSERT(retval->ReadFnPtr);
  74.     return retval;
  75. }
  76. BlastHSPStream* BlastHSPStreamFree(BlastHSPStream* hsp_stream)
  77. {
  78.     BlastHSPStreamDestructor destructor_fnptr = NULL;
  79.     if (!hsp_stream) {
  80.         return (BlastHSPStream*) NULL;
  81.     }
  82.     if ( !(destructor_fnptr = (*hsp_stream->DeleteFnPtr))) {
  83.         sfree(hsp_stream);
  84.         return NULL;
  85.     }
  86.     return (BlastHSPStream*) (*destructor_fnptr)(hsp_stream);
  87. }
  88. const int kBlastHSPStream_Error = -1;
  89. const int kBlastHSPStream_Success = 0;
  90. const int kBlastHSPStream_Eof = 1;
  91. /** This method is akin to a vtable dispatcher, invoking the method registered
  92.  * upon creation of the implementation of the BlastHSPStream interface 
  93.  * @param hsp_stream The BlastHSPStream object [in]
  94.  * @param name Name of the method to invoke on hsp_stream [in]
  95.  * @param arg Arbitrary argument passed to the method name [in]
  96.  * @return kBlastHSPStream_Error on NULL hsp_stream or NULL method pointer 
  97.  * (i.e.: unimplemented or uninitialized method on the BlastHSPStream 
  98.  * interface) or return value of the implementation.
  99.  */
  100. static int 
  101. _MethodDispatcher(BlastHSPStream* hsp_stream, EMethodName name, 
  102.                   BlastHSPList** hsp_list)
  103. {
  104.     BlastHSPStreamMethod method_fnptr = NULL;
  105.     if (!hsp_stream) {
  106.         return kBlastHSPStream_Error;
  107.     }
  108.     ASSERT(name < eMethodBoundary); 
  109.     switch (name) {
  110.     case eRead:
  111.         method_fnptr = (*hsp_stream->ReadFnPtr);
  112.         break;
  113.     case eWrite:
  114.         method_fnptr = (*hsp_stream->WriteFnPtr);
  115.         break;
  116.     default:
  117.         abort();    /* should never happen */
  118.     }
  119.     if (!method_fnptr) {
  120.         return kBlastHSPStream_Error;
  121.     }
  122.     return (*method_fnptr)(hsp_stream, hsp_list);
  123. }
  124. int BlastHSPStreamRead(BlastHSPStream* hsp_stream, BlastHSPList** hsp_list)
  125. {
  126.     return _MethodDispatcher(hsp_stream, eRead, hsp_list);
  127. }
  128. int BlastHSPStreamWrite(BlastHSPStream* hsp_stream, BlastHSPList** hsp_list)
  129. {
  130.     return _MethodDispatcher(hsp_stream, eWrite, hsp_list);
  131. }
  132. /*****************************************************************************/
  133. void* GetData(BlastHSPStream* hsp_stream)
  134. {
  135.     if ( !hsp_stream ) {
  136.         return NULL;
  137.     }
  138.     return hsp_stream->DataStructure;
  139. }
  140. int SetData(BlastHSPStream* hsp_stream, void* data)
  141. {
  142.     if ( !hsp_stream ) {
  143.         return kBlastHSPStream_Error;
  144.     }
  145.     hsp_stream->DataStructure = data;
  146.     return kBlastHSPStream_Success;
  147. }
  148. int SetMethod(BlastHSPStream* hsp_stream, 
  149.               EMethodName name,
  150.               BlastHSPStreamFunctionPointerTypes fnptr_type)
  151. {
  152.     if ( !hsp_stream ) {
  153.         return kBlastHSPStream_Error;
  154.     }
  155.     ASSERT(name < eMethodBoundary); 
  156.     switch (name) {
  157.     case eConstructor:
  158.         hsp_stream->NewFnPtr = fnptr_type.ctor;
  159.         break;
  160.     case eDestructor:
  161.         hsp_stream->DeleteFnPtr = fnptr_type.dtor;
  162.         break;
  163.     case eRead:
  164.         hsp_stream->ReadFnPtr = fnptr_type.method;
  165.         break;
  166.     case eWrite:
  167.         hsp_stream->WriteFnPtr = fnptr_type.method;
  168.         break;
  169.     default:
  170.         abort();    /* should never happen */
  171.     }
  172.     return kBlastHSPStream_Success;
  173. }