FastArray.h
上传用户: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.h,v 1.4.2.1 2003/04/12 22:52:32 mike Exp $
  29.  * 
  30.  */
  31. #ifndef FASTARRAY_H
  32. #define FASTARRAY_H
  33. class FastArrayImp {
  34. protected:
  35.   HANDLE m_heap;
  36.   unsigned m_item_size;
  37.   char **m_chunks;
  38.   unsigned m_nchunks;
  39.   enum {
  40.     CHUNK_BITS=10,    // 1<<10 items per chunk
  41.     CHUNK_ITEMS=1<<CHUNK_BITS,
  42.     CHUNK_MASK=CHUNK_ITEMS-1
  43.   };
  44.   unsigned m_curchunk;
  45.   unsigned m_chunkptr;
  46.   bool m_dofree;
  47. FastArrayImp(unsigned item_size,HANDLE heap,bool dofree);
  48. ~FastArrayImp();
  49.   void *Get() {
  50.     if (m_chunkptr<CHUNK_ITEMS)
  51.       return m_chunks[m_curchunk]+m_item_size*m_chunkptr++;
  52.     return SlowGet();
  53.   }
  54.   int Size() { return (m_curchunk<<CHUNK_BITS)+m_chunkptr; }
  55.   void *Item(unsigned ii) {
  56.     return m_chunks[ii>>CHUNK_BITS]+m_item_size*(ii&CHUNK_MASK);
  57.   }
  58.   void *SlowGet();
  59.   void RemoveAll() { m_chunkptr=m_curchunk=0; }
  60. };
  61. // WARNING: this is intended for use with structures _without_ constructors and
  62. // destructors
  63. template<class T>
  64. class FastArray: public FastArrayImp {
  65. public:
  66. FastArray(HANDLE heap,bool dofree=false) : FastArrayImp(sizeof(T),heap,dofree) { }
  67.   T *Get() { return (T*)FastArrayImp::Get(); }
  68.   T& operator[](int ii) { return *(T*)FastArrayImp::Item(ii); }
  69.   int GetSize() { return Size(); }
  70.   void Add(T& tt) { memcpy(Get(),&tt,sizeof(T)); }
  71.   // does _not_ release memory
  72.   void RemoveAll() { FastArrayImp::RemoveAll(); }
  73. };
  74. #endif