FastArray.cpp
上传用户:hmc_gdtv
上传日期:2013-08-04
资源大小:798k
文件大小:3k
源码类别:

Windows Mobile

开发平台:

Visual C++

  1. /*
  2.  * Copyright (c) 2001,2002,2003 Mike Matsnev.  All Rights Reserved.
  3.  *
  4.  * Redistribution and use in source and binary forms, with or without
  5.  * modification, are permitted provided that the following conditions
  6.  * are met:
  7.  *
  8.  * 1. Redistributions of source code must retain the above copyright
  9.  *    notice immediately at the beginning of the file, without modification,
  10.  *    this list of conditions, and the following disclaimer.
  11.  * 2. Redistributions in binary form must reproduce the above copyright
  12.  *    notice, this list of conditions and the following disclaimer in the
  13.  *    documentation and/or other materials provided with the distribution.
  14.  * 3. Absolutely no warranty of function or purpose is made by the author
  15.  *    Mike Matsnev.
  16.  *
  17.  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
  18.  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
  19.  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
  20.  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
  21.  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
  22.  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
  23.  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
  24.  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  25.  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
  26.  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  27.  * 
  28.  * $Id: FastArray.cpp,v 1.4.2.1 2003/04/12 22:52:32 mike Exp $
  29.  * 
  30.  */
  31. #include <afx.h>
  32. #include "FastArray.h"
  33. #define START_CHUNKS 16
  34. #define CHUNKS_INC 16
  35. FastArrayImp::FastArrayImp(unsigned item_size,HANDLE heap,bool dofree) :
  36.   m_item_size(item_size), m_heap(heap), m_dofree(dofree)
  37. {
  38.   m_chunks=(char**)HeapAlloc(m_heap,HEAP_NO_SERIALIZE|HEAP_ZERO_MEMORY,
  39.     sizeof(char*)*START_CHUNKS);
  40.   if (!m_chunks)
  41.     AfxThrowMemoryException();
  42.   m_chunks[0]=(char*)HeapAlloc(m_heap,HEAP_NO_SERIALIZE,m_item_size*CHUNK_ITEMS);
  43.   if (!m_chunks[0]) {
  44.     if (m_dofree)
  45.       HeapFree(m_heap,HEAP_NO_SERIALIZE,(void*)m_chunks);
  46.     AfxThrowMemoryException();
  47.   }
  48.   m_nchunks=START_CHUNKS;
  49.   m_curchunk=m_chunkptr=0;
  50. }
  51. FastArrayImp::~FastArrayImp() {
  52.   if (m_dofree) {
  53.     for (unsigned i=0;i<m_nchunks;++i)
  54.       if (m_chunks[i])
  55. HeapFree(m_heap,HEAP_NO_SERIALIZE,(void*)m_chunks[i]);
  56.     HeapFree(m_heap,HEAP_NO_SERIALIZE,(void*)m_chunks);
  57.   }
  58. }
  59. void *FastArrayImp::SlowGet() {
  60.   if (++m_curchunk>=m_nchunks) {
  61.     m_nchunks+=CHUNKS_INC;
  62.     m_chunks=(char**)HeapReAlloc(m_heap,HEAP_NO_SERIALIZE|HEAP_ZERO_MEMORY,
  63.       (void*)m_chunks,sizeof(char*)*m_nchunks);
  64.     if (!m_chunks)
  65.       AfxThrowMemoryException();
  66.   }
  67.   if (!m_chunks[m_curchunk]) {
  68.     m_chunks[m_curchunk]=(char*)HeapAlloc(m_heap,HEAP_NO_SERIALIZE,m_item_size*CHUNK_ITEMS);
  69.     if (!m_chunks[m_curchunk])
  70.       AfxThrowMemoryException();
  71.   }
  72.   m_chunkptr=1;
  73.   return (void*)m_chunks[m_curchunk];
  74. }