Library of Assembled Shared Sources
scoped_ptr.h
Go to the documentation of this file.
1/** @file
2 * @author Bram de Greve (bram@cocamware.com)
3 * @author Tom De Muer (tom@cocamware.com)
4 *
5 * *** BEGIN LICENSE INFORMATION ***
6 *
7 * The contents of this file are subject to the Common Public Attribution License
8 * Version 1.0 (the "License"); you may not use this file except in compliance with
9 * the License. You may obtain a copy of the License at
10 * http://lass.sourceforge.net/cpal-license. The License is based on the
11 * Mozilla Public License Version 1.1 but Sections 14 and 15 have been added to cover
12 * use of software over a computer network and provide for limited attribution for
13 * the Original Developer. In addition, Exhibit A has been modified to be consistent
14 * with Exhibit B.
15 *
16 * Software distributed under the License is distributed on an "AS IS" basis, WITHOUT
17 * WARRANTY OF ANY KIND, either express or implied. See the License for the specific
18 * language governing rights and limitations under the License.
19 *
20 * The Original Code is LASS - Library of Assembled Shared Sources.
21 *
22 * The Initial Developer of the Original Code is Bram de Greve and Tom De Muer.
23 * The Original Developer is the Initial Developer.
24 *
25 * All portions of the code written by the Initial Developer are:
26 * Copyright (C) 2004-2011 the Initial Developer.
27 * All Rights Reserved.
28 *
29 * Contributor(s):
30 *
31 * Alternatively, the contents of this file may be used under the terms of the
32 * GNU General Public License Version 2 or later (the GPL), in which case the
33 * provisions of GPL are applicable instead of those above. If you wish to allow use
34 * of your version of this file only under the terms of the GPL and not to allow
35 * others to use your version of this file under the CPAL, indicate your decision by
36 * deleting the provisions above and replace them with the notice and other
37 * provisions required by the GPL License. If you do not delete the provisions above,
38 * a recipient may use your version of this file under either the CPAL or the GPL.
39 *
40 * *** END LICENSE INFORMATION ***
41 */
42
43#ifndef LASS_GUARDIAN_OF_INCLUSION_UTIL_SCOPED_PTR_H
44#define LASS_GUARDIAN_OF_INCLUSION_UTIL_SCOPED_PTR_H
45
46#include "util_common.h"
47#include "non_copyable.h"
48#include "smart_ptr_policies.h"
49
50#if LASS_COMPILER_TYPE == LASS_COMPILER_TYPE_MSVC
51# pragma warning(push)
52# pragma warning(disable: 4996) // 'deprecated-declaration': deprecation-message (or "was declared deprecated")
53#else
54# pragma GCC diagnostic push
55# pragma GCC diagnostic ignored "-Wdeprecated-declarations"
56#endif
57
58namespace lass
59{
60namespace util
61{
62
63template
64<
65 typename T,
66 template <typename, typename> class StoragePolicy = ObjectStorage
67>
68class LASS_DEPRECATED("use std::unique_ptr instead") ScopedPtr: public StoragePolicy<T, NonCopyable>
69{
70public:
71
72 typedef T TPointee;
73 typedef StoragePolicy<T, NonCopyable> TStoragePolicy;
74 typedef typename TStoragePolicy::TStorage TStorage;
75 typedef typename TStoragePolicy::TPointer TPointer;
76 typedef typename TStoragePolicy::TReference TReference;
77
78 template <typename U> struct Rebind
79 {
80 typedef ScopedPtr<U, StoragePolicy> Type;
81 };
82
83 ScopedPtr():
84 TStoragePolicy()
85 {
86 }
87 explicit ScopedPtr(TPointer p):
88 TStoragePolicy(p)
89 {
90 }
91 ~ScopedPtr()
92 {
93 TStoragePolicy::dispose();
94 }
95
96 void reset(TPointer p = 0)
97 {
98 ScopedPtr temp(p);
99 swap(temp);
100 }
101
102 template <typename U> ScopedPtr(std::unique_ptr<U> p):
103 TStoragePolicy(p.get())
104 {
105 p.release();
106 }
107 template <typename U> void reset(std::unique_ptr<U> p)
108 {
109 ScopedPtr temp(std::move(p));
110 swap(temp);
111 }
112
113 void swap(ScopedPtr& other)
114 {
115 TStoragePolicy::swap(other);
116 }
117
118 TPointer get() const
119 {
120 return TStoragePolicy::pointer();
121 }
122 TPointer operator->() const
123 {
124 LASS_ASSERT(get());
125 return get();
126 }
127 TReference operator*() const
128 {
129 LASS_ASSERT(get());
130 return *get();
131 }
132 TReference operator[](size_t i) const
133 {
134 LASS_ASSERT(get());
135 return TStoragePolicy::at(i);
136 }
137
138 bool isEmpty() const
139 {
140 return TStoragePolicy::isNull();
141 }
142 bool operator!() const
143 {
144 return isEmpty();
145 }
146 explicit operator bool() const
147 {
148 return !isEmpty();
149 }
150
151 /** returns reference to storage pointer */
152 const TStorage& storage() const
153 {
154 return TStoragePolicy::storage();
155 }
156 /** returns reference to storage pointer */
157 TStorage& storage()
158 {
159 return TStoragePolicy::storage();
160 }
161};
162
163#if LASS_COMPILER_TYPE == LASS_COMPILER_TYPE_MSVC
164# pragma warning(pop)
165#else
166# pragma GCC diagnostic pop
167#endif
168
169}
170}
171
172#endif
173
174// EOF
Default storage policy for single objects, implementation of StoragePolicy concept.
general utility, debug facilities, ...
Library for Assembled Shared Sources.
Definition config.h:53