VirtualBox

source: vbox/trunk/src/libs/boost-1.37.0/boost/scoped_array.hpp@ 41872

Last change on this file since 41872 was 16204, checked in by vboxsync, 16 years ago

export the boost stuff required for Main

File size: 3.1 KB
Line 
1#ifndef BOOST_SCOPED_ARRAY_HPP_INCLUDED
2#define BOOST_SCOPED_ARRAY_HPP_INCLUDED
3
4// (C) Copyright Greg Colvin and Beman Dawes 1998, 1999.
5// Copyright (c) 2001, 2002 Peter Dimov
6//
7// Distributed under the Boost Software License, Version 1.0. (See
8// accompanying file LICENSE_1_0.txt or copy at
9// http://www.boost.org/LICENSE_1_0.txt)
10//
11// http://www.boost.org/libs/smart_ptr/scoped_array.htm
12//
13
14#include <boost/assert.hpp>
15#include <boost/checked_delete.hpp>
16#include <boost/config.hpp> // in case ptrdiff_t not in std
17
18#include <boost/detail/workaround.hpp>
19
20#include <cstddef> // for std::ptrdiff_t
21
22namespace boost
23{
24
25// Debug hooks
26
27#if defined(BOOST_SP_ENABLE_DEBUG_HOOKS)
28
29void sp_array_constructor_hook(void * p);
30void sp_array_destructor_hook(void * p);
31
32#endif
33
34// scoped_array extends scoped_ptr to arrays. Deletion of the array pointed to
35// is guaranteed, either on destruction of the scoped_array or via an explicit
36// reset(). Use shared_array or std::vector if your needs are more complex.
37
38template<class T> class scoped_array // noncopyable
39{
40private:
41
42 T * ptr;
43
44 scoped_array(scoped_array const &);
45 scoped_array & operator=(scoped_array const &);
46
47 typedef scoped_array<T> this_type;
48
49 void operator==( scoped_array const& ) const;
50 void operator!=( scoped_array const& ) const;
51
52public:
53
54 typedef T element_type;
55
56 explicit scoped_array(T * p = 0) : ptr(p) // never throws
57 {
58#if defined(BOOST_SP_ENABLE_DEBUG_HOOKS)
59 boost::sp_array_constructor_hook(ptr);
60#endif
61 }
62
63 ~scoped_array() // never throws
64 {
65#if defined(BOOST_SP_ENABLE_DEBUG_HOOKS)
66 boost::sp_array_destructor_hook(ptr);
67#endif
68 boost::checked_array_delete(ptr);
69 }
70
71 void reset(T * p = 0) // never throws
72 {
73 BOOST_ASSERT(p == 0 || p != ptr); // catch self-reset errors
74 this_type(p).swap(*this);
75 }
76
77 T & operator[](std::ptrdiff_t i) const // never throws
78 {
79 BOOST_ASSERT(ptr != 0);
80 BOOST_ASSERT(i >= 0);
81 return ptr[i];
82 }
83
84 T * get() const // never throws
85 {
86 return ptr;
87 }
88
89 // implicit conversion to "bool"
90
91#if defined(__SUNPRO_CC) && BOOST_WORKAROUND(__SUNPRO_CC, <= 0x530)
92
93 operator bool () const
94 {
95 return ptr != 0;
96 }
97
98#elif defined(__MWERKS__) && BOOST_WORKAROUND(__MWERKS__, BOOST_TESTED_AT(0x3003))
99 typedef T * (this_type::*unspecified_bool_type)() const;
100
101 operator unspecified_bool_type() const // never throws
102 {
103 return ptr == 0? 0: &this_type::get;
104 }
105
106#else
107
108 typedef T * this_type::*unspecified_bool_type;
109
110 operator unspecified_bool_type() const // never throws
111 {
112 return ptr == 0? 0: &this_type::ptr;
113 }
114
115#endif
116
117 bool operator! () const // never throws
118 {
119 return ptr == 0;
120 }
121
122 void swap(scoped_array & b) // never throws
123 {
124 T * tmp = b.ptr;
125 b.ptr = ptr;
126 ptr = tmp;
127 }
128
129};
130
131template<class T> inline void swap(scoped_array<T> & a, scoped_array<T> & b) // never throws
132{
133 a.swap(b);
134}
135
136} // namespace boost
137
138#endif // #ifndef BOOST_SCOPED_ARRAY_HPP_INCLUDED
Note: See TracBrowser for help on using the repository browser.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette