⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 scoped_ptr.h

📁 本人收集整理的一份c/c++跨平台网络库
💻 H
字号:
/****************************************************************************//  scoped_ptr mimics a built-in pointer except that it guarantees deletion//  of the object pointed to, either on destruction of the scoped_ptr or via//  an explicit reset(). scoped_ptr is a simple solution for simple needs;//  use shared_ptr or std::auto_ptr if your needs are more complex.//  scoped_ptr_malloc added in by Google.  When one of//  these goes out of scope, instead of doing a delete or delete[], it//  calls free().  scoped_ptr_malloc<char> is likely to see much more//  use than any other specializations.//  release() added in by Google. Use this to conditionally//  transfer ownership of a heap-allocated object to the caller, usually on//  method success.******************************************************************************/#ifndef UTILS_BASE_SCOPED_PTR_H_#define UTILS_BASE_SCOPED_PTR_H_#include <cstddef>            // for std::ptrdiff_t#include <assert.h>           // for assert#include <stdlib.h>           // for free() decl#ifdef _WIN32namespace std { using ::ptrdiff_t; };#endif // _WIN32namespace utils_base {template <typename T>class scoped_ptr { private:  T* ptr;  scoped_ptr(scoped_ptr const &);  scoped_ptr & operator=(scoped_ptr const &); public:  typedef T element_type;  explicit scoped_ptr(T* p = 0): ptr(p) {}  ~scoped_ptr() {    typedef char type_must_be_complete[sizeof(T)];    delete ptr;  }  void reset(T* p = 0) {    typedef char type_must_be_complete[sizeof(T)];    if (ptr != p) {      delete ptr;      ptr = p;    }  }  T& operator*() const {    assert(ptr != 0);    return *ptr;  }  T* operator->() const  {    assert(ptr != 0);    return ptr;  }  T* get() const  {    return ptr;  }  void swap(scoped_ptr & b) {    T* tmp = b.ptr;    b.ptr = ptr;    ptr = tmp;  }  T* release() {    T* tmp = ptr;    ptr = 0;    return tmp;  }    T** accept() {    if (ptr) {      delete ptr;      ptr = 0;    }    return &ptr;  }  T** use() {    return &ptr;  }};template<typename T> inlinevoid swap(scoped_ptr<T>& a, scoped_ptr<T>& b) {  a.swap(b);}//  scoped_array extends scoped_ptr to arrays. Deletion of the array pointed to//  is guaranteed, either on destruction of the scoped_array or via an explicit//  reset(). Use shared_array or std::vector if your needs are more complex.template<typename T>class scoped_array { private:  T* ptr;  scoped_array(scoped_array const &);  scoped_array & operator=(scoped_array const &); public:  typedef T element_type;  explicit scoped_array(T* p = 0) : ptr(p) {}  ~scoped_array() {    typedef char type_must_be_complete[sizeof(T)];    delete[] ptr;  }  void reset(T* p = 0) {    typedef char type_must_be_complete[sizeof(T)];    if (ptr != p) {      delete [] ptr;      ptr = p;    }  }  T& operator[](std::ptrdiff_t i) const {    assert(ptr != 0);    assert(i >= 0);    return ptr[i];  }  T* get() const {    return ptr;  }  void swap(scoped_array & b) {    T* tmp = b.ptr;    b.ptr = ptr;    ptr = tmp;  }  T* release() {    T* tmp = ptr;    ptr = 0;    return tmp;  }  T** accept() {    if (ptr) {      delete [] ptr;      ptr = 0;    }    return &ptr;  }};template<class T> inline void swap(scoped_array<T>& a, scoped_array<T>& b) {  a.swap(b);}// scoped_ptr_malloc<> is similar to scoped_ptr<>, but it accepts a// second template argument, the function used to free the object.template<typename T, void (*FF)(void*) = free> class scoped_ptr_malloc { private:  T* ptr;  scoped_ptr_malloc(scoped_ptr_malloc const &);  scoped_ptr_malloc & operator=(scoped_ptr_malloc const &); public:  typedef T element_type;  explicit scoped_ptr_malloc(T* p = 0): ptr(p) {}  ~scoped_ptr_malloc() {    typedef char type_must_be_complete[sizeof(T)];    FF(static_cast<void*>(ptr));  }  void reset(T* p = 0) {    typedef char type_must_be_complete[sizeof(T)];    if (ptr != p) {      FF(static_cast<void*>(ptr));      ptr = p;    }  }  T& operator*() const {    assert(ptr != 0);    return *ptr;  }  T* operator->() const {    assert(ptr != 0);    return ptr;  }  T* get() const {    return ptr;  }  void swap(scoped_ptr_malloc & b) {    T* tmp = b.ptr;    b.ptr = ptr;    ptr = tmp;  }  T* release() {    T* tmp = ptr;    ptr = 0;    return tmp;  }  T** accept() {    if (ptr) {      FF(static_cast<void*>(ptr));      ptr = 0;    }    return &ptr;  }};template<typename T, void (*FF)(void*)> inline void swap(scoped_ptr_malloc<T,FF>& a, scoped_ptr_malloc<T,FF>& b) {  a.swap(b);}} // namespace utils_base// TODO: get rid of this global using using utils_base::scoped_ptr;#endif  // #ifndef UTILS_BASE_SCOPED_PTR_H_

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -