STLdoc
STLdocumentation
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros
auto_gcroot.h
Go to the documentation of this file.
1 /***
2 *auto_gcroot.h
3 *
4 * Copyright (c) Microsoft Corporation. All rights reserved.
5 *
6 *Purpose: automatic resource management, like std::auto_ptr which can be used
7 * to embed a virtual handle into a native type
8 *
9 * [Public]
10 *
11 ****/
12 
13 #pragma once
14 
15 #if !defined (_INC_MSCLR_AUTO_GCROOT)
16 
17 #ifndef __cplusplus_cli
18 #error ERROR: msclr libraries are not compatible with /clr:oldSyntax
19 #endif /* __cplusplus_cli */
20 
21 #include <vcclr.h>
22 #include <msclr/safebool.h>
23 #include <algorithm>
24 
25 namespace msclr
26 {
27 
28 // Forward Declaration
29 template<typename _element_type>
31 
32 namespace _detail
33 {
34 
35 // _auto_gcroot_ref is a proxy reference for auto_gcroot copying.
36 // auto_gcroot's copy constructor takes a non-const reference
37 // because it must assume ownership from the source. But this
38 // makes it impossible for auto_gcroot to be returned by value,
39 // because temporary objects cannot be bound to non-const
40 // references. Instead, a conversion to _auto_gcroot_ref is provided,
41 // and an auto_gcroot can be initialized from an _auto_gcroot_ref.
42 
43  template<typename _element_type>
45  {
46  // construct from compatible auto_gcroot
48  : m_ref( ref )
49  {
50  }
51 
52  // reference to constructor argument
54 
55  };
56 
57 } // namespace detail
58 
59 // wrap a resource to enforce strict ownership and ensure proper cleanup
60 template<typename _element_type>
61 class auto_gcroot
62 {
63 private:
64  // disallow explicit comparisons to _safe_bool
67 
68 public:
69 
70  // Constructors
71 
72  // construct from object pointer
73  auto_gcroot( _element_type _ptr = nullptr )
74  : m_ptr( _ptr )
75  {
76  }
77 
78  // construct by assuming pointer from _right auto_gcroot
80  : m_ptr( _right.release() )
81  {
82  }
83 
84  // construct by assuming pointer from _right _detail::_auto_gcroot_ref
86  : m_ptr( _right.m_ref.release() )
87  {
88  }
89 
90  template<typename _other_type>
92  : m_ptr( _right.release() )
93  {
94  }
95 
96  auto_gcroot<_element_type> & attach(_element_type _right)
97  {
98  reset(_right);
99  return *this;
100  }
101 
102  // assign compatible _right
104  auto_gcroot<_element_type> & _right )
105  {
106  reset( _right.release() );
107  return *this;
108  }
109 
110  // assign compatible _right.ref
113  {
114  reset( _right.m_ref.release() );
115  return *this;
116  }
117 
118  template<typename _other_type>
120  auto_gcroot<_other_type> & _right )
121  {
122  reset( _right.release() );
123  return *this;
124  }
125 
126  auto_gcroot<_element_type> & operator=(_element_type _right)
127  {
128  return attach(_right);
129  }
130 
131  // assign compatible _right
133  auto_gcroot<_element_type> & _right )
134  {
135  return attach(_right);
136  }
137 
138  // assign compatible _right.ref
141  {
142  return attach(_right);
143  }
144 
145  template<typename _other_type>
147  auto_gcroot<_other_type> & _right )
148  {
149  return attach(_right);
150  }
151 
152  _element_type get() const
153  {
154  return m_ptr;
155  }
156 
157  // return pointer to class object (assume pointer)
158  _element_type operator->() const
159  {
160  return m_ptr;
161  }
162 
163  // for use when auto_gcroot appears in a conditional
164  operator _detail_class::_safe_bool() const
165  {
167  }
168 
169  // for use when auto_gcroot appears in a conditional
170  bool operator!() const
171  {
172  return ! valid();
173  }
174 
175  // convert to compatible _detail::_auto_gcroot_ref
177  {
179  }
180 
181  template<typename _other_type>
183  {
184  return auto_gcroot<_other_type>( *this );
185  }
186 
187  template<typename _other_type>
189  {
191  }
192 
194  {
195  m_ptr.swap( _right.m_ptr );
196  }
197 
198  void reset( _element_type _new_ptr = nullptr )
199  {
200  if( _element_type(m_ptr) != _new_ptr )
201  {
202  if( valid() )
203  {
204  delete _element_type(m_ptr);
205  }
206  m_ptr = _new_ptr;
207  }
208  }
209 
210  _element_type release()
211  {
212  _element_type _tmp_ptr = m_ptr;
213  m_ptr = nullptr;
214  return _tmp_ptr;
215  }
216 
217  // destroy the object
219  {
220  if( valid() )
221  {
222  delete _element_type(m_ptr);
223  }
224  }
225 
226 private:
227 
228  bool valid() const
229  {
230  // see if the managed resource is in the invalid state.
231  return _element_type(m_ptr) != nullptr;
232  }
233 
234  // the wrapped object
236 };
237 
238 // swap the contents of two auto_gcroot objects
239 template<typename _element_type>
241  auto_gcroot<_element_type> & _right )
242 {
243  _left.swap( _right );
244 }
245 
246 } // namespace msclr
247 
248 #define _INC_MSCLR_AUTO_GCROOT
249 
250 #endif /* !defined (_INC_MSCLR_AUTO_GCROOT) */
void swap(auto_gcroot< _element_type > &_left, auto_gcroot< _element_type > &_right)
Definition: auto_gcroot.h:240
System::String _safe_bool
Definition: safebool.h:37
reference_wrapper< _Ty > ref(_Ty &_Val) _NOEXCEPT
Definition: type_traits:1617
_element_type operator->() const
Definition: auto_gcroot.h:158
Definition: auto_gcroot.h:44
_auto_gcroot_ref(auto_gcroot< _element_type > &ref)
Definition: auto_gcroot.h:47
Definition: gcroot.h:43
bool operator!=(_detail_class::_safe_bool) const
static _safe_bool const _safe_false
Definition: safebool.h:39
bool operator==(_detail_class::_safe_bool) const
auto_gcroot< _element_type > & attach(_detail::_auto_gcroot_ref< _element_type > &_right)
Definition: auto_gcroot.h:111
auto_gcroot< _element_type > & operator=(_detail::_auto_gcroot_ref< _element_type > &_right)
Definition: auto_gcroot.h:139
_element_type release()
Definition: auto_gcroot.h:210
auto_gcroot(_detail::_auto_gcroot_ref< _element_type > _right)
Definition: auto_gcroot.h:85
bool valid() const
Definition: auto_gcroot.h:228
static _safe_bool const _safe_true
Definition: safebool.h:38
auto_gcroot< _element_type > & m_ref
Definition: auto_gcroot.h:53
Definition: auto_gcroot.h:30
auto_gcroot< _element_type > & operator=(auto_gcroot< _element_type > &_right)
Definition: auto_gcroot.h:132
auto_gcroot< _element_type > & attach(auto_gcroot< _element_type > &_right)
Definition: auto_gcroot.h:103
bool operator!() const
Definition: auto_gcroot.h:170
auto_gcroot< _element_type > & attach(auto_gcroot< _other_type > &_right)
Definition: auto_gcroot.h:119
auto_gcroot< _element_type > & attach(_element_type _right)
Definition: auto_gcroot.h:96
auto_gcroot(auto_gcroot< _other_type > &_right)
Definition: auto_gcroot.h:91
auto_gcroot< _element_type > & operator=(_element_type _right)
Definition: auto_gcroot.h:126
gcroot< _element_type > m_ptr
Definition: auto_gcroot.h:235
~auto_gcroot()
Definition: auto_gcroot.h:218
void reset(_element_type _new_ptr=nullptr)
Definition: auto_gcroot.h:198
auto_gcroot(_element_type _ptr=nullptr)
Definition: auto_gcroot.h:73
auto_gcroot< _element_type > & operator=(auto_gcroot< _other_type > &_right)
Definition: auto_gcroot.h:146
void swap(auto_gcroot< _element_type > &_right)
Definition: auto_gcroot.h:193
void swap(gcroot< T > &_right)
Definition: gcroot.h:109
auto_gcroot(auto_gcroot< _element_type > &_right)
Definition: auto_gcroot.h:79