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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: handle_stack.cpp,v $
  4.  * PRODUCTION Revision 1000.1  2004/06/01 19:19:07  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.5
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /* $Id: handle_stack.cpp,v 1000.1 2004/06/01 19:19:07 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:  Vladimir Soussov
  35.  *   
  36.  * File Description:  Handlers Stack
  37.  *
  38.  */
  39. #include <ncbi_pch.hpp>
  40. #include <dbapi/driver/util/handle_stack.hpp>
  41. #include <string.h>
  42. BEGIN_NCBI_SCOPE
  43. CDBHandlerStack::CDBHandlerStack(size_t n)
  44. {
  45.     m_Room    = (n < 8) ? 8 : (int) n;
  46.     m_Stack   = new CDB_UserHandler* [m_Room];
  47.     m_TopItem = 0;
  48. }
  49. void CDBHandlerStack::Push(CDB_UserHandler* h)
  50. {
  51.     if (m_TopItem >= m_Room) {
  52.         CDB_UserHandler** t = m_Stack;
  53.         m_Room += m_Room / 2;
  54.         m_Stack = new CDB_UserHandler* [m_Room];
  55.         memcpy(m_Stack, t, m_TopItem * sizeof(CDB_UserHandler*));
  56.         delete [] t;
  57.     }
  58.     m_Stack[m_TopItem++] = h;
  59. }
  60. void CDBHandlerStack::Pop(CDB_UserHandler* h, bool last)
  61. {
  62.     int i;
  63.     if ( last ) {
  64.         for (i = m_TopItem;  --i >= 0; ) {
  65.             if (m_Stack[i] == h) {
  66.                 m_TopItem = i;
  67.                 break;
  68.             }
  69.         }
  70.     }
  71.     else {
  72.         for (i = 0;  i < m_TopItem;  i++) {
  73.             if (m_Stack[i] == h) {
  74.                 m_TopItem = i;
  75.                 break;
  76.             }
  77.         }
  78.     }
  79. }
  80. CDBHandlerStack::CDBHandlerStack(const CDBHandlerStack& s)
  81. {
  82.     m_Stack = new CDB_UserHandler* [s.m_Room];
  83.     memcpy(m_Stack, s.m_Stack, s.m_TopItem * sizeof(CDB_UserHandler*));
  84.     m_TopItem = s.m_TopItem;
  85.     m_Room    = s.m_Room;
  86. }
  87. CDBHandlerStack& CDBHandlerStack::operator= (const CDBHandlerStack& s)
  88. {
  89.     if (m_Room < s.m_TopItem) {
  90.         delete [] m_Stack;
  91.         m_Stack = new CDB_UserHandler* [s.m_Room];
  92.         m_Room = s.m_Room;
  93.     }
  94.     memcpy(m_Stack, s.m_Stack, s.m_TopItem * sizeof(CDB_UserHandler*));
  95.     m_TopItem = s.m_TopItem;
  96.     return *this;
  97. }
  98. void CDBHandlerStack::PostMsg(CDB_Exception* ex)
  99. {
  100.     for (int i = m_TopItem;  --i >= 0; ) {
  101.         if ( m_Stack[i]->HandleIt(ex) )
  102.             break;
  103.     }
  104. }
  105. END_NCBI_SCOPE
  106. /*
  107.  * ===========================================================================
  108.  * $Log: handle_stack.cpp,v $
  109.  * Revision 1000.1  2004/06/01 19:19:07  gouriano
  110.  * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.5
  111.  *
  112.  * Revision 1.5  2004/05/17 21:11:38  gorelenk
  113.  * Added include of PCH ncbi_pch.hpp
  114.  *
  115.  * Revision 1.4  2001/11/06 17:59:53  lavr
  116.  * Formatted uniformly as the rest of the library
  117.  *
  118.  * Revision 1.3  2001/09/27 20:08:32  vakatov
  119.  * Added "DB_" (or "I_") prefix where it was missing
  120.  *
  121.  * Revision 1.2  2001/09/27 16:46:32  vakatov
  122.  * Non-const (was const) exception object to pass to the user handler
  123.  *
  124.  * Revision 1.1  2001/09/21 23:39:59  vakatov
  125.  * -----  Initial (draft) revision.  -----
  126.  * This is a major revamp (by Denis Vakatov, with help from Vladimir Soussov)
  127.  * of the DBAPI "driver" libs originally written by Vladimir Soussov.
  128.  * The revamp involved massive code shuffling and grooming, numerous local
  129.  * API redesigns, adding comments and incorporating DBAPI to the C++ Toolkit.
  130.  *
  131.  * ===========================================================================
  132.  */