Import the boost scoped_ptr class to LLVM. This patch was prepared by
authorChris Lattner <sabre@nondot.org>
Thu, 15 Nov 2007 05:57:06 +0000 (05:57 +0000)
committerChris Lattner <sabre@nondot.org>
Thu, 15 Nov 2007 05:57:06 +0000 (05:57 +0000)
C├ędric Venet.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@44161 91177308-0d34-0410-b5e6-96231b3b80d8

LICENSE.TXT
docs/BOOST_LICENSE_1_0.txt [new file with mode: 0644]
include/llvm/ADT/scoped_ptr.h [new file with mode: 0644]

index e8e082f..d453def 100644 (file)
@@ -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 (file)
index 0000000..36b7cd9
--- /dev/null
@@ -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 (file)
index 0000000..a95a6ef
--- /dev/null
@@ -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 <cassert>
+
+namespace llvm {
+
+// verify that types are complete for increased safety
+template<class T> 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 T> class scoped_ptr // noncopyable
+{
+private:
+
+    T * ptr;
+
+    scoped_ptr(scoped_ptr const &);
+    scoped_ptr & operator=(scoped_ptr const &);
+
+    typedef scoped_ptr<T> 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<class T> inline void swap(scoped_ptr<T> & a, scoped_ptr<T> & b) // never throws
+{
+    a.swap(b);
+}
+
+// get_pointer(p) is a generic way to say p.get()
+
+template<class T> inline T * get_pointer(scoped_ptr<T> const & p)
+{
+    return p.get();
+}
+
+} // namespace llvm
+
+#endif // #ifndef LLVM_SCOPED_PTR_HPP_INCLUDED