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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: memory_store.hpp,v $
  4.  * PRODUCTION Revision 1000.0  2003/10/29 20:27:20  gouriano
  5.  * PRODUCTION PRODUCTION: IMPORTED [ORIGINAL] Dev-tree R1.4
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. #ifndef DBAPI_DRIVER___MEMORY_STORE__HPP
  10. #define DBAPI_DRIVER___MEMORY_STORE__HPP
  11. /*  $Id: memory_store.hpp,v 1000.0 2003/10/29 20:27:20 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.  * File Name:  memory_store.cpp
  37.  *
  38.  * Author:  Vladimir Soussov
  39.  *
  40.  * File Description:  RAM storage
  41.  *
  42.  */
  43. #include <corelib/ncbistd.hpp>
  44. #include <corelib/ncbi_limits.h>
  45. BEGIN_NCBI_SCOPE
  46. static size_t kMax_BlobSize= (size_t) kMax_Int;
  47. // The storage with the sequential access
  48. class C_SA_Storage
  49. {
  50. public:
  51.     virtual size_t  Read  (void*       buff, size_t nof_bytes) = 0;
  52.     virtual size_t  Append(const void* buff, size_t nof_bytes) = 0;
  53.     virtual void    Flush (void) = 0;
  54.     virtual ~C_SA_Storage() {}
  55. };
  56. // Random access storage
  57. class C_RA_Storage : public C_SA_Storage
  58. {
  59. public:
  60.     enum EWhence {
  61.         eCurr,
  62.         eHead,
  63.         eTail
  64.     };
  65.     virtual long   Seek (long offset, EWhence whence) = 0;
  66.     virtual size_t Tell (void) const = 0;
  67.     virtual size_t Write(const void* buff, size_t nof_bytes) = 0;
  68.     virtual ~C_RA_Storage() {}
  69. };
  70. // Full access storage (allows insert and delete)
  71. class C_FA_Storage : public C_RA_Storage
  72. {
  73. public:
  74.     virtual size_t Insert  (const void* buff, size_t nof_bytes) = 0;
  75.     virtual size_t Delete  (size_t nof_bytes) = 0;
  76.     virtual size_t Truncate(size_t nof_bytes) = 0;
  77.     virtual ~C_FA_Storage() {}
  78. };
  79. class CMemStore : public C_FA_Storage
  80. {
  81. public:
  82.     CMemStore() { x_Init(); }
  83.     CMemStore(size_t block_size) { x_Init((TSize) block_size); }
  84.     CMemStore(C_SA_Storage& storage, size_t block_size = 2048);
  85.     ~CMemStore();
  86.     size_t Read        (void*       buff, size_t nof_bytes);
  87.     size_t Append      (const void* buff, size_t nof_bytes);
  88.     size_t Write       (const void* buff, size_t nof_bytes);
  89.     size_t Insert      (const void* buff, size_t nof_bytes);
  90.     size_t Delete      (size_t nof_bytes = kMax_BlobSize);
  91.     size_t Truncate    (size_t nof_bytes = kMax_BlobSize);
  92.     void   Flush       (void)  { return; };
  93.     long   Seek        (long offset, EWhence whence);
  94.     size_t Tell        () const  { return (size_t) m_Pos; }
  95.     size_t GetDataSize () const  { return (size_t) m_Size; }
  96.     typedef long TSize;
  97. private:
  98.     struct SMemBlock
  99.     {
  100.         SMemBlock* next;
  101.         SMemBlock* prev;
  102.         TSize      free_space;
  103.         char*      body;
  104.     };
  105.     TSize      m_BlockSize;
  106.     SMemBlock* m_First;
  107.     SMemBlock* m_Last;
  108.     SMemBlock* m_Current;
  109.     TSize      m_Pos;
  110.     TSize      m_BlockPos;
  111.     TSize      m_Size;
  112.     SMemBlock* x_InsertBlock(void);
  113.     SMemBlock* x_AddBlock(void);
  114.     TSize      x_SeekHEAD(TSize offset);
  115.     TSize      x_SeekCURR(TSize offset);
  116.     TSize      x_SeekTAIL(TSize offset);
  117.     void x_Init(TSize block_size = 2048) {
  118.         m_BlockSize = (block_size > 16) ? block_size : 2048;
  119.         m_First = m_Last = m_Current = 0;
  120.         m_Pos = m_BlockPos = m_Size = 0;
  121.     };
  122. };
  123. END_NCBI_SCOPE
  124. /*
  125.  * ===========================================================================
  126.  * $Log: memory_store.hpp,v $
  127.  * Revision 1000.0  2003/10/29 20:27:20  gouriano
  128.  * PRODUCTION: IMPORTED [ORIGINAL] Dev-tree R1.4
  129.  *
  130.  * Revision 1.4  2002/09/13 18:43:18  soussov
  131.  * fixes compiler warnings
  132.  *
  133.  * Revision 1.3  2002/09/13 18:27:02  soussov
  134.  * fixed bug with long overflow
  135.  *
  136.  * Revision 1.2  2001/11/06 17:59:53  lavr
  137.  * Formatted uniformly as the rest of the library
  138.  *
  139.  * Revision 1.1  2001/09/21 23:40:00  vakatov
  140.  * -----  Initial (draft) revision.  -----
  141.  * This is a major revamp (by Denis Vakatov, with help from Vladimir Soussov)
  142.  * of the DBAPI "driver" libs originally written by Vladimir Soussov.
  143.  * The revamp involved massive code shuffling and grooming, numerous local
  144.  * API redesigns, adding comments and incorporating DBAPI to the C++ Toolkit.
  145.  *
  146.  * ===========================================================================
  147.  */
  148. #endif  /* DBAPI_DRIVER___MEMORY_STORE__HPP */