From ab64806af2a10657dd15a5e8670ba6e900a3c29d Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Thu, 15 Nov 2007 05:57:06 +0000 Subject: [PATCH] =?UTF-8?q?Import=20the=20boost=20scoped=5Fptr=20class=20t?= =?UTF-8?q?o=20LLVM.=20=20This=20patch=20was=20prepared=20by=20C=C3=A9dric?= =?UTF-8?q?=20Venet.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@44161 91177308-0d34-0410-b5e6-96231b3b80d8 --- LICENSE.TXT | 3 + docs/BOOST_LICENSE_1_0.txt | 23 ++++++ include/llvm/ADT/scoped_ptr.h | 129 ++++++++++++++++++++++++++++++++++ 3 files changed, 155 insertions(+) create mode 100644 docs/BOOST_LICENSE_1_0.txt create mode 100644 include/llvm/ADT/scoped_ptr.h diff --git a/LICENSE.TXT b/LICENSE.TXT index e8e082fc243..d453def1db1 100644 --- a/LICENSE.TXT +++ b/LICENSE.TXT @@ -66,3 +66,6 @@ Compiler Driver llvm/tools/llvmc Autoconf llvm/autoconf llvm/projects/ModuleMaker/autoconf llvm/projects/sample/autoconf +Boost C++ Libraries llvm/include : docs/BOOST_LICENSE_1_0.txt + + diff --git a/docs/BOOST_LICENSE_1_0.txt b/docs/BOOST_LICENSE_1_0.txt new file mode 100644 index 00000000000..36b7cd93cdf --- /dev/null +++ b/docs/BOOST_LICENSE_1_0.txt @@ -0,0 +1,23 @@ +Boost Software License - Version 1.0 - August 17th, 2003 + +Permission is hereby granted, free of charge, to any person or organization +obtaining a copy of the software and accompanying documentation covered by +this license (the "Software") to use, reproduce, display, distribute, +execute, and transmit the Software, and to prepare derivative works of the +Software, and to permit third-parties to whom the Software is furnished to +do so, all subject to the following: + +The copyright notices in the Software and this entire statement, including +the above license grant, this restriction and the following disclaimer, +must be included in all copies of the Software, in whole or in part, and +all derivative works of the Software, unless such copies or derivative +works are solely in the form of machine-executable object code generated by +a source language processor. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT +SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE +FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, +ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. diff --git a/include/llvm/ADT/scoped_ptr.h b/include/llvm/ADT/scoped_ptr.h new file mode 100644 index 00000000000..a95a6efaef8 --- /dev/null +++ b/include/llvm/ADT/scoped_ptr.h @@ -0,0 +1,129 @@ +//===- llvm/ADT/scoped_ptr.h - basic smart pointer --------------*- C++ -*-===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// +// +// This file defines the scoped_ptr smart pointer: 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. +// +//===----------------------------------------------------------------------===// +// +// (C) Copyright Greg Colvin and Beman Dawes 1998, 1999. +// Copyright (c) 2001, 2002 Peter Dimov +// +// Distributed under the Boost Software License, Version 1.0. (See +// accompanying file llvm/docs/BOOST_LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt ) +// +// http://www.boost.org/libs/smart_ptr/scoped_ptr.htm +// + +#ifndef LLVM_SCOPED_PTR_HPP_INCLUDED +#define LLVM_SCOPED_PTR_HPP_INCLUDED + +#include + +namespace llvm { + +// verify that types are complete for increased safety +template inline void checked_delete(T * x) { + // intentionally complex - simplification causes regressions + typedef char type_must_be_complete[ sizeof(T)? 1: -1 ]; + (void) sizeof(type_must_be_complete); + delete x; +} + +// 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. + +template class scoped_ptr // noncopyable +{ +private: + + T * ptr; + + scoped_ptr(scoped_ptr const &); + scoped_ptr & operator=(scoped_ptr const &); + + typedef scoped_ptr this_type; + +public: + + typedef T element_type; + + explicit scoped_ptr(T * p = 0): ptr(p) // never throws + { + } + + ~scoped_ptr() // never throws + { + llvm::checked_delete(ptr); + } + + void reset(T * p = 0) // never throws + { + assert( (p == 0 || p != ptr) && "scoped_ptr: self-reset error"); // catch self-reset errors + this_type(p).swap(*this); + } + + T & operator*() const // never throws + { + assert(ptr != 0 && "scoped_ptr: Trying to dereference a null pointeur"); + return *ptr; + } + + T * operator->() const // never throws + { + assert(ptr != 0 && "scoped_ptr: Trying to dereference a null pointeur"); + return ptr; + } + + T * get() const // never throws + { + return ptr; + } + + // implicit conversion to "bool" + typedef T * this_type::*unspecified_bool_type; + + operator unspecified_bool_type() const // never throws + { + return ptr == 0? 0: &this_type::ptr; + } + + bool operator! () const // never throws + { + return ptr == 0; + } + + void swap(scoped_ptr & b) // never throws + { + T * tmp = b.ptr; + b.ptr = ptr; + ptr = tmp; + } +}; + +template inline void swap(scoped_ptr & a, scoped_ptr & b) // never throws +{ + a.swap(b); +} + +// get_pointer(p) is a generic way to say p.get() + +template inline T * get_pointer(scoped_ptr const & p) +{ + return p.get(); +} + +} // namespace llvm + +#endif // #ifndef LLVM_SCOPED_PTR_HPP_INCLUDED