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

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: ptr.h,v 1.11.4.1 2003/04/12 22:52:34 mike Exp $
  29.  * 
  30.  */
  31. #if !defined(AFX_PTR_H__DE473C69_8A68_4943_B3D7_EE059BE4EB0F__INCLUDED_)
  32. #define AFX_PTR_H__DE473C69_8A68_4943_B3D7_EE059BE4EB0F__INCLUDED_
  33. #if _MSC_VER > 1000
  34. #pragma once
  35. #endif // _MSC_VER > 1000
  36. namespace kilo
  37. {
  38. template <class T> class auto_ptr {
  39. private:
  40.   T* m_ptr;
  41. public:
  42.   explicit auto_ptr(T* p = 0) : m_ptr(p) {}
  43.   auto_ptr(auto_ptr& a) : m_ptr(a.release()) {}
  44.   auto_ptr& operator=(auto_ptr& a) {
  45. if (&a != this) {
  46.   delete m_ptr;
  47.   m_ptr = a.release();
  48. }
  49. return *this;
  50.   }
  51.   auto_ptr& operator=(T *p) {
  52. if (p != m_ptr) {
  53.   delete m_ptr;
  54.   m_ptr=p;
  55. }
  56. return *this;
  57.   }
  58.   ~auto_ptr() { delete m_ptr; }
  59.   T& operator*() const { return *m_ptr; }
  60.   T* operator->() const { return m_ptr; }
  61.   T* get() const { return m_ptr; }
  62.   T* release() { T* tmp = m_ptr; m_ptr = 0; return tmp; }
  63.   void reset(T* p = 0) { delete m_ptr; m_ptr = p; }
  64. };
  65. }
  66. template<class T>
  67. class Buffer
  68. {
  69.   struct Buf {
  70.     int     m_refs;
  71.     //T     *m_data;
  72.   };
  73.   T     *m_data;
  74.   Buf     *buf() const { return ((Buf*)m_data)-1; }
  75.   int     m_size;
  76.   void     grab() const {
  77.     if (m_data)
  78.       ++buf()->m_refs;
  79.   }
  80.   void     release() {
  81.     if (m_data) {
  82.       if (--buf()->m_refs==0)
  83. delete[] buf();
  84.       m_data=0;
  85.     }
  86.   }
  87. public:
  88.   Buffer() : m_data(0), m_size(0) { }
  89.   Buffer(const Buffer& b) : m_data(b.m_data), m_size(b.m_size) { grab(); }
  90.   Buffer(int n) : m_size(n), m_data(0) {
  91.     if (n) {
  92.       m_data=(T*)(new Buf[(sizeof(T)*n+sizeof(Buf)-1)/sizeof(Buf)+1]+1);
  93.       buf()->m_refs=1;
  94.     }
  95.   }
  96.   Buffer(const T *p,int n) : m_size(n), m_data(0) {
  97.     if (n) {
  98.       m_data=(T*)(new Buf[(sizeof(T)*n+sizeof(Buf)-1)/sizeof(Buf)+1]+1);
  99.       buf()->m_refs=1;
  100.       memcpy(m_data,p,sizeof(T)*n);
  101.     }
  102.   }
  103.   ~Buffer() { release(); }
  104.   Buffer<T>& operator=(const Buffer<T>& b) {
  105.     b.grab();
  106.     release();
  107.     m_data=b.m_data;
  108.     m_size=b.m_size;
  109.     return *this;
  110.   }
  111.   operator T*() { return m_data; }
  112.   operator const T*() const { return m_data; }
  113.   int size() const { return m_size; }
  114.   void setsize(int ns) { m_size=ns; }
  115.   void Zero() { memset(m_data,0,m_size*sizeof(T)); }
  116. };
  117. #endif // !defined(AFX_PTR_H__DE473C69_8A68_4943_B3D7_EE059BE4EB0F__INCLUDED_)